class DAC -- 數位轉類比轉換

DAC 會在兩個 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 的整數(12)。每個通道實際對應的接腳取決於 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 倍。

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 位元模式下被視為位元組陣列,在 12 位元模式下則被視為無號半字組陣列(陣列型別碼 'H')。

freq 可以是指定寫入 DAC 取樣頻率的整數,使用 Timer(6)。或者它也可以是一個已經初始化的 Timer 物件,用來觸發 DAC 取樣。有效的計時器為 2、4、5、6、7 與 8。

mode 可以是 DAC.NORMALDAC.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 模式會將資料緩衝區中的波形傳送一次。

CIRCULAR: int

CIRCULAR 模式會傳送資料緩衝區中的波形,並在每次到達結尾時繞回緩衝區的開頭,產生連續的循環,直到呼叫 deinit() 為止。