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) เพื่อควบคุมแรงดันที่เอาต์พุตให้คงที่ แทนการส่งแรงดันป้อนกลับมายังออปแอมป์แบบเดิม

ESP32 DAC and ADC Control DC Power Supply
รูปที่ 1 แสดงแนวความคิดของการออกแบบวงจรใหม่เพิ่มเติม
ESP32 DAC and ADC Control DC Power Supply
รูปที่ 2 วงจรที่พัฒนาใหม่ของ ESP32 DAC and ADC Control DC Power Supply

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

ESP32 DAC and ADC Control DC Power Supply
รูปที่ 3 ลักษณะของการต่อวงจรสำหรับทดลองการทำงานจริง

รูปที่ 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 เพื่อควบคุมแรงดันเอาต์พุตให้ได้ตามที่ต้องการ

ESP32 DAC and ADC Control DC Power Supply
รูปที่ 4 กำหนดให้ SetVoltageOUTPUT = 1000; แรงดันเอาพุต์เท่ากับ 5.93V
ESP32 DAC and ADC Control DC Power Supply
รูปที่ 5 กำหนดให้ SetVoltageOUTPUT = 2000; แรงดันเอาพุต์เท่ากับ 10.32V
ESP32 DAC and ADC Control DC Power Supply
รูปที่ 6 กำหนดให้ SetVoltageOUTPUT = 3000; แรงดันเอาพุต์เท่ากับ 14.82V
ESP32 DAC and ADC Control DC Power Supply
รูปที่ 7 กำหนดให้ SetVoltageOUTPUT = 4000; แรงดันเอาพุต์เท่ากับ 18.05V

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

Reference

  1. https://www.electronicwings.com/esp32/dac-digital-to-analog-converter-esp32
  2. https://www.electronicwings.com/esp32/adc-of-esp32
  3. https://deepbluembedded.com/esp32-dac-audio-arduino-examples/
  4. https://www.xecor.com/blog/esp32-pinout-diagram