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