Rubyちゃん(mruby)にはタイマAPIが見当たらないとブー垂れ、ESP32版のMicroPythonでタイマを使ってみることに。MicroPythonでのタイマの利用は過去記事でやってます。STM32マイコン版ではいろいろと。しかしタイマAPIはマイコン・ハードウエアの依存性が強いです。ESP32版ではどこまで?
※「MicroPython的午睡」投稿順 Indexはこちら
STM32版MicroPythonでのタイマAPI利用
いろいろやってみている中で、タイマと割り込みのコマケー話を拾っていたのが以下の過去回です。そこに書かれている失敗を踏んづけないように気をつけます。
MicroPython的午睡(86) STM32版、タイマ・チャネル、割り込み受け TIPS
ESP32版のタイマ利用について書かれているドキュメント
いつもお世話になっております以下の日本語ページにESP32版のタイマ利用の件についても書かれています(概要だけね。)
詳しいことは以下のページなどをみてねという感じです。
ESP32のタイマ
ESP32にはタイマが4本搭載されてます。STM32など他のマイコンのようにタイマの横にインプットキャプチャとか、アウトプットコンペア(またはPWM)などがぶら下がったIO機能を含んだありがちなタイマではありません。
-
- プリスケーラ16ビット
- アップダウン・カウンタ64ビット
のシンプルな構造です。インターバルタイマ(あるいはワンショット)として時間(クロック)を測る機能に集中。PWM出力などは別ユニットの担当です。それにしても64ビット幅というのはビット幅広。他のマイコンはプリスケーラ16ビット、カウンタ16ビットくらいが普通だけれども(個人の感想デス。)
なお、MicroPythonのAPIは実ハードウエアTimerに対して定義されており、仮想タイマのサポートなどは無いと書かれてます。今回、軽く確かめたところでは、Timer 0/1/2/3 の4本すべてMicroPythonから制御可能でした。ただし使用するモジュールによっては使われることもありかと。知らんけど。
実験に使用したソース
以下のスクリプトを走らせて動作を確認しました。タイマを使って以下の3つの仕事が並行動作します。
-
- タイマ0、定周期(1秒)毎にp23端子をトグル
- タイマ3、定周期(1000Hz、0.001秒)毎にp32端子をトグル
- メインループ、だいたい3秒おきに、USBシリアルにループ回数報告
from machine import Timer, Pin import time p23 = Pin(23, Pin.OUT) p32 = Pin(32, Pin.OUT) def p23toggle(t): p23.value( 1 if p23.value() == 0 else 0 ) def p32toggle(t): p32.value( 1 if p32.value() == 0 else 0 ) def main(): print("ESP32 DevKit-C Timer 0/1, Interval test.") tim0 = Timer(0) tim0.init(period=1000, mode=Timer.PERIODIC, callback=p23toggle) tim3 = Timer(3) tim3.init(freq=1000, mode=Timer.PERIODIC, callback=p32toggle) count = 1 while True: print("{}".format(count)) count += 1 time.sleep(3) if __name__ == "__main__": main()
実験結果
Thonny IDEから起動したので、Thonny IDEの下の方のShellのところにmain()内のループからの3秒ごとのカウント報告が到来してます。
p23端子の外側には、LEDを接続してあるので、以下のように毎秒ON/OFFを繰り返します(タイマ利用のLチカね。)
さて、p32端子にはインターバルタイマの割り込みつかって1kHzの信号を出力しています。オシロをあてると波形は以下のようでした(ONで1ms、OFFで1msという信号なので、周波数的には500Hzです。)
インターバルタイマは期待通りの動きをしてますな。あたりまえか。