class ADC -- 模数转换

用法:

import pyb

adc = pyb.ADC("P6")
val = adc.read()

如需同时访问每个 ADC 通道以及 MCU 的内部芯片温度、VBATVREFINT 传感器,请参阅 pyb.ADCAll

构造函数

class pyb.ADC(pin: int | str | Pin)

创建一个与给定引脚关联的 ADC 对象。这样你就可以读取该引脚上的模拟值。

方法

read() int

读取该模拟引脚上的值并返回。返回值介于 0 到 4095 之间。

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

timer 对象设定的速率将模拟值读入 buf

buf 可以是 bytearray 或 array.array 等类型。ADC 值具有 12 位分辨率,如果其元素大小为 16 位或更大,则会直接存入 buf。如果 buf 仅有 8 位元素(例如 bytearray),则采样分辨率将降至 8 位。

timer 应为 Timer 对象,每次定时器触发时读取一个采样。该定时器必须已初始化并以所需的采样频率运行。

为支持本函数以往的行为,timer 也可以是一个整数,用于指定采样频率(单位为 Hz)。在这种情况下,Timer(6) 将被自动配置为以给定频率运行。

使用 Timer 对象的示例(推荐方式):

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
tim = pyb.Timer(6, freq=10)        # create a timer running at 10Hz
buf = bytearray(100)               # buffer to hold the samples
adc.read_timed(buf, tim)           # sample 100 values, taking 10s

使用整数指定频率的示例:

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
buf = bytearray(100)               # buffer of 100 bytes
adc.read_timed(buf, 10)            # read 100 samples at 10Hz (10s total)

for val in buf:
    print(val)

本函数不分配任何堆内存。它具有阻塞行为:在缓冲区填满之前不会返回到调用程序。

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

从多个 ADC 中提取相对时序或相位数据。

timer 对象设定的速率将多个 ADC 的模拟值读入缓冲区。每次定时器触发时,依次从每个 ADC 快速读取一个采样。

ADC 实例和缓冲区实例以元组形式传入,每个 ADC 都有一个关联的缓冲区。所有缓冲区必须具有相同的类型和长度,且缓冲区的数量必须等于 ADC 的数量。

缓冲区可以是 bytearrayarray.array 等类型。ADC 值具有 12 位分辨率,如果缓冲区的元素大小为 16 位或更大,则会直接存入缓冲区。如果缓冲区仅有 8 位元素(例如 bytearray),则采样分辨率将降至 8 位。

timer 必须是 Timer 对象。该定时器必须已初始化并以所需的采样频率运行。

STM32 的 OpenMV Cam 仅暴露一个支持 ADC 的排针引脚(P6),因此在原装硬件上,read_timed_multi 仅在配合单个 ADC 时才有用。若要在多个 ADC 上使用它,请通过 pyb.Pincpu 引用接入额外的模拟输入。

读取一个 ADC 的示例:

import array

adc = pyb.ADC(pyb.Pin.board.P6)
tim = pyb.Timer(8, freq=100)
rx = array.array("H", (0 for i in range(100)))

# Sample 100 values at 100Hz (takes one second).
pyb.ADC.read_timed_multi((adc,), (rx,), tim)

for val in rx:
    print(val)

本函数不分配任何堆内存。它具有阻塞行为:在缓冲区填满之前不会返回到调用程序。

如果所有采样都以正确的时序采集,则函数返回 True。在高采样率下,采集一组采样所需的时间可能超过定时器周期。在这种情况下,函数返回 False,表示采样间隔的精度有所损失。在极端情况下,可能会漏掉采样。

最大速率取决于多种因素,包括数据宽度和正在读取的 ADC 数量。在测试中,两个 ADC 以 210kHz 的定时器速率采样而未发生溢出。在 215kHz 时则出现采样漏失。对于三个 ADC,上限约为 140kHz,对于四个 ADC 则约为 110kHz。在高采样率下,在采集期间禁用中断可以降低偶发数据丢失的风险。