Raspberry Pi向けMicroPythonに実装中のPWMクラスのAPIについて、先日「どうするか検討中です」と書いたばかりですが、まさにこのタイミングでPWMクラスの仕様案が、開発者のD.P.Georgeさんから提示がありました。
概要
まだ「案」の段階ではありますが、内容はこんな感じです。
(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クラスは、この仕様に沿って書き直してみる予定です。
コメント