การใช้งาน 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 ของ 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 บิต | |
TCCR0A | COM0A1 | COM0A0 | COM0B1 | COM0B0 | – | – | WGM01 | WGM00 |
Timer/Counter Control Register 1 A
COM0A1 | COM0A0 | คำอธิบาย |
0 | 0 | OC0A ถูกปิดใช้งาน |
0 | 1 | WGM02 = 0: การทำงานของพอร์ตปกติ, OC0A ถูกตัดการเชื่อมต่อ WGM02 = 1: สลับ OC0A ในการเปรียบเทียบการจับคู่ |
1 | 0 | ไม่มีโหมดกลับหัว (สูงที่ด้านล่างต่ำเมื่อจับคู่) |
1 | 1 | โหมดกลับหัว (ต่ำที่ด้านล่างสูงเมื่อจับคู่) |
ใช้กับโหมด PWM เท่านั้น
การใช้งาน PWM ในไมโครคอนโทรลเลอร์ ATmega328P
รายการอุปกรณ์
- 1. ชุดคิทต่อวงจร Minimum ATmega328P Circuit
- 2. Breadboard 700 Points SYB-120
- 3. Jumper (M2M) cable 10cm Male to Male
- 4. FT232RL FTDI USB To TTL Serial Converter Module
- 5. USB Male to Mini USB B 5pin Data Cable
ขั้นตอนการทํางาน
1 : ทดสอบโปรแกรมแรก กับ ATmega328P
โปรแกรมแรกของ การใช้งานไมโครคอนโทรลเลอร์มักจะเป็น Blink ไฟกะพริบ ซึ่งเป็นหนึ่งในโปรแกรมที่ง่ายที่สุดเท่าที่จะเป็นไปได้ในการเขียนภาษาโปรแกรมต่างๆ เพราะฉะนั้นโดยธรรมเนียมปฏิบัติแล้ว มักจะใช้ในการตรวจสอบว่าเขียนภาษาโปรแกรมได้ถูกต้องหรือระบบมีการประมวลผลที่ถูกต้อง และมักถูกใช้เป็นตัวอย่างที่ง่ายที่สุดในการแสดงผลลัพธ์ของการเขียนโปรแกรม โดยทำตามขั้นตอนลิงค์ด้านล่าง
2: การใช้งาน PWM
วิธีการต่อวงจรทำได้โดยต่อขา LED (ขายาว) เข้าที่ขา PD2 ของ ATmega328P ส่วนขาอีกด้านหนึ่ง (ขาสั้น) ต่อเข้ากับ ตัวต้านทาน 220 โอห์ม แล้วจึงต่อลง GND
สำหรับโมดุล 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 >>>