ブログ

Armadillo-640:PWM出力を使ってみる

at_kazutaka.bito
2019年10月7日 13時36分

Armadillo-640で、PWM出力を使ってみました。

ここでは、下記の2つの端子をPWM出力にする例で説明します。
CON9の13:PWM5
CON9の14:PWM6

1.デバイスツリーでPWMを設定

ATDE上で、下記に記載のat-dtwebというツールを使って、端子設定を行います。
Armadillo-640 製品マニュアル
20.3. Device Treeをカスタマイズする


at-dtwebがインストールされていない場合は、下記の手順でインストールします。
20.3.1. at-dtwebのインストール

下記の手順で、at-dtwebを起動します。
20.3.2. at-dtwebの起動
補足)
カーネルのディレクトリ(Linux-v4.19)以下のディレクトリにいると、後の手順のビルドでエラーになります。
別のディレクトリに移動してから、at-dtwebを起動します。

20.3.3. Device Treeをカスタマイズ
上記の手順にて、at-dtwebの画面で、UART1(※)、PWM5、PWM6を有効にします。
画面左の「Available features」から「UART1」、「PWM5」、「PWM6」をドラッグし、
画面右の「Armadillo-640」の白色に変化したピンにドロップします。
※)
at-dtwebのデフォルトの設定は、コンソール用のUART(UART1)も無効になっています。
ここでは、コンソール用のUART(UART1)を使用するため、UART1も有効にしています。

以降、
20.3.3. Device Treeをカスタマイズ
20.3.3.4. DTS/DTBの生成
まで進めて、DTB(armadillo-640-at-dtweb.dtb)を生成します。
このarmadillo-640-at-dtweb.dtbで、Armadillo-640のDTBを書き換えます。

参考)DTBの書き換え方法は下記に記載されています
11.2.3. DTBの書き換え

Armadillo-640のDTBを書き換え後、再起動するとPWM5、PWM6が使用できるようになります。

2.PWMの設定

Armadillo-640では、
/sys/class/pwm/pwmchip[N]
というクラスで見えます。

今回の例では、CON9の13(PWM5)/CON9の14(PWM6)の2つをPWMにした場合、
/sys/class/pwm/pwmchip0
/sys/class/pwm/pwmchip1
という2つのクラスができます。

CON9の13(PWM5)/CON9の14(PWM6)のどちらかを確認するには、まず、下記を実行します。

root@armadillo:~# ls -l /sys/class/pwm/pwmchip0
lrwxrwxrwx 1 root root 0 Sep  4 13:41 /sys/class/pwm/pwmchip0 -> ../../devices/soc0/soc/2000000.aips-bus/20f0000.pwm/pwm/pwmchip0
 
root@armadillo:~# ls -l /sys/class/pwm/pwmchip1
lrwxrwxrwx 1 root root 0 Sep  4 13:41 /sys/class/pwm/pwmchip1 -> ../../devices/soc0/soc/2000000.aips-bus/20f4000.pwm/pwm/pwmchip1

pwmchip0(20f0000.pwmのある方)が、CON9の13(PWM5)
pwmchip1(20f4000.pwmのある方)が、CON9の14(PWM6)
を意味します。

PWMを制御する場合は、下記のように実行します。
(下記は、pwmchip0=CON9の13(PWM5)の場合)

root@armadillo:~# echo 0 > /sys/class/pwm/pwmchip0/export
root@armadillo:~# echo 204167 > /sys/class/pwm/pwmchip0/pwm0/period
root@armadillo:~# echo 22083 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
root@armadillo:~# echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable

(pwmchip1=CON9の14(PWM6)を制御する場合は、pwmchip0をpwmchip1に読み替えてください。)

上記コマンドを上から順番に説明します。

echo 0 > /sys/class/pwm/pwmchip0/export #クラスを使って制御するために、pwm0をエクスポートします。
echo 204167 > /sys/class/pwm/pwmchip0/pwm0/period #周期を設定します。nsec単位です。
echo 22083 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle #dutyを設定します。nsec単位です。0 < duty_cycle < periodの範囲です。
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable #出力をenableにします。

以上で、PWMの波形が出力されます。