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可以是一个整数,指定使用 Timer(6) 写入 DAC 采样的频率。也可以是一个已初始化的 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)
常量¶