(บล็อกที่ 3 )Arduino and Motor Control : Part 2

Arduino and Motor Control : Part 2

เมื่อ 3 ปีที่ผ่านมา
โดย เจ้าของร้าน

วันนี้มาพูดถึงการควบคุมความเร็วรอบของ DC Motor ด้วยเทคนิค Pulse Width Modulation (PWM) กันครับ
  เริ่มต้นกันจากอะไรคือ PWM กันก่อนครับ  เอาแบบความหมายง่ายๆ ก็คือ การมอดูเลตสัญญาณให้มีความกว้างตามสัดส่วนที่กำหนด บนความถี่ Carrier ที่ต้องการใช้งาน  ซึ่งโดยปกติแล้วจะใช้ประโยชน์ในการควบคุมการเปิดปิดของวงจรอิเล็กทรอนิกส์กำลัง เช่น วงจรบัก  วงจรบูส  วงจรบักบูส เป็นต้น นอกจากนี้ยังใช้สามารถใช้ประกอบกับวงจร H - Bridge เพื่อควบคุมความเร็วรอบของมอเตอร์  หรือว่าแต่ต้องการจะหรี่หลอด LED ก็ได้อีกด้วย
  ทีนี้มารู้จักกับพารามิเตอร์ที่ใช้ระบุรูปร่างหน้าตาของ PWM กันบ้าง  ที่สำคัญมี 2 ค่าด้วยกันคือ ความถี่ของคลื่นพาหะ (Carrier Frequency)  และ อัตราส่วนหน้าที่ (Duty Ratio)  เอาเป็นว่าผมขอใช้ทับศัพท์ภาษาอังกฤษละกันครับ  ใช้ภาษาไทยอาจจะแปลกๆ
   Carrier Frequency ใน Arduino ก็ ราวๆ 490 HZ ในกรณีที่ใช้ Library ปกติใน Arduino IDE นะครับ  แต่บอกไว้ก่อนว่ามีวิธีในการปรับให้มีความถี่สูงขึ้นเป็นค่าอื่นๆ เช่น 31.25 kHZ ด้วย (ไว้โอกาสหน้าจะเล่าให้ฟัง ถ้ามีคนสนใจ)
 ***  บอกนิดครับว่าผมลงทุนไปเปิดพจนานุกรมศัพท์วิศวกรรมไฟฟ้า ของ วสท. มาเลยนะครับ
  อีกคำคือ Duty Ratio  คือสัดส่วนของเวลาที่จ่ายแรงดัน ต่อ คาบของ  Carrier Frequency  ซึ่งกรณีของเราตอนนี้ที่เห็นในภาพก็คือ เวลาที่จ่ายแรงดัน 1.02  มิลลิวินาที  ต่อคาบ 2.04 มิลลิวินาที ซึ่งจะได้ Duty Ratio = 50%\
  ตัวอย่าง Sketch ให้แรงดัน PWM ออกที่ขา 3 โดยมี Duty Ratio = 50%
int ledPin = 3;      // LED connected to digital pin 9
int val = 0;         // variable to store the read value
void setup()
{
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}
void loop()
{
  analogWrite(3, 128);  // analogRead values go from 0 to                              //1023, analogWrite values from 0 to 255
}
  อีกซักตัวอย่างนะครับ   ถ้าเป็นภาพด้านล่าง ก็จะเห็นว่ามี Carrier Frequency เท่าเดิม เพราะผมก็ยังใช้ PWM จาก LIbrary ปกติ  แต่คราวนี้ปรับให้เวลาที่เปิด เป็น 0.51 มิลลิวินาที  ซึ่งจะได้ Duty Ratio = 25% นั้นเอง
คราวนี้มาดูกันว่ามันเกี่ยวกันกับ Arduino Sketch ยังไงนะครับ
ถ้าดูภาพบนสุด ผมใช้ PWM Port 3  ในการกำเนิดสัญญาณนี้นะครับ  โดยใช้คำสั่ง analogWrite(3, 128)  ซึ่งหมายถึงการเขียนให้ออก Port 3 โดยมีสัดส่วน Duty Ratio คือ 128/256 หรือ 50% นั่นเอง
อย่าสับสนนะครับว่าทำไมใช้คำสั่ง analogWrite แต่ไปออกขา Digital(PWM)  นี่เป็นเพราะ Arduino Board อย่าง UNO ไม่มี Analog Output channel นะครับ มีแต่ PWM Output ที่ Pin ด้าน Digital 
   คราวนี้ จากสัญญา PWM ถึ่งแม้จะมีความถี่ Carrier ที่ 490 Hz แต่ก็พอที่จะใช้ในการควบคุมมอเตอร์กระแสตรงโดยใช้วงจร H-Bridge แล้วละครับ  โดย PWM ที่ว่านี้ก็ใช้ได้ทั้งกับ IC เบอร์ L298P และ L293 หรือ Motor Shield หรือว่าจะต่อวงจรสร้าง H-Bridge เอาเองกรณีที่มอเตอร์มีขนาดใหญ่กว่า 2 A ก็ทำได้นะครับ  วิธีใช้งานก็แสนจะง่าย  ต่อเข้ากับขา INPUT ของ IC ที่ใช้ และอย่าลืมต่อกราวด์ ของ Arduino กับ แหล่งจ่ายแรงดันหลักของมอเตอร์ด้วยนะครับ
 รายละเอียดและ Sketch ขอให้ดูใน ตอนที่ 1 โดยให้ปรับในส่วนของขา 2,4 และ 6,7 โดยใช้เป็น analogwrite แทน digitalwrite เพื่อให้ใส่สัญญาณ PWM เข้าที่ขา 2,4 และ 6,7  ครับ

  อีกส่วนที่อยากจะทำให้ดูเพื่อเอาใจคนที่จะทำวงจร Switching Power Supply คือการปรับให้ Arduino กำเนิดสัญญา PWM แบบความถี่สูงๆ เช่น 31.25 kHz นะครับ  การใช้งาน Arduino ในส่วนนี้ต้องเข้าไปแก้ไข Register อยู่ 4 ตัวใน Atmel 328 ที่เราใช้เป็นตัว Microcontroller ของ Arduino UNO   อันนี้ใช้สำหรับการทำงานกับวงจร Power Electronics ของจริงนะครับ เพราะแค่ 490 HZ ไม่พอแน่นอนสำหรับการทำ Switching Power Supply แบบต่างๆ   ทำไมนะเหรอครับ ก็เพราะว่าขนาดของ Capcitor กับ Inductor ในวงจรเพื่อใช้ filter ความถี่จะต้องมีขนาดใหญ่มากๆ  ไม่เหมาะสมกับการปฏิบัติแน่ๆ
   ใน Sketch ด้านล่างเป็นการสร้าง PWM ที่ Carrier Frequency 31.25 kHz โดยมี Duty Ratio = 50% หรือ กำหนดให้มีค่า 128 ใน Sketch นั่นเอง  และให้มีสัญญาณออกที่ขา 11 นะครับ
void setup(){
  pwmSetup();
}
void loop(){
  int Duty = 128;//type in the voltage you want. Refer to guide on limiting comonents
  OCR2A = Duty;
}
void pwmSetup(){//just run once at setup
  pinMode(11, OUTPUT); //OCR2A
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20); //phase correct pwm 31250hz
  TCCR2B = _BV(CS20);//change this as datasheet says to mainly get different pwm frequencies
  OCR2A = 0;
  OCR2B = 0;
}
 
ซึงจะเห็นได้จากภาพของสัญญานจากออสซิลโลสโคปนะครับว่ามีความถี่ 31.25 kHZ  (ที่มันอ่านได้ 31.4 kHZ ในภาพผมเข้าใจว่ามัน error นิดหน่อยเพราะมันเปลี่ยนไปมาไม่นิ่ง  สโคปผมราคาถูกไปหน่อยครับ)  โดยจะเห็นว่ามี Duty ratio 50% ตามที่เราตั้งไว้เป็น 128  ตามต้องการครับ

วันนี้พอแค่นี้ครับ เนื้อหาอาจจะดูหนักไปหน่อย (รึเปล่า) คราวหน้าจะกลับมาพูดถึงการทำงานและควบคุม Stepper motor กันครับ

 *** ถ้าต้องการอ่านฉบับภาษาอังกฤษ ตามมาที่นี่ครับ ****  รับรองว่าลึกถึงใจ !!!
*** สามารถติดตามตอนที่ 1 ได้ที่นี่ครับ  ตอนที่ 1)  ****

 โดย  Mountain "A"


ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

(บล็อกที่ 9). code รถบังคับจากแผ่นซีดี ควบคุมด้วยแอพแอนดรอยด์

โครงงานเครื่องรดน้ำต้นไม้อัตโนมัติ (งานที่ 6)

( บล็อกที่ 2 )โปรเจค หุ่นยนต์เดินตามเส้น 4 เซ็นเซอร์ Arduino + L298P