Arduino UNO set Timer2 for Synchronous Buck Converter

บทความนี้จะเป็นการปรับค่าในรีจิสเตอร์ (Register) พัลซ์วิดมอดูเลตชั่น แบบ Phase Correct PWM สำหรับนำไปใช้กับวงจรสวิตชื่งซิงโครนัสบักคอนเวอร์เตอร์ (Synchronous Buck Converter) ทั้งนี้ลักษณะของการปรับค่ารีสิเตอร์แบบนี้จะมีความแตกต่าง ของการนำไปประยุกต์ใช้งานในงานแต่ละประเภท ซึ่งจะเป็นอย่างไรนั้น ลองติดตามบทความนี้ดูครับ ซึ่งจะทดลองผลที่เกิดขึ้นด้วยคลิปสั้นๆ เพื่อให้เข้าใจได้ง่ายยิ่งขึ้น

รูปที่ 1 แสดงโครงสร้างของ Timer/Counter2 ซึ่งเป็นส่วนหนึ่งของการปรับค่าต่างๆ ทั้งนี้เพื่อให้เห็นลักษณะการทำงานของแต่ส่วนที่เรากำหนดค่าในแต่ละบิต และการเชื่อมโยงของข้อมูลระหว่างกัน

รูปที่ 2 แสดงรีจิสเตอร์สำหรับปรับค่าการใช้โหมดการสร้างสัญญาณในรูปแบบต่างๆ โดยในรีจิสเตอร์นี้จะให้เรากำหนดได้ 6 บิต คือ บิต 0, 1, 4, 5, 6 และ 7 โดยใรแต่ละบิตจะมีรายละเอียดเพิ่มเติมดังในรูปต่อไป



รูปที่ 5 การกำหนดบิตรูปแบบของการสร้างสัญญาณพัลซ์วิดธ์มอดูเลตชั่น โดยในส่วนนี้จะต้องกำหนดร่วมกันทั้ง 2 ส่วน คือ ส่วนแรกรีจิสเตอร์ TCCR2A ที่บิต 0 และบิต 1 ในส่วนที่สองที่รีจิสเตอร์ TCCR2B ที่ตำแหน่งบิต 3 ซึ่งเราซึ่งในที่นี้จะเป็นโหมด PWM, phase correct และก็จะทำให้เราทราบปรับแต่งในบิตอื่นของรีจิสเตอร์ TCCR2A คือ บิต 4 ถึงบิต7

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

การปรับเซตรีจิสเตอร์ให้ใช้งานในโหมด Phase Correct PWM ในส่วนของ Timer2 เพื่อนำไปประยุกต์ใช้งานกับวงจรซิงโครนัสบักคอนเวอร์เตอร์นี้ จะต้องกำหนดรูปแบบส่วนของการขับสัญญาณให้กับเพาเวอร์สวิตชิ่งตัวบน (High side Drive) สัมพันธ์กับการขับสัญญาณให้กับเพาเวอร์สวิตชิ่งตัวล่าง (Low side drive) ดังในรูปที่ 8 ตำแหน่ง S1และ S2 ที่จะปรับช่วงเวลาการทำงานเล็กน้อย ทั้งนี้เพื่อให้การทำงานมีประสิทธิภาพมากที่สุด รวมทั้งการปรับตั้งค่าหยุดการทำงานของเพาเวอร์สวิตชิ่งตัวบนและตัวล่าง (Dead Time : DT) ซึ่งเป็นองค์ประกอบอีกส่วนหนึ่ง

ในส่วนของตัวอย่างโปรแกรมข้างล่างนี้จะแสดงการปรับเซตค่าให้กับรีจิสเตอร์ TCCR2A และ TCCR2B โดยผลที่เกิดขึ้นนั้น เราจะต้องใช้ออสซิลโลสโคปวัดสัญญาณที่ตำแหน่งขา D11 และ D3 เพื่อสังเกตการทำงานและทดลองปรับค่าสัญญาณพัลซ์วิดธ์มอดูเลต (PWM Signal) ขา A0 สำหรับดูการเปลี่ยนแปลงที่เกิดขึ้น
/* Pseudo Code for set Register Timer2 (Phase correct PWM) on the Arduino UNO Application for switching Synchronous Buck Converter Dev by : www.electronicsDNA.com Date : 12/1/2021 (V.0) */ int Output_PWM = 0; int DT = 5; // set Dead Time void setup() { pinMode (3, OUTPUT); pinMode (11, OUTPUT); Serial.begin(9600); TCCR2A =0b11100001; // Set Register Phase Correct PWM TCCR2B =0b00000001; // Set Fsw = 31.372 kHz delay(300); } void loop() { Output_PWM = analogRead(A0); // Read ADC CH0 for Adj PWM Output_PWM = 1024-Output_PWM; // Inv data of Output_PWM Output_PWM = (Output_PWM/4); // Set Data form ADC (10Bit) to register OCR2x (8Bit) OCR2A = Output_PWM; // PIN D11 OCR2B = (Output_PWM-DT); // PIN D3 delay(100); }


จากตัวอย่างโปรแกรมที่นำเสนอข้างบนนี้ เราจะสังเกตเห็นลักษณะการทำงานได้ชัดเจนขึ้นจากวิดีโอการทดลองข้างล่าง ทั้งนี้เราสามารถปรับแต่งโปรแกรมนี้ เพื่อให้วงจรควบคุมการทำงานให้มีประสิทธิภาพมากขึ้นได้ตามต้องการ เช่น การใช้ตัวควบคุมแบบ PID Control หรือ Fuzzy Logic Control : FLC เป็นต้น
Reference
- http://www.righto.com/2009/07/secrets-of-arduino-pwm.html
- https://playground.arduino.cc/Main/TimerPWMCheatsheet
- http://www.cse.dmu.ac.uk/~sexton/power_labs/class%20D.html
- https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
- https://techweb.rohm.com/knowledge/dcdc/s-dcdc/02-s-dcdc/92
- https://www.maximintegrated.com/en/design/technical-documents/app-notes/6/6129.html