Arduino ESP32C3 ADC校准读取

在使用 Arduino 对 ESP32C3 ADC引脚读取电压数值时发现与实际电压有较大误差,查询手册,按照说明ADC1是带有出厂校准的,经过一番搜索后在这里发现了在 Arduino 环境下的解决方法:

Arduino ESP32C3 6 Channel ADC With Calibration – Seenov®icon-default.png?t=M3C8https://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。

Arduino ESP32C3 ADC校准读取_第1张图片

 

你可能感兴趣的:(嵌入式,单片机)