发布时间:2023-01-12 15:00
在使用 Arduino 对 ESP32C3 ADC引脚读取电压数值时发现与实际电压有较大误差,查询手册,按照说明ADC1是带有出厂校准的,经过一番搜索后在这里发现了在 Arduino 环境下的解决方法:
Arduino ESP32C3 6 Channel ADC With Calibration – Seenov®https://seenov.com/2022/03/04/arduino-esp32c3-6-channel-adc-with-calibration/
按照官方说明,对于带有eFuse ADC校准位的板子,可以使用esp_adc_cal_raw_to_voltage()
来获得校准的转换结果。这些结果代表了实际电压(单位:mV)。不需要通过公式来转换这些数据。如果在没有eFuse ADC校准位的板上使用ADC校准API,将产生警告。
#include
#include "esp_adc_cal.h"
int BAT_PIN = 3; // select the input pin for the ADC
#define ADC_EXAMPLE_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
#define ADC_EXAMPLE_ATTEN ADC_ATTEN_DB_2_5
static esp_adc_cal_characteristics_t adc1_chars;
bool cali_enable;
static bool adc_calibration_init(void)
{
esp_err_t ret;
bool cali_enable = false;
ret = esp_adc_cal_check_efuse(ADC_EXAMPLE_CALI_SCHEME);
if (ret == ESP_ERR_NOT_SUPPORTED) {
Serial.println( "Calibration scheme not supported, skip software calibration");
} else if (ret == ESP_ERR_INVALID_VERSION) {
Serial.println("eFuse not burnt, skip software calibration");
} else if (ret == ESP_OK) {
cali_enable = true;
esp_adc_cal_characterize(ADC_UNIT_1, ADC_EXAMPLE_ATTEN, ADC_WIDTH_BIT_12, 0, &adc1_chars);
} else {
Serial.println("Invalid arg");
}
return cali_enable;
}
void setup() {
Serial.begin(115200);
Serial.println("start");
cali_enable = adc_calibration_init();
}
void loop() {
// read the value from the sensor:
uint32_t sum = 0;
analogSetAttenuation(ADC_2_5db);
for (size_t i = 0; i < 50; i++)
{
sum += analogRead(BAT_PIN);
delay(1);
}
sum /= 50;
Serial.print("Channel Raw Data= ");
Serial.println(sum/50);
if (cali_enable){
uint32_t voltage = esp_adc_cal_raw_to_voltage(sum, &adc1_chars);
Serial.print("Channel Votage= ");
Serial.println(voltage);
}
delay(2000);
}
代码给出了ADC的校准参数读取以及使用方法,经过校准后,多次测试,发现误差基本在10mV以内。
注意代码中使用了2.5dB的衰减,使得最大读取值为1050mV。