- PWM Pins ในไมโครคอนโทรลเลอร์ AVR Atmega16
- สัญญาณ PWM คืออะไร?
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม Atmega16 สำหรับ PWM
Pulse Width Modulation (PWM) เป็นเทคนิคที่มีประสิทธิภาพซึ่งความกว้างของพัลส์จะเปลี่ยนไปโดยการรักษาความถี่ให้คงที่ เทคนิคนี้ใช้ในระบบควบคุมจำนวนมากในปัจจุบัน การประยุกต์ใช้ PWM ไม่ จำกัด และจะมีการใช้ในช่วงกว้างของการใช้งานเช่นการควบคุมความเร็วของมอเตอร์การวัดการควบคุมการใช้พลังงานและการสื่อสารอื่น ๆ เทคนิคใน PWM หนึ่งสามารถสร้างสัญญาณอะนาล็อกโดยใช้สัญญาณดิจิตอลบทช่วยสอนนี้จะช่วยคุณในการทำความเข้าใจ PWM คำศัพท์และวิธีการใช้งานโดยใช้ไมโครคอนโทรลเลอร์ ในบทช่วยสอนนี้เราจะสาธิตPWM พร้อมกับไมโครคอนโทรลเลอร์ AVR Atmega16โดยการปรับความเข้มของ LED ให้แตกต่างกัน
เพื่อทำความเข้าใจพื้นฐานของ PWM โดยละเอียดโปรดไปที่บทช่วยสอนก่อนหน้าของเราเกี่ยวกับ PWM พร้อมไมโครคอนโทรลเลอร์ต่างๆ:
- ARM7-LPC2148 PWM Tutorial: การควบคุมความสว่างของ LED
- การมอดูเลตความกว้างพัลส์ (PWM) โดยใช้ MSP430G2: การควบคุมความสว่างของ LED
- การสร้าง PWM โดยใช้ไมโครคอนโทรลเลอร์ PIC พร้อม MPLAB และ XC8
- การมอดูเลตความกว้างพัลส์ (PWM) ใน STM32F103C8: การควบคุมความเร็วของพัดลม DC
- การสร้างสัญญาณ PWM บนพิน GPIO ของไมโครคอนโทรลเลอร์ PIC
- การสอน Raspberry Pi PWM
PWM Pins ในไมโครคอนโทรลเลอร์ AVR Atmega16
ATmega16 มีสี่ขา หมุดเหล่านี้คือ PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2)
นอกจากนี้Atmega16 ยังมีตัวจับเวลา 8 บิตสองตัวและตัวจับเวลา 16 บิตหนึ่งตัว Timer0 และ Timer2 มีตัวนับ 8 บิตในขณะที่ Timer1 เป็นจับเวลา ในการสร้าง PWM เราต้องมีภาพรวมของตัวจับเวลาเนื่องจากตัวจับเวลาใช้ในการสร้าง PWM ดังที่เราทราบว่าความถี่คือจำนวนรอบต่อวินาทีที่ตัวจับเวลาทำงาน ดังนั้นความถี่ที่สูงขึ้นจะทำให้เราจับเวลาได้เร็วขึ้น ในการสร้าง PWM ความถี่ PWM ที่เร็วขึ้นจะให้การควบคุมเอาต์พุตได้ดีขึ้นเนื่องจากสามารถตอบสนองต่อรอบการทำงานของ PWM ใหม่ได้เร็วขึ้น
ในบทช่วยสอน Atmega16 PWMนี้เราจะใช้ Timer2 คุณสามารถเลือกรอบการทำงานใดก็ได้ หากคุณไม่ทราบว่าduty cycle ใน PWMคืออะไรลองมาพูดคุยกันสั้น ๆ
สัญญาณ PWM คืออะไร?
Pulse Width Modulation (PWM) เป็นสัญญาณดิจิทัลที่นิยมใช้ในวงจรควบคุม เวลาที่สัญญาณอยู่สูงเรียกว่า "ตรงเวลา" และเวลาที่สัญญาณอยู่ต่ำเรียกว่า "เวลาปิด" มีพารามิเตอร์สำคัญสองประการสำหรับ PWM ดังที่กล่าวไว้ด้านล่าง:
รอบการทำงานของ PWM
เปอร์เซ็นต์ของเวลาที่สัญญาณ PWM ยังคงสูง (ตรงเวลา) เรียกว่าเป็นรอบการทำงาน
เช่นเดียวกับสัญญาณพัลส์ 100ms หากสัญญาณสูงเป็นเวลา 50 มิลลิวินาทีและต่ำเป็นเวลา 50 มิลลิวินาทีหมายความว่าพัลส์อยู่ที่ครึ่งเวลาสูงและครึ่งเวลาต่ำ ดังนั้นเราสามารถพูดได้ว่ารอบการทำงานคือ 50% ในทำนองเดียวกันถ้าชีพจรอยู่ในสถานะ HIGH 25ms และ 75ms ในสถานะ LOW จาก 100ms รอบการทำงานจะเป็น 25% สังเกตว่าเราคำนวณระยะเวลาของสถานะสูงเท่านั้น คุณสามารถอ้างอิงภาพด้านล่างเพื่อความเข้าใจภาพ สูตรสำหรับรอบการทำงานคือ
Duty Cycle (%) = On Time / (On Time + Off Time)
ดังนั้นโดยการเปลี่ยนรอบการทำงานเราสามารถเปลี่ยนความกว้างของ PWM ซึ่งส่งผลให้ความสว่างของ LED เปลี่ยนไป เราจะสาธิตการใช้งานรอบการทำงานที่แตกต่างกันในการควบคุมความสว่างของ LED ตรวจสอบวิดีโอสาธิตในตอนท้ายของบทช่วยสอนนี้
หลังจากเลือกรอบการทำงานแล้วขั้นตอนต่อไปคือการเลือกโหมด PWM โหมด PWM ระบุว่าคุณต้องการให้ PWM ทำงานอย่างไร โหมด PWM ส่วนใหญ่มี 3 ประเภท ดังต่อไปนี้:
- PWM ที่รวดเร็ว
- เฟสที่ถูกต้อง PWM
- เฟสและความถี่ที่ถูกต้อง PWM
Fast PWMใช้ในกรณีที่การเปลี่ยนเฟสไม่สำคัญ ด้วยการใช้ Fast PWM เราสามารถส่งออกค่า PWM ได้อย่างรวดเร็ว ไม่สามารถใช้ Fast PWM ในกรณีที่การเปลี่ยนเฟสมีผลต่อการทำงานเช่นการควบคุมมอเตอร์ดังนั้นในแอปพลิเคชั่นดังกล่าวจะใช้โหมดอื่น ๆ ของ PWM เนื่องจากเราจะควบคุม Brightness ของ LED ซึ่งการเปลี่ยนเฟสจะไม่ส่งผลมากนักดังนั้นเราจึงใช้โหมด Fast PWM
ตอนนี้ในการสร้าง PWM เราจะควบคุมตัวจับเวลาภายในให้นับขึ้นจากนั้นตั้งค่ากลับเป็นศูนย์ที่การนับหนึ่งดังนั้นตัวจับเวลาจะนับขึ้นจากนั้นตั้งค่ากลับเป็นศูนย์ซ้ำแล้วซ้ำอีก นี่เป็นการกำหนดช่วงเวลา ตอนนี้เรามีตัวเลือกในการควบคุมชีพจรโดยเปิดพัลส์ตามจำนวนที่กำหนดในตัวจับเวลาขณะที่มันเพิ่ม เมื่อตัวนับกลับไปที่ 0 ให้ปิดชีพจร มีความยืดหยุ่นอย่างมากเนื่องจากคุณสามารถเข้าถึงการนับของตัวจับเวลาได้ตลอดเวลาและให้พัลส์ต่างๆด้วยตัวจับเวลาเพียงครั้งเดียว วิธีนี้ยอดเยี่ยมเมื่อคุณต้องการควบคุม LED หลาย ๆ ตัวพร้อมกัน ตอนนี้ขอเริ่มต้นการเชื่อมต่อหนึ่ง LED ที่มี ATmega16 สำหรับ PWM
ตรวจสอบโครงการที่เกี่ยวข้องกับ PWM ทั้งหมดที่นี่
ส่วนประกอบที่จำเป็น
- Atmega16 AVR ไมโครคอนโทรลเลอร์ IC
- 16Mhz คริสตัลออสซิลเลเตอร์
- ตัวเก็บประจุ 100nF สองตัว
- ตัวเก็บประจุ 22pF สองตัว
- ปุ่มกด
- สายจัมเปอร์
- เขียงหั่นขนม
- USBASP v2.0
- 2 Led (สีใดก็ได้)
แผนภูมิวงจรรวม
เราใช้ OC2 สำหรับ PWM เช่น Pin21 (PD7) ดังนั้นเชื่อมต่อ LED หนึ่งตัวที่ขา PD7 ของ Atmega16
การเขียนโปรแกรม Atmega16 สำหรับ PWM
โปรแกรมที่สมบูรณ์ได้รับด้านล่าง เบิร์นโปรแกรมใน Atmega16 โดยใช้ JTAG และ Atmel studio และดูเอฟเฟกต์ PWM บน LED ความสว่างจะเพิ่มขึ้นและลดลงอย่างช้าๆเนื่องจากวงจรการทำงานของ PWM ที่แตกต่างกัน ตรวจสอบวิดีโอที่ให้ไว้ในตอนท้าย
เริ่มการเขียนโปรแกรม Atmega16 ด้วยการตั้งค่า Timer2 Register บิตรีจิสเตอร์ Timer2 มีดังต่อไปนี้และเราสามารถตั้งค่าหรือรีเซ็ตบิตได้
ตอนนี้เราจะพูดถึงบิตทั้งหมดของ Timer2 เพื่อให้เราได้รับ PWM ที่ต้องการโดยใช้โปรแกรมที่เขียนขึ้น
ส่วนใหญ่มีสี่ส่วนในการลงทะเบียน Timer2:
FOC2 (Force Output Compare for Timer2): FOC2 bit ถูกตั้งค่าเมื่อบิต WGM ระบุโหมดที่ไม่ใช่ PWM
WGM2 (โหมดสร้างคลื่นสำหรับ Timer2):บิตเหล่านี้ควบคุมลำดับการนับของตัวนับแหล่งที่มาของค่าตัวนับสูงสุด (TOP) และประเภทของการสร้างรูปคลื่นที่จะใช้
COM2 (เปรียบเทียบโหมดเอาต์พุตสำหรับ Timer2):บิตเหล่านี้ควบคุมพฤติกรรมเอาต์พุต คำอธิบายบิตทั้งหมดได้อธิบายไว้ด้านล่าง
TCCR2 - = (1 <
ตั้งค่าบิต WGM20 และ WGM21 เป็น HIGH เพื่อเปิดใช้งานโหมดรวดเร็ว PWM WGM ย่อมาจากโหมดการสร้างรูปคลื่น บิตการเลือกมีดังต่อไปนี้
WGM00 |
WGM01 |
การทำงานของโหมด Timer2 |
0 |
0 |
โหมดปกติ |
0 |
1 |
CTC (ล้างตัวจับเวลาเมื่อเปรียบเทียบการจับคู่) |
1 |
0 |
PWM เฟสถูกต้อง |
1 |
1 |
โหมดรวดเร็ว PWM |
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับโหมดการสร้างรูปคลื่นคุณสามารถดูเอกสารข้อมูลอย่างเป็นทางการของ Atmega16
TCCR2 - = (1 <
นอกจากนี้เรายังไม่ได้ใช้การปรับขนาดล่วงหน้าดังนั้นเราจึงตั้งค่าการลงทะเบียนแหล่งสัญญาณนาฬิกาเป็น '001'
บิตการเลือกนาฬิกามีดังนี้:
CS22 |
CS21 |
CS20 |
คำอธิบาย |
0 |
0 |
0 |
ไม่มีแหล่งสัญญาณนาฬิกา (ตัวจับเวลา / ตัวนับหยุด) |
0 |
0 |
1 |
clk T2S / (ไม่มีการกำหนดมาตราส่วนล่วงหน้า) |
0 |
1 |
0 |
Clk T2S / 8 (จาก Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (จาก Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (จาก Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (จาก Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (จาก Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (จาก Prescaler) |
OC2 ยังถูกล้างในการเปรียบเทียบการจับคู่โดยตั้งค่า COM21 บิตเป็น '1' และ COM20 เป็น '0'
ตัวเลือกการเลือกเปรียบเทียบโหมดเอาต์พุต (COM) สำหรับโหมด Fast PWM มีให้ด้านล่าง:
COM21 |
COM21 |
คำอธิบาย |
0 |
0 |
การทำงานของพอร์ตปกติตัดการเชื่อมต่อ OC2 |
0 |
1 |
ที่สงวนไว้ |
1 |
0 |
ล้าง OC2 เมื่อเปรียบเทียบการจับคู่ตั้งค่า OC2 ที่ด้านบน |
1 |
1 |
ตั้งค่า OC2 ในการเปรียบเทียบการจับคู่ล้าง OC2 ที่ TOP |
เพิ่มรอบการทำงานจาก 0% เป็น 100% ดังนั้นความสว่างจะเพิ่มขึ้นตลอดเวลา รับค่าจาก 0-255 และส่งไปยังขา OCR2
สำหรับ (duty = 0; duty <255; duty ++) // 0 to max duty cycle { OCR2 = duty; // ค่อยๆเพิ่มความสว่าง LED _delay_ms (10); }
ในทำนองเดียวกันลดรอบการทำงานจาก 100% เป็น 0% เพื่อค่อยๆลดความสว่างของ LED
สำหรับ (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // ลดความสว่างของ LED ลงอย่างช้าๆ _delay_ms (10); }
นี้เสร็จสิ้นเราสอนเกี่ยวกับการใช้ PWM ใน ATmega16