https://blog.csdn.net/solar_Lan/article/details/79248485
介紹
模數轉換器(ADC)用於將模擬信號轉換為數字形式。ESP8266具有內置的10位ADC,只有一個ADC通道,即只有一個ADC輸入引腳可讀取來自外部器件的模擬電壓。
NodeMCU套件上的ESP8266 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。
有關“vdd33_const”的更多信息,請參閱本文末尾的ESP8266數據表的ADC部分。
請注意,下圖所示的NodeMCU Dev Kit具有板上寄存器分配網絡,從3.3V到ESP8266的ADC引腳提供1.0V的電壓。因此,對於NodeMCU以下的開發套件,我們可以使用0-3.3V范圍的ADC輸入電壓。由於ADC具有10位分辨率,因此開發工具包上的ADC輸入電壓為0-3.3V時,會給出0-1023的值范圍。
NodeMCU ADC功能
analogRead(A0)
此功能用於讀取施加在模塊的ADC引腳上的外部電壓。
ESP.getVcc()
該功能用於讀取NodeMCU模塊的VCC電壓。ADC引腳必須保持不連接。
請注意,在讀取VCC電源電壓之前,應更改ADC模式以讀取系統電壓。
要ADC_MODE(mode)在#include行后面改變ADC模式。
模式是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讀取系統電壓
ADC_MODE(ADC_VCC); void setup() { Serial.begin(9600); } void loop() { Serial.print("System voltage(mV): ");Serial.println(ESP.getVcc()); delay(300); }
輸出窗口
下圖顯示了Arduino IDE串行監視器上的輸出
在這里,我們發現測得的值與實際值略有偏差。對於外部電壓,在開發套件上的ADC引腳上施加0-3.3V的5-1007 ADC值變化。而對於系統電壓(模塊上的電壓),我們可以達到2790mV,即大約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的輸出窗口圖像。