Raspberry Pi 5のRP1-Chipを使い倒す(PWM)

前回投稿のPi5用のGPIOライブラリをPWM対応してみた。

ドキュメントのないPWMクロック生成をどうするのかが課題であったがPi5のPWM冷却ファン制御の設定を参考に試したところうまく動作。

クロック以外の仕様はデータシートに記載されているためそれ以外の問題はないと思う。資料作成はコードを書くよりも大変な作業だったりするが早めの公開を望みたい。

PWM対応はArduinoと同じanalogWrite()という関数にしてみたがArduinoのdutyは0-100%指定なのに対しrangeに合わせてdutyを指定するところが違うので注意してほしい。

PWMのクロックはPWM0_FREQ(50MHz)として定義されているので秒単位で点滅したいときは下記のように行う。

前回投稿と同じく、実行するにはルート権限が必要なことに注意しよう!

【続編】
Raspberry Pi 5のRP1-Chipを使い倒す(GPCLK)

【サンプル】

【修正】
2026-06-16
setFuncSel()によるPWM/GPCLKのオンオフ制御と正確な遅延制御を可能とするための変更を行った。
・削除
gettime()
sleep()
sleepMicroseconds()
sleepNanoseconds()
・追加
struct timespec& clock()
・実装変更(clock_nanosleep()による実装へ変更)
delay()
delayMicroseconds()
delayNanoseconds()
・仕様変更
pinMode(戻り値の変更)
analogWrite(戻り値の変更と出力制御のための引数追加)
outputGPCLK(戻り値の変更と出力制御のための引数追加)
詳細は、下記投稿(Update:2026-06-16)を参照。
Raspberry PiでFANをPWM制御する。(自作ライブラリ版)

2025-06-28
下記メソッドの追加とdigitalWrite()のチューニングを行った。
static void sleepNanoseconds(unsigned long ns)
static void sleepMicroseconds(unsigned long us)
static void sleep(unsigned long ms)

2025-06-25
GPIOを高速にON/OFFさせると意図した通りの出力にならないときがある。その場合、直前で一度だけGPIOをリードすると正常になったりする。RP1チップの不具合?なのか...

2025-06-16
yield()を追加。

2025-05-12
IOを同期する正しい方法がわかったので修正。以前に試して効果なかった気がするけど何か勘違いがあったようだ。v(-_-;)

2025-05-09
pinMode()とdigitalWrite()を改良しTOGGLE出力を高速化。

2025-05-06
pinMode()に出力初期値指定の追加と不必要なプルアップ設定を解除するようにした。

2025-05-02
下記関数を追加。
static unsigned long nanos(void)
static unsigned long micros(void)
static unsigned long millis(void)
static void delayNanoseconds(unsigned long ns)
static void delayMicroseconds(unsigned long us)
static void delay(unsigned long ms)

2025-04-30
digitalWrite()の出力がリアルに反映されない現象の対策を行った。
その結果、Lチカ出力周波数は、SET/CLRで最大5MHz、TOGGLEでは最大400KHzとなる。

【ライブラリ】