MicroPython的午睡(102) ESP32版、8 bit のDAC使えた

Joseph Halfmoon

別シリーズ記事のルネサスRX631マイコン上のRubyでDAC出力をやってみたので、こちらESP32版のMicroPythonでもDAC出力をやってみます。でもね、いつもお世話になっておりますMicroPythonの「ESP32用クイックリファレンス(日本語)」ページにはDACのこと書いてないです。でも使えると。

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

ESP32版MicroPythonのDAC出力

以下の日本語ドキュメントページにはADCに関しての記述はあるのですがDACについての記述はありません。

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

しかし、実機上のMicroPythonに聞いてみれば、以下のようにmachineモジュール内にDACクラスが存在します。メソッドは一つだけ、write()のみ。ESP32_machine_DAC

実験に使用している ESP32 DevKit-C ボードに搭載されているESP32は、ESP32-WROOM-32Dという機種です(ESP32は一つのESP32という名のもとに多くの品種があり、「似て」いますが当然差異があるので細かいことを調べるときは該当機種のデータシートをみるべきかと。でも大したこと書いてないのだけれども。)そこで、以下のデータシートを確認してみました。

ESP32-WROOM-32D & ESP32-WROOM-32U Datasheet

上記によれは、8ビットのDACを2チャンネル搭載してます。私メなどは、年寄なのでDACが載っているだけ御の字でないのという感覚ですが、今時的に8ビットはちょっと寂しい、けれど無いよりマシではないかと。それにちょいとユニークな機能もあるので結構使えるような気もします(個人の感想デス。)

IO端子に対する割り当てはチャネル毎に固定。以下のようでした。

    • IO25 DAC_1
    • IO26 DAC_2

一応、ESP32 DevKitCのShematicを確認しておくと、IO25端子はボード上にシルクで25とふられた端子、IO26端子は同じく26です。チップの端子名とボードの端子名が一緒でDevKitCは良いボードだよ。

今回実験のMicroPythonスクリプト

今回実験のスクリプトは短いっす。ほぼほぼ別シリーズのRubyで走らせたものと同じです。ソフトウエアループでDAC出力最小から最大まで出力するだけのもの。動作した暁にはノコギリ波がオシロ画面に現れるという塩梅。

from machine import Pin, DAC

dac1 = DAC(Pin(25))
dacV = 0

while True:
    dac1.write(dacV)
    dacV += 1
    if dacV > 255:
        dacV = 0
実験結果

データシートを眺めたのですが、DA出力の測定条件などについての言及は発見できず、テキトーに1MΩの負荷抵抗をとりつけました。こちらもいい加減だけれども。また、別件記事のルネ様RX631の10ビットDAでは参照電圧とか、動作時電流の影響とかいろいろ注意点書かれていたあたりの記載は一切なし。すがすがしい割り切り? なお、データシートによるとDACのREF電圧はIO電圧の3.3Vそのものらしいデス。無いよりマシ、とやかく言うなということ?

まずはソフトウエアループで作成したノコギリ波を御覧じろ。ESP32_DAC_SOFTLOOP_TIM

まず時間軸方向は、Period 4.6556 ms で256ステップなので、1ステップあたり約18μsecとなります。

測定値的には上限 3.1808V、下限が0.04646Vで、この間に256ステップなので、1ステップは、12.4mVとなります。

だいたいの雰囲気が分かった?で波形を拡大してみました。

ESP32_DAC_MAG

 

時間方向、電圧方向ともΔ値は上で計算した値と似たようなもんだね。

とりあえずMicroPythonからDACが使えることが分かったので、次回はESP32の「ユニーク機能」か。それともRubyちゃんに何かやってみろと課題を突き付けられるのか?

MicroPython的午睡(101) ESP32版、PWMのサンプルプログラムそのまま へ戻る

MicroPython的午睡(103) ESP32版、12bit ADC、アッテネータ設定と読み取り へ進む