- Các chân PWM trong Vi điều khiển AVR Atmega16
- Tín hiệu PWM là gì?
- Thành phần bắt buộc
- Sơ đồ mạch
- Lập trình Atmega16 cho PWM
Điều chế độ rộng xung (PWM) là một kỹ thuật mạnh mẽ trong đó độ rộng của xung được thay đổi bằng cách giữ tần số không đổi. Kỹ thuật này được sử dụng trong nhiều hệ thống điều khiển ngày nay. Ứng dụng của PWM không bị giới hạn và nó được sử dụng trong nhiều ứng dụng như điều khiển tốc độ động cơ, đo lường, điều khiển công suất và truyền thông, vv Trong kỹ thuật PWM, người ta có thể dễ dàng tạo ra tín hiệu đầu ra tương tự bằng cách sử dụng tín hiệu số. Hướng dẫn này sẽ giúp bạn hiểu về PWM, các thuật ngữ của nó và cách chúng ta có thể triển khai nó bằng vi điều khiển. Trong hướng dẫn này, chúng tôi sẽ trình diễn PWM với Vi điều khiển AVR Atmega16 bằng cách thay đổi cường độ của đèn LED.
Để hiểu chi tiết cơ bản về PWM, vui lòng xem các hướng dẫn trước của chúng tôi về PWM với các bộ vi điều khiển khác nhau:
- ARM7-LPC2148 PWM Hướng dẫn: Kiểm soát độ sáng của đèn LED
- Điều chế độ rộng xung (PWM) sử dụng MSP430G2: Điều khiển độ sáng của đèn LED
- Tạo PWM bằng Vi điều khiển PIC với MPLAB và XC8
- Điều chế độ rộng xung (PWM) trong STM32F103C8: Điều khiển tốc độ của quạt DC
- Tạo tín hiệu PWM trên các chân GPIO của Vi điều khiển PIC
- Hướng dẫn sử dụng Raspberry Pi PWM
Các chân PWM trong Vi điều khiển AVR Atmega16
Atmega16 có bốn chân PWM chuyên dụng. Các chân này là PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Ngoài ra Atmega16 có hai bộ định thời 8 bit và một bộ định thời 16 bit. Timer0 và Timer2 là bộ định thời 8 bit trong khi Timer1 là bộ định thời 16 bit. Để tạo PWM, chúng ta phải có tổng quan về bộ định thời vì bộ định thời được sử dụng để tạo PWM. Như chúng ta biết rằng tần số là số chu kỳ trên giây mà bộ đếm thời gian chạy. Vì vậy, tần số cao hơn sẽ cho chúng ta một bộ đếm thời gian nhanh hơn. Khi tạo PWM, tần số PWM nhanh hơn sẽ giúp kiểm soát đầu ra tốt hơn vì nó có thể đáp ứng nhanh hơn với các chu kỳ nhiệm vụ PWM mới.
Trong hướng dẫn Atmega16 PWM này, chúng tôi sẽ sử dụng Timer2. Bạn có thể chọn bất kỳ chu kỳ nhiệm vụ nào. Nếu bạn không biết chu kỳ nhiệm vụ trong PWM là gì thì chúng ta hãy thảo luận ngắn gọn.
Tín hiệu PWM là gì?
Điều chế độ rộng xung (PWM) là một tín hiệu kỹ thuật số được sử dụng phổ biến nhất trong mạch điều khiển. Thời gian tín hiệu duy trì ở mức cao được gọi là “đúng giờ” và thời gian tín hiệu ở mức thấp được gọi là “thời gian tắt”. Có hai tham số quan trọng đối với PWM như được thảo luận dưới đây:
Chu kỳ hoạt động của PWM
Phần trăm thời gian mà tín hiệu PWM vẫn ở mức CAO (đúng giờ) được gọi là chu kỳ nhiệm vụ.
Giống như trong tín hiệu xung 100ms, nếu tín hiệu CAO trong 50ms và THẤP trong 50ms, có nghĩa là xung có nửa thời gian CAO và nửa thời gian THẤP. Vì vậy, chúng ta có thể nói rằng chu kỳ nhiệm vụ là 50%. Tương tự nếu xung ở trạng thái CAO 25ms và 75ms ở trạng thái THẤP trong số 100ms, thì chu kỳ nhiệm vụ sẽ là 25%. Lưu ý rằng chúng tôi chỉ tính toán thời gian của trạng thái CAO. Bạn có thể tham khảo hình ảnh dưới đây để hiểu trực quan. Sau đó, công thức cho chu kỳ nhiệm vụ là,
Chu kỳ nhiệm vụ (%) = Đúng giờ / (Đúng giờ + Thời gian tắt)
Vì vậy, bằng cách thay đổi chu kỳ nhiệm vụ, chúng ta có thể thay đổi độ rộng của PWM, do đó dẫn đến thay đổi độ sáng của đèn LED. Chúng tôi sẽ có bản demo về việc sử dụng các chu kỳ nhiệm vụ khác nhau trong việc kiểm soát độ sáng của đèn LED. Kiểm tra Video demo ở cuối hướng dẫn này.
Sau khi chọn chu kỳ nhiệm vụ, bước tiếp theo sẽ là chọn chế độ PWM. Chế độ PWM chỉ định rằng bạn muốn PWM hoạt động như thế nào. Chủ yếu có 3 loại chế độ PWM. Những điều này như sau:
- PWM nhanh
- PWM đúng pha
- PWM đúng pha và tần số
PWM nhanh được sử dụng khi sự thay đổi pha không quan trọng. Bằng cách sử dụng Fast PWM, chúng tôi có thể xuất các giá trị PWM nhanh chóng. Không thể sử dụng Fast PWM khi thay đổi pha ảnh hưởng đến hoạt động như điều khiển động cơ, vì vậy trong ứng dụng này, các Chế độ PWM khác được sử dụng. Vì chúng tôi sẽ kiểm soát Độ sáng của đèn LED mà sự thay đổi pha sẽ không ảnh hưởng nhiều, vì vậy chúng tôi sẽ sử dụng chế độ Fast PWM.
Bây giờ để tạo PWM, chúng tôi sẽ điều khiển bộ đếm thời gian bên trong để đếm lên và sau đó đặt trở lại 0 tại một số đếm cụ thể, vì vậy bộ đếm thời gian sẽ đếm lên và sau đó đặt lại về 0 nhiều lần. Điều này thiết lập khoảng thời gian. Bây giờ chúng ta có tùy chọn điều khiển xung, BẬT xung ở một số đếm cụ thể trong bộ định thời khi nó tăng lên. Khi bộ đếm trở về 0, sau đó tắt xung. Có rất nhiều sự linh hoạt với điều này vì bạn luôn có thể truy cập số đếm của bộ đếm thời gian và cung cấp các xung khác nhau với một bộ hẹn giờ duy nhất. Điều này rất tốt khi bạn muốn điều khiển nhiều đèn LED cùng một lúc. Bây giờ chúng ta hãy bắt đầu giao tiếp một đèn LED với Atmega16 cho PWM.
Kiểm tra tất cả các dự án liên quan đến PWM tại đây.
Thành phần bắt buộc
- IC vi điều khiển AVR Atmega16
- Bộ dao động tinh thể 16Mhz
- Hai tụ điện 100nF
- Hai tụ điện 22pF
- Nút ấn
- Dây nhảy
- Breadboard
- USBASP v2.0
- 2 Led (Bất kỳ màu nào)
Sơ đồ mạch
Chúng tôi đang sử dụng OC2 cho PWM tức là Pin21 (PD7). Vì vậy, kết nối một đèn LED tại chân PD7 của Atmega16.
Lập trình Atmega16 cho PWM
Chương trình hoàn chỉnh được đưa ra dưới đây. Ghi chương trình trong Atmega16 bằng JTAG và Atmel studio và xem hiệu ứng PWM trên đèn LED. Độ sáng của nó sẽ tăng và giảm từ từ do chu kỳ nhiệm vụ khác nhau của PWM. Kiểm tra Video được đưa ra ở cuối.
Bắt đầu lập trình Atmega16 với việc thiết lập Thanh ghi Timer2. Các bit thanh ghi Timer2 như sau và chúng ta có thể đặt hoặc đặt lại các bit cho phù hợp.
Bây giờ chúng ta sẽ thảo luận về tất cả các bit của Timer2 để chúng ta có thể nhận được PWM mong muốn bằng cách sử dụng chương trình đã viết.
Chủ yếu có bốn phần trong thanh ghi Timer2:
FOC2 (Force Output Compare for Timer2): Bit FOC2 được đặt khi các bit WGM chỉ định Chế độ không phải PWM.
WGM2 (Chế độ tạo sóng cho Timer2): Các bit này điều khiển trình tự đếm của bộ đếm, nguồn cho giá trị bộ đếm lớn nhất (TOP) và kiểu tạo dạng sóng sẽ được sử dụng.
COM2 (So sánh chế độ đầu ra cho Timer2): Các bit này điều khiển hành vi đầu ra. Mô tả bit hoàn chỉnh được giải thích bên dưới.
TCCR2 - = (1 <
Đặt các bit WGM20 và WGM21 là CAO để kích hoạt Chế độ nhanh PWM. WGM là viết tắt của Chế độ tạo dạng sóng. Các bit lựa chọn như bên dưới.
WGM00 |
WGM01 |
Chế độ Timer2 Hoạt động |
0 |
0 |
Chế độ bình thường |
0 |
1 |
CTC (Xóa hẹn giờ khi so sánh đối sánh) |
1 |
0 |
PWM, Pha đúng |
1 |
1 |
Chế độ PWM nhanh |
Để biết thêm chi tiết về Chế độ tạo dạng sóng, bạn có thể tham khảo biểu dữ liệu chính thức của Atmega16.
TCCR2 - = (1 <
Ngoài ra, chúng tôi chưa sử dụng bất kỳ tỷ lệ trước nào vì vậy chúng tôi đã đặt thanh ghi nguồn Đồng hồ là '001'.
Các bit lựa chọn đồng hồ như sau:
CS22 |
CS21 |
CS20 |
Sự miêu tả |
0 |
0 |
0 |
Không có nguồn đồng hồ (Bộ hẹn giờ / Bộ đếm đã dừng) |
0 |
0 |
1 |
clk T2S / (Không đặt trước) |
0 |
1 |
0 |
Clk T2S / 8 (Từ Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (Từ Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (Từ Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (Từ Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (Từ Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (Từ Prescaler) |
Ngoài ra OC2 được xóa khi so sánh khớp bằng cách đặt bit COM21 là '1' và COM20 là '0'.
Các tùy chọn lựa chọn Chế độ đầu ra so sánh (COM) cho Chế độ PWM nhanh được đưa ra bên dưới:
COM21 |
COM21 |
Sự miêu tả |
0 |
0 |
Cổng hoạt động bình thường, OC2 bị ngắt kết nối. |
0 |
1 |
Kín đáo |
1 |
0 |
Xóa OC2 trên So sánh trận đấu, Đặt OC2 ở ĐẦU |
1 |
1 |
Đặt OC2 trên trận đấu so sánh, xóa OC2 ở TOP |
Tăng chu kỳ nhiệm vụ từ 0% lên 100% để độ sáng sẽ tăng theo thời gian. Lấy giá trị từ 0-255 và gửi đến chân OCR2.
for (duty = 0; duty <255; duty ++) // 0 đến chu kỳ nhiệm vụ tối đa { OCR2 = duty; // tăng từ từ độ sáng LED _delay_ms (10); }
Tương tự, giảm chu kỳ nhiệm vụ từ 100% xuống 0% để giảm dần độ sáng của đèn LED.
for (duty = 0; duty> 255; duty--) // tối đa đến 0 chu kỳ nhiệm vụ { OCR2 = duty; // giảm từ từ độ sáng LED _delay_ms (10); }
Điều này kết thúc Hướng dẫn sử dụng PWM trong Atmega16 / 32 của chúng tôi.