micro:bitで矩形波を出力してみる(その3:PWMモジュールを使ってみる)

micro:bit矩形波を出力してみるシリーズ、第3弾。
前回まではSleep関数を使って矩形波を出力しようとしていましたが、
どうやらメインループが回るときにオーバーヘッドがあるらしく、
精度の良い矩形波が出力されない、という結論でした。
stacked-tip.hateblo.jp
stacked-tip.hateblo.jp

何かないのかと調べていましたら、
どうやらmicro:bitはPWMモジュールを持っていることがわかりました。
sanuki-tech.net

これを使えば矩形波を出せるんじゃないか?
ということで、試してみました。

まずは、周期1ms、つまり1kHzでトライしてみます。
f:id:stacked-tip:20190929095724p:plain:w400

micro:bitでは「アナログ出力」がPWM出力を意味するようです。
うーん…と思ってしまいますが、まぁここは流しましょう。

「最初だけ」のブロックで、

  • アナログで出力する 端子P0 値512
  • アナログ出力 パルス周期を設定する 端子P0 周期(マイクロ秒) 1000

と書いていますが、実はこの順番が大事です。

2番目の

  • アナログ出力 パルス周期を設定する 端子P0 周期(マイクロ秒) 1000

というブロックは、P0がアナログ出力端子として使用されていない時は無視される仕様になっているらしいので、

  • まずP0をアナログ出力端子として使用する
  • それからパルス周期を変更する

の順で処理してあげる必要があります。
f:id:stacked-tip:20190929100303p:plain:w400
ブロックにカーソルを合わせると、その旨を注意するメッセージが表示されます(英語だけどね)。

オシロスコープに繋いて、波形を見てみましょう。
f:id:stacked-tip:20190929094150j:plain:w400

さて、結果です。
f:id:stacked-tip:20190929091623j:plain:w400
1ms周期の矩形波がちゃんとでています。
PWMモジュールを使えば綺麗な矩形波が出力できることが分かりました。

できるとわかったら、「どこまでできるのか」を調べたくなるのが技術者です。
パルス周期をどんどん短くしてみましょう。

次は一気に0.01ms=10us、周期にして100kHzです。
f:id:stacked-tip:20190929100936p:plain:w400

結果はこちら。
f:id:stacked-tip:20190929092854j:plain:w400
問題なく100kHzの矩形波が出力されています。

次は5us、周期にして200kHz。
f:id:stacked-tip:20190929101106p:plain:w400

結果はこのとおり。
f:id:stacked-tip:20190929093443j:plain:w400
200kHzの矩形波が出力されて…はいますが、
よく見るとDuty比が50%になっていませんね。
ハイレベルが2usとローレベルが3usで、併せて5usになっています。
2.5usという制御ができない、最小単位が1usということなのですかね?

では、2us、周期にして500kHzにしてみますか。
f:id:stacked-tip:20190929101549p:plain:w400

結果はこちら。
f:id:stacked-tip:20190929093734j:plain:w400
今度は大丈夫です。無事、Duty比50%の500kHz矩形波が出力されました。
どうやら最小単位が1usで、小数点以下は切り捨てられてしまうようです。

じゃぁ1us、周期にして1MHzは…たぶんでないんだろうけど。
f:id:stacked-tip:20190929101834p:plain:w400

結果はこうなる。
f:id:stacked-tip:20190929094058j:plain:w400
波形は出力されません。
0.5usが切り捨てられて0usになり、ハイレベル部分がなくなってしまったのでしょう。

というわけで、
micro:bit矩形波を出力したい場合は、

  • PWMモジュールを使用する
  • 最小単位は1usであることに注意する

で、実現できることがわかりました。

実際のところ、どれくらいの周波数なら使い物になるのでしょうか。
精度を定量化して、この記事を終えましょう。
f:id:stacked-tip:20190929111505p:plain:w400

精度の指標として、Hiレベル時間の、理想と実際との比率でみてみようと思います。
実際のHiレベル時間が、理想のHiレベル時間と近いほど、高精度であると言えますから、
この比率が100%に近いほど良いということになります。

f:id:stacked-tip:20190929112316p:plain:w400

精度はあるところでストンと落ちて、そこからじりじりと上がっていき、
100%になったところでまたストンと落ちる、となっています。
500kHzを超えると、理想のHiレベル時間が1usを切るので、精度は0%になってそのまま上がってきません。

f:id:stacked-tip:20190929112542p:plain:w400
100kHzまでで拡大してみました。
35kHzまでなら、95%以上の精度になります。
11kHzまでに限定すれば、99%以上の精度になります。
実用範囲は10kHzまで、というところでしょうかね。