Gần đây tôi đã có một số lý do để bắt đầu thử nghiệm với PWM, và thấy rằng (như được chỉ ra bởi một trong những ý kiến) tần số dường như thay đổi theo chu kỳ nhiệm vụ - bizzare, phải không? Nó chỉ ra rằng Broadcom đã triển khai PWM "cân bằng" để làm cho các xung PWM bật và tắt phân bố đều nhất có thể. Họ đưa ra một mô tả về thuật toán và một số thảo luận thêm trên trang 139 của bảng dữ liệu của họ:
http://www.element14.com/community/servlet/JiveServlet/doadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Vì vậy, những gì bạn thực sự muốn là đặt PWM ở chế độ không gian đánh dấu, sẽ cung cấp cho bạn các PWM truyền thống (và có thể dự đoán được) mà bạn đang tìm kiếm:
pwmSetMode(PWM_MODE_MS);
Phần còn lại của câu trả lời cho rằng chúng ta đang ở chế độ không gian đánh dấu.
Tôi cũng đã thực hiện một số thử nghiệm với phạm vi giá trị cho phép pwmSetClock()
và pwmSetRange()
. Như đã lưu ý trong một trong những câu trả lời khác, phạm vi hợp lệ pwmSetClock()
dường như đi từ 2 đến 4095, trong khi phạm vi hợp lệ pwmSetRange()
lên tới 4096 (tôi không cố gắng tìm giới hạn thấp hơn).
Phạm vi và đồng hồ (một tên tốt hơn có lẽ là ước số) cả hai đều ảnh hưởng đến tần số. Phạm vi cũng ảnh hưởng đến độ phân giải, do đó, trong khi có thể sử dụng các giá trị rất thấp, có một giới hạn thực tế về mức độ thấp mà bạn có thể muốn đi. Ví dụ: nếu bạn đã sử dụng phạm vi 4, bạn có thể đạt được tần số cao hơn, nhưng bạn sẽ chỉ có thể đặt chu kỳ nhiệm vụ thành 0/4, 1/4, 2/4, 3/4 hoặc 4/4.
Đồng hồ Raspberry Pi PWM có tần số cơ bản là 19,2 MHz. Tần số này, được chia cho đối số pwmSetClock()
là, tần số mà bộ đếm PWM được tăng lên. Khi bộ đếm đạt giá trị bằng phạm vi đã chỉ định, nó sẽ đặt lại về không. Trong khi bộ đếm nhỏ hơn chu kỳ nhiệm vụ được chỉ định, đầu ra cao, nếu không thì đầu ra thấp.
Điều này có nghĩa là, nếu bạn muốn đặt PWM có tần số cụ thể, bạn có thể sử dụng mối quan hệ sau:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Nếu bạn sử dụng các giá trị tối đa cho phép cho pwmSetClock()
và pwmSetRange()
, bạn sẽ kết thúc với tần số PWM phần cứng tối thiểu có thể đạt được là ~ 1,14 Hz. Điều này chắc chắn sẽ cung cấp ánh sáng nhấp nháy có thể nhìn thấy (thực sự nhiều hơn một đèn flash) cho đèn LED. Tôi đã xác nhận phương trình trên với một máy hiện sóng, và nó dường như giữ. Giới hạn tần số trên sẽ bị ảnh hưởng bởi độ phân giải bạn cần, như được mô tả ở trên.
pwmWrite()
. Không có điều gì tôi mong đợi sẽ xảy ra