class DAC -- 數位轉類比轉換¶
DAC 會在兩個 STM32 DAC 通道之一上輸出介於 0 V 與 3.3 V 之間的類比電壓。
在每一款公開 pyb.DAC 的 STM32 OpenMV Cam(M4 / M7 / H7 / H7 Plus / Pure Thermal)上,通道的接線如下:
DAC 通道 |
排針接腳 |
STM32 接腳 |
|---|---|---|
|
(不在排針上) |
|
|
|
|
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 可以是
None、False或True;此參數的意義請參閱上方的建構函式。
- 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.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)
常數¶