class ADC -- アナログ-デジタル変換¶
使用例:
import pyb
adc = pyb.ADC("P6")
val = adc.read()
すべてのADCチャンネルと、MCU内蔵のダイ温度、VBAT、VREFINT の各センサーへ同時にアクセスするには pyb.ADCAll を参照してください。
コンストラクタ¶
- class pyb.ADC(pin: int | str | Pin)¶
指定したピンに関連付けられたADCオブジェクトを作成します。これにより、そのピンでアナログ値を読み取れるようになります。
メソッド¶
- 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の数と等しくなければなりません。
バッファには、たとえば
bytearrayやarray.arrayを使用できます。ADC値は12ビット解像度で、要素サイズが16ビット以上であればバッファに直接格納されます。バッファが8ビット要素のみ(例:bytearray)の場合、サンプルの解像度は8ビットに低減されます。timer はTimerオブジェクトである必要があります。タイマーは、あらかじめ初期化され、目的のサンプリング周波数で動作している必要があります。
STM32搭載のOpenMV Camは、ADC対応のヘッダーピンを1本(
P6)しか公開していないため、標準ハードウェアではread_timed_multiは単一のADCでのみ有用です。複数のADCで使用するには、pyb.Pinのcpu参照を介して追加のアナログ入力を配線してください。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です。高いサンプルレートでは、その間だけ割り込みを無効にすると、散発的なデータ損失のリスクを低減できます。