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の波形が出力されます。