GPIOをパルス幅変調(PWM)に使用できますか?


97

GPIOをパルス幅変調出力として使用できますか?

もしそうなら、私はそれをどのように行おうとし、同時にいくつの異なるPWM出力を得ることができますか?


おそらく、使用しているモデルを指定する必要があります。それらはすべてわずかに異なります。
not2qubit

2
@ user1147688この質問は、モデルが1つしかないときに返されました!
berry120

回答:


76

Alex Chamberlainが提案したように、WiringPiライブラリは、モデルに応じて1つまたは2つのGPIOピンでのハードウェアPWM出力と、他のGPIOピンでのソフトウェアPWMの両方をサポートするようです。一方、RPIO.PWMライブラリは、GPIOピンでDMAによりPWM を実行します。事実上、これはハードウェアとソフトウェアPWMの中間に位置し、WiringPiのソフトウェアPWM [1]では100 µsであったのに対し、1 µsのタイミング分解能を提供します。

これらのうちどれがアプリケーションに適しているかは、必要なPWM出力の数と、それらの出力に必要なパフォーマンスによって異なります。

アプリケーションが低タイミング解像度と高ジッターに耐性がある場合は、ソフトウェアまたはDMA支援のタイミングループを使用できます。高精度/低ジッタPWMが必要な場合は、ハードウェアの支援が必要になる場合があります。

ソフトウェアPWMが適しているのはいつですか?

さまざまな人間の目に見えるリズム(10ヘルツ)のLEDをソフトリアルタイムの応答要件でフラッシュする場合、ソフトウェアループはGPIOピンと同じ数のPWMを処理できます。

ハードウェアPWMが適しているのはいつですか?

ハードリアルタイムの応答要件でサーボモーターを制御する場合は、ハードウェアPWMを使用する必要があります。それでも、エンコーダ入力をPWM出力に結び付けるサーボループのリアルタイム応答を確保するのに問題がある場合があります。

安定したサーボループは、エンコーダーを通常のレート(低ジッター)で読み取り、修正されたPWM出力値を通常のレートで書き出す必要があり、これらの間のレイテンシは固定する必要があります(全体的に低ジッター)。これができない場合は、負荷がかかって不安定になるのを防ぐために、モーターをアンダーチューニング(ソフトチューニング)する必要があります。これは、低レベルのサポートがないマルチタスクオペレーティングシステムでは困難です。

さらにハードウェアPWM出力が必要な場合はどうすればよいですか?

ハードウェアPWM出力よりも多くのサーボループを実行する必要がある場合は、ハードリアルタイムパフォーマンスを確保するためにそれらを別のデバイスにオフロードし、Raspberry Piをソフトリアルタイムスーパーバイザーに委ねる必要があります。

1つのオプションは、Adafruit 16チャンネル12ビットPWM /サーボドライバー-I²Cインターフェース-PCA9685のようなもので、これにより、I²Cバス用のGPIOのいくつかのピンで16個のPWM出力を制御できます。その使用例については、I²C16チャンネルPWM /サーボブレイクアウト -Raspberry Piフォーラムのワーキングポストをご覧ください。

1. 提案のためのdm76に感謝しますが、ヘザーはRPIO.PWMが新しいpiモデルでは動作しない可能性があると言います。


ソフトウェアPWMアプローチを使用してDCモーターを実行できますか?
ギデオン

@gideon-はい、使用したモーターパワーアンプはすべて入力としてPWMを使用しています。
マークブース

2
FYI、RPIライブラリ(pythonhosted.org/RPIO/pwm_py.htmlは)100US解像度WiringPiに比べてはるかに優れた解像度(1US)を持っているように見える
dm76

@MarkBooth-問題ありません。ライブラリは、本当によく書かれている、あなたが後者以降実現PWM信号が必要であったとのプロジェクトを開始した場合に非常に便利ですRPi.GPIOのドロップイン置換として使用することができます...
dm76

RPIO.PWMは、新しいpiモデルでは動作しなくなる可能性があります。
ヘザー

39

ハードウェアPWM

はい、Raspberry PiにはハードウェアPWM出力が1つあり、P1-12(GPIO18)に接続されています。さらに、I²CまたはSPIインターフェースを使用してPWM出力を追加できます。一部の人々はこれで成功しました(フォーラム投稿)。

サンプルコード

WiringPiライブラリを使用して、PWMピンを制御できます。ライブラリ全体を含めないようにコードを確認できます。

ソフトウェアPWM

Linuxはリアルタイムオペレーティングシステムではないため、Raspberry Piは深刻なソフトウェアPWMには適していません。


1
質問、深刻なソフトウェアPWMの定義または例は何ですか?また、「リアルタイムオペレーティングシステム」とは何
ですか。Piにアクセス

@AnthonyBlakeまあ、おそらくソフトウェアPWMを使用してライトの明るさを制御できますが、モーターが停止するのではないかと思います。ただし、ソフトウェアPWMを実行する必要はありません。ハードウェアはよりシンプルで効果的です。リアルタイムオペレーティングシステムについては、Googleがより適切に説明します。彼らは、ソフトウェアがどれくらいの時間、そして頻繁に実行されるかについて特定のことを保証します。
アレックスチェンバレン

2
@AnthonyBlake「リアルタイムOS」(RTOS)は、実行の上限時間を保証するオペレーティングシステムです。プログラムに言うように、「はい、33msの実行時間(許容または2msの許容誤差)があり、そのGPIOピンビットを反転させて、ステップモーターに必要なときに正確な時間ウィンドウで信号を送信します。その上!」RT Linuxがあります。RPiに移植されたかどうかはわかりません(まだ)。
オリテナ

アレックス、ごめんなさい、あなたの答えの別の部分を意図的に盗むことはしませんでしたが、異なるルートを経由して同じフォーラム投稿に来たことがわかりました。
マークブース

2
40ピンの新しいモデルには、GPIO19(ピン35)に接続された2番目のハードウェアPWMがあります。
ケビン

12

最近のPiには2つのハードウェアPWMチャネルがあります。さらに、40ピン拡張ヘッダーに接続されているすべてのGPIOでハードウェアタイミングPWMパルスを個別に生成できます。

実際には、これは2つの非常に正確なPWMチャネルがあり、他のすべてのGPIOがArduinoスタイルのPWM(800 Hz、0オフ-255完全オン)を持つ可能性があることを意味します。

例えば、サーボブラスターと私のpigpioなど。


素敵な答え!これら2つのHW PWMを使用するにはどうすればよいですか?2つのサーボを制御する必要がありますが、サーボブラスターとpigpioはそれでいいと言いますが、HW PWMについては疑問に思っています。テスト用のRPi 2 V1.1があります。
コズチ


2
重いCPU負荷でも違いはありません。特にデフォルトの200kHzではなく1MHzでサンプリングする場合、ネットワーク負荷が大きいとgpioServoに違いが生じる可能性があります。周波数は50(Hz)で、デューティサイクルの範囲は0〜1000000(0〜5000000の真の基礎値にマッピングされます)です。1ミリ秒は20ミリ秒で1ミリ秒なので、5%のデューティサイクルなので、50000、1.5ms-> 7.5%-> 75000、2ms-> 10%-> 100000です。
ジョアン

1
BCM2835 ARMペリフェラルの 102ページには、GPIOを割り当てることができるさまざまなモードが示されています。GPIOがさまざまなPiモデル拡張ヘッダーに導かれているオンラインをご覧ください。
ジョアン

1
@ user1147688 PLLD(500MHz)がコアPWMクロックとして使用されます。「it」の動作方法により、PWMコア周波数は250 MHzです。オンとオフを切り替えることができるようにするため(PWMには非常に重要)、最大値は125 MHzです。PLLC(1000 MHz)を使用して数値を2倍にすることもできますが、そのPLLはコアクロック速度によって異なります。
joan

2

リアルタイムOSではありませんが、Raspberry PiのRISC OSは協調マルチタスクです。そのため、CPUが100%のアプリケーションを簡単に実行できるため、タイミングをより適切に管理できます。ただ、あなた自身のコード以外に何もすることを期待しないでください。


出力ピンのスイッチング周波数に関してもハードウェアの制限があることをどこかで読みました。約20 MHzだったと思います。そのため、CPU使用率が100%であっても、300 MHz PWMまたはその種のものを引き出すことができると期待しないでください。
ポンカドゥードル14年

@Wallacoloo:どのアプリケーションに300 MHz PWMが必要ですか?
ピーターモーテンセン

2
@PeterMortensen:無線送信機などがどのように信号を生成するのかわかりませんが、PWMでそれを行う人もいるかもしれません。PiFMは100 MHzでそれを行います。それは私のコメントと矛盾しているようですが、ピンがその周波数でまだ指令できるのではないかと思いますが、ピンの容量がそのような信号を減衰させるだけなので、100 MHzの方形波は実際に(例えば1.0 V 、2.3 V)の全範囲(0 V、3.3 V)ではなく。
ポンカドゥードル

2

「非常に効率的:CPUを使用せず、非常に安定したパルスを与える」と主張するこのライブラリ(pi-blaster)を見つけました。

まだテストしていませんが、更新したらすぐに更新するでしょう(おそらく今日)


私はこれを試しましたが、これまでのところ運はありません。私が知る限り、実際にハードウェアを切り替えることはありませんか?
-MrMowgli

1
ただこれをバンプしたいです。Pi-blasterは、これらの他の回答ではうまくいかなかった私のために働いてきました。
セフリード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.