Raspberry Pi + Ubuntu + .NET Core で GPIO「Part2 Hardware PWM」

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();

出力波形をオシロスコープで観測してみました。

環境など