CircuitPython 10行プログラミング (3) アナログ入出力

 Trinket M0マイコン・ボードとCircuitPythonを使って、アナログ入出力を動かします。

 前回作成したI/Oピンの図からアナログにかかわるピンをピックアップします。アナログ入力ポートはA1、A2、A3、A4の四つ、アナログ出力ポートはA0の一つです。

アナログ入力

 マイコンに内蔵されたA-Dコンバータは12ビット(2^12=4096)の分解能をもっています。CircuitPythonのアナログ入力は16ビットの値で戻るので、0~65535のディジタル値が得られます。A1ポートから読み込むサンプルです。

import analogio
from board import *

pin = analogio.AnalogIn(A1)
print(pin.value)
pin.deinit()

 A1(シルク印刷では2)端子を3.3V端子へつないだ結果は65520でした。

  65520 / 65536 * 3.3 = 3.299 [V]   

(2020/05/09)65535は間違いなので、65536に変更した。下記のプログラムも修正したが、実行結果は変更していない

from analogio import AnalogIn
from board import *
from time import sleep

pin = AnalogIn(A1)

while 1:
    print(pin.value / 65536 * 3.3)
    sleep(3.14)

 Muの実行画面です。

 このボードで使われているCortex-M0+のATSAMD21E18のA-Dコンバータ部分を少し調べます。

  • 分解能 12ビット
  • 変換速度 350ksps
  • チャネル数 14
  • 入力形式 差動、シングルエンド
  • PGA(前置増幅器) ×2~×16
  • オーバサンプリング 13、14、15、16ビット
  • 基準電圧 内部1.0V、Vccの1/2、外部A、B入力端子

 Pythonの引数はポート番号だけなので、マイコンのもっている機能をほとんど生かせられないように感じます。

 電圧発生器TR6142の出力を測りました。

  •  設定値    測定値
  • 1.0000V  1.02~1.0065
  • 0.5000V  0.503537~0.505159

でした。

 なお、value 以外にreference_voltageが読み取れます。実際にprint(pin.reference_voltage)で読むと3.3とでました。基準電圧に何が使われているかは不明です。
 このボードではUSBの5Vからレギュレータで3.3Vが作られているので、固有差はありますが、3.3Vはほとんど変動しません。

アナログ出力

 A0端子のD-Aコンバータからアナログの電圧を出力するサンプル・プログラムです。

from analogio import AnalogOut
from board import *
from time import sleep

dac = AnalogOut(A0) # output on pin A0

while 1:
dac.value = 32768 # makes A0 1.65V
sleep(0.1)

 テスタで測ると1.659Vでした。dac.valueに65535を入力すると、テスタの読みは3.311Vでした。したがって、valueには16ビットの整数値を与えることがわかります。そして、出力は0から3.3Vです。

 連続して出力値を変えてみます。

from analogio import AnalogOut
from board import *
from time import sleep

dac = AnalogOut(A0) # output on pin A0

while 1:
for E in range(65535):
dac.value = E
sleep(0.1)

 オシロスコープで観測した結果です。