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

DAC は 2 つの STM32 DAC チャンネルのいずれかで 0 V から 3.3 V までのアナログ電圧を出力します。

pyb.DAC を備えるすべての STM32 系 OpenMV Cam(M4 / M7 / H7 / H7 Plus / Pure Thermal)では、チャンネルは次のように配線されています。

DAC チャンネル

ヘッダーピン

STM32 ピン

DAC(1)

(ヘッダー上にはありません)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 には DAC ペリフェラルがありません。そのボードでは pyb.DAC は利用できません。

使用例:

from pyb import DAC

dac = DAC(1)            # create DAC channel 1
dac.write(128)          # write a value to the DAC (approximately 1.65 V)

dac = DAC(1, bits=12)   # use 12-bit resolution
dac.write(4095)         # output maximum value, 3.3 V

連続した正弦波を出力するには:

import math
from pyb import DAC

# create a buffer containing a sine-wave
buf = bytearray(100)
for i in range(len(buf)):
    buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))

# output the sine-wave at 400Hz
dac = DAC(1)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

12 ビット解像度で連続した正弦波を出力するには:

import math
from array import array
from pyb import DAC

# 128-sample sine wave, half-word samples centred at 2048 (12-bit mid).
N = 128
buf = array("H", (
    2048 + int(2047 * math.sin(2 * math.pi * i / N))
    for i in range(N)
))

# Output the sine wave at 400Hz.
dac = DAC(1, bits=12)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

コンストラクタ

class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)

新しい DAC オブジェクトを構築します。

port には Pin オブジェクト、または DAC チャンネル 1 か 2 を選択する整数(1 または 2)を指定できます。各チャンネルがルーティングされる物理ピンは OpenMV Cam によって異なります。

bits は解像度を指定する整数で、8 または 12 を指定できます。write() および write_timed() が受け付ける最大値は (2**bits) - 1 です(8 ビットでは 255、12 ビットでは 4095)。

buffering パラメータは DAC オペアンプ出力バッファの動作を選択します。このバッファの目的は出力インピーダンスを下げることです。None を指定するとデフォルト(DAC.noise()DAC.triangle()DAC.write_timed() ではバッファリング有効、DAC.write() では無効)が選択され、False を指定するとバッファリングを完全に無効化し、True を指定すると出力バッファリングを有効化します。

バッファリングを有効にすると、DAC ピンは 5KΩ までの負荷を駆動できます。それ以外の場合は出力インピーダンスが最大 15KΩ となり、結果としてバッファリングなしで 1% の精度を達成するには、印加する負荷を 1.5MΩ 未満にする必要があります。バッファを使用すると、特に範囲の両端付近で精度が低下するというペナルティが生じます。

メソッド

init(bits: int = 8, *, buffering: bool | None = None) None

DAC を再初期化します。bits には 8 または 12 を指定できます。buffering には NoneFalseTrue を指定できます。このパラメータの意味については上記のコンストラクタを参照してください。

deinit() None

DAC を非初期化し、そのピンを他の用途で使用できるようにします。

noise(freq: int) None

疑似ランダムなノイズ信号を生成します。指定された周波数で新しいランダムなサンプルが DAC 出力に書き込まれます。

triangle(freq: int) None

三角波を生成します。DAC 出力の値は指定された周波数で変化し、12 ビットの全範囲を(上下に)ランプします。したがって、繰り返される三角波そのものの周波数は 8192 分の 1 になります。

write(value: int) None

DAC 出力への直接アクセスです。最小値は 0、最大値は (2**bits) - 1 で、bits は DAC オブジェクトの作成時または init() で設定されます。

write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None

DMA 転送を使用して RAM から DAC へのバースト転送を開始します。入力データは、8 ビットモードでは byte の配列として、12 ビットモードでは符号なしハーフワード(配列タイプコード 'H')の配列として扱われます。

freq には、Timer(6) を使用して DAC サンプルを書き込む周波数を指定する整数を指定できます。または、DAC サンプルのトリガーに使用される初期化済みの Timer オブジェクトを指定することもできます。有効なタイマーは 2、4、5、6、7、8 です。

mode には DAC.NORMAL または DAC.CIRCULAR を指定できます。

両方の DAC を同時に使用する例:

dac1 = DAC(1)
dac2 = DAC(2)
dac1.write_timed(buf1, pyb.Timer(6, freq=100), mode=DAC.CIRCULAR)
dac2.write_timed(buf2, pyb.Timer(7, freq=200), mode=DAC.CIRCULAR)

定数

NORMAL: int

NORMAL モードはデータバッファ内の波形を 1 回だけ送信します。

CIRCULAR: int

CIRCULAR モードはデータバッファ内の波形を送信し、末尾に達するたびにバッファの先頭に戻ってラップし、deinit() が呼び出されるまで連続したループを生成します。