Arduino Phase Correct PWM for DC to DC Converter

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

Arduino Phase Correct PWM
รูปที่ 1 รูปแสดงลักษณะการทดลอง

รูปที่ 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);  
  }
Arduino Phase Correct PWM
รูปที่ 2 บอร์ดทดลอง ดีซี ทู ดีซี ที่สามารถต่อเข้ากับไมโครคอนโทรลเลอร์โดยตรง

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

Arduino Phase Correct PWM for DC to DC Converter
รูปที่ 3 แสดงลักษณะการต่อบอร์ด ดีซี ทู ดีซี กับบอร์ด Arduino UNO
Arduino Phase Correct PWM for DC to DC Converter
รูปที่ 4 การต่อสายไฟเลี้ยงอินพุตและสายเอาต์พุตให้กับบอร์ด ดีซี ทู ดีซี คอนเวอร์เตอร์

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

Arduino Phase Correct PWM for DC to DC Converter
รูปที่ 4 ตัวต้านทานขนาด 20 วัตต์ 2 ตัว ใช้เป็นโหลด

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

Arduino Phase Correct PWM for DC to DC Converter
รูปที่ 5 แสดงการใช้แคล้มมิเตอร์ในการวัดกระแสทางด้านเอาต์พุต

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

Arduino Phase Correct PWM for DC to DC Converter
รูปที่ 6 การทดลองที่ 1 มัลติมิเตอร์แสดงค่าแรงดันเอาต์พุต ซึ่งในที่นี้จะกำหนดค่าไว้ที่ประมาณ 5V
Arduino Phase Correct PWM for DC to DC Converter
รูปที่ 7 การทดลองที่ 1 การวัดกระแสที่เกิดขึ้นกับโหลดความต้านทาน 20 โอห์ม
Arduino Phase Correct PWM
รูปที่ 8 การทดลองที่ 1 ลักษณะสัญญาณที่เกิดขึ้นเมื่อวงจรจ่ายกระแสให้โหลดที่ประมาณ 0.25A

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

Arduino Phase Correct PWM
รูปที่ 9 การทดลองที่ 2 แสดงค่าแรงดันเอาต์พุตที่กระแสโหลดประมาณ 0.55A
Arduino Phase Correct PWM
รูปที่ 10 การทดลองที่ 2 ปริมาณกระแสที่เกิดขึ้นกับค่าความต้านทานโหลด 10 โอห์ม ประมาณ 0.55A

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

Arduino Phase Correct PWM
รูปที่ 11 การทดลองที่ 2 ลักษณะสัญญาณที่เกิดขึ้นเมื่อวงจรจ่ายกระแสให้โหลดที่ประมาณ 0.55A

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

Arduino Phase Correct PWM
รูปที่ 12 การทดลองที่ 3 แสดงค่าแรงดันเอาต์พุต ที่กระแสโหลดประมาณ 0.96A
Arduino Phase Correct PWM
รูปที่ 13 การทดลองที่ 3 ปริมาณกระแสที่เกิดขึ้นกับค่าความต้านทานโหลด 5 โอห์ม ประมาณ 0.96A
Arduino Phase Correct PWM
รูปที่ 14 การทดลองที่ 3 ลักษณะสัญญาณที่เกิดขึ้นเมื่อวงจรจ่ายกระแสให้โหลดที่ประมาณ 0.96A

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

Arduino Phase Correct PWM
รูปที่ 15 แสดงค่าแรงดันอินพุตและกระแสที่จ่ายให้กับวงจรดีซี ทู ดีซี เมื่อจ่ายกระแสที่จ่ายเท่ากับ 0.96A

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

Arduino Phase Correct PWM
รูปที่ 16 แสดงลักษณะการทดลอง เครื่องมือที่ใช้และการวัดค่าต่างๆ ที่เกิดขึ้น

จากการทดลองกำหนดค่ารีจิสเตอร์ในตัว Timer2 ที่ TCCR2A และ TCCR2B นั้น จะเห็นว่าลักษณะของสัญญาณเป็นไปตามที่ต้องการ ส่วนความถี่สวิตชิ่งจำกำหนดไว้ที่ 31.372kHz โดยวงจรที่ทดลองนี้จะเป็นลักษณะของวงจรบักคอนเวอร์เตอร์แบบทั่วไป ทั้งนี้เรากำหนด Timer2 ในโหมด Phase Correct PWM ในการตอบสนองต่อระบบควบคุมเป็นที่น่าพอใจ ซึ่งในที่นี้เรากำหนดค่าแรงดันเอาต์พุตไว้ที่ 5V และวงจรสามารถป้องกันกระแสเกิน (Output short circuit protection) ในลักษณะของการซ๊อตเซอร์กิตที่เอาต์พุตได้

Reference

  1. https://arduino.stackexchange.com/questions/10112/how-to-make-sure-arduinos-pwm-pulses-are-phase-shifted
  2. https://arduino.stackexchange.com/questions/26000/uno-timer-2-set-up
  3. https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
  4. https://www.arxterra.com/tutorial-on-fast-pulse-width-modulation/
  5. http://www.righto.com/2009/07/secrets-of-arduino-pwm.html