目录
介绍
模数转换器(ADC)用于将模拟信号转换为数字形式。ESP8266内置10位ADC,只有一个ADC通道,即它只有一个ADC输入引脚,用于读取外部器件/传感器的模拟电压。
NodeMCU DevKit上的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电压。因此,我们可以将0-3.3V范围用于NodeMCU Dev Kit的ADC输入电压。由于10位分辨率,它将为Dev Kit上的ADC输入电压0-3.3V提供0-1023的值范围。
adc.force_init_mode()(如下所述)功能用于选择模式,即ADC读取系统电压或ADC读取外部电压。
如果模式改变,则必须重新启动系统(例如,使用电源循环,复位按钮,node.restart())。
NodeMCU ADC功能
我们来看看用于访问NodeMCU Dev Kit上的ADC的ADC函数。
adc.force_init_mode()
检查并在必要时重新配置ESP init数据块中的ADC模式设置。
句法:
adc.force_init_mode(mode_value)
参数:
mode_value或者是adc.INIT_ADC于外部电压或adc.INIT_VDD33在船上系统电压。
返回:
如果函数必须更改模式,则返回true;如果已配置模式,则返回fals。在真正的返回时,ESP需要重新启动才能使更改生效。
例:
if adc.force_init_mode(adc.INIT_VDD33)
then
node.restart()
return
end
adc.read()
该功能读取ADC引脚上的模拟电压。
句法:
adc.read(channel)
参数:
ADC channel只有1,ESP8266总是0
返回:采样数字值。
请注意,如果ESP8266已配置为使用ADC读取系统电压,则此功能将始终返回65535.这是硬件和/或SDK限制。
例:
ADC value = adc.read(0)
adc.readvdd33()
该功能读取系统电压。
句法:
adc.readvdd33()
参数:无
返回:以毫伏(数字)返回系统电压
如果ESP8266已配置为使用ADC对引脚上的外部电压进行采样,则此功能将始终返回65535.这是硬件和/或SDK限制。
例:
print("System voltage (mV):", adc.readvdd33(0))
例
让我们写一个Lua脚本来读取NodeMCU的ADC引脚上的模拟电压。这里我们使用电位器在Dev Kit的ADC引脚上提供0-3.3V的可变电压。连接如下图所示。
NodeMCU ADC
现在编写Lua脚本来读取ADC通道并在ESPlorer的串行监视器上打印数字值。
用于读取外部电压的Lua脚本
print("ADC value:", adc.read(0)) -- print external voltage
输出窗口
下图显示了ESPlorer IDE的串行监视器上的输出
ESPlorer的串行输出窗口
用于读取系统电压的Lua脚本
print("System voltage (mV):", adc.readvdd33(0)) -- print system voltage
输出窗口
下图显示了ESPlorer IDE的串行监视器上的输出
系统电压(电源电压)值稍微偏离其实际值。关于系统电压读数的这个问题在ESP8266 github页面的#721给出。
根据ESP8266的数据表,TOUT(ESP8266的ADC引脚)引脚必须悬空(浮动),同时通过ADC测量电源电压。但是在NodeMCU开发套件/模块上,为了支持外部电压范围(0-3.3V),它连接到电阻分压器网络(100Kohm和220Kohm),如下图所示。
NodeMCU ADC分压器网络
现在,如果我们移除电阻分压器n / w和ADC引脚(TOUT)悬空,那么我们得到的结果如下面的系统电压读数的输出窗口图像所示。即3521 mV。
本教程完整代码下载: