การใช้งาน PWM ภาษาซี

การใช้งาน PWM ภาษาซี

Pulse Width Modulation ( PWM ) เป็นเทคนิคที่มีประสิทธิภาพซึ่งความกว้างของพัลส์จะเปลี่ยนไปโดยการรักษาความถี่ให้คงที่ เทคนิคนี้ใช้ในระบบควบคุมจำนวนมากในปัจจุบัน การประยุกต์ใช้ PWM ได้ไม่จำกัด เช่นการควบคุมความเร็วของมอเตอร์การวัดการควบคุมการใช้พลังงานและการสื่อสารอื่น ๆ เทคนิคใน PWM นี้สามารถสร้างสัญญาณอะนาล็อกโดยใช้สัญญาณดิจิตอล บทความนี้จะช่วยคุณในการทำความเข้าใจ PWM คำศัพท์และวิธีที่เราสามารถนำไปใช้ในไมโครคอนโทรลเลอร์ โดยจะสาธิตPWM พร้อมกับไมโครคอนโทรลเลอร์ ATmega328P โดยการปรับความเข้มของ LED ให้แตกต่างกัน


ขา PWM ในไมโครคอนโทรลเลอร์ ATmega328P

ATmega328P มีขาเอาต์พุต PWM อยู่ 6 ขา คือ OC2B หรือขา PD3 , OC0B หรือขา PD5 , OC0A หรือขา PD6 , OC2A หรือขา PB3 , OC1B หรือขา PB2 , OC1A หรือขา PB1 ,โดย 2 ขา อยู่ที่ timer และ counter



การใช้งาน PWM ภาษาซี


ในการสร้าง PWM เราต้องมีภาพรวมของตัวจับเวลาเนื่องจากตัวจับเวลาใช้ในการสร้าง PWM ดังที่เราทราบว่าความถี่คือจำนวนรอบต่อวินาทีที่ตัวจับเวลาทำงาน ดังนั้นความถี่ที่สูงขึ้นจะทำให้เราจับเวลาได้เร็วขึ้น ในการสร้าง PWM ความถี่ PWM ที่เร็วขึ้นจะให้การควบคุมเอาต์พุตได้ดีขึ้นเนื่องจากสามารถตอบสนองต่อรอบการทำงาน PWM ใหม่ได้เร็วขึ้น

ตัวจับเวลา PWM ของ AVR สามารถทำงานได้ใน 3 โหมดที่แตกต่างกัน: Fast PWM, Phase Corrected PWM และ Phase and Frequency Phase Corrected PWM

สัญญาณ PWM คืออะไร?


Pulse Width Modulation (PWM) เป็นสัญญาณดิจิทัลที่นิยมใช้ในวงจรควบคุม เวลาที่สัญญาณอยู่สูงเรียกว่า “on time” และเวลาที่สัญญาณอยู่ต่ำเรียกว่า “off time” มีสองพารามิเตอร์ที่สำคัญสำหรับ PWM ดังที่กล่าวไว้ด้านล่าง:

เมื่อสัญญาณดิจิทัลเปิดอยู่สักพักและดับไปชั่วขณะ ถ้าเราหาร on ด้วย off และคูณด้วย 100% เราจะได้สิ่งที่เรียกว่า duty cycle

Duty_Cycle = [ ON_time / (ON_time + OFF_time)] * 100


รอบการทำงานของ PWM


เปอร์เซ็นต์ของเวลาที่สัญญาณ PWM ยังคงสูง (on time) เรียกว่าเป็นรอบการทำงาน

เช่นเดียวกับสัญญาณพัลส์ 100ms หากสัญญาณสูงเป็นเวลา 50 มิลลิวินาทีและต่ำเป็นเวลา 50 มิลลิวินาทีหมายความว่าพัลส์อยู่ที่ครึ่งเวลาสูงและครึ่งเวลาต่ำ ดังนั้นเราสามารถพูดได้ว่ารอบการทำงานคือ 50% ในทำนองเดียวกันถ้าชีพจรอยู่ในสถานะ HIGH 25ms และ 75ms ในสถานะ LOW จาก 100ms รอบการทำงานจะเป็น 25% สังเกตว่าเราคำนวณระยะเวลาของสถานะสูงเท่านั้น คุณสามารถอ้างอิงภาพด้านล่างเพื่อความเข้าใจภาพ สูตรสำหรับรอบการทำงานคือ

TIMER0 (8BIT PWM):


Timer / Counter0 มี 2 เอาต์พุต OC0A และ OC0B เนื่องจากเอาต์พุตทั้งสองนี้ใช้ตัวจับเวลาเดียวกันและเครื่องกำเนิดรูปคลื่นทั้ง OC0A และ OC0B จะซิงโครไนซ์จึงทำให้ตัวจับเวลาเหมาะสำหรับการสร้างหุ่นยนต์รถถัง

    Timer / Counter0 ไม่มี 32 หรือ 128 devision ใน Prescaler ด้วยเหตุนี้จึงค่อนข้าง จำกัด ความถี่ที่สามารถผลิตได้ หากคุณต้องการความถี่เฉพาะใน PWM ของคุณให้ใช้ Timer / Counter2 ซึ่งมีค่า Prescaler ทั้งหมด

    Timer / Counter0 สามารถทำงานได้ 4 โหมด Fast PWM พร้อมสูงสุด TOP (0xFF) โหมด Fast PWM พร้อมตัวแปร TOP (OCR0A) โหมด Phase Corrected PWM พร้อมสูงสุด TOP (0xFF) และ Phase Corrected PWM โหมดที่มีตัวแปร TOP (OCR0A) แต่ละโหมดเหล่านี้สามารถกลับด้านหรือไม่กลับด้าน  

  7 บิต 6 บิต  5 บิต  4 บิต  3 บิต  2 บิต  1 บิต  0 บิต 
TCCR0ACOM0A1COM0A0 COM0B1COM0B0 – WGM01WGM00 

Timer/Counter Control Register 1 A

COM0A1COM0A0 คำอธิบาย
0 OC0A ถูกปิดใช้งาน
0 WGM02 = 0: การทำงานของพอร์ตปกติ, OC0A ถูกตัดการเชื่อมต่อ
 WGM02 = 1: สลับ OC0A ในการเปรียบเทียบการจับคู่
1 ไม่มีโหมดกลับหัว (สูงที่ด้านล่างต่ำเมื่อจับคู่)
1 โหมดกลับหัว (ต่ำที่ด้านล่างสูงเมื่อจับคู่)

ใช้กับโหมด PWM เท่านั้น


การใช้งาน PWM ในไมโครคอนโทรลเลอร์ ATmega328P


 รายการอุปกรณ์


ขั้นตอนการทํางาน

1 : ทดสอบโปรแกรมแรก กับ ATmega328P


โปรแกรมแรกของ การใช้งานไมโครคอนโทรลเลอร์มักจะเป็น Blink ไฟกะพริบ ซึ่งเป็นหนึ่งในโปรแกรมที่ง่ายที่สุดเท่าที่จะเป็นไปได้ในการเขียนภาษาโปรแกรมต่างๆ เพราะฉะนั้นโดยธรรมเนียมปฏิบัติแล้ว มักจะใช้ในการตรวจสอบว่าเขียนภาษาโปรแกรมได้ถูกต้องหรือระบบมีการประมวลผลที่ถูกต้อง และมักถูกใช้เป็นตัวอย่างที่ง่ายที่สุดในการแสดงผลลัพธ์ของการเขียนโปรแกรม โดยทำตามขั้นตอนลิงค์ด้านล่าง


2: การใช้งาน PWM


วิธีการต่อวงจรทำได้โดยต่อขา LED (ขายาว) เข้าที่ขา PD2 ของ ATmega328P ส่วนขาอีกด้านหนึ่ง (ขาสั้น) ต่อเข้ากับ ตัวต้านทาน 220 โอห์ม แล้วจึงต่อลง GND


ต่อขา LED เข้าที่ขา PD2


การใช้งาน PWM ภาษาซี

สำหรับโมดุล PWM ของ ATmega328P มีความละเอียด 8 bit หรือ ปรับได้ 255 ระดับ ดังนั้นค่าสัญญาณ 0 โวลต์ถึง 5 โวลต์ จะถูกแสดงเป็นสัญญาณแบบดิจิตอล จะได้ 0 ถึง 255 ซึ่งเราสามารถเทียบสัดส่วนคำนวนจากเลขจริง เป็น เลขทางดิจิตอลได้ ดังรูปด้านล่าง


ตัวอย่างโค้ดด้านล่าง เมื่อเริ่มทำงาน LED สีแดง ที่เชื่อมต่อที่ขา PD2 จะติด ในความสว่าง 25 % ตามที่เราเขียนโค้ดไว้ ที่ OCR0A = 64; สามารถทดสอบแก้ไขโค้ด ลดหรือเพิ่ม ความสว่าง 0 – 255 คือ ค่ายิ่งมาก LED จะ สว่างมากขึ้น

 
  #include <avr/io.h> //  Contains all the I/O Register Macros
  
  
  int main(void)
  {
         DDRD |= (1 << DDD6); // PD6 is now an output
  
         OCR0A = 64;  // set PWM for 25% duty cycle
  
  
         TCCR0A |= (1 << COM0A1);  // set none-inverting mode
  
         TCCR0A |= (1 << WGM01) | (1 << WGM00);  // set fast PWM Mode
  
         TCCR0B |= (1 << CS01);  // set prescaler to 8 and starts PWM
  
  
         while (1);
         {
                // we have a working Fast PWM
         }
  } 
  

<<< C5: การใช้งานอินเตอร์รัพท์  บทความก่อนหน้า |  บทความต่อไป C7: ควบคุม DC Motor ด้วย L298N >>>

Leave a Reply

Your email address will not be published. Required fields are marked *

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

Allow All
Manage Consent Preferences
  • Always Active

Save