#ESP32 #Python
machine.ADC
类是machine
模块下的一个核心硬件抽象类,旨在专门配置与控制 ADC(模拟到数字转换器)设备的各项参数,同时提供了一系列操作 ADC 设备所必需的方法。本章节聚焦于 ESP32 微控制器内置的模数转换器(ADC)的详细介绍与应用实践。在此,我们将演示如何通过Python编程方式,利用前面学习的UART串口通信技术,实时输出并监控 ADC 采集到的电压值,以实现一个基础的、实时性强的监控机制。
本节课目标:
通过Python编程,利用前面学习的UART串口通信技术,实时输出并监控ESP32内置 ADC 采集的电压值。
本节课内容:
- ADC简介
- machine.ADC类
- 硬件设计
- 软件设计
- 下载验证
一、ADC简介
ADC,即模数转换器(Analogue to Digital Converter),是一种关键的数据转换装置。其功能在于将模拟信号转换为二进制代码,从而使数字电路能够与外部环境实现无缝对接,进而处理现实世界中的各类信号。
针对ESP32的ADC模块,其设计具备12位的分辨率,这意味着在模拟信号转换为数字信号的过程中,能够识别并表达极其细微的差异。具体而言,ADC转换后的数值范围被界定在0至4095之间,这一范围详尽地映射了模拟信号的动态变化。
鉴于ESP32的工作电压设定为3.3V,我们可以进一步推导出ADC数值与电压之间的明确关系。当ADC数值达到其上限,即4095时,所代表的电压值恰好为3.3V;相反,当ADC数值为0时,则对应于0V的电压值。
ESP32 集成了 2 个 12 位 SAR ADC,共支持 18 个模拟通道输入。为了实现更低功耗,ESP32 的 ULP 协处理器也 可以在睡眠方式下测量电压,此时,可通过设置阈值或其他触发方式唤醒 CPU。 在ESP32WROOM-32的GPIO引脚如下图所示:
二、machine.ADC类
在machine模块中,ADC类负责配置并管理ADC设备,实现模拟信号至离散数字信号的转换过程。ADC设备的关键性能指标包括采样值与分辨率。采样值具体指代某一时刻由模拟信号转换所得的数字信号的数值表示;而分辨率则以二进制(或十进制)数字的位数来量化,位数增加意味着分辨率的提升,从而促使采样值达到更高的精确度。
下面是MicroPython库的machine.ADC类链接。
类 ADC – 模数转换 — MicroPython 最新文档
1. machine.ADC类的构造对象
构造对象方法如下:
class machine.ADC(id, *, atten)
使用示例:adc =ADC(Pin(35), ADC.ATTN_11DB)
构造函数的参数描述如下:
参数 | 描述 |
id | 管脚号,Pin(*) |
atten | atten 指定输入衰减。测试有效值(近似线性测量范围值)如下:
|
返回值:ADC
类对象
2. machine.ADC类的方法
(1)对象初始化
方法原型如下:
ADC.init(*, atten)
方法的参数描述如下:
参数 | 描述 |
atten | atten 指定输入衰减。测试有效值(近似线性测量范围值)如下:
|
(2)设置输入衰减
方法原型如下:
ADC.atten(atten)
相当于 ADC.init(atten)
参数 | 描述 |
atten | atten 指定输入衰减。测试有效值(近似线性测量范围值)如下:
|
(3)设置采样宽度,即ADC分辨率
方法原型如下:
ADC.width(bits)
方法的参数描述如下:
参数 | 描述 |
bits |
|
(4)读取原始ADC值
返回采集的ADC数值,例如0-4095表示12位分辨率。
方法原型如下:
ADC.read()
返回值:读取到的ADC原始值。
三、硬件设计
1. 例程功能
通过Python编程,利用前面学习的UART串口通信技术,实时输出并监控ESP32内置 ADC 采集的电压值。
2. 硬件资源
- USART2 :GPIO16 GPIO17 连接串口工具 RX、TX引脚。
- ADC: GPIO35 --> ADC1_7
3. 原理图
在ESP32开发环境中,应当精确地通过杜邦线连接一个电位器元件。电位器的两端引脚分别代表了其固定的电阻值,一端应稳妥地接地(GND),以确保电流的正常回流;另一端则应可靠地连接至3.3V直流电源,以为电位器提供稳定的电压供应。至于电位器的中间引脚,它承载着变化的电压输出功能,这一输出应准确无误地连接到ESP32开发板的ADC1_7接口(即GPIO 35号引脚),以实现对模拟信号的精确采集与处理。
四、软件设计
1. 程序流程图
2. 程序
from machine import UART, Pin, ADC
import time
# 实例化串口
uart = UART(2, 115200, 8, None, 1, tx=Pin(17), rx=Pin(16))
# 实例化ADC
# 并设置 ADC 输入衰减模式, 【 ADC.ATTN_11DB: 11dB衰减(150mV-2450mV)】
adc = ADC(Pin(35), atten=ADC.ATTN_11DB)
# 设置ADC采样宽度,即ADC分辨率。12位分辨率。
adc.width(ADC.WIDTH_12BIT)
while True:
# 循环ADC采集输出
# 读取ADC值,并转换为电压值
Voltage_Val = float(adc.read()/4095*3.3) # 采集电压值
# 串口输出
uart.write(b'ADC: %0.2f V\r\n' % Voltage_Val)
# REPL输出,方便调试
print('ADC: %0.2f V\r\n' %Voltage_Val)
# 延时 1 S
time.sleep(1)
五、下载验证
已经成功实现了ESP32内置模拟数字转换器(ADC)的电压采集功能,并且能够通过串行通信接口(串口)对外输出所采集到的电压值信息。