ADC(模数转换)

在 ESP32 芯片上,ADC 功能可用的引脚为 32-39(ADC 通道 1)以及 0、2、4、12-15 和 25-27(ADC 通道 2)。

在 ESP32S3 芯片上,ADC 功能可用于引脚 1-10(ADC 通道 1)以及引脚 11-14 和 17-20(ADC 块 2)。

ADC 通道 2 也会被 WiFi 使用,因此当 WiFi 处于活动状态时,尝试从通道 2 引脚读取模拟值将会引发异常。

MicroPython 应用示例:

 1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from hardware import *
 9
10
11title0 = None
12label0 = None
13adc6 = None
14
15
16def setup():
17    global title0, label0, adc6
18
19    M5.begin()
20    Widgets.fillScreen(0x222222)
21    title0 = Widgets.Title("CoreS3 ADC Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18)
22    label0 = Widgets.Label(
23        "Read GPIO6 ADC Value:", 4, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18
24    )
25
26    adc6 = ADC(Pin(6), atten=ADC.ATTN_11DB)
27
28
29def loop():
30    global title0, label0, adc6
31    M5.update()
32    label0.setText(str((str("ADC Value:") + str((adc6.read())))))
33
34
35if __name__ == "__main__":
36    try:
37        setup()
38        while True:
39            loop()
40    except (Exception, KeyboardInterrupt) as e:
41        try:
42            from utility import print_error_msg
43
44            print_error_msg(e)
45        except ImportError:
46            print("please update to latest firmware")

UiFlow2 应用示例:

example.png

adc_cores3_example.m5f2

class ADC

class ADC(pin, *, atten)

返回指定引脚的 ADC 对象。ESP32 不支持 ADC 采样的不同定时,因此不支持 sample_ns 关键字参数。

要读取高于参考电压的电压,请使用 atten 关键字参数对输入进行衰减。有效值(以及近似的线性测量范围)如下:

  • ADC.ATTN_0DB:无衰减(100 mV - 950 mV)。

  • ADC.ATTN_2_5DB:2.5 dB 衰减(100 mV - 1250 mV)。

  • ADC.ATTN_6DB:6 dB 衰减(150 mV - 1750 mV)

  • ADC.ATTN_11DB:11 dB 衰减(150 mV - 2450 mV)

UIFLOW2:

init.png

警告

请注意,输入引脚的绝对最大额定电压为 3.6V。接近该边界有损坏 IC 的风险!

Methods

ADC.read()

该方法返回原始 ADC 值,其范围根据该块的分辨率而定,例如 12 位分辨率为 0-4095。

UIFLOW2:

read.png

ADC.read_u16()

执行一次模拟读取,并返回范围为 0-65535 的整数。返回值表示 ADC 采集的原始读数,并经过缩放处理,使最小值为 0,最大值为 65535。

UIFLOW2:

read_u16.png

ADC.read_uv()

该方法利用 ADC 的已知特性以及每个封装在制造时设置的 eFuse 值,返回经校准的输入电压(衰减前),单位为微伏。返回值只有毫伏分辨率(即始终为 1000 微伏的整数倍)。

校准仅在 ADC 的线性范围内有效。特别是,将输入端接地时,读数将会是高于 0 微伏的值。然而,在线性范围内,相较于使用 read_u16() 并用常量对结果进行缩放,将获得更准确且更一致的结果。

UIFLOW2:

read_uv.png

ADC.atten(atten)

等同于 ADC.init(atten=atten)

UIFLOW2:

atten.png

ADC.width(bits)

等同于 ADC.block().init(bits=bits)

为兼容性考虑,ADC 对象还提供与所支持的 ADC 分辨率相匹配的常量:

  • ADC.WIDTH_9BIT = 9

  • ADC.WIDTH_10BIT = 10

  • ADC.WIDTH_11BIT = 11

  • ADC.WIDTH_12BIT = 12

UIFLOW2:

width.png