ラズパイ2023年10月更新 bookworm ⑪ ラズパイ5のPWM-ハードウェアPWM<その1>
ラズパイ5のPWM(pulse-width modulation)は、
- Software PWM available on all pins
- Hardware PWM available on GPIO12, GPIO13, GPIO18, GPIO19
とドキュメントRaspberry Pi hardwareに書かれています。
●2番目のハードウェアPWM
/sys ファイル システムには、pwmchip0 と pwmchip2 という二つの PWM チップが表示されます。
$ ls /sys/class/pwm
pwmchip0 pwmchip2
この何もしていない時点の/sys/class/pwmは、設定用ファイルなどが何もない状態です。
/boot/overlays/READMEには、pwmとpwm-2chanの二つの記述例があります。
pwmの記述は、単一の PWM チャネルを構成する例で、デフォルトはGPIO18に出力されます。
Name: pwm Info: Configures a single PWM channel Legal pin,function combinations for each channel: PWM0: 12,4(Alt0) 18,2(Alt5) 40,4(Alt0) 52,5(Alt1) PWM1: 13,4(Alt0) 19,2(Alt5) 41,4(Alt0) 45,4(Alt0) 53,5(Alt1) N.B.: 1) Pin 18 is the only one available on all platforms, and it is the one used by the I2S audio interface. Pins 12 and 13 might be better choices on an A+, B+ or Pi2. 2) The onboard analogue audio output uses both PWM channels. 3) So be careful mixing audio and PWM. 4) Currently the clock must have been enabled and configured by other means. Load: dtoverlay=pwm,<param>=<val> Params: pin Output pin (default 18) - see table func Pin function (default 2 = Alt5) - see above clock PWM clock frequency (informational) |
試してみます。$ sudo nano /boot/firmware/config.txtの最後に、
dtoverlay=pwm
を追加し、CTRL-O、CTRL-Xで抜け、リブートします。
/sys/class/pwmには、pwmchip0、pwmchip2に加えて、pwmchip6ができていました。
●2番目のハードウェアPWMを動作させる
次の設定用スクリプト(フォーラムPi5 - PWM on GPIO 18)をテキスト・ファイルで作成し、実行権を付けます。
#!/bin/bash
CHANNEL=2
CHIP=pwmchip2
PWM=pwm$CHANNEL
echo $CHANNEL > /sys/class/pwm/$CHIP/export
sleep 1
echo 240000 > /sys/class/pwm/$CHIP/$PWM/period
echo 120000 > /sys/class/pwm/$CHIP/$PWM/duty_cycle
echo 1 > /sys/class/pwm/$CHIP/$PWM/enable
Paramのpinを記述しないとGPIO18、funcを記述しないと関数は5?です。
オシロスコープで測定しました。GPIO18には、100kΩの抵抗負荷をつないでいます。
一度止めますね。
$ echo 0 > /sys/class/pwm/pwmchip0/subsystem/pwmchip2/pwm2/enable
周波数を変えてみます。
#!/bin/bash
CHANNEL=2
CHIP=pwmchip2
PWM=pwm$CHANNEL
echo $CHANNEL > /sys/class/pwm/$CHIP/export
sleep 1
echo 20000 > /sys/class/pwm/$CHIP/$PWM/period
echo 10000 > /sys/class/pwm/$CHIP/$PWM/duty_cycle
echo 1 > /sys/class/pwm/$CHIP/$PWM/enable
$ ./pwm_1.sh
./pwm_1.sh: line 6: echo: write error: Device or resource busy
エラーになったのですが、値は更新できていたので、enableにします。
$ echo 1 > /sys/class/pwm/pwmchip0/subsystem/pwmchip2/pwm2/enable
enableにしないでも、波形が出る場合がありました。波形です。
周波数をもう一桁上げます。period=2000、duty_cycle=1000。
period=20、duty_cycle=10では波形は出なかったので、period=100、duty_cycle=50にしました。
period=36、duty_cycle=18にしました。このあたりが限界なようです。15.36MHzのクロックが生成できています。
リブートしたら、/sys/class/pwm/pwmchip0/subsystem/pwmchip2/pwm2/は、消えていました。
ラズパイ2023年10月更新 bookworm ⑨ ラズパイ5のGPIO
の、$ pinctrl -pを実行したとき、
32: no pd | -- // GPIO12 = none
33: no pd | -- // GPIO13 = none
12: no pd | -- // GPIO18 = none
35: no pd | -- // GPIO19 = none
と表示されるので、パワーオン・リセットで、機能なし(none)になっているのかもしれません。
●もう一つのGPIO
ラズパイ4までは、
- PWM Channel 0 : GPIO12、GPIO18
- PWM Channel 1 : GPIO13、GPIO19
と説明されており、GPIO12とGPIO18はそれぞれ独立した周波数の設定はできない、同じく、GPIO13とGPIO19はそれぞれ独立した周波数の設定はできないと説明されていたようです。チップセットはbcm2711で、ラズパイ5はBCM2712です。
- チャネル0 pwmchip0 ; pwm0、pwm1
- チャネル2 pwmchip2 ; pwm2、pwm3、pwm4、pwm5
なお、ファン用には、一つ割り当てられています。
45: a0 pd | hi // FAN_PWM/GPIO45 = PWM1_CHAN3
$ pinctrl -c bcm2712 xxを実行した結果です。XXピンが持つAlt=alternate ;代替機能の一覧のようです。
- 18, GPIO18, gpio, SD_CARD_LED_B, I2S_DATA0_OUT, VC_SPI3_MOSI, I2S_DATA0_IN, SD0_DAT2, ENET0_RGMII_IRQ, VC_PWM1_0, -
- 19, GPIO19, gpio, SD_CARD_VOLT_B, USB_PWRFLT, VC_SPI3_SCLK, PKT_DATA1, SPDIF_OUT, SD0_DAT3, IR_IN, VC_PWM1_1
- 12, GPIO12, gpio, SPI_S_SS0B, MTSIF_DATA6_ALT1, I2S_DATA0_IN, I2S_DATA0_OUT, VC_SPI5_MISO, VC_I2CSL_MOSI, SD0_CLK, SD_CARD_VOLT_D
- 13, GPIO13, gpio, SPI_S_MISO, MTSIF_DATA7_ALT1, I2S_DATA1_OUT, USB_VBUS_PRESENT, VC_SPI5_MOSI, VC_I2CSL_CE_N, SD0_CMD, SD_CARD_PWR0_D
utils/pinctrl/gpiochip_bcm2712.cを見ると、次の二つの存在するようです。
VC_PWM0_0、VC_PWM0_1
/boot/overlays/READMEのpwmには、
PWM0: 12,4(Alt0) 18,2(Alt5) 40,4(Alt0) 52,5(Alt1)
PWM1: 13,4(Alt0) 19,2(Alt5) 41,4(Alt0) 45,4(Alt0) 53,5(Alt1)
と書かれていて、2チャネルあることはわかります。ピン番号の次の数字がfunctionの番号で、かっこ中のAltXというのは代替番号のようです。これらの説明が見つかりません。
●もう一つのGPIOの波形を見る
DPIO18の設定をして、別の設定ができないというGPIO12の波形を観測します。
最初に、export機能を確認します。今まで使ったのは、
$ echo 2 > /sys/class/pwm/pwmchip2/export
でした。一度閉じて開くと、ディレクトリpwm2ができていました。周波数の値を書き込むperiodやduty_cycleの内容は'0'です。
echo 20000 > /sys/class/pwm/pwmchip2/pwm2/period
echo 10000 > /sys/class/pwm/pwmchip2/pwm2/duty_cycle
echo 1 > /sys/class/pwm/pwmchip2/pwm2/enable
波形を見ます。上の青色がGPIO18下の赤色がGPIO12です。
$ echo 3 > /sys/class/pwm/pwmchip2/export
/sys/class/pwm/pwmchip2/pwm3ができました。
echo 20000 > /sys/class/pwm/pwmchip2/pwm3/period
echo 10000 > /sys/class/pwm/pwmchip2/pwm3/duty_cycle
echo 1 > /sys/class/pwm/pwmchip2/pwm3/enable
GPIO12に波形は出ませんでした。
/boot/firmware/config.txtに、dtoverlay=pwm,pin=12,func=4を書き込んでリブートしました。
$ echo 2 > /sys/class/pwm/pwmchip2/export
/sys/class/pwm/pwmchip2/pwm2ができました。
echo 20000 > /sys/class/pwm/pwmchip2/pwm2/period
echo 10000 > /sys/class/pwm/pwmchip2/pwm2/duty_cycle
echo 1 > /sys/class/pwm/pwmchip2/pwm2/enable
GPIO12/GPIO18に波形は出てきません。
$ echo 3 > /sys/class/pwm/pwmchip2/export
/sys/class/pwm/pwmchip2/pwm3ができました。
echo 20000 > /sys/class/pwm/pwmchip2/pwm3/period
echo 10000 > /sys/class/pwm/pwmchip2/pwm3/duty_cycle
echo 1 > /sys/class/pwm/pwmchip2/pwm3/enable
GPIO12に波形は出ませんでした。
やみくもにやって波形は出ないようです。一度、ここで終了します。