TOPに戻る

ラズパイ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に波形は出ませんでした。

 やみくもにやって波形は出ないようです。一度、ここで終了します。

-