在本教程中,我们将学习ESP32中的ADC外设。的模拟数字转换器或简单的ADC od ESP32是非常有用的测量模拟电压从不同的传感器(如lm35温度传感器),电位器(调整LED的亮度)等。通过了解ESP32 ADC外设的特性、引脚、功能和几个演示电路来学习如何使用它。
关于ESP32 ADC外围设备的简要说明
ESP32 SoC由两个逐次逼近寄存器(SAR)型模拟到数字转换器(ADC)组成。ESP32中的ADC1和ADC2两个SAR adc总共有18个信道。ADC1由8个信道组成,ADC2由10个信道组成。
ESP32中的ADC的最大ADC分辨率为12位,是的,ADC的分辨率可以配置为9位、10位、11位和12位。通常,如果不更改,分辨率设置为12位。
因此,默认情况下,ESP32 ADC的输出将是0和4095范围内的值(因为默认分辨率是12位,输出数字值可以有212= 4096个值)。此外,ADC的输入电压限制为3.3V,即ESP32 ADC可以测量0V到3.3V的模拟电压。
ESP32的ADC引脚
不像一些数字外设(PWM,软件SPI和I2C), ADC引脚是固定的,也就是说,你必须使用预定义的具有ADC功能的GPIO引脚,你不能在软件中配置它。然而,有一些限制您必须知道。
即使ESP32有18通道ADC,所有的ADC引脚都不是用户可用的。在8个ADC1通道中,只有6个是可用的(ACD1_CH0和ACD1_CH3到ACD1_CH7),而ADC1_CH1和ADC1_CH2是不可用的(即使针脚没有在ESP32开发板上暴露)。
到了ADC2,这有点复杂。当您使用ESP32的Wi-Fi时,Wi-Fi驱动程序使用ADC2外设。因此,只有在Wi-Fi驱动未启动的情况下,才能使用ADC2。
即使你正在使用ADC2(假设没有使用Wi-Fi),所有的引脚也不是很容易获得的,因为与ADC2相关的一些引脚被用于其他重要的目的(引导捆扎)。
下表显示了ADC通道,Arduino风格的名称(A0, A1等),GPIO引脚和任何重要的点要记住。
ADC通道 |
销的名字 | GPIO管脚 | 笔记 |
ACD1_CH0 |
A0 | GPIO 36 | 免费使用/霍尔传感器引脚 |
ACD1_CH1 | GPIO 37 | 不可用 |
|
ACD1_CH2 |
GPIO 38 | 不可用 | |
ACD1_CH3 | A3 | GPIO 39 | 免费使用/霍尔传感器引脚 |
ACD1_CH4 |
A4 | GPIO 32 | 免费使用 |
ACD1_CH5 | A5 | GPIO 33 | 免费使用 |
ACD1_CH6 |
A6 | GPIO 34 | 免费使用 |
ACD1_CH7 | A7 | GPIO 35 | 免费使用 |
ACD2_CH0 |
A10 | GPIO 4 | |
ACD2_CH1 | A11 | GPIO 0 | 用作BOOT Pin /不可用 |
ACD2_CH2 |
A12 | GPIO 2 | 用作BOOT绑带针 |
ACD2_CH3 | 首次购物 | GPIO 15 | 用作BOOT绑带针 |
ACD2_CH4 |
阿 | GPIO 13 | |
ACD2_CH5 | A15 | GPIO 12 | |
ACD2_CH6 |
系 | GPIO 14 | |
ACD2_CH7 | 第A17 | GPIO 27 |
|
ACD2_CH8 |
那么 | GPIO 25 | |
ACD2_CH9 | A19 | GPIO 26 |
考虑到上述所有信息,可以肯定6个可用的ADC1引脚(ACD1_CH0和ACD1_CH3到ACD1_CH7)可以毫无歧义地使用。
ADC1_CH0和ADC1_CH3也与霍尔效应传感器相关联。
其他ESP32开发委员会可能有他们自己的限制。因此,一定要检查数据表和原理图,并检查特定的ADC引脚是否可以免费使用。
ADC的功能
ADC驱动程序公开了九个功能。它们是:
- analogRead(pin):获取指定引脚的ADC值。
- analogReadResolution(bits):设置analogRead输出分辨率。默认值为12位,可设置为9 ~ 12。
- analogSetWidth(bits):设置示例位和读取分辨率。默认值是12位,但取值范围是9 ~ 12。
- analogSetClockDiv(clockDiv):设置ADC时钟的分压器。
- analogSetAttenuation(attenuation):设置所有信道的衰减。默认值为11db,但可能的值为0db、2_5db、6db和11db。
- analogSetPinAttenuation(pin, attenuation):设置一个特定引脚的衰减。
- adcAttachPin(引脚):将引脚附加到ADC(在analogRead中自动完成)。
- analogSetVRefPin(引脚):设置引脚用于ADC校准,如果ESP32尚未校准。可能的引脚有25、26或27。
- analogReadMilliVolts(引脚):获取引脚的毫伏值。
模拟电压测量
有了理论,引脚信息和库功能的布局,我们现在可以开始开发实际使用ESP32的ADC外设的电路。对于第一个项目,让我们看看如何配置ESP32的ADC通道,并测量施加到其中一个ADC引脚的模拟电压。ESP32项目初学者]
提供可变模拟电压最简单的方法是利用电位器。将POT连接到ESP32开发板的3.3V和GND,将雨刷连接到ADC引脚的任意一端。为了简单起见,我使用ADC1_CH0,也就是GPIO 36 (A0)作为ADC引脚。
组件的要求
- ESP32 DevKit开发板
- 10 KΩ电位计
- 电路试验板
- 连接电线
- 5毫米领导
- 220Ω电阻
线路图
下图是用ESP32的ADC测量模拟电压的电路图。
代码
如果你曾经使用Arduino或ESP8266的ADC,代码是非常直接的。使用' analogRead '函数读取ADC引脚的ADC值(在本例中为A0),使用一个小的计算将数字值转换为电压,并在串行监视器上显示结果。
串行监视器的输出看起来像这样:
LED PWM采用ESP32 ADC
我做了一个关于LEDC工作的专门教程在PWM ESP32.阅读该教程以深入了解ESP32中的PWM。利用ADC可以设置ESP32的PWM输出占空比。
ADC引脚与前面的A0 (ADC1_CH0 - GPIO 36)相同,PWM引脚为GPIO 16。我连接了一个5毫米红色LED到这个引脚使用220Ω限流电阻。
线路图
下图是利用ESP32的ADC手动配置PWM占空比从而调节LED亮度的电框图。
代码
结论
关于在ESP32中使用ADC Module的完整教程。您了解了ESP32 ADC外设,它的相关引脚,什么ADC引脚使用是安全的,如何使用ESP32中的ADC测量模拟电压,以及如何使用ESP32中的ADC和PWM手动调整LED的亮度。
一个回应
非常好的文章,但是对于我自己来说,我想看到更多关于ESP32的高速捕捉能力的信息。在我的例子中,我要求CPU捕获4个同步模拟脉冲,持续时间从10毫秒到50毫秒,4个模拟输入的每一毫秒有20次扫描的分辨率。我在Espressif数据表中看到过注释,声称模拟输入能够实现真正的高速(即DIG控制器的2Msps),但没有详细解释。