Arduino Phase Correct PWM for DC to DC Converter

สำหรับโครงงานนี้เป็นการทดลองใช้บอร์ด Arduino UNO ในการสร้างสัญาณพัลซ์ เพื่อเป็นสัญญาณในการขับให้ ดีซี ทู ดีซี คอนเวอร์เตอร์ หรืออินเวอร์เตอร์ โดยการกำหนดค่าที่รีจิสเตอร์ Timer2 รวมทั้งการกำหนดความถี่ของสัญญาณที่เกิดขึ้้น และการกลับเฟสของสัญญาณ โดยเราจะเข้าไปเซตที่ TCCR2A และ TCCR2B และจะมีตัวอย่างโปรแกรมสั้นๆ เพื่อให้เราทดลอง รวมทั้งสามารถนำไปประยุกต์ใช้งานต่างๆ ได้ และระบบควบคุมสามารถเลือกใช้ได้ทั้งแบบการควบคุมด้วย PID Control และ Fuzzy logic control : FLC เป็นต้น

รูปที่ 1 แสดงภาพรวมถึงลักษณะของการทดลอง โดยในการทดลองนี้จะใช้การควบคุมแบบ Fuzzy logic control ด้วยโหมดการควบคุมแบบแรงดัน (Voltage Mode) ทั้งนี้เพื่อเป็นการตรวจสอบความถูกต้องของลักษณะสัญญาณที่สร้างขึ้น
โดยในกล่องข้อความข้างล่างนี้จะเป็นตัวอย่างโปรแกรมแบบย่อ 2 ตัวอย่างสำหรับนำไปประยุกต์ใช้งาน ในส่วนของการสร้างสัญญาณแบบ Phase Correct PWM ซึ่งเราสามารถปรับเปลี่ยนความกว้างของสัญญาณดิวตี้ไซเกิล (Duty Cycle) ตามค่าที่ต้องการ ผ่านตัวแปรไปยังรีจิสเตอร์ OCR2A และ OCR2B นั้นเอง
Pseudo Code (Phase correct PWM on the Atmega328)
Example1 : for PIN D3, D11
byte setPWM = 100;
void setup()
{
pinMode (3, OUTPUT);
pinMode (11, OUTPUT);
TCCR2A=0b10110001; // Generate inverted PWM signals in output
TCCR2B=0b00000001; // Set Fsw = 31.372kHz
delay(300);
OCR2A = setPWM;
OCR2B = 255 - setPWM;
}
void loop()
{
}
Pseudo Code (Phase correct PWM on the Atmega328)
Example2 : for PIN D9, D10
int setPWM = 0;
void setup()
{
Serial.begin(9600);
pinMode (3, OUTPUT);
pinMode (11, OUTPUT);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
TCCR1A=0b10110001; // Generate inverted PWM signals in output
TCCR1B=0b00000001; // Set Fsw = 31.372kHz
delay(500);
OCR1A = setPWM;
OCR1B = 255-setPWM;
}
void loop()
{
int sensorValue = analogRead(A0);
setPWM = (sensorValue/4);
OCR1A = setPWM;
OCR1B = 255-setPWM;
delay(50);
}

ในรูปที่ 2 เป็นบอร์ดทดลองวงจรดีซี ทู ดีซี คอนเวอร์เตอร์ ขนาดเล็กที่เราสามารถทดลองร่วมกับบอร์ดไมโครคอนโทรลเลอร์ต่างๆ ได้ทันที โดยตัวบอร์ดนี้สามารถรับแรงดันอินพุตได้ที่ 12V-30V จ่ายกระแสเอาต์พุตได้ 20A (Hall Effect sensor) และสามารถปรับค่าแรงดันเอาต์พุตได้ตามต้องการ


รูปที่ 3 และ 4 เป็นการต่อร่วมกันระหว่างบอร์ด Arduino UNO และบอร์ดวงจรดีซี ทู ดีซี คอนเวอร์เตอร์ โดยบอร์ด Arduino UNO จะทำหน้าที่ส่งสัญญาณพัลซ์วิดธ์ในการควบคุมการทำงานได้ 2 ช่อง (High side และ Low side Drive) และรับสัญญาณป้อนกลับ (Feedback signal) 2 ส่วนคือ ค่าแรงดันและกระแสของเอาต์พุตที่เกิดในการควบคุมการทำงานของระบบ

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

รูปที่ 5 แสดงการวัดค่ากระแสทางด้านเอาต์พุต โดยใช้แคล้มมิเตอร์และวัดค่าแรงดันด้วยดิจิตอลมัลติมิเตอร์ เพื่อสังเกตค่าโหลดเรกูเลชั่น (Load regulation)



รูปที่ 8 แสดงขนาดของสัญญาณพัลช์วิดธ์ มอดูเลตชั่น (PWM Signal) ที่ตอบสนองต่อโหลดประมาณ 1.25 วัตต์


รูปที่ 10 ลักษณะของการวัดค่ากระแสที่เอาต์พุตอีกครั้ง โดยกระแสที่วัดได้จะใกล้เคียงกับค่ากระแสที่เราสามารถคำนวณได้คร่าวๆ คือ I=E/R เมื่อ E = 5 โวลต์ และ R = 10 โอห์ม

ในรูปที่ 11 แสดงปริมาณของสัญญาณพัลช์วิดธ์ มอดูเลตชั่น ที่เกิดขึ้นเมื่อวงจรจ่ายกระแสให้โหลดเพิ่มที่ 2.5 วัตต์ ซึ่งเมื่อเทียบกับในรูปที่ 8 อาจจะเห็นความแตกต่างค่อนข้างน้อย แต่ค่าแรงดันที่เอาต์พุตยังใกล้เคียงค่าที่กำหนดอยู่



จากในรูปที่ 14 เราจะเห็นความเปลี่ยนแปลงของขนาดสัญญาณพัลช์วิดธ์ มอดูเลตชั่น ที่เกิดขึ้นเมื่อเทียบกับการทดลองที่ 1 แต่ก็ค่อนข้างน้อยทั้งนี้ สัญญาณพัลช์วิดธ์ มอดูเลตชั่นจะปรับชดเชยในส่วนที่ต่างออกไปเพื่อให้แรงดันเอาต์พุตคงที่เท่านั้น

ในรูปที่ 15 เป็นแหล่งจ่ายไฟเลี้ยง (DC Power supply) ที่ใช้ในการทดลอง ซึ่งแสดงในช่วงที่แหล่งจ่าย กำลังจ่ายไฟเลี้ยงให้กับวงจรดีซี ทู ดีซี ที่แรงดันเอาต์พุต 5V และกระแส 0.96A

จากการทดลองกำหนดค่ารีจิสเตอร์ในตัว Timer2 ที่ TCCR2A และ TCCR2B นั้น จะเห็นว่าลักษณะของสัญญาณเป็นไปตามที่ต้องการ ส่วนความถี่สวิตชิ่งจำกำหนดไว้ที่ 31.372kHz โดยวงจรที่ทดลองนี้จะเป็นลักษณะของวงจรบักคอนเวอร์เตอร์แบบทั่วไป ทั้งนี้เรากำหนด Timer2 ในโหมด Phase Correct PWM ในการตอบสนองต่อระบบควบคุมเป็นที่น่าพอใจ ซึ่งในที่นี้เรากำหนดค่าแรงดันเอาต์พุตไว้ที่ 5V และวงจรสามารถป้องกันกระแสเกิน (Output short circuit protection) ในลักษณะของการซ๊อตเซอร์กิตที่เอาต์พุตได้
Reference
- https://arduino.stackexchange.com/questions/10112/how-to-make-sure-arduinos-pwm-pulses-are-phase-shifted
- https://arduino.stackexchange.com/questions/26000/uno-timer-2-set-up
- https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
- https://www.arxterra.com/tutorial-on-fast-pulse-width-modulation/
- http://www.righto.com/2009/07/secrets-of-arduino-pwm.html