Bisakah saya menggunakan GPIO untuk modulasi lebar pulsa (PWM)?

97

Bisakah saya menggunakan GPIO sebagai output modulasi lebar-pulsa ?

Jika demikian, bagaimana cara saya melakukannya dan berapa banyak output PWM bersamaan yang dapat saya miliki?

berry120
sumber
Anda mungkin perlu menentukan model mana yang Anda gunakan. Mereka semua sedikit berbeda.
not2qubit
2
@ user1147688 Pertanyaan ini ditanyakan kembali ketika hanya ada satu model!
berry120

Jawaban:

76

Seperti yang disarankan oleh Alex Chamberlain , pustaka WiringPi tampaknya mendukung output PWM perangkat keras pada satu atau dua pin GPIO tergantung pada model, dan PWM perangkat lunak pada salah satu pin GPIO lainnya. Sementara itu perpustakaan RPIO.PWM melakukan PWM oleh DMA pada pin GPIO apa pun. Secara efektif ini adalah setengah jalan antara perangkat keras dan perangkat lunak PWM, memberikan resolusi waktu 1 μs dibandingkan dengan 100 μs dengan Perangkat Lunak PWM WiringPi [1] .

Yang mana yang cocok untuk aplikasi Anda tergantung pada berapa banyak output PWM yang Anda butuhkan dan kinerja apa yang Anda inginkan dari output tersebut.

Jika aplikasi Anda toleran terhadap resolusi timing rendah dan jitter tinggi, maka Anda dapat menggunakan perangkat lunak atau loop timing berbantuan DMA. Jika Anda ingin presisi tinggi / PWM jitter yang lebih rendah maka Anda mungkin memerlukan bantuan perangkat keras.

Kapan PWM perangkat lunak cocok?

Jika Anda ingin mem-flash sekelompok LED dengan irama manusia yang terlihat berbeda (10's dari hertz) dengan persyaratan respons real-time lunak maka loop perangkat lunak dapat menangani PWM sebanyak yang Anda miliki dengan pin GPIO.

Kapan PWM perangkat keras mungkin cocok?

Jika Anda ingin mengendalikan motor servo dengan persyaratan respons waktu nyata yang keras, maka Anda harus menggunakan PWM perangkat keras. Bahkan kemudian Anda mungkin memiliki masalah memastikan respon real-time untuk loop servo yang mengikat input encoder ke output PWM.

Servo loop yang stabil perlu membaca encoders dengan kecepatan reguler (jitter rendah), menuliskan nilai-nilai output PWM yang direvisi pada laju reguler dan latensi di antaranya harus diperbaiki (keseluruhan jitter rendah). Jika Anda tidak dapat melakukan ini, maka Anda harus menjalankan (soft tune) motor Anda untuk mencegahnya menjadi tidak stabil di bawah beban. Ini sulit dilakukan dengan sistem operasi multi-tasking tanpa dukungan level rendah.

Bagaimana jika saya membutuhkan lebih banyak output PWM perangkat keras?

Jika Anda perlu menjalankan lebih banyak servo loop daripada yang Anda miliki dengan output PWM perangkat keras, maka Anda mungkin perlu melepasnya ke perangkat lain untuk memastikan kinerja real-time yang sulit, menurunkan Raspberry Pi Anda menjadi supervisor real-time yang lembut .

Satu opsi, akan menjadi seperti Driver Adafruit 16-Channel 12-bit PWM / Servo - antarmuka I²C - PCA9685 yang memungkinkan Anda untuk mengontrol 16 output PWM hanya dengan beberapa pin GPIO untuk bus I²C. Untuk contoh penggunaannya, lihat I²C 16 Channel PWM / Servo Breakout - Postingan kerja di forum Raspberry Pi.

1. Terima kasih kepada dm76 untuk sarannya, namun heather mengatakan bahwa RPIO.PWM mungkin tidak lagi berfungsi untuk model pi yang lebih baru.

Mark Booth
sumber
Dapatkah saya menggunakan pendekatan PWM perangkat lunak untuk menjalankan motor DC?
gideon
@ Gideon - Ya, penguat daya motor yang saya gunakan semua mengambil PWM sebagai input mereka.
Mark Booth
2
FYI, perpustakaan RPI ( pythonhosted.org/RPIO/pwm_py.html ) tampaknya memiliki resolusi yang jauh lebih baik (1us) dibandingkan dengan WiringPi dengan resolusi 100us
dm76
@MarkBooth - Tidak ada masalah. Perpustakaan ditulis dengan sangat baik dan dapat digunakan sebagai pengganti untuk RPi.GPIO yang sangat berguna jika Anda memulai proyek dengan yang terakhir dan kemudian menyadari sinyal PWM diperlukan ...
dm76
RPIO.PWM mungkin tidak lagi berfungsi untuk model pi yang lebih baru, saya pikir.
heather
39

PWM perangkat keras

Ya, ada satu output PWM perangkat keras pada Raspberry Pi, yang terhubung ke P1-12 (GPIO18). Selanjutnya, output PWM dapat ditambahkan menggunakan antarmuka I²C atau SPI ; beberapa orang telah sukses dengan ini ( posting forum ).

Kode Contoh

Anda dapat menggunakan perpustakaan WiringPi untuk mengontrol pin PWM; Anda bisa melihat kode untuk menghindari menyertakan seluruh perpustakaan.

PWM perangkat lunak

Raspberry Pi tidak cocok untuk PWM perangkat lunak serius karena Linux bukan sistem operasi waktu-nyata.

Alex Chamberlain
sumber
1
Pertanyaan, apa definisi atau contoh PWM perangkat lunak yang serius? Dan apa yang dimaksud dengan "sistem operasi waktu nyata" dan apakah ada peluang untuk mendapatkannya di Pi
AnthonyBlake
@AnthonyBlake Yah, Anda mungkin dapat mengontrol kecerahan cahaya menggunakan perangkat lunak PWM, tapi saya curiga motor akan macet. Tidak perlu melakukan perangkat lunak PWM, perangkat keras lebih sederhana dan lebih efektif. Sistem operasi waktu nyata akan lebih baik dijelaskan oleh Google; mereka menjamin hal-hal tertentu tentang berapa lama dan sering kali perangkat lunak dijalankan.
Alex Chamberlain
2
@AnthonyBlake "Real-Time OS" (RTOS) adalah sistem operasi yang memberi Anda jaminan pada batas waktu eksekusi atas. Seperti mengatakan pada program "Ya, Anda akan memiliki waktu eksekusi dalam 33ms (memberi atau mengambil toleransi 2ms) untuk membalik bit pin GPIO untuk memberikan motor langkah Anda sinyal di jendela waktu yang tepat ketika ia membutuhkannya. Dan Anda dapat mengandalkan itu! " Ada RT Linux di luar sana. Tidak tahu apakah porting telah dikirim ke RPi (belum).
orithena
Maaf Alex, saya tidak sengaja mencuri bagian lain dari jawaban Anda, tetapi saya baru saja memperhatikan bahwa kami datang ke posting forum yang sama melalui rute yang berbeda.
Mark Booth
2
Model yang lebih baru dengan 40 pin memiliki PWM perangkat keras kedua yang terhubung ke GPIO19 (pin 35).
Kevin
12

Pis terbaru memiliki dua saluran PWM perangkat keras. Selain itu, pulsa PWM berwaktu perangkat keras dapat dihasilkan secara independen pada semua GPIO yang terhubung ke header ekspansi 40 pin.

Dalam praktiknya ini berarti ada dua saluran PWM yang sangat akurat dan semua GPIO lainnya mungkin memiliki PWM gaya Arduino (800 Hz, 0 off - 255 sepenuhnya aktif).

Misalnya servoblaster dan pigpio saya , dll.

joan
sumber
Jawaban bagus! Bagaimana saya bisa menggunakan kedua PWM HW itu? Saya perlu mengontrol 2 servos, saya tahu Anda mengatakan servoblaster dan pigpio tidak masalah untuk itu, tapi saya hanya ingin tahu tentang HW PWM, karena saya tidak dapat menemukan apa pun tentang mereka ... apakah ada beberapa dokumen untuk itu di luar sana? Saya punya RPi 2 V1.1 untuk tes.
Kozuch
2
Beban CPU yang berat seharusnya tidak membuat perbedaan. Beban jaringan yang berat dapat membuat perbedaan untuk gpioServo terutama jika pengambilan sampel pada 1MHz daripada 200kHz default. Frekuensinya adalah 50 (Hz), rentang siklus tugasnya adalah 0 - 10.00000 (dipetakan ke nilai sebenarnya yang mendasari 0 - 5000000). 1 ms adalah 1 ms dalam 20 ms jadi dutycycle 5% jadi 50000, 1,5ms-> 7,5% -> 75000, 2ms-> 10% -> 100000.
joan
1
Halaman 102 dari BCM2835 ARM Peripherals menunjukkan berbagai mode yang dapat ditetapkan oleh GPIO. Lihat online yang GPIO mengarah ke berbagai header ekspansi model Pi.
joan
1
@ user1147688 PLLD (500MHz) digunakan sebagai clock inti PWM. Karena cara "itu" bekerja, frekuensi inti PWM adalah 250 MHz. Untuk dapat menghidupkan dan mematikan (sangat penting untuk PWM) maksimal adalah 125 MHz. Anda dapat menggandakan angka dengan menggunakan PLLC (1000 MHz) tetapi PLL itu bervariasi dengan kecepatan clock inti.
joan
2

Bukan OS real-time, tetapi RISC OS untuk Raspberry Pi adalah multitasking yang kooperatif, sehingga Anda dapat dengan mudah menjalankan aplikasi yang memiliki 100% CPU sehingga Anda dapat mengatur timing Anda dengan lebih baik. Hanya saja, jangan berharap untuk melakukan hal lain selain kode Anda sendiri.

John
sumber
Saya membaca di suatu tempat bahwa ada batas perangkat keras untuk frekuensi switching pin output juga. Saya pikir itu sekitar 20 MHz. Jadi jangan berharap dapat menarik 300 MHz PWM atau hal semacam itu, bahkan dengan penggunaan CPU 100%.
Ponkadoodle
@ Wallalloloo: Aplikasi apa yang membutuhkan 300 MHz PWM?
Peter Mortensen
2
@ PeterMensensen: Yah saya tidak tahu bagaimana pemancar radio dan semacamnya menghasilkan sinyal mereka, tetapi beberapa mungkin melakukannya dengan PWM. PiFM melakukan itu pada 100 MHz. Itu tampaknya bertentangan dengan komentar saya, jadi saya bertanya-tanya apakah mungkin pin masih dapat diperintahkan pada frekuensi itu, tapi hanya saja kapasitansi pin melemahkan sinyal seperti itu, sehingga gelombang persegi 100 MHz mungkin benar-benar terombang-ambing dari misalnya (1.0 V) , 2,3 V) bukannya rentang penuh (0 V, 3,3 V).
Ponkadoodle
2

Saya telah menemukan perpustakaan ini ( pi-blaster ) yang mengklaim sebagai "sangat efisien: tidak menggunakan CPU dan memberikan pulsa yang sangat stabil."

Saya belum mengujinya, tetapi akan memperbarui segera setelah saya lakukan (mungkin hari ini)

Glantucan
sumber
Saya sudah mencoba ini tetapi sejauh ini tidak berhasil. Sejauh yang saya tahu itu tidak benar-benar mengganti perangkat keras?
MrMowgli
1
Hanya ingin menabrak ini. Pi-blaster telah bekerja untuk saya di mana jawaban lain ini tidak.
Seph Reed