MCP3208 ADC Converter 12-Bit SPI with Arduino NANO

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

รูปที่ 1 บล็อกไดอะแกรมโครงสร้างภายในไอซีเบอร์ MCP3208
รูปที่ 2 แสดงตำแหน่งขาต่อใช้งานไอซีเบอร์ MCP3208

Datasheet for MCP3208 ADC Converter

MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 3 การต่อไอซี MCP3208 ร่วมกับบอร์ดควบคุม Arduino NANO

ในรูปที่ 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 ได้เช่นกันครับ

MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 4 การทดลองที่ 1 เมื่อป้อนแรงดันอินพุตเข้า CH0 เท่ากับ 1.622V
MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 5 การทดลองที่ 1 แรงดันอินพุตเข้า CH0 ที่อ่านได้เท่ากับ 1.60V

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

MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 6 การทดลองที่ 2 เมื่อป้อนแรงดันอินพุตเข้า CH1 เท่ากับ 2.538V
MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 7 การทดลองที่ 2 แรงดันอินพุตเข้า CH1 ที่อ่านได้เท่ากับ 2.5V

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

MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 8 วงจรที่ใช้ในการทดลองไอซี MCP3208
MCP3208 ADC Converter 12-Bit SPI with Arduino NANO
รูปที่ 9 ลักษณะการทดลองไอซี MCP3208

สำหรับไอซี MCP3208 เป็นไอซีทำหน้าที่แปลงสัญญาณอะนาลอกเป็นดิจิตอลที่สามารถเพิ่มขารับสัญญาณอะนาลอกได้อีก 8 ขา (CH0-CH7) และนำมาต่อใช้งานได้ไม่ยากนักและต่ออุปกรณ์อื่นๆ เพิ่มเติมให้กับตัวไอซีน้อย รวมทั้งใช้การสื่อสารแบบ SPI ที่ให้ความเร็วในการสื่อสารที่ค่อนข้างสูง ซึ่งสามารถนำไปประยุกต์ใช้งานต่างๆ ได้หลายมากมาย

Reference

  1. https://www.denshi.club/cookbook/adda/adc/a-d412spi-mcp3208.html
  2. https://forum.arduino.cc/t/datalogging-using-mcp3208/532926
  3. https://forum.arduino.cc/t/mpc3008-coding/693815
  4. https://www.alhin.de/arduino/index.php?n=43
  5. https://www.arduino.cc/reference/en/libraries/mcp3208/
  6. https://www.microchip.com/en-us/product/mcp3208
  7. https://ww1.microchip.com/downloads/en/devicedoc/21298e.pdf