第十九章 ADC实验
machine.ADC 类是 machine 模块下的一个硬件类,用于指定 ADC 设备的配置和控制,提供对 ADC 设备的操作方法。本章,我们将介绍ESP32-S3的内部模数转换器ADC。我们将使用SPILCD模块来RV1的电压值,实现一个简单的实时监控。
本章分为如下几个小节:
19.1 ADC简介
19.2 machine.ADC类
19.3 硬件设计
19.4 软件设计
19.5 下载验证
19.1 ADC简介
ADC是模数转换器(Analogue to Digital Converter)的简称,是一种数据转换器。它通过将模拟信号编码为二进制代码,使数字电路能够与现实世界进行接口。
在现实世界中,模拟信号具有不断变化的值,这些值来自各种来源和传感器,可以测量声音、光、温度或运动,许多数字系统通过测量来自这些传感器的模拟信号与环境相互作用。然而,数字电路只能处理只有两个离散状态的二进制信号,即逻辑“1”(HIGH)或逻辑“0”(LOW)。因此,需要一种能够在连续变化的模拟信号和离散数字信号这两个不同域之间进行转换的电子电路,这就是ADC的作用。
在ESP32-S3开发板中,具有ADC功能的GPIO引脚如下图所示。
图19.1.1 ESP32-S3 ADC管脚
在上图中,ESP32-S3 集成了两个12位SAR ADC,共支持20个模拟通道输入,ADC、RTC和TOUCH功能只能用这些管脚实现功能,不能在其他管脚复用这些功能。
ESP32-S3的ADC模块的分辨率为12位,所以AD转换后的值范围为0~4095。由于ESP32-S3的工作电压为3.3V,所以当AD值为4095时,对应的电压为3.3V;当AD值为0时,对应的电压为0V。对于AD值和电压值,这里就会有一个简单的关系,如下所示。
19.2 machine.ADC类
machine模块下的ADC类提供了配置和控制ADC设备的方法,可以将连续变化的模拟信号转化为离散的数字信号。ADC设备的两个重要参数是采样值和分辨率。采样值表示当前时间由模拟信号转化的数值信号的数值,分辨率以二进制(或十进制)数的位数来表示,位数越多表示分辨率越高,采样值会更精确。
1,machine.ADC类的构造方法
RTC的构造对象方法如下:
class machine.ADC(pin) 使用示例:adc = ADC(Pin(8))
该构造方法的参数描述,如下表所示。
表19.2.1 machine.ADC构造方法参数描述
返回值:ADC对象。
2,machine.ADC类的方法
①:设置输入衰减。
其方法原型如下:
adc.atten(atten)
该方法的参数描述,如下表所示。
表19.1.2 RTC.init方法参数描述
返回值:无。
②:读取原始ADC值。
其方法原型如下:
adc.read()
返回值:ADC数值。
③:设置采样宽度。
其方法原型如下:
adc.width(bits)
该方法的参数描述,如下表所示。
表19.1.3 adc.width的方法描述
返回值:无。
19.2 硬件设计
1. 例程功能
本章实验功能简介:使用ADC1采集通道7(IO8)上面的电压,在SPILCD模块上面显示ADC转换值以及换算成电压后的电压值。在P3端口中,使用短路帽将AIN和RV1排针连接,使得IO8连接到电位器上,然后将ADC采集到的数据和转换后的电压值在SPILCD屏中显示。用户可以通过调节电位器的旋钮改变电压值。LED闪烁,提示程序运行。
2. 硬件资源
1)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
2)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
3)ADC
AIN-RV(跳线帽)
3. 原理图
ADC属于ESP32-S3内部资源,实际上我们只需要软件设置就可以正常工作,另外还需要将待测量的电压源连接到ADC通道上,以便ADC测量。本实验,我们通过ADC1的通道7(IO8)来采集外部电压值,开发板有一个电位器,可调节的电压范围是:0~3.3V。我们可以通过跳线帽将IO8与电位器连接,如下图所示:
图19.2.1 IO8(对应AIN排针)与电位器示意图
使用杜邦线将ADC和RV1排针连接好后,并下载程序后,就可以用螺丝刀调节电位器变换多种电压值进行测量。
有的朋友可能还想测量其它地方的电压值,我们只需要1根杜邦线,一端接到AIN排针上,另外一端就接你要测试的电压点。一定要保证测试点的电压在0~3.3V的电压范围,否则可能烧坏我们的ADC,甚至是整个主控芯片。
19.3 软件设计
19.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
图19.3.1.1 程序流程图
19.3.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。ADC实验main.py源码如下:
from machine import Pin,ADC,SPI,I2C import atk_xl9555 as io_ex import atk_lcd as lcd import time """ * @brief 程序入口 * @param 无 * @retval 无 """ if __name__ == '__main__': # 初始化LED并输出高电平 led = Pin(1,Pin.OUT,value = 1) # IIC初始化 i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000) # XL9555初始化 xl9555 = io_ex.init(i2c0) # 复位LCD xl9555.write_bit(io_ex.SLCD_RST,0) time.sleep_ms(100) xl9555.write_bit(io_ex.SLCD_RST,1) time.sleep_ms(100) # 初始化SPI spi = SPI(2,baudrate = 80000000, sck=Pin(12), mosi=Pin(11), miso = Pin(13)) # 初始化LCD,lcd = 0为正点原子2.4寸屏幕;lcd = 1为正点原子1.3寸SPILCD屏幕; display = lcd.init(spi,dc = Pin(40,Pin.OUT),cs=Pin(21, Pin.OUT),dir=1,lcd=0) # 开启背光 xl9555.write_bit(io_ex.SLCD_PWR,1) time.sleep_ms(100) # 显示实验信息 display.string(30, 50, 240, 32, 32, "ESP32-S3",lcd.RED) display.string(30, 80, 240, 24, 24, "ADC TEST",lcd.RED) display.string(30, 110, 240, 16, 16, "ATOM@ALIENTEK",lcd.RED) display.string(30, 130, 200, 16, 16, "ADC: 0 . 0 V", lcd.BLUE) # 初始化ADC adc = ADC(Pin(8)) # 引脚8跟底板的电位器相连接 while True: # 读取ADC值 umber = float(adc.read()/4095*3.3) display.num(30 + 40 ,130,int(umber),2,16,lcd.RED) display.num(30 + 72 ,130,int(umber * 100 % 100),2,16,lcd.RED) led_state = led.value() led.value(not led_state) time.sleep_ms(100)
这示例代码的主要功能是使用各种硬件接口和模块来控制和初始化一些设备,并在LCD显示屏上显示信息。具体来说,代码首先初始化了LED灯并使其输出高电平,然后初始化了I2C总线设备,并使用I2C总线初始化了一个XL9555芯片。接着,通过这个芯片来复位LCD显示屏,并使用SPI总线设备初始化了一个LCD显示屏。然后开启LCD显示屏的背光,并在显示屏上显示一些信息。最后,代码进入一个无限循环,在循环中不断读取ADC设备的值,并将其显示在LCD显示屏上。同时,还会切换LED灯的状态
19.4 下载验证
下载代码后,可以看到LCD显示如下图所示:
图19.4.1 ADC采集实验测试图
上图中,我们使用跳线帽将P3的AIN和RV1连接,使得IO8连接到电位器上,测试的是电位器的电压,并可以通过螺丝刀调节电位器改变电压值,范围:0~3.3V。LED闪烁,提示程序运行。