MCP4922 Digital-to-Analog Converter 12-Bit with Arduino UNO

บทความนี้เป็นการทดลองต่อวงจรใช้งานไอซี MCP4922 ซึ่งทำหน้าที่แปลงสัญญาณดิจิตอลให้เป็นสัญญาณอะนาลอก (Digital-to-Analog Converter) ขนาด 12 บิต กับบอร์ดควบคุม Arduino UNO โดยไอซี MCP4922 สามารถจ่ายสัญญาณอะนาลอกได้ 2 ช่อง (VoutA, VoutB) ใช้อุปกรณ์ต่อร่วมกับไอซีน้อย มีโปรแกรมตัวอย่างหรือไลบารี่ให้ดาวน์โหลดมากมาย รวมทั้งนำไอซีไปประยุกต์ใช้งานได้หลายรูปแบบ

รูปที่ 1 ลักษณะตัวถังและตำแหน่งขาของไอซี MCP4922 [Picture by Ref.1]
รูปที่ 2 บล็อกไดอะแกรมวงจรภายในไอซี MCP4922 [Picture by Ref.1]

สำหรับรูปที่ 1 และรูปที่ 2 แสดงลักษณะตัวถัง ตำแหน่งขาและล็อกไดอะแกรมวงจรภายในไอซี MCP4922 เพื่อให้เข้าใจกลไกการทำงาน ซึ่งรายละเอียดของการทำงานทั้งหมดสามารถดาวน์โหลดดาต้าชีตท้ายบทความหรือให้คลิกที่ Picture by Ref.1

รูปที่ 3 ตัวอย่างการนำไอซี MCP4922 ไปประยุกต์ใช้งาน [Picture by Ref.1]

รูปที่ 3 เป็นตัวอย่างวงจรการนำไอซี MCP4922 มาประยุกต์ใช้งาน เพื่อควบคุมการตรวจจับกระแสให้กับมอเตอร์ไฟฟ้าที่เข้าใจได้ง่าย นอกจากนี้เราสามารถนำไอซีไปใช้งานในลักษณะอื่นๆ อีกหลายรูปแบบ เช่น แหล่งจ่ายไฟเลี้ยง (Programmable Power Supply : PPS) แบบโปรแกรมค่าที่ต้องการได้ทั้งกระแสและแรงดันทางด้านเอาต์พุต

MCP4922 Digital-to-Analog Converter 12-Bit with Arduino UNO
รูปที่ 4 ลักษณะการต่อวงจรให้กับไอซี MCP4922 และบอร์ดควบคุม Arduino UNO

ในรูปที่ 4 เป็นลักษณะของการต่อวงจรให้กับไอซี MCP4922 และบอร์ดควบคุม Arduino UNO สำหรับการทดลองการทำงาน โดยการวัดค่าแรงดันเอาต์พุตของไอซี MCP4922 ที่ตำแหน่งขา 10 และขา 14 จะใช้ดิจิตอลออสซิลโลสโคปในการวัด เพื่อให้เห็นลักษณะการเปลี่ยนแปลงค่าแรงดันได้ง่ายขึ้น

/*
 * Credit Arduino Code by : https://forums.adafruit.com/viewtopic.php?p=593297
 * Arduino MOSI (Pin 11), DAC SCK to SCLK (Pin 13), DAC CS to CS (Pin 10), 
 * DAC Vref to 5 volts (DAC power supply), LDAC to ground and SHDN to 5 volts.
 */

#include <SPI.h>

int i = 0;
int j = 0;

void setup() {
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
delay(10);
digitalWrite(10, LOW);
delay(10);
digitalWrite(10, HIGH);
SPI.begin();
}

void dacWrite(int value, byte channel){
if(channel == 1){
digitalWrite(10, LOW);

//set top 4 bits of value integer to data variable
unsigned int data = value & 4095;
data = value | 12288; //top 4 bits = 0011
SPI.transfer16(data);

digitalWrite(10, HIGH);
}
else if(channel == 2){

digitalWrite(10, LOW);

//set top 4 bits of value integer to data variable
unsigned int data = value & 4095;
data = value | 45056; //top 4 bit = 1011
SPI.transfer16(data);

digitalWrite(10, HIGH);
}
}

void loop() {
dacWrite(i, 1);
dacWrite(j, 2);
i= i+1;
j= 4095-i;
if(i > 4095){i = 0;}
}

สำหรับการทำงานของตัวอย่างโปรแกรมข้างบนสามารถอธิบายแบบพอสังเขปคือ ในส่วนแรกจะเป็นการกำหนดใช้งานไลบารี่ #include <SPI.h> และค่าตัวแปรในการสร้างสัญญาณฟันเลื่อยทั้ง 2 ช่องด้วยคำสั่ง int i = 0; และ int j = 0; จากนั้นในส่วนที่สอง void setup() เป็นการส่งสัญญาณ CS ให้กับไอซี MCP4922 ด้วยขา D10 ถัดลงมาเป็นคำสั่งฟังก์ชั่นรับค่าตัวแปรและกำหนดการส่งค่าแรงดันทางด้านเอาต์พุตไปยังช่องที่ต้องการด้วย void dacWrite(int value, byte channel) นส่วนที่สาม void loop() เป็นโปรแกรมส่งค่าไปยังฟังก์ชั่นด้วยคำสั่ง dacWrite(i, 1); และ dacWrite(j, 2); เพื่อกำหนดค่าแรงดันเอาต์พุตที่ต้องการโดยลักษณะของการส่งค่านั้นไปฟังก์ชั่นสามารถปรับเปลี่ยนได้ตามที่ผู้ใช้งานต้องการ

MCP4922 Digital-to-Analog Converter 12-Bit with Arduino UNO
รูปที่ 5 ลักษณะสัญญาณเอาต์พุตที่ได้จากการทดลอง

รูปที่ 5 เป็นสัญญาณที่ได้จากการทดลองจะสังเกตเห็นว่าสัญญาณที่ช่องสัญญาณที่ 1 รูปบน (CH1) จะเป็นการเพิ่มค่าแรงดันขึ้นตามลำดับจากคำสั่ง i= i+1; และในทางกลับกันที่ช่องสัญญาณที่ รูปล่าง (CH2) จะเป็นรูปสัญญาณตรงกันข้ามกับสัญญาณบนจากคำสั่ง j= 4095-i;

MCP4922 Digital-to-Analog Converter 12-Bit with Arduino UNO
รูปที่ 6 วงจรที่ใช้ในการทดลองไอซี MCP4922
MCP4922 Digital-to-Analog Converter 12-Bit with Arduino UNO
รูปที่ 7 การทดลองการทำงานของไอซี MCP4922

สำหรับการทดลองและต่อใช้งานไอซี MCP4922 ครั้งนี้ เป็นการทดลองวงจรขนาดเล็กและใช้อุปกรณ์เพิ่มเติมเพียงเล็กน้อย และไอซีตัวนี้เป็นไอซีอีกหนึ่งตัวที่จะให้ความแม่นยำและรวดเร็วในการจ่ายค่าแรงดันเอาต์พุตเพิ่มขึ้นเมื่อเทียบกับการจ่ายสัญญาณเอาต์พุตด้วยคำสั่ง analogWrite() ที่มีในโปรแกรม Arduino IDE (ซึ่งเป็นเทคนิคของ Digital-to-Analog Converter แบบหนึ่ง) รวมทั้งการจ่ายแรงดันเอาต์พุตที่ต้องการเปลี่ยนแปลงค่าเอาต์พุตที่รวดเร็วจะทำได้ในระดับหนึ่งเท่านั้น

Reference

  1. https://ww1.microchip.com/downloads/en/devicedoc/22250a.pdf
  2. https://ua726.co.uk/2012/12/22/testing-the-mcp4922-with-an-arduino/
  3. https://www.arduino.cc/reference/en/libraries/mcp_dac/
  4. https://forum.arduino.cc/t/trying-to-learn-the-spi-library-with-an-mcp4922-dac-code-not-working/228864
  5. http://nctu-yab.synology.me/arduino-mcp4922.html
  6. https://cyberblogspot.com/how-to-use-mcp4921-dac-with-arduino/
  7. https://forums.adafruit.com/viewtopic.php?p=593297
  8. https://synthhacker.blogspot.com/2014/08/testing-my-mcp4922-pcb.html
  9. https://github.com/chipaudette/MCP4922/blob/master/MCP4922_SteppingVoltages/MCP4922_SteppingVoltages.ino
  10. http://www.pwv.co.jp/~take/TakeWiki/index.php?arduino%2FDAC%E3%82%92%E8%A9%A6%E3%81%99