Tôi có thể sử dụng GPIO cho điều chế độ rộng xung (PWM) không?


97

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?


Bạn có thể cần chỉ định mô hình nào bạn đang sử dụng. Họ đều hơi khác nhau.
not2qubit

2
@ user1147688 Câu hỏi này đã được hỏi lại khi chỉ có một mô hình!
berry120

Câu trả lời:


76

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.

Khi nào phần mềm PWM có thể phù hợp?

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.

Khi nào phần cứng PWM có thể phù hợp?

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.

Điều gì xảy ra nếu tôi cần thêm đầu ra PWM phần cứng?

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.


Tôi có thể sử dụng phương pháp phần mềm PWM để chạy động cơ DC không?
gideon

@gideon - Có, các bộ khuếch đại công suất động cơ mà tôi đã sử dụng đều lấy PWM làm đầu vào của chúng.
Đánh dấu gian hàng

2
FYI, thư viện RPI ( pythonhosted.org/RPIO/pwm_py.html ) dường như có độ phân giải tốt hơn nhiều (1us) so với WiresPi với độ phân giải 100us
dm76

@MarkBooth - Không có probs. Thư viện được viết rất tốt và có thể được sử dụng để thay thế cho RPi.GPIO, rất tiện lợi nếu bạn bắt đầu một dự án với các tín hiệu PWM sau và sau đó nhận ra là cần thiết ...
dm76

RPIO.PWM có thể không còn hoạt động cho các mô hình pi mới hơn, tôi nghĩ vậy.
thạch

39

Phần cứng PWM

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

Mã ví dụ

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.

Phần mềm PWM

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.


1
Câu hỏi, định nghĩa hoặc một ví dụ về phần mềm PWM nghiêm trọng là gì? Và "hệ điều hành thời gian thực" là gì và có bao giờ có cơ hội nhận được một chiếc trên Pi
AnthonyBlake

@AnthonyBlake Chà, có lẽ bạn có thể kiểm soát độ sáng của ánh sáng bằng phần mềm PWM, nhưng tôi nghi ngờ một động cơ sẽ bị đình trệ. Không cần phải làm phần mềm PWM, phần cứng đơn giản và hiệu quả hơn. Hệ điều hành thời gian thực sẽ được Google giải thích rõ hơn; họ bảo đảm một số điều nhất định về thời gian và phần mềm thường chạy.
Alex Chamberlain

2
@AnthonyBlake "Hệ điều hành thời gian thực" (RTOS) là một hệ điều hành mang đến cho bạn sự đảm bảo về giới hạn thời gian thực hiện cao hơn. Giống như nói với chương trình "Có, bạn sẽ có thời gian thực hiện trong 33ms (cho hoặc chịu 2ms) để lật bit pin GPIO đó để đưa tín hiệu cho động cơ bước của bạn trong cửa sổ thời gian chính xác khi anh ta cần. Và bạn có thể tin cậy trên đó!" Có một RT Linux ngoài kia. Không biết nếu nó đã được chuyển đến RPi (chưa).
orithena

Xin lỗi Alex, tôi đã không cố ý ăn cắp một phần câu trả lời khác của bạn, nhưng tôi chỉ nhận thấy rằng chúng tôi đã đến cùng một bài đăng trên diễn đàn qua các tuyến đường khác nhau.
Đánh dấu gian hàng

2
Các mô hình mới hơn với 40 chân có một phần cứng PWM thứ hai được kết nối với GPIO19 (chân 35).
Kevin

12

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ụ: servoblasterpigpio của tôi , v.v.


Câu trả lời tốt đẹp! Làm thế nào tôi có thể sử dụng hai PWM đó? Tôi cần phải điều khiển 2 servo, tôi biết bạn nói servoblaster và pigpio đều ổn vì điều đó, nhưng tôi chỉ tự hỏi về HW PWM, vì tôi không thể tìm thấy bất cứ điều gì về chúng ... có một số tài liệu cho nó không? Tôi có RPi 2 V1.1 để thử nghiệm.
Kozuch


2
Tải CPU nặng không nên tạo sự khác biệt. Tải mạng nặng có thể tạo ra sự khác biệt cho gpioServo, đặc biệt nếu lấy mẫu ở tần số 1 MHz thay vì 200kHz mặc định. Tần số là 50 (Hz), phạm vi của các chu kỳ nhiệm vụ sẽ là 0 - 1000000 (được ánh xạ tới giá trị cơ bản thực sự là 0 - 5000000). 1 ms là 1 ms trong 20 ms nên một chu kỳ 5% nên 50000, 1,5ms-> 7,5% -> 75000, 2ms-> 10% -> 100000.
joan

1
Trang 102 của BCM2835 Thiết bị ngoại vi ARM hiển thị các chế độ khác nhau mà GPIO có thể được chỉ định. Nhìn trực tuyến mà GPIO được dẫn đến các tiêu đề mở rộng mô hình Pi khác nhau.
joan

1
@ user1147688 PLLD (500 MHz) được sử dụng làm đồng hồ PWM lõi. Do cách "nó" hoạt động, tần số lõi PWM là 250 MHz. Để có thể bật và tắt (khá cần thiết cho PWM) tối đa là 125 MHz. Bạn có thể nhân đôi số liệu bằng cách sử dụng PLLC (1000 MHz) nhưng PLL đó thay đổi theo tốc độ xung nhịp lõi.
joan

2

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 đọc ở đâu đó rằng cũng có giới hạn phần cứng về tần số chuyển đổi của pin đầu ra. Tôi nghĩ rằng nó là khoảng 20 MHz. Vì vậy, đừng mong đợi có thể kéo được 300 MHz PWM hoặc bất cứ thứ gì thuộc loại đó, ngay cả với việc sử dụng CPU 100%.
Ponkadoodle

@Wallacoloo: Ứng dụng nào yêu cầu 300 MHz PWM?
Peter Mortensen

2
@PeterMortensen: Chà tôi không biết làm thế nào các máy phát vô tuyến và những thứ đó tạo ra tín hiệu của chúng, nhưng một số có thể làm điều đó với PWM. PiFM thực hiện điều đó ở 100 MHz. Điều đó dường như mâu thuẫn với nhận xét của tôi, vì vậy tôi tự hỏi liệu có thể pin vẫn có thể được ra lệnh ở tần số đó không, nhưng chỉ là điện dung của pin làm suy giảm các tín hiệu như vậy, để sóng vuông 100 MHz thực sự dao động từ ví dụ (1.0 V , 2.3 V) thay vì phạm vi đầy đủ (0 V, 3.3 V).
Ponkadoodle

2

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)


Tôi đã thử điều này nhưng cho đến nay không có may mắn. Theo như tôi có thể nói nó không thực sự chuyển đổi phần cứng?
MrMowgli

1
Chỉ muốn va vào cái này. Pi-blaster đã làm việc cho tôi khi những câu trả lời khác không có.
Seph Reed
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.