类 ADC – 模数转换¶
用法:
import pyb
adc = pyb.ADC(pin) # create an analog object from a pin
val = adc.read() # read an analog value
adc = pyb.ADCAll(resolution) # create an ADCAll object
adc = pyb.ADCAll(resolution, mask) # create an ADCAll object for selected analog channels
val = adc.read_channel(channel) # read the given channel
val = adc.read_core_temp() # read MCU temperature
val = adc.read_core_vbat() # read MCU VBAT
val = adc.read_core_vref() # read MCU VREF
val = adc.read_vref() # read MCU supply voltage
方法¶
-
ADC.read()¶ 读取模拟引脚上的值并将其返回。返回值将在 0 到 4095 之间。
-
ADC.read_timed(buf, timer)¶ buf以timer对象设置的速率将模拟值读入。buf例如,可以是 bytearray 或 array.array。ADC 值具有 12 位分辨率,buf如果其元素大小为 16 位或更大,则直接存储到其中。如果buf只有 8 位元素(例如字节数组),则样本分辨率将降低到 8 位。timer应该是一个 Timer 对象,每次定时器触发时都会读取一个样本。计时器必须已经初始化并以所需的采样频率运行。为了支持此函数的先前行为,
timer也可以是一个整数,指定要采样的频率(以 Hz 为单位)。在这种情况下,Timer(6) 将自动配置为以给定频率运行。使用 Timer 对象的示例(首选方式):
adc = pyb.ADC(pyb.Pin.board.X19) # create an ADC on pin X19 tim = pyb.Timer(6, freq=10) # create a timer running at 10Hz buf = bytearray(100) # creat a buffer to store the samples adc.read_timed(buf, tim) # sample 100 values, taking 10s
使用整数作为频率的示例:
adc = pyb.ADC(pyb.Pin.board.X19) # create an ADC on pin X19 buf = bytearray(100) # create a buffer of 100 bytes adc.read_timed(buf, 10) # read analog values into buf at 10Hz # this will take 10 seconds to finish for val in buf: # loop over all values print(val) # print the value out
此函数不分配任何堆内存。它具有阻塞行为:在缓冲区已满之前它不会返回到调用程序。
-
ADC.read_timed_multi((adcx, adcy, ...), (bufx, bufy, ...), timer)¶ 这是一个静态方法。它可用于从多个 ADC 中提取相关时序或相位数据。
它以定时器对象设置的速率从多个 ADC 读取模拟值到缓冲区中。每次定时器触发一个样本时,都会依次从每个 ADC 快速读取。
ADC 和缓冲区实例以元组形式传递,每个 ADC 都有一个关联的缓冲区。所有缓冲区必须具有相同的类型和长度,并且缓冲区的数量必须等于 ADC 的数量。
缓冲器可以是
bytearray或array.array例如。ADC 值具有 12 位分辨率,如果其元素大小为 16 位或更大,则直接存储到缓冲区中。如果缓冲区只有 8 位元素(例如bytearray),则样本分辨率将降低到 8 位。timer必须是一个 Timer 对象。计时器必须已经初始化并以所需的采样频率运行。
读取 3 个 ADC 的示例:
adc0 = pyb.ADC(pyb.Pin.board.X1) # Create ADC's adc1 = pyb.ADC(pyb.Pin.board.X2) adc2 = pyb.ADC(pyb.Pin.board.X3) tim = pyb.Timer(8, freq=100) # Create timer rx0 = array.array('H', (0 for i in range(100))) # ADC buffers of rx1 = array.array('H', (0 for i in range(100))) # 100 16-bit words rx2 = array.array('H', (0 for i in range(100))) # read analog values into buffers at 100Hz (takes one second) pyb.ADC.read_timed_multi((adc0, adc1, adc2), (rx0, rx1, rx2), tim) for n in range(len(rx0)): print(rx0[n], rx1[n], rx2[n])
此函数不分配任何堆内存。它具有阻塞行为:在缓冲区已满之前它不会返回到调用程序。
True如果所有样本均以正确的时序采集,则该函数返回。在高采样率下,采集一组样本所花费的时间可能会超过定时器周期。在这种情况下,函数返回False, 表示采样间隔中的精度损失。在极端情况下,样本可能会丢失。最大速率取决于包括数据宽度和正在读取的 ADC 数量在内的因素。在测试中,两个 ADC 以 210kHz 的定时器速率采样而没有溢出。样本在 215kHz 时丢失。三个 ADC 的限制在 140kHz 左右,四个 ADC 的限制在 110kHz 左右。在高采样率下,在持续时间内禁用中断可以降低零星数据丢失的风险。
ADCAll 对象¶
实例化这会将所有屏蔽的 ADC 引脚更改为模拟输入。可以分别在 ADC 通道 16、17 和 18 上访问预处理的 MCU 温度、VREF 和 VBAT 数据。根据使用的参考电压(通常为 3.3V)处理适当的缩放。芯片上的温度传感器经过工厂校准,可以读取 +/- 1 摄氏度的芯片温度。虽然这听起来很准确,但不要忘记测量 MCU 的内部温度。根据处理负载和 I/O 子系统的活动情况,芯片温度很容易比环境温度高出几十度。另一方面,在长时间待机后唤醒的 pyboard 将显示在上述限制范围内的正确环境温度。
ADCAll read_core_vbat(), read_vref() 和 read_core_vref()方法读取备份电池电压,基准电压和使用实际的供应作为基准(1.21V标称)的参考电压。所有结果都是给出直流电压值的浮点数。
read_core_vbat() 返回备用电池的电压。这个电压也是根据实际供电电压来调整的。为避免模拟输入过载,电池电压通过分压器测量并根据分压器值进行缩放。为防止备用电池负载过大,分压器仅在 ADC 转换期间有效。
read_vref()通过测量内部参考电压并使用内部参考电压的工厂校准值对其进行回标来评估。在大多数情况下,读数将接近 3.3V。如果 pyboard 使用电池供电,电源电压可能会降至 3.3V 以下。只要满足运行条件,pyboard 仍然可以正常运行。通过适当设置 MCU 时钟、闪存访问速度和编程模式,可以将 pyboard 运行到 2 V 并仍然获得有用的 ADC 转换。
确保模拟输入电压永远不会超过实际电源电压非常重要。
其他模拟输入通道 (0..15) 将根据所选精度返回未缩放的整数值。
为避免模拟输入(通道 0..15)的意外激活,可以指定第二个参数。此参数是一个二进制模式,其中每个请求的模拟输入都设置了相应的位。默认值为 0xffffffff,这意味着所有模拟输入都处于活动状态。如果仅需要内部通道 (16..18),则掩码值应为 0x70000。
例子:
adcall = pyb.ADCAll(12, 0x70000) # 12 bit resolution, internal channels
temp = adcall.read_core_temp()