MicroPythonのPWMクラス仕様案が登場

Raspberry Pi向けMicroPythonに実装中のPWMクラスのAPIについて、先日「どうするか検討中です」と書いたばかりですが、まさにこのタイミングでPWMクラスの仕様案が、開発者のD.P.Georgeさんから提示がありました。

docs/machine: Specify new class machine.PWM. by dpgeorge · Pull Request #4237 · micropython/micropython

概要

まだ「案」の段階ではありますが、内容はこんな感じです。

(1) 周波数は整数(freq)で指定、デューティ比は%で指定。デューティ比は%の値を16bit整数(duty_u16)で表現(65535=100%、0=0%)
(2) あるいはパルス全体の区間(period)とHighとなる区間(duty_ticks)をそれぞれ整数(tick)で表現。その場合は、tickを周波数に換算するパラメータ(tick_hz)も指定

例として、周波数1KHz、デューティ比25%にするには

p = PWM(freq=1000, duty_u16=16384)

となります。duty_u16の値は、デューティ比に0xffffUを乗じた値です。

また、同じ指定を

p = PWM(tick_hz=960000, duty_ticks=240, period=960)

とすることもできます。
この場合は、period=960が波ひとつ分で、tick_hzをperiodで割ると1000になりますので、周波数は1000Hzです。
peirodおよびduty_ticksは常にtick_hzと共に使う必要があります(でないと周波数が計算できない)。

タイマーとPWMの結びつけ

AVRやSTM32等のマイコンではPWMはタイマーの使い方の一種となっていますが、これを考慮してPWM生成に用いるタイマーオブジェクトをコンストラクタに与えることが可能です。
コンストラクタの仕様は

PWM.init(dest, \*, freq, period, tick_hz, duty_ticks, duty_u16, block)

となっており、destがPinオブジェクト、blockがタイマーオブジェクトを指定する部分になります。

Raspberry Piの場合はタイマーを指定することはできませんので、blockは必要ありませんが。

クロック関連のパラメータ

クロック関連の指定はPWMクラスでは行えません。tick_hzはクロックを指定していると読めなくもないですが、Georgeさんの想定ではtick_hzはハードウェアに対する設定ではなく、PWMインスタンス内でperiodを時間に換算するためのパラメータだということです。

従って、Raspberry Piではクロック源やプリスケーラはPWMクラスではなく外部で行うほうが、他のプラットフォームとの整合性は高そうです。

作成途中のPWMクラスは、この仕様に沿って書き直してみる予定です。

コメント