ESP32 DAC and ADC Control DC Power Supply 0-20V/1A

โครงงานนี้เป็นการพัฒนาต่อเนื่องจากโครงงานที่ผ่านมา (Prototype ESP32 DAC Control DC Power Supply 0-20V/1A) ด้วยการให้บอร์ดควบคุม NodeMCU ESP32 ส่งค่าแรงดันอ้างอิง (Vref) เพื่อสร้างแรงดันที่เอาต์พุตจาก DAC (Digital to Analog Converter) เช่นเดิม จากนั้นจะให้ NodeMCU ESP32 รับค่าแรงดันเอาต์พุตป้อนกลับ (VFB) เข้ามายัง ADC (Analog to Digital Converter) เพื่อควบคุมแรงดันที่เอาต์พุตให้คงที่ แทนการส่งแรงดันป้อนกลับมายังออปแอมป์แบบเดิม


ในรูปที่ 2 เป็นการพัฒนาวงจรใหม่ของ ESP32 DAC and ADC Control DC Power Supply ซึ่งเดิมจะอยู่ในกรอบสีน้ำเงิน และใช้ออปแอมป์ในการเปรียบเทียบแรงดันระหว่างแรงดันอ้างอิงจาก DAC กับแรงดันป้อนกลับจากเอาต์พุต (Vo) เพื่อควบคุมแรงดันที่เอาพุตให้คงที่ โดยเมื่อเราพิจารณาแล้ว วงจรในกรอบสีน้ำเงินจะมีอัตราการขยาย 7.7 เท่าของค่าแรงดันอินพุต (Vi) จากแรงดันอ้างอิงจาก DAC ทั้งนี้ในวงจรใหม่จะนำค่าแรงดันที่เอาพุตมาป้อนกลับอีกครั้งที่ขา A0 สำหรับควบคุมการทำงานด้วยระดับความละเอียด ADC เท่ากับ 12 บิต

รูปที่ 3 แสดงลักษณะของการต่อวงจรสำหรับทดลองการทำงานจริงตามรูปที่ 2 เพื่อให้ NodeMCU ESP32 ประมวลผลและควบคุมการทำงานทั้งหมด ซึ่งวงจรส่วนใหญ่จะมาจากวงจรโครงงานเดิมที่ผ่านมา แต่จะมีส่วนของการรับสัญญาณเอาต์พุตเข้ามายัง RP1(5K) เพื่อปรับระดับให้เหมาะสมกับขา A0 (0-3.3V) อีกครั้ง
/* ESP32 DAC and ADC Control DC Power Supply 0-20V/1A MCU: ESP32-WROOM-32 Voltage set: 0-20V ADC: A0 Pin GPIO 36 (For Feedback signal) DAC: CH1 Pin 25 (For Set Voltage OUTPUT) Dev by : www.electronicsdna.com */ #define DAC_CH1 25 // DAC1 int sensorPin = A0; int Voutput = 0; int Output_Vref; void setup() { Serial.begin(115200); } void loop() { int SetVoltageOUTPUT = 1000; // Set Voltage OUTPUT [Test = 1000, 2000, 3000, 4000] Voutput = analogRead(sensorPin); if(Voutput>SetVoltageOUTPUT){Output_Vref = Output_Vref-1; goto goDACSignal;} if(Voutput<SetVoltageOUTPUT){Output_Vref = Output_Vref+1; goto goDACSignal;} goDACSignal: if(Output_Vref>200){Serial.print("\t MAX "); Output_Vref=200; goto setDAC;} if(Output_Vref<0) {Serial.print("\t MIN "); Output_Vref=0; goto setDAC;} setDAC: Serial.println(Output_Vref); dacWrite(DAC_CH1, Output_Vref); delay(10); }
โปรแกรม Arduino ที่ใช้ในการทดลองโครงงานดังแสดงข้างบน จะแบ่งออกเป็น 5 ส่วนคือ ส่วนแรกจะเป็นการประกาศใช้งานขา DAC, การใช้ตัวแปร และอัตราบอดเรตการสื่อสารพอร์ตอนุกรม (เท่ากับ 115200) ที่ฟังก์ชั่น void setup() ต่อมา ส่วนที่ 2 ในฟังก์ชั่น void loop() จะเป็นคำสั่ง int SetVoltageOUTPUT = 1000; ทำหน้าที่กำหนดค่าแรงดันเอาต์พุตที่ต้องการ โดยในโครงงานนี้จะทดลองกำหนดที่ 1000, 2000, 3000 และ 4000 ตามลำดับ ส่วนที่ 3 เป็นการรับค่าจากแรงดันเอาต์พุต (Vo) ด้วยคำสั่ง Voutput = analogRead(sensorPin); และนำมาเปรียบเทียบกับค่าแรงดันเอาต์พุตที่ต้องการด้วยคำสั่ง if(Voutput>SetVoltageOUTPUT) และคำสั่ง if(Voutput<SetVoltageOUTPUT) โดยในกรณ๊ที่ Voutput>SetVoltageOUTPUT ใช้ให้ลดค่า Output_Vref ลง 1 ระดับ ในทางกลับกันเมื่อ (Voutput<SetVoltageOUTPUT ใช้ให้เพิ่มค่า Output_Vref ขึ้น 1 ระดับ ต่อมาในส่วนที่ 4 ที่ goDACSignal: จะเป็นคำสั่งกำหนดค่า Output_Vref ให้อยู่ในช่วง 0-200 (แรงดันเอาต์พุต 0-20V) สุดท้ายในส่วนที่ 5 จะเป็นคำสั่ง dacWrite(DAC_CH1, Output_Vref); สำหรับกำหนดการสร้างแรงดันอ้างอิงของ DAC เพื่อควบคุมแรงดันเอาต์พุตให้ได้ตามที่ต้องการ




สำหรับในรูปที่ 4 ถึงรูปที่ 7 แสดงผลการทดลองที่ได้เมื่อกำหนดค่าตัวแปร SetVoltageOUTPUT ไปที่ 1000, 2000, 3000 และ 4000 เพื่อให้เห็นความแตกต่างของการควบคุมค่าแรงดันที่เอาต์พุต (Vo) และสำหรับโครงงานนี้คงจะเป็นไอเดียอีกแบบหนึ่งของการใช้บอร์ดควบคุม NodeMCU ESP32 มาประยุกต์ใช้งานให้กับแหล่งจ่ายไฟเลี้ยงกระแสตรง (DC Power Supply) นอกจากการใช้งานในด้าน IoT (Internet of Things) หรือใช้ควบคุมงานต่างๆ ทั่วไป เป็นต้น
Reference