class 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

构造函数

class pyb.ADC(pin)

创建与引脚关联的ADC对象。这使您可以在该引脚上读取模拟值。

方法

ADC.read()

读取模拟引脚上的值并返回它。返回值将在 0 和 4095 之间。

ADC.read_timed(buf, timer)

以由 timer 对象设置的速率将模拟值读取到 buf 中。

buf 可以是 bytearray 或 array.array。以Array为例。ADC 值具有 12 位分辨率,如果 buf 的元素大小为 16 位或更大,则直接存储到 buf 中。如果 buf 只有 8 位元素(例如 bytearray),则采样分辨率将降低为 8 位。

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

支持此函数以前的行为,timer 也可以是一个整数,指定要采样的频率(以赫兹为单位)。在这种情况下,Timer(6) 将自动配置为以给定频率运行。

使用 Timer 对象的示例(首选方法):

adc = pyb.ADC(pyb.Pin("P5"))        # create an ADC on pin P5
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("P5"))        # create an ADC on pin P5
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

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

ADCAll 对象

实例化此对象将所有掩码 ADC 引脚更改为模拟输入。预处理的 MCU 温度、VREF 和 VBAT 数据可以通过分别在 ADC 通道 16、17 和 18 上访问。根据所使用的参考电压(通常为 3.3V),将进行适当的缩放。芯片上的温度传感器经过出厂校准,允许将芯片温度读取到 +/- 1 摄氏度。尽管听起来相当准确,但不要忘记 MCU 的内部温度是被测量的。根据处理负载和活动的 I/O 子系统,芯片温度可能轻易高出环境温度十多度。另一方面,长时间待机后唤醒的 pyboard 将在上述限制内显示正确的环境温度。

ADCAllread_core_vbat(), read_vref()read_core_vref() 方法读取备用电池电压、参考电压和(1.21V 名义)参考电压,使用实际供电作为参考。所有结果都是浮点数,提供直接电压值。

read_core_vbat() 返回备用电池电压。该电压也根据实际供电电压进行调整。为了避免模拟输入过载,电池电压是通过电压分压器测量的,并根据分压器值进行缩放。为了防止对备用电池造成过大负载,只有在 ADC 转换期间才会激活电压分压器。

read_vref() 通过测量内部电压参考并使用内部电压参考的工厂校准值进行反向缩放。在大多数情况下,读数将接近 3.3V。如果 pyboard 由电池供电,供电电压可能会降至低于 3.3V 的值。只要满足操作条件,pyboard 仍然会正常运行。通过正确设置 MCU 时钟、闪存访问速度和编程模式,可以将 pyboard 运行到 2V 以下,仍然可以获得有用的 ADC 转换。

非常重要的是确保模拟输入电压永远不要超过实际供电电压。

其他模拟输入通道(0..15)将根据所选精度返回未缩放的整数值。

为了避免意外激活模拟输入(通道 0..15),可以指定第二个参数。该参数是一个二进制模式,其中每个请求的模拟输入都具有相应的位设置。默认值为 0xffffffff,表示所有模拟输入都处于活动状态。如果只需要内部通道(16..18),则掩码值应为 0x70000。

例子:

adcall = pyb.ADCAll(12, 0x70000) # 12 bit resolution, internal channels
temp = adcall.read_core_temp()