class ADC -- 模数转换¶
用法:
import pyb
adc = pyb.ADC("P6")
val = adc.read()
如需同时访问每个 ADC 通道以及 MCU 的内部芯片温度、VBAT 和 VREFINT 传感器,请参阅 pyb.ADCAll。
构造函数¶
- class pyb.ADC(pin: int | str | Pin)¶
创建一个与给定引脚关联的 ADC 对象。这样你就可以读取该引脚上的模拟值。
方法¶
- 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 的数量。
缓冲区可以是
bytearray或array.array等类型。ADC 值具有 12 位分辨率,如果缓冲区的元素大小为 16 位或更大,则会直接存入缓冲区。如果缓冲区仅有 8 位元素(例如bytearray),则采样分辨率将降至 8 位。timer 必须是 Timer 对象。该定时器必须已初始化并以所需的采样频率运行。
STM32 的 OpenMV Cam 仅暴露一个支持 ADC 的排针引脚(
P6),因此在原装硬件上,read_timed_multi仅在配合单个 ADC 时才有用。若要在多个 ADC 上使用它,请通过pyb.Pin的cpu引用接入额外的模拟输入。读取一个 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。在高采样率下,在采集期间禁用中断可以降低偶发数据丢失的风险。