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

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


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

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

ในรูปที่ 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); เพื่อกำหนดค่าแรงดันเอาต์พุตที่ต้องการโดยลักษณะของการส่งค่านั้นไปฟังก์ชั่นสามารถปรับเปลี่ยนได้ตามที่ผู้ใช้งานต้องการ

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


สำหรับการทดลองและต่อใช้งานไอซี MCP4922 ครั้งนี้ เป็นการทดลองวงจรขนาดเล็กและใช้อุปกรณ์เพิ่มเติมเพียงเล็กน้อย และไอซีตัวนี้เป็นไอซีอีกหนึ่งตัวที่จะให้ความแม่นยำและรวดเร็วในการจ่ายค่าแรงดันเอาต์พุตเพิ่มขึ้นเมื่อเทียบกับการจ่ายสัญญาณเอาต์พุตด้วยคำสั่ง analogWrite() ที่มีในโปรแกรม Arduino IDE (ซึ่งเป็นเทคนิคของ Digital-to-Analog Converter แบบหนึ่ง) รวมทั้งการจ่ายแรงดันเอาต์พุตที่ต้องการเปลี่ยนแปลงค่าเอาต์พุตที่รวดเร็วจะทำได้ในระดับหนึ่งเท่านั้น
Reference
- https://ww1.microchip.com/downloads/en/devicedoc/22250a.pdf
- https://ua726.co.uk/2012/12/22/testing-the-mcp4922-with-an-arduino/
- https://www.arduino.cc/reference/en/libraries/mcp_dac/
- https://forum.arduino.cc/t/trying-to-learn-the-spi-library-with-an-mcp4922-dac-code-not-working/228864
- http://nctu-yab.synology.me/arduino-mcp4922.html
- https://cyberblogspot.com/how-to-use-mcp4921-dac-with-arduino/
- https://forums.adafruit.com/viewtopic.php?p=593297
- https://synthhacker.blogspot.com/2014/08/testing-my-mcp4922-pcb.html
- https://github.com/chipaudette/MCP4922/blob/master/MCP4922_SteppingVoltages/MCP4922_SteppingVoltages.ino
- http://www.pwv.co.jp/~take/TakeWiki/index.php?arduino%2FDAC%E3%82%92%E8%A9%A6%E3%81%99