Hardware PWM を有効化する
H/W 仕様
Raspberry Pi には Hardware PWM が搭載されています。 pinout.xyz
ただし、OS のデフォルトでは GPIO として機能するようになっているので、設定を行わないと Hardware PWM としては動作しません。
設定パターン
基本ルールはこれです。
- Hardware PWM は合計2基搭載されていて、1基ずつ有効化できる
- PWM0 は GPIO の 12
物理32
または 13物理33
に割り当てできる - PWM1 は GPIO の 18
物理12
または 19物理35
に割り当てできる
以下に詳しく解説されているので、一部を引用・転記しておきます。
iot/raspi-pwm.md at main · dotnet/iot · GitHub
Activating only 1 channel
PWM GPIO Function Alt dtoverlay PWM0 12 4 Alt0 dtoverlay=pwm,pin=12,func=4 PWM0 18 2 Alt5 dtoverlay=pwm,pin=18,func=2 PWM1 13 4 Alt0 dtoverlay=pwm,pin=13,func=4 PWM1 19 2 Alt5 dtoverlay=pwm,pin=19,func=2 Activating 2 channels
PWM0 PWM0 GPIO PWM0 Function PWM0 Alt PWM1 PWM1 GPIO PWM1 Function PWM1 Alt dtoverlay PWM0 12 4 Alt0 PWM1 13 4 Alt0 dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4 PWM0 18 2 Alt5 PWM1 13 4 Alt0 dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4 PWM0 12 4 Alt0 PWM1 19 2 Alt5 dtoverlay=pwm-2chan,pin=12,func=4,pin2=19,func2=2 PWM0 18 2 Alt5 PWM1 19 2 Alt5 dtoverlay=pwm-2chan,pin=18,func=2,pin2=19,func2=2
設定方法
上記の表の中から有効化したい組み合わせを1つ選び /boot/firmware/config.txt
に dtoverlay を書き加えます。上記で紹介しているサイトでは config.txt のパスが違いますが Ubuntu ではこっちのパスでした。
$ sudo vi /boot/firmware/config.txt
最終行に [all] があったので、その下に書き加えました。
...省略... [all] dtoverlay=pwm,pin=12,func=4
再起動して設定を反映します。
sudo reboot
動作確認
GPIO 制御ライブラリとしてはこれを利用します。
NuGet Gallery | Iot.Device.Bindings 2.1.0
実装はこのようなかんじ。
using System.Device.Pwm; Console.WriteLine("PWM. Press <Enter> to exit."); using var pwm = PwmChannel.Create(chip: 0, channel: 0, frequency: 400, dutyCyclePercentage: 0.5); pwm.Start(); Console.ReadLine(); Console.WriteLine("App exit."); pwm.Stop();
出力波形をオシロスコープで観測してみました。
環境など
- Raspberry Pi 4 Model B 4GB
- Raspberry Pi 用の Ubuntu Server 22.04 LTS
ubuntu-22.04-preinstalled-server-arm64+raspi.img.xz
- .NET Core Runtime
aspnetcore-runtime-6.0.7-linux-arm64.tar.gz