micro:bitで矩形波を出力してみる(その3:PWMモジュールを使ってみる)
micro:bitで矩形波を出力してみるシリーズ、第3弾。
前回まではSleep関数を使って矩形波を出力しようとしていましたが、
どうやらメインループが回るときにオーバーヘッドがあるらしく、
精度の良い矩形波が出力されない、という結論でした。
stacked-tip.hateblo.jp
stacked-tip.hateblo.jp
何かないのかと調べていましたら、
どうやらmicro:bitはPWMモジュールを持っていることがわかりました。
sanuki-tech.net
これを使えば矩形波を出せるんじゃないか?
ということで、試してみました。
まずは、周期1ms、つまり1kHzでトライしてみます。
micro:bitでは「アナログ出力」がPWM出力を意味するようです。
うーん…と思ってしまいますが、まぁここは流しましょう。
「最初だけ」のブロックで、
- アナログで出力する 端子P0 値512
- アナログ出力 パルス周期を設定する 端子P0 周期(マイクロ秒) 1000
と書いていますが、実はこの順番が大事です。
2番目の
- アナログ出力 パルス周期を設定する 端子P0 周期(マイクロ秒) 1000
というブロックは、P0がアナログ出力端子として使用されていない時は無視される仕様になっているらしいので、
- まずP0をアナログ出力端子として使用する
- それからパルス周期を変更する
の順で処理してあげる必要があります。
ブロックにカーソルを合わせると、その旨を注意するメッセージが表示されます(英語だけどね)。
オシロスコープに繋いて、波形を見てみましょう。
さて、結果です。
1ms周期の矩形波がちゃんとでています。
PWMモジュールを使えば綺麗な矩形波が出力できることが分かりました。
できるとわかったら、「どこまでできるのか」を調べたくなるのが技術者です。
パルス周期をどんどん短くしてみましょう。
次は一気に0.01ms=10us、周期にして100kHzです。
結果はこちら。
問題なく100kHzの矩形波が出力されています。
次は5us、周期にして200kHz。
結果はこのとおり。
200kHzの矩形波が出力されて…はいますが、
よく見るとDuty比が50%になっていませんね。
ハイレベルが2usとローレベルが3usで、併せて5usになっています。
2.5usという制御ができない、最小単位が1usということなのですかね?
では、2us、周期にして500kHzにしてみますか。
結果はこちら。
今度は大丈夫です。無事、Duty比50%の500kHz矩形波が出力されました。
どうやら最小単位が1usで、小数点以下は切り捨てられてしまうようです。
じゃぁ1us、周期にして1MHzは…たぶんでないんだろうけど。
結果はこうなる。
波形は出力されません。
0.5usが切り捨てられて0usになり、ハイレベル部分がなくなってしまったのでしょう。
というわけで、
micro:bitで矩形波を出力したい場合は、
- PWMモジュールを使用する
- 最小単位は1usであることに注意する
で、実現できることがわかりました。
実際のところ、どれくらいの周波数なら使い物になるのでしょうか。
精度を定量化して、この記事を終えましょう。
精度の指標として、Hiレベル時間の、理想と実際との比率でみてみようと思います。
実際のHiレベル時間が、理想のHiレベル時間と近いほど、高精度であると言えますから、
この比率が100%に近いほど良いということになります。
精度はあるところでストンと落ちて、そこからじりじりと上がっていき、
100%になったところでまたストンと落ちる、となっています。
500kHzを超えると、理想のHiレベル時間が1usを切るので、精度は0%になってそのまま上がってきません。
100kHzまでで拡大してみました。
35kHzまでなら、95%以上の精度になります。
11kHzまでに限定すれば、99%以上の精度になります。
実用範囲は10kHzまで、というところでしょうかね。