关于ESP32使用ADC测量电压不准的解决方案
目前此份代码解决了ADC测量电压不准的问题,并不能尝试解决ADC采集模拟信号的问题
#include <Arduino.h>
#include "esp_adc_cal.h"
int BAT_PIN = 36; // select the input pin for the ADC
static esp_adc_cal_characteristics_t adc_chars;
static const adc1_channel_t channel = ADC1_CHANNEL_0; //GPIO34 if ADC1, GPIO14 if ADC2
static const adc_bits_width_t width = ADC_WIDTH_BIT_12;
static const adc_atten_t atten = ADC_ATTEN_DB_11;
static const adc_unit_t unit = ADC_UNIT_1;
void adc_calibration_init()
{
if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
printf("eFuse Two Point: Supported\n");
} else {
printf("eFuse Two Point: NOT supported\n");
}
//Check Vref is burned into eFuse
if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
printf("eFuse Vref: Supported\n");
} else {
printf("eFuse Vref: NOT supported\n");
}
}
void setup() {
Serial.begin(115200);
Serial.println("start");
adc_calibration_init();
adc1_config_width(width);
adc1_config_channel_atten(channel, atten);
esp_adc_cal_characterize(unit, atten, width, 0, &adc_chars);
}
void loop() {
uint32_t sum = 0;
sum= analogRead(BAT_PIN);
Serial.println(sum);
uint32_t voltage = esp_adc_cal_raw_to_voltage(sum, &adc_chars);
double battery=(voltage*3.97)/1000.0;
Serial.print("Channel Votage= ");
Serial.println(String(battery,1));
delay(2000);
}
注意:记得使用ESP32进行编译!
欢迎留言解决ESP32ADC采集稳定的问题