回答:
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が必要な場合は、ハードウェアの支援が必要になる場合があります。
さまざまな人間の目に見えるリズム(10ヘルツ)のLEDをソフトリアルタイムの応答要件でフラッシュする場合、ソフトウェアループはGPIOピンと同じ数の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モデルでは動作しない可能性があると言います。
はい、Raspberry PiにはハードウェアPWM出力が1つあり、P1-12(GPIO18)に接続されています。さらに、I²CまたはSPIインターフェースを使用してPWM出力を追加できます。一部の人々はこれで成功しました(フォーラム投稿)。
WiringPiライブラリを使用して、PWMピンを制御できます。ライブラリ全体を含めないようにコードを確認できます。
Linuxはリアルタイムオペレーティングシステムではないため、Raspberry Piは深刻なソフトウェアPWMには適していません。
最近のPiには2つのハードウェアPWMチャネルがあります。さらに、40ピン拡張ヘッダーに接続されているすべてのGPIOでハードウェアタイミングPWMパルスを個別に生成できます。
実際には、これは2つの非常に正確なPWMチャネルがあり、他のすべてのGPIOがArduinoスタイルのPWM(800 Hz、0オフ-255完全オン)を持つ可能性があることを意味します。
リアルタイムOSではありませんが、Raspberry PiのRISC OSは協調マルチタスクです。そのため、CPUが100%のアプリケーションを簡単に実行できるため、タイミングをより適切に管理できます。ただ、あなた自身のコード以外に何もすることを期待しないでください。
「非常に効率的:CPUを使用せず、非常に安定したパルスを与える」と主張するこのライブラリ(pi-blaster)を見つけました。
まだテストしていませんが、更新したらすぐに更新するでしょう(おそらく今日)