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