Tần số của đầu ra PWM trên Arduino là gì


22

Tần số nào Arduinos sử dụng cho PWM bình thường khi bạn sử dụng analogWrite ()?

Và nó có khác nhau cho mô hình Arduino khác nhau không? Tôi đặc biệt quan tâm đến Mega 2560, nhưng cũng muốn biết liệu nó có phù hợp giữa các mô hình hay không.

Tôi đã thấy một tài liệu tham khảo đến Arduino sử dụng 500 Hz, có vẻ rất chậm.


Điều đó cũng phụ thuộc vào pin bạn đang sử dụng.
Gerben

Câu trả lời:


31

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()micros().


1
Tôi tập hợp, sau đó, tần số nhanh nhất bạn có thể nhận được cho PWM là 16Mhz / 256 (prescaler = 1), hay 62.5Khz?
Duncan C

Và hơn nữa tần số PWM phải là một hệ số chẵn 62,5KHz? Ai đó trên một chủ đề khác muốn kiểm soát tốc độ quạt của quạt PC 4 chân. Rõ ràng nó muốn tín hiệu điều khiển PWM 25KHz. 62,5 / 25 là 2,5, không phải là giá trị nguyên.
Duncan C

Tôi đã cập nhật câu trả lời để giải thích chi tiết hơn về khả năng đạt được tần số cụ thể,
user2973

Ở đầu tần số thấp, bạn có thể đặt trước bộ hẹn giờ 16 bit ở chế độ đúng pha bằng bộ đếm trước 1024 để có được 16e6 / 1024/2 ^ 16/2 = 0.119Hz hoặc 7.1 chu kỳ / phút. Để thấp hơn thế, người ta sẽ cần phải chuyển các bit dựa trên thứ gì đó như millis (). Hoặc có thể kích hoạt bộ đếm trên chân đầu vào bên ngoài T?.
Dave X
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.