Nodemcu的ADC功能介绍
模数转换器(ADC)用于将模拟信号转换成数字形式。NodeMcu内置了10位ADC,只有一个ADC通道,即只有一个ADC输入引脚从外部设备读取模拟电压。
NodeMcu ADC引脚

Nodemcu内部设计中,ADC引脚与外部供电电路进行多路复用。因此,我们可以利用它来测量内部电压或外部电压。ADC引脚在读取外部电压时,输入电压范围为0-1.0V。
ADC模式的设置,测量的是系统电压还是外部电压,可在固件“esp_init_data_default” (0-127 byte) 的第 107 byte 设置。
ADC 内部电压测量
esp_init_data_default.bin (0-127 byte) 的 第107 byte (0 – 127字节)“vdd33_const”,必须设置为0xFF,即255,才能读取系统电压,即Nodemcu的VDD引脚上的电压。
ADC 外部电压测量
要读取ADC引脚上的外部电压,必须将“ vdd33_const ”的值设置为Nodemcu VDD引脚上的电源电压映射值,Nodemcu的工作电压范围在1.8V到3.6V之间,“vdd33_const”的单元为0.1V,因此,“vdd33_const”的值范围为18到36。
NodeMCU ADC函数
analogRead(A0):该函数用于读取模块ADC引脚上的外部电压。
ESP.getVcc():该函数用于读取NodeMCU模块VCC电压。ADC引脚必须留空。
注意,在读取VCC电源电压之前,应将ADC模式改为读取系统电压。要更改ADC模式,要在代码的 #include 行之后使用ADC_MODE(mode)。mode值为:ADC_TOUT表示外部电压,值为 ADC_VCC表示系统电压。默认情况下,它读取外部电压。
Nodemcu的ADC控制实例
读取NodeMCU的ADC引脚上的模拟电压,使用电位器在ADC引脚上提供0-3.3V的可变电压。

注意:上图NodeMCU ADC输入采用了电阻分压网络从3.3V引脚连接到ADC引脚,因此可确保NodeMCU的ADC脚的输入电压在0~3.3V范围,由于ADC的分辨率为10bit,所以在ADC输入电压0-3.3V的取值范围为0-1023。
ADC读取外部电压
void setup() { Serial.begin(9600); } void loop() { Serial.print("ADC Value: ");Serial.println(analogRead(A0)); delay(300); }
调整电位器,串口监视器输出如下:

在这里,我们发现测量值与实际值略有偏差。我们得到ADC 值变化为 5-1007,最高达到2790mv,即2.8V左右,与3.3V大约存在0.5V的差异。
ADC读取内部电压
根据Nodemcu的datasheet,通过ADC测量电源电压时,必须将ESP8266的ADC引脚悬空。在上面的外部电压测量中,为了确保外部电压输入范围(0-3.3V),我们将ADC连接到电阻分压器(100K 或 220K),如下图所示。

现在,如果我们去掉电阻分压器,让ADC引脚(TOUT)悬空,那么我们可以得到更好的精度,如下面所示,系统电压读数接近3.3V。
