MCP3208 ADC Converter 12-Bit SPI with Arduino NANO

ไอซีเบอร์ MCP3208 เป็นไอซีที่จะทำหน้าที่แปลงสัญญาณอะนาลอกเป็นดิจิตอล (ADC Converter) ที่ความละเอียด 12 บิต และมีขารับสัญญาณอะนาลอกได้ถึง 8 ขา และใช้การสื่อสารแบบ SPI : Serial Peripheral Interface ช่วยให้ผู้นำไปใช้งานสามารถขยายขารับสัญญาณอะนาลอกให้กับตัวประมวลผลเพิ่มขึ้น โดยเฉพาะไมโครคอนโทรลเลอร์ (Microcontroller) ทั้งนี้ไมโครคอนโทรลเลอร์บางตระกูลมีขารับสัญญาณอะนาลอกไม่มากนัก เช่น ESP8266 หรือเราอาจจะต้องพัฒนาโครงงานที่ใช้การรับสัญญาณอะนาลอกหลายช่อง ซึ่งไอซีเบอร์ MCP3208 เป็นอีกเบอร์หนึ่งที่น่าสนใจ


Datasheet for MCP3208 ADC Converter

ในรูปที่ 3 สำหรับการต่อไอซี MCP3208 ร่วมกับบอร์ดควบคุม Arduino NANO จะใช้เบรดบอร์ดและสายไฟจั้มเข้าด้วยกันเพื่อความรวดเร็ว ทั้งนี้อุปกรณ์ในการทดลองวงจรไม่มากนัก โดยในการทดลองจะป้อนสัญญาณอะนาลอกเข้าที่ขา 1 (CH0) และขา 2 (CH1) เพื่อสังเกตการทำงาน
// Arduino Code Ref. https://forum.arduino.cc/t/datalogging-using-mcp3208/532926
#include <SPI.h>
#define SELPIN 10 //Selection Pin
#define DATAOUT 11 //MOSI
#define DATAIN 12 //MISO
#define SPICLOCK 13 //Clock
#define aref_voltage 5
float readvalue,voltage0,voltage1,voltage2,voltage3,voltage4,voltage5;
void setup(){
//set pin modes
pinMode(SELPIN, OUTPUT);
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK, OUTPUT);
digitalWrite(SELPIN,HIGH);
digitalWrite(DATAOUT,LOW);
digitalWrite(SPICLOCK,LOW);
Serial.begin(9600);
}
float read_adc(int channel){
int adcvalue = 0;
byte commandbits = B11000000; //command bits - start, mode, chn (3), dont care (3)
//allow channel selection
commandbits|=((channel-1)<<3);
digitalWrite(SELPIN,LOW); //Select adc
// setup bits to be written
for (int i=7; i>=3; i--){
digitalWrite(DATAOUT,commandbits&1<<i);
//cycle clock
digitalWrite(SPICLOCK,HIGH);
digitalWrite(SPICLOCK,LOW);
}
digitalWrite(SPICLOCK,HIGH); //ignores 2 null bits
digitalWrite(SPICLOCK,LOW);
digitalWrite(SPICLOCK,HIGH);
digitalWrite(SPICLOCK,LOW);
//read bits from adc
for (int i=11; i>=0; i--){
adcvalue+=digitalRead(DATAIN)<<i;
//cycle clock
digitalWrite(SPICLOCK,HIGH);
digitalWrite(SPICLOCK,LOW);
}
digitalWrite(SELPIN, HIGH); //turn off device
return adcvalue;
}
void loop() {
readvalue = read_adc(1);
voltage0 = (aref_voltage*readvalue)/4096;
Serial.print(" CH0 = ");
Serial.print(voltage0);
Serial.println("V");
readvalue = read_adc(2);
voltage1 = (aref_voltage*readvalue)/4096;
Serial.print(" CH1 = ");
Serial.print(voltage1);
Serial.println("V");
readvalue = read_adc(3);
voltage2 = (aref_voltage*readvalue)/4096;
Serial.print(" CH2 = ");
Serial.print(voltage2);
Serial.println("V");
readvalue = read_adc(4);
voltage3 = (aref_voltage*readvalue)/4096;
Serial.print(" CH3 = ");
Serial.print(voltage3);
Serial.println("V");
Serial.println(" ");
delay(2000);
}
โปรแกรมสำหรับการทดลองไอซี MCP3208 ข้างบน เป็นตัวอย่างการอ่านค่าสัญญาณอะนาลอกเพียง 4 ช่อง (CH0-CH3) โดยในโปรแกรมนี้จะใช้เพียงไลบารี่ SPI.h เพียงอย่างเดียว ซึ่งส่วนใหญ่จะมีอยู่ในตัวโปรแกรม Arduino IDE อยู่แล้ว แต่ในกรณีที่ต้องการดาวน์โหลดเพิ่มเติม สามารถค้นหาได้จาก Google.com และใช้คำค้นหา Arduino SPI.h Library ได้เช่นกันครับ


ในรูปที่ 4 และรูปที่ 5 เป็นการทดลองที่ 1 ด้วยการป้อนแรงดันอินพุตเข้า CH0 เท่ากับ 1.622V โดยวัดค่าแรงดันกับมัลติมิเตอร์ จากนั้นอ่านค่าแรงดันอินพุตเข้า CH0 ผ่านหน้าต่าง Serial Monitor ซึ่งค่าที่อ่านได้เท่ากับ 1.60V ภายในกรอบสีแดง


สำหรับในรูปที่ 6 และรูปที่ 7 เป็นการทดลองที่ 2 เช่นเดียวกับการทดลองที่ 1 ด้วยการป้อนแรงดันอินพุตเข้า CH1 เท่ากับ 2.538V โดยวัดค่าแรงดันกับมัลติมิเตอร์ จากนั้นอ่านค่าแรงดันอินพุตเข้า CH1 ผ่านหน้าต่าง Serial Monitor อีกครั้ง และค่าที่อ่านได้เท่ากับ 2.5V ภายในกรอบสีเขียว


สำหรับไอซี MCP3208 เป็นไอซีทำหน้าที่แปลงสัญญาณอะนาลอกเป็นดิจิตอลที่สามารถเพิ่มขารับสัญญาณอะนาลอกได้อีก 8 ขา (CH0-CH7) และนำมาต่อใช้งานได้ไม่ยากนักและต่ออุปกรณ์อื่นๆ เพิ่มเติมให้กับตัวไอซีน้อย รวมทั้งใช้การสื่อสารแบบ SPI ที่ให้ความเร็วในการสื่อสารที่ค่อนข้างสูง ซึ่งสามารถนำไปประยุกต์ใช้งานต่างๆ ได้หลายมากมาย
Reference
- https://www.denshi.club/cookbook/adda/adc/a-d412spi-mcp3208.html
- https://forum.arduino.cc/t/datalogging-using-mcp3208/532926
- https://forum.arduino.cc/t/mpc3008-coding/693815
- https://www.alhin.de/arduino/index.php?n=43
- https://www.arduino.cc/reference/en/libraries/mcp3208/
- https://www.microchip.com/en-us/product/mcp3208
- https://ww1.microchip.com/downloads/en/devicedoc/21298e.pdf