本文主要是介绍Arduino ESP32C3 ADC校准读取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在使用 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 <Arduino.h>
#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_5static 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校准读取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!