Tôi có thể sử dụng GPIO làm đầu ra điều chế độ rộng xung không?
Nếu vậy, tôi sẽ thực hiện nó như thế nào và tôi có thể có bao nhiêu đầu ra PWM đồng thời, khác biệt?
Tôi có thể sử dụng GPIO làm đầu ra điều chế độ rộng xung không?
Nếu vậy, tôi sẽ thực hiện nó như thế nào và tôi có thể có bao nhiêu đầu ra PWM đồng thời, khác biệt?
Câu trả lời:
Theo đề xuất của Alex Chamberlain , thư viện WiresPi dường như hỗ trợ cả đầu ra PWM phần cứng trên một hoặc hai chân GPIO tùy thuộc vào kiểu máy và phần mềm PWM trên bất kỳ chân GPIO nào khác. Trong khi đó, thư viện RPIO.PWM thực hiện PWM bằng DMA trên bất kỳ chân GPIO nào. Thực tế, đây là một ngôi nhà nửa chừng giữa phần cứng và phần mềm PWM, cung cấp độ phân giải thời gian 1vs so với 100 Lời nói với phần mềm PWM của WiresPi's [1] .
Cái nào trong số này phù hợp với các ứng dụng của bạn phụ thuộc vào số lượng đầu ra PWM bạn cần và hiệu suất bạn muốn trong số các đầu ra đó.
Nếu ứng dụng của bạn là khoan dung độ phân giải-thời gian thấp và cao jitter sau đó bạn có thể sử dụng một phần mềm hoặc DMA hỗ trợ vòng lặp thời gian. Nếu bạn muốn độ chính xác cao hơn / jitter PWM thấp hơn thì bạn có thể cần hỗ trợ phần cứng.
Nếu bạn muốn chiếu một loạt đèn LED với các nhịp khác nhau có thể nhìn thấy được của con người (10 hertz) với các yêu cầu đáp ứng thời gian thực mềm thì vòng lặp phần mềm có thể xử lý nhiều chân PWM như bạn có chân GPIO.
Nếu bạn muốn điều khiển một động cơ servo với các yêu cầu đáp ứng thời gian thực cứng thì bạn sẽ cần sử dụng phần cứng PWM. Thậm chí sau đó bạn có thể gặp sự cố khi đảm bảo đáp ứng thời gian thực cho vòng lặp servo liên kết đầu vào bộ mã hóa với đầu ra PWM.
Một vòng lặp servo ổn định cần phải đọc các bộ mã hóa ở tốc độ thông thường (jitter thấp), ghi ra các giá trị đầu ra PWM được sửa đổi ở tốc độ thường xuyên và độ trễ giữa các bộ này phải được cố định (tổng jitter thấp). Nếu bạn không thể làm điều này, thì bạn sẽ phải thực hiện (điều chỉnh mềm) động cơ của mình để ngăn chặn nó không ổn định khi tải. Điều này khó thực hiện với một hệ điều hành đa tác vụ mà không có hỗ trợ cấp thấp.
Nếu bạn cần chạy nhiều vòng servo hơn so với đầu ra PWM phần cứng, thì có lẽ bạn sẽ cần phải giảm tải chúng sang một thiết bị khác để đảm bảo hiệu suất thời gian thực cứng, đưa Raspberry Pi trở thành người giám sát thời gian thực mềm .
Một tùy chọn, sẽ là một cái gì đó giống như Trình điều khiển PWM / Servo 12-bit 12 kênh Adaf nhung - Giao diện I²C - PCA9685 cho phép bạn điều khiển 16 đầu ra PWM chỉ bằng một vài chân GPIO cho bus I²C. Để biết ví dụ về việc sử dụng nó, hãy xem Breakout Servo / Servo 16 kênh I²C - Bài đăng hoạt động trên các diễn đàn Raspberry Pi.
1. Cảm ơn dm76 về đề xuất này, tuy nhiên heather nói rằng RPIO.PWM có thể không còn hoạt động cho các mẫu pi mới hơn.
Có, có một đầu ra PWM phần cứng trên Raspberry Pi, được kết nối với P1-12 (GPIO18). Hơn nữa, các đầu ra PWM có thể được thêm vào bằng giao diện I²C hoặc SPI ; một số người đã thành công với điều này ( bài diễn đàn ).
Bạn có thể sử dụng thư viện WiresPi để điều khiển chân PWM; bạn có thể nhìn vào mã để tránh bao gồm toàn bộ thư viện.
Raspberry Pi không phù hợp với bất kỳ phần mềm PWM nghiêm trọng nào vì Linux không phải là hệ điều hành thời gian thực.
Pis gần đây có hai kênh PWM phần cứng. Ngoài ra, các xung PWM được định thời phần cứng có thể được tạo độc lập trên tất cả các GPIO được kết nối với tiêu đề mở rộng 40 pin.
Trong thực tế, điều này có nghĩa là có hai kênh PWM có độ chính xác cao và tất cả các GPIO khác có thể có kiểu PWM Arduino (800 Hz, tắt 0 - bật hoàn toàn 255).
Ví dụ: servoblaster và pigpio của tôi , v.v.
Không hoàn toàn là HĐH thời gian thực, nhưng RISC OS cho Raspberry Pi là đa nhiệm hợp tác, vì vậy bạn có thể dễ dàng chạy một ứng dụng có CPU 100% để bạn có thể quản lý thời gian của mình tốt hơn nhiều. Chỉ không mong đợi để làm bất cứ điều gì khác ngoài mã của riêng bạn.
Tôi đã tìm thấy thư viện này ( pi-blaster ) tự nhận là "cực kỳ hiệu quả: không sử dụng CPU và cho các xung rất ổn định."
Tôi chưa thử nghiệm nó, nhưng sẽ cập nhật ngay khi tôi làm (có thể là hôm nay)