Arduino UNO set Timer2 for Synchronous Buck Converter

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

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 1 แสดงส่วนหนึ่งของโครงสร้าง Timer2 ที่เราจะใช้ในการปรับค่า รูปจาก [4]

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

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 2 รีจิสเตอร์ TCCR2A และการกำหนดค่าในแต่ละบิต

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

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 3 การกำหนดโหมดการทำงานที่ตำแหน่งบิต COM2A0 และ COM2A1
Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 4 การกำหนดโหมดการทำงานที่ตำแหน่งบิต COM2ฺB0 และ COM2B1

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 5 โหมดการสร้างสัญญาณแหน่งบิต WGM2, WGM1 และ WGM0

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

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 6 รีจิสเตอร์ TCCR2B การกำหนดค่าถี่สัญญาณนาฬิกาและรีจิสเตอร์กำหนดร่วมกับ TCCR2A (WGM22)

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

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 7 ตารางแสดงการกำหนดอัตราส่วนสัญญาณนาฬิกา เพื่อใช้งานค่าความถี่สวิตชิ่ง

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

Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 8 ลักษณะของวงจรสวิตชิ่งแบบซิงโครนัสบักคอนเวอร์เตอร์

ในส่วนของตัวอย่างโปรแกรมข้างล่างนี้จะแสดงการปรับเซตค่าให้กับรีจิสเตอร์ 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);
}
Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 9 แสดงลักษณะการต่อวงจรสำหรับทดลองกับบอร์ด Arduino UNO ที่ขา D11 และขา D3
Arduino UNO set Timer2 for Synchronous Buck Converter
รูปที่ 10 ลักษณะของสัญญาณที่เกิดขึ้นและการปรับสัญญาณ

จากตัวอย่างโปรแกรมที่นำเสนอข้างบนนี้ เราจะสังเกตเห็นลักษณะการทำงานได้ชัดเจนขึ้นจากวิดีโอการทดลองข้างล่าง ทั้งนี้เราสามารถปรับแต่งโปรแกรมนี้ เพื่อให้วงจรควบคุมการทำงานให้มีประสิทธิภาพมากขึ้นได้ตามต้องการ เช่น การใช้ตัวควบคุมแบบ PID Control หรือ Fuzzy Logic Control : FLC เป็นต้น

Reference

  1. http://www.righto.com/2009/07/secrets-of-arduino-pwm.html
  2. https://playground.arduino.cc/Main/TimerPWMCheatsheet
  3. http://www.cse.dmu.ac.uk/~sexton/power_labs/class%20D.html
  4. https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
  5. https://techweb.rohm.com/knowledge/dcdc/s-dcdc/02-s-dcdc/92
  6. https://www.maximintegrated.com/en/design/technical-documents/app-notes/6/6129.html