MicroPython的午睡(105) ESP32版、インターバルタイマ2本使ってみる

Joseph Halfmoon

Rubyちゃん(mruby)にはタイマAPIが見当たらないとブー垂れ、ESP32版のMicroPythonでタイマを使ってみることに。MicroPythonでのタイマの利用は過去記事でやってます。STM32マイコン版ではいろいろと。しかしタイマAPIはマイコン・ハードウエアの依存性が強いです。ESP32版ではどこまで?

※「MicroPython的午睡」投稿順 Indexはこちら

STM32版MicroPythonでのタイマAPI利用

いろいろやってみている中で、タイマと割り込みのコマケー話を拾っていたのが以下の過去回です。そこに書かれている失敗を踏んづけないように気をつけます。

MicroPython的午睡(86) STM32版、タイマ・チャネル、割り込み受け TIPS

ESP32版のタイマ利用について書かれているドキュメント

いつもお世話になっております以下の日本語ページにESP32版のタイマ利用の件についても書かれています(概要だけね。)

ESP32 用クイックリファレンス

詳しいことは以下のページなどをみてねという感じです。

クラス Timer — ハードウェアタイマーの制御

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秒ごとのカウント報告が到来してます。ESP32_IntervalTimer_Running

p23端子の外側には、LEDを接続してあるので、以下のように毎秒ON/OFFを繰り返します(タイマ利用のLチカね。)

ESP32Timer_DUT

さて、p32端子にはインターバルタイマの割り込みつかって1kHzの信号を出力しています。オシロをあてると波形は以下のようでした(ONで1ms、OFFで1msという信号なので、周波数的には500Hzです。)ESP32_P32WAVE

インターバルタイマは期待通りの動きをしてますな。あたりまえか。

MicroPython的午睡(104) ESP32版、改めてModule群を眺めてみる へ戻る

MicroPython的午睡(106) ESP32版、DHT11を接続してみる へ進む