Làm thế nào Arduino Uno có thể hỗ trợ lên đến 12 servo nếu nó chỉ có 6 chân PWM kỹ thuật số?


10

Theo đó :

Thư viện Servo hỗ trợ tối đa 12 động cơ trên hầu hết các bo mạch Arduino và 48 trên Arduino Mega. Trên các bo mạch khác ngoài Mega, việc sử dụng thư viện sẽ vô hiệu hóa chức năng analogWrite () (PWM) trên các chân 9 và 10, cho dù có hay không có Servo trên các chân đó. Trên Mega, có thể sử dụng tối đa 12 servo mà không can thiệp vào chức năng PWM; sử dụng động cơ 12 đến 23 sẽ vô hiệu hóa PWM trên chân 11 và 12.

Tuy nhiên, theo điều này :

Chân I / O kỹ thuật số 14 (trong đó 6 cung cấp đầu ra PWM)

Vậy làm thế nào để Uno có thể điều khiển hơn 6 servo nếu nó chỉ có 6 chân I / O kỹ thuật số có thể cung cấp đầu ra PWM?

Câu trả lời:


8

Thư viện Servo không sử dụng PWM. Khi bạn gọi write (), nó sẽ tính độ rộng xung tính bằng micro giây và lưu trữ nó trong một mảng toàn cục. Sau đó, có một bộ định thời duy nhất thường xuyên kích hoạt ngắt làm thay đổi tín hiệu đầu ra theo độ rộng xung mong muốn của mỗi kênh.

Bạn có thể tìm thấy mã nguồn dưới đây: liên kết Github


1
Vì vậy, về cơ bản nó mô phỏng PWM? Điểm của các chân kỹ thuật số với các kênh PWM là gì?
user41158

2
Nói chung, các xung servo dài khoảng 1 ms. Do đó, chúng phải được điều khiển bởi các tần số xung quanh 1 kHz, rất dễ tạo ra bởi phần mềm trên bất kỳ đầu ra nào có micro chạy ở tần số vài MHz. Đầu ra AVR PWM được tạo bởi phần cứng chuyên dụng và có thể đạt tần số CPU nhưng số lượng kênh bị hạn chế. Tôi đoán các tác giả của mô-đun Servo đã quyết định sử dụng một bộ đếm thời gian duy nhất để xử lý nhiều kênh như chân và lưu phần cứng PWM cho các mục đích sử dụng khác.
Grapsus

1
PWM của đầu ra Arduino dành cho đầu ra công suất biến đổi với chu kỳ nhiệm vụ từ 0 đến 100%. Điều khiển "PWM" kiểu RC có phạm vi chu kỳ nhiệm vụ rất hạn chế - 1000 chúng tôi ở 50 Hz là 5%, 2000 chúng tôi ở 50 Hz là 10%. Hãy nghĩ về RC PWM như một "chuỗi xung" chứ không phải là "PWM" truyền thống.
Jon Watte

@ user41158 Nếu bạn có thời gian CPU không giới hạn, bạn có thể sử dụng bất kỳ đầu ra kỹ thuật số nào dưới dạng PWM và điều khiển chúng trong phần mềm, không chỉ là PWM, theo lý thuyết bạn có thể tạo bất kỳ hệ thống truyền thông kỹ thuật số nào bằng cách viết chương trình và chuyển đổi các đầu ra này, nó được gọi là " bit- đập ". Nhưng trong thực tế, thời gian CPU không phải là không giới hạn và tốt nhất là giải quyết các tác vụ phần cứng bằng phần cứng. Đối với điều khiển servo, tần số PWM khá thấp, do đó, thực tế là phải đập bit PWM trong phần mềm để tạo đầu ra bổ sung.
比尔

2

6 chân PWM sử dụng UART tích hợp trên ATmega328P để tạo đầu ra của chúng. Điều này làm cho các xung rất nhanh cho đầu ra "analog" chất lượng cao hơn. Vì servo giao tiếp với tốc độ đủ chậm, chúng có thể được điều khiển bằng các ngắt phần mềm. Các ngắt phần mềm đi xa khỏi mã bạn đang thực thi và chạy mã đi kèm với thư viện servo. Mã này sử dụng các phương tiện tiêu chuẩn để thay đổi trạng thái của các chân. Bằng cách thực hiện bằng cách sử dụng các ngắt thay vì sử dụng UART, bạn sẽ lãng phí thời gian xử lý nhưng có được khả năng lái nhiều động cơ hơn.


Bạn có thể giải thích (hoặc liên kết đến) nhiều hơn? UART được sử dụng cho PWM như thế nào?
Martin Thompson

Tôi nghĩ sẽ tốt hơn nếu nói rằng thư viện PWM có thể sử dụng các chân I / O UART nếu muốn. thư viện PWM sẽ không sử dụng chính UART, nhưng các chân được sử dụng bởi UART cũng có thể được sử dụng làm I / O kỹ thuật số tiêu chuẩn nếu không cần thiết cho UART.
Peter Bennett
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.