目录
介绍
模数转换器(ADC)用于将模拟信号转换为数字形式。ESP8266内置10位ADC,只有一个ADC通道,即它只有一个ADC输入引脚,用于从外部器件读取模拟电压。
NodeMCU上的ESP8266 ADC引脚
NodeMCU ADC引脚
ESP8266上的ADC通道与电池电压复用。因此,我们可以将其设置为测量板载系统电压或外部电压。读取外部电压时,ADC引脚的输入电压范围为0-1.0V。
固件的“esp_init_data_default.bin”(0-127字节)的第107个字节中提供了ADC模式的设置,即是否正在测量系统电压或外部电压。
esp_init_data_default.bin
(0 – 127字节)的第107个字节是“vdd33_const”。它必须设置为0xFF,即255才能读取系统电压,即ESP8266的VDD引脚上的电压。
要读取ADC引脚上的外部电压,必须将其设置为ESP8266的VDD引脚上的电源电压。ESP8266的工作电源电压范围为1.8V至3.6V,“vdd33_const”的单位为0.1V,因此“vdd33_const”的取值范围为18至36。
请注意,下图所示的NodeMCU Dev Kit具有板载寄存器分配器网络,可从3.3V向ESP8266的ADC引脚提供1.0V电压。因此,对于以下NodeMCU Dev Kit,我们可以将0-3.3V范围用于ADC输入电压。由于ADC具有10位分辨率,因此在Dev Kit上为ADC输入电压0-3.3V提供0-1023值范围。
NodeMCU ADC功能
analogRead(A0)
该功能用于读取模块ADC引脚上的外部电压。
ESP.getVcc()
该功能用于读取NodeMCU模块的VCC电压。ADC引脚必须保持未连接状态。
请注意,在读取VCC电源电压之前,应将ADC模式更改为读取系统电压。
要改变ADC模式ADC_MODE(mode)
,请在#include行之后使用。
模式是ADC_TOUT
(对于外部电压),ADC_VCC
(对于系统电压)。默认情况下,它读取外部电压。
例
让我们编写一个Arduino程序,用于读取NodeMCU的ADC引脚上的模拟电压。这里我们使用电位器在Dev Kit的ADC引脚上提供0-3.3V的可变电压。连接如下图所示:
Arduino程序用于读取外部电压
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("ADC Value: ");
Serial.println(analogRead(A0));
delay(300);
}
输出结果
下图显示了Arduino IDE串行监视器的输出
Arduino 程序用于读取系统电压
输出窗口
下图显示了Arduino IDE串行监视器的输出
在这里,我们发现测量值与实际值略有不同。对于外部电压,我们得到5-1007 ADC值变化,0-3.3V应用于Dev Kit上的ADC引脚。对于系统电压(模块上的电压),我们可以达到2790 mV,即大约2.8V。这表明差异大约为0.5V,即3.3V。
关于外部电压测量的问题在ESP8266 github页面的#2672和#3168给出。有关系统电压读数的问题,请参见ESP8266 github页面上的#721。
根据ESP8266的数据表,TOUT(ESP8266的ADC引脚)引脚必须悬空(浮动),同时通过ADC测量电源电压。但是在NodeMCU开发套件/模块上,为了支持外部电压范围(0-3.3V),它连接到电阻分压器网络(100Kohm和220Kohm),如下图所示。
现在,如果我们移除电阻分压器n / w,并使ADC引脚(TOUT)悬空,那么我们可以获得更好的结果精度,如下面的系统电压读数的输出窗口图像所示,接近3.3V。
本教程完整程序下载: