class ADC -- アナログ-デジタル変換

使用例:

import pyb

adc = pyb.ADC("P6")
val = adc.read()

すべてのADCチャンネルと、MCU内蔵のダイ温度、VBATVREFINT の各センサーへ同時にアクセスするには pyb.ADCAll を参照してください。

コンストラクタ

class pyb.ADC(pin: int | str | Pin)

指定したピンに関連付けられたADCオブジェクトを作成します。これにより、そのピンでアナログ値を読み取れるようになります。

メソッド

read() int

アナログピンの値を読み取って返します。返される値は0から4095の範囲になります。

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

timer オブジェクトで設定したレートで、アナログ値を buf に読み込みます。

buf には、たとえばbytearrayやarray.arrayを使用できます。ADC値は12ビット解像度で、要素サイズが16ビット以上であれば buf に直接格納されます。buf が8ビット要素のみ(例: bytearray)の場合、サンプルの解像度は8ビットに低減されます。

timer はTimerオブジェクトである必要があり、タイマーがトリガするたびにサンプルが1つ読み取られます。タイマーは、あらかじめ初期化され、目的のサンプリング周波数で動作している必要があります。

この関数の従来の動作をサポートするために、timer にはサンプリングする周波数(Hz単位)を指定する整数を渡すこともできます。この場合、Timer(6)が指定の周波数で動作するように自動的に設定されます。

Timerオブジェクトを使用した例(推奨される方法):

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
tim = pyb.Timer(6, freq=10)        # create a timer running at 10Hz
buf = bytearray(100)               # buffer to hold the samples
adc.read_timed(buf, tim)           # sample 100 values, taking 10s

周波数に整数を使用した例:

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
buf = bytearray(100)               # buffer of 100 bytes
adc.read_timed(buf, 10)            # read 100 samples at 10Hz (10s total)

for val in buf:
    print(val)

この関数はヒープメモリをまったく確保しません。ブロッキング動作をします。すなわち、バッファがいっぱいになるまで呼び出し元プログラムに制御を返しません。

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

複数のADCから相対的なタイミングまたは位相のデータを抽出します。

timer オブジェクトで設定したレートで、複数のADCからアナログ値をバッファに読み込みます。タイマーがトリガするたびに、各ADCから順番に高速でサンプルが読み取られます。

ADCとバッファのインスタンスはタプルで渡され、各ADCに対応するバッファが割り当てられます。すべてのバッファは同じ型かつ同じ長さでなければならず、バッファの数はADCの数と等しくなければなりません。

バッファには、たとえば bytearrayarray.array を使用できます。ADC値は12ビット解像度で、要素サイズが16ビット以上であればバッファに直接格納されます。バッファが8ビット要素のみ(例: bytearray)の場合、サンプルの解像度は8ビットに低減されます。

timer はTimerオブジェクトである必要があります。タイマーは、あらかじめ初期化され、目的のサンプリング周波数で動作している必要があります。

STM32搭載のOpenMV Camは、ADC対応のヘッダーピンを1本(P6)しか公開していないため、標準ハードウェアでは read_timed_multi は単一のADCでのみ有用です。複数のADCで使用するには、pyb.Pincpu 参照を介して追加のアナログ入力を配線してください。

1つのADCを読み取る例:

import array

adc = pyb.ADC(pyb.Pin.board.P6)
tim = pyb.Timer(8, freq=100)
rx = array.array("H", (0 for i in range(100)))

# Sample 100 values at 100Hz (takes one second).
pyb.ADC.read_timed_multi((adc,), (rx,), tim)

for val in rx:
    print(val)

この関数はヒープメモリをまったく確保しません。ブロッキング動作をします。すなわち、バッファがいっぱいになるまで呼び出し元プログラムに制御を返しません。

すべてのサンプルが正しいタイミングで取得された場合、この関数は True を返します。高いサンプルレートでは、1組のサンプルを取得するのにかかる時間がタイマー周期を超えることがあります。この場合、関数は False を返し、サンプル間隔の精度が低下したことを示します。極端な場合には、サンプルが取りこぼされることがあります。

最大レートは、データ幅や読み取るADCの数などの要因に依存します。テストでは、2つのADCがオーバーランなしで210kHzのタイマーレートでサンプリングされました。215kHzではサンプルが取りこぼされました。3つのADCの場合の上限は約140kHz、4つの場合は約110kHzです。高いサンプルレートでは、その間だけ割り込みを無効にすると、散発的なデータ損失のリスクを低減できます。