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