CircuitPython 10行プログラミング Step9 (9) D-Aコンバータを作る

 今回利用しているESP32-S3-DevKitC-1-N8には、D-Aコンバータはありません。I/Oポートを使ってD-Aコンバータを作ります。CircuitPython は8.0.0-rc.1です。

実験回路

 4ビットのR-2R抵抗ラダー型のD-Aコンバータを作ります。12ビットあれば実用的になりますが、まずは動作を確認します。

 参考;ADALM2000による実習:D/Aコンバータを試す

 OPアンプのプラス電源はマイコン・ボードの3.3Vで、マイナス電源はエネループ(1.2V)を3本つないで作りました。-3.3Vより少し高めです。OPアンプはOP1612で、電源電圧まで出力がスイングします。

 抵抗は、20kと10kで構成したかったのですがなかったので、22kΩを使いました。パラレルにして11kΩです。

配線

 マイコン・ボードは、1、2、42、41と印刷された端子を、回路図のda0、da1、da2、da3につなぎます。

プログラム

 三つの出力を試しました。最初は全部 '1'、最後は全部'0'です。二つめは'0001'でMSBが'1'です。


import digitalio
from board import *
import time

da0 = digitalio.DigitalInOut(IO1)
da1 = digitalio.DigitalInOut(IO2)
da2 = digitalio.DigitalInOut(IO42)
da3 = digitalio.DigitalInOut(IO41)
da0.direction = digitalio.Direction.OUTPUT
da1.direction = digitalio.Direction.OUTPUT
da2.direction = digitalio.Direction.OUTPUT
da3.direction = digitalio.Direction.OUTPUT

while True:
    da0.value = True  # ①
    da1.value = True
    da2.value = True
    da3.value = True
    time.sleep(0.02)

    da0.value = False  # ②
    da1.value = False
    da2.value = False
    da3.value = True
    time.sleep(0.01)
    
    da0.value = False  # ③
    da1.value = False
    da2.value = False
    da3.value = False
    time.sleep(0.01)

 実行例です。上の黄色の波形がOPアンプの+側入力端子、下の青色がOPアンプの1番の出力です。

 階段状に値を増やしました。


import digitalio
from board import *
import time

da0 = digitalio.DigitalInOut(IO1)
da1 = digitalio.DigitalInOut(IO2)
da2 = digitalio.DigitalInOut(IO42)
da3 = digitalio.DigitalInOut(IO41)
da0.direction = digitalio.Direction.OUTPUT
da1.direction = digitalio.Direction.OUTPUT
da2.direction = digitalio.Direction.OUTPUT
da3.direction = digitalio.Direction.OUTPUT

while True:
    da0.value = True
    da1.value = True
    da2.value = True
    da3.value = True
    time.sleep(0.02)

    da0.value = False
    da1.value = False
    da2.value = True
    da3.value = True
    time.sleep(0.01)
    
    da0.value = True
    da1.value = True
    da2.value = False
    da3.value = True
    time.sleep(0.01)

    da0.value = False
    da1.value = False
    da2.value = False
    da3.value = True
    time.sleep(0.01)

    da0.value = False
    da1.value = True
    da2.value = True
    da3.value = False
    time.sleep(0.01)
    
    da0.value = True
    da1.value = True
    da2.value = False
    da3.value = False
    time.sleep(0.01)

    da0.value = False
    da1.value = True
    da2.value = False
    da3.value = False
    time.sleep(0.01)

    da0.value = True
    da1.value = False
    da2.value = False
    da3.value = False
    time.sleep(0.01)
    
    da0.value = False
    da1.value = False
    da2.value = False
    da3.value = False
    time.sleep(0.01)

 実行例です。