Tín hiệu PWM được tạo bởi bộ định thời trên các chip AVR. Mỗi bộ đếm thời gian có thể tạo tín hiệu PWM trên hai hoặc ba chân khác nhau. Mỗi pin có thể có chu kỳ nhiệm vụ riêng, nhưng chúng chia sẻ tần số PWM. Bạn có thể thay đổi tần số của PWM bằng cách thay đổi nguồn xung nhịp cho bộ định thời. Theo mặc định, họ sử dụng đồng hồ CPU chia cho 64, tức là. họ có bộ đếm trước được đặt thành 64 bằng mã khởi tạo Arduino. Để gây nhầm lẫn hơn nữa, có hai chế độ PWM khác nhau: PWM nhanh và PWM đúng pha. Trong PWM nhanh, bộ đếm thời gian đếm đến 255, sau đó tràn ra và bắt đầu lại từ 0 (256 trạng thái khác nhau). Trong chế độ PWM đúng pha, bộ định thời đếm đến 255, sau đó thay đổi hướng và đếm xuống 0, thay đổi hướng và cứ thế (510 trạng thái khác nhau).
Arduino Mega có 5 bộ định thời, timer0 - timer4. Bởi vì timer0 cũng được sử dụng cho các chức năng millis và micros, nó sử dụng PWM nhanh, trong khi các bộ định thời khác được cấu hình cho PWM đúng pha. Điều này dẫn đến các tần số khác nhau trên các chân khác nhau:
Chân 4 và 13, được điều khiển bởi bộ định thời0:
16 Mhz / 64/256 = 976,56 Hz
Các chân PWM khác, được điều khiển bởi bộ định thời1-4:
16 Mhz / 64/510 = 490,20 Hz
Tính toán là: Số trạng thái của Clock / Prescaler / PWM
Tình hình là giống nhau cho tất cả các bo mạch Arduino khác mà tôi biết, ngoại trừ chúng có ít bộ định thời kết nối với các chân khác nhau.
Bạn có thể thay đổi tần số PWM bằng cách thay đổi bộ đếm thời gian. Xem trang này: http://playground.arduino.cc/Main/TimerPWMChcoateet
Cũng có thể làm cho bộ định thời được tính thành một giá trị khác với 255. Trên bộ định thời 8 bit, bạn sẽ mất một chân đầu ra, nhưng trên bộ định thời 16 bit, bạn có thể sử dụng Thanh ghi chụp đầu vào để xác định giá trị TOP. Chức năng chụp đầu vào là một tính năng hiếm khi được sử dụng trong cộng đồng Arduino nên bạn có thể sẽ không bỏ lỡ nó.
Các thư viện Arduino chỉ cho phép bạn sử dụng độ phân giải 8 bit, ngay cả trên bộ định thời 16 bit. Nếu bạn muốn độ phân giải cao hơn, bạn sẽ phải viết analogWrite của riêng bạn hoặc sử dụng một thư viện được tạo ra cho mục đích này. Trên Arduino Mega timer0 và timer2 là 8 bit, còn lại là 16 bit.
Bằng cách thay đổi chế độ của bộ định thời 16 bit để sử dụng độ phân giải đầy đủ, kết hợp với thay đổi giá trị trước và giá trị TOP, bạn có thể đạt được dải tần số PWM rất rộng.
Tần số tối đa bạn có thể đạt được là xung nhịp / 4, bằng cách đặt bộ đếm gộp thành 1 và TOP thành 3 ở chế độ PWM nhanh - không cho phép giá trị thấp hơn. Điều này sẽ cung cấp cho bạn một PWM 4 MHz với độ phân giải 2 bit. Nó có thể là 0%, 25%, 50% hoặc 75% thời gian. Giá trị TOP cao hơn sẽ cho bạn độ phân giải cao hơn với tần suất thấp hơn.
Để giải thích dài hơn, hãy đọc bài viết này hoặc tham khảo bảng dữ liệu .
Thay đổi bộ đếm gộp trước, chế độ PWM hoặc giá trị TOP cho timer0 sẽ gây rối millis()
và micros()
.