PID Control Buck Converter By using Arduino UNO

โครงงานนี้เป็นการทดลองควบคุมแรงดันเอาต์พุตให้คงที่ สำหรับวงจรบักคอนเวอร์เตอร์แบบสวิตชิ่ง (Switching Buck Converter) ด้วยการใช้ไมโครคอนโทรลเลอร์ Arduino UNO และโปรแกรมควบคุมแบบปิด (Closed-Loop control) แบบ PID Control โดยส่งค่าแรงดันเอาต์พุตด้วยวงจรแบ่งแรงดันเข้าที่ขา A0 ของบอร์ด Arduino และส่งสัญญาณควบคุมให้กับเพาเวอร์มอสเฟตในลักษณะพัลซ์วิดมอดูเลตชัน (PWM Signal) จากขา 3 (D3) สำหรับการสวิตชิ่งให้แรงดันที่เอาต์พุตคงที่

ในรูปที่ 1 จะเป็นลักษณะของอุปกรณ์ที่ใช้ใรการสร้างวงจรบักคอนเวอร์เตอร์แบบสวิตชิ่ง สำหรับการทดลองครั้งนี้ ซึ่งจะใช้ PCB แบบอเนกประสงค์

สำหรับในรูปที่ 2 จะเป็นตัวเหนี่ยวนำทางด้านเอาต์พุตจะใช้แกนเทอร์รอย ขนาดเส้นผ่าศูนย์กลาง 3.5 เซนติเมตร สีดำและใช้ลวดเบอร์ 20 SWG พันในแกนประมาณ 55 รอบ ซึ่งจะได้ค่าเหนี่ยวนำประมาณ 200uH/5A

เมื่อต่อวงจรเสร็จแล้วแสดงดังในรูปที่ 3 ซึ่งในรูปจะเห็นว่าเป็นการต่อวงจรด้านลายทองแดงของ PCB อเนกประสงค์ เพื่อให้ง่ายต่อการทดลอง การปรับแก้ไข การวัดสัญญาณต่างๆ และการเชื่อมต่อสัญญาณควบคุมและสัญญาณป้อนกลับไปยังบอร์ดควบคุม Arduino UNO

จากนั้นประกอบวงจรต่างๆ เข้าด้วยกันแสดงในรูปที่ 4 ซึ่งจะมีองค์ประกอบด้วยกัน 3 ส่วนคือ ส่วนของตัวควบคุมการทำงานทั้งหมดจะเป็นบอร์ด Arduino UNO (บอร์ดสีน้ำเงิน) บอร์ดสวิตชิ่งบักคอนเวอร์เตอร์ (เป็นบอร์ดอเนกประสงค์) และตัวต้านทานสำหรับทดสอบวงจรจะเป็นตัวต้านทานขนาด 10 โอห์ม 20 วัตต์ 2 ตัว

รูปที่ 5 แสดงลักษณะของการทดลองให้วงจรจ่ายกระแสไฟฟ้าให้กับโหลดที่กระแส 0.5A และ 1A ด้วยการใช้แคลมป์มิเตอร์ในการวัดกระแสที่เกิดขึ้น
/
Example PID Control for Buck Converter
Reading analog input A0 for Control PWM signal output D3
Fs = 35kHz, Vo = 10V, Vi = 15-20V
R&D By : www.electronicsDNA.com
Date : 22-3-2020, (V.0)
/
#include <PWM.h>
#include <PID_v1.h>
int32_t frequency = 35000; //frequency (in Hz)
//Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Specify the links and initial tuning parameters
double Kp=3, Ki=1, Kd=0; // 2 5 1
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
void setup()
{
Serial.begin(9600);
InitTimersSafe();
bool success = SetPinFrequencySafe(3,frequency);
Setpoint = 500;
//turn the PID on
myPID.SetMode(AUTOMATIC);
}
void loop()
{
Input = analogRead(A0);
// Serial.println(Input);
myPID.Compute();
// analogWrite(PIN_OUTPUT, Output);
pwmWrite(3, Output);
// Serial.println(Output);
}
Library PID_v1.h : http://www.mediafire.com/file/1zc1xngmdgmuhlm/Arduino-PID-Library.zip/file
Library PWM.h : http://www.mediafire.com/file/rny8gch6anqeuxk/PWM-master.zip/file

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

ในรูปที่ 7 เป็นแหล่งจ่ายไฟเลี้ยงสำหรับทดลองวงจรขนาด 20V/2A ซึ่งเราสามารถสังเกต ลักษณะการทำงานในด้านพลังงานขาเข้า และประสิทธิภาพการทำงานของวงจรนี้เบื้องต้น

ในรูปที่ 8 โปรแกรมจะเป็นการแก้ไขไฟล์ไลบารี่ PID_v1.h ที่ตำแหน่ง SampleTime จากเดิมจะมีค่าเท่ากับ 0.1S ให้เราเปลี่ยนเป็นค่า 0.001S แทน เพื่อให้ระยะเวลาการตรวจสอบค่าความผิดพลาด (Error) เพิ่มมากขึ้น และมีความเร็วในการตอบสนองต่อค่าแรงดันเอาต์พุตที่เปลี่ยนแปลงได้อย่างเหมาะสม

ในรูปที่ 9 เป็นวงจรบักคอนเวอร์เตอร์ที่ใช้ในการทดลองครั้งนี้ ซึ่งจะออกแบบให้ใช้อุปกรณ์น้อยที่สุดและให้สามารถทำงานได้ตามแนวคิดที่ได้วางแผนไว้ ในส่วนของวงจรฟิลเตอร์เอาต์พุตจะใช้ตัวเหนี่ยวนำร่วมกับตัวเก็บประจุโดยประมาณ เพื่อให้ออกแบบวงจรได้ง่ายและเร็วขึ้น และจะใช้การทดสอบและปรับแต่งความถี่เล็กน้อยให้วงจรมีประสิทธิภาพ และเกิดพลังงานสูญเสียภายในตัวเหนี่ยวนำน้อยที่สุดครับ.
Reference