ESP32 IDF ADC数模转换使用 带衰减因子的真实电压计算

代码配置参考ESP-IDF例程

这里会配置分辨率和衰减因子

基准电压是1100mv,衰减因子相当于将输入电压按倍数降低

选一个合适的,然后就可以使用这个函数获取原始数据:

当然,获取到的原始数据不能直接使用,需要一个公式转换,这是手册里写的:

手册里写得不详细,看不懂;还有一个无脑的办法:

调用这个函数,把刚才得到的adc原始数据传进去,在voltage_mv中就得到了测量的模拟电压数据,不过肯定不是百分百准确,多少有点误差。

贴一个代码:


/**
 * @fn 获取当前电池的电压
 * 
 * @param void
 * 
 * @return 返回当前电池的电压,单位mv
*/
uint32_t fn_read_battery(void)
{
    int adc_battery = 0;
    int voltage_mv = 0;
    int i = 0;
    int out_raw = 0;

    for(i = 0; i < NO_OF_SAMPLES; i++){
        out_raw = 0;
        if(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN1, &out_raw) == ESP_OK){
            // ESP_LOGI(TAG, "read volt:%d", out_raw);
            adc_battery += out_raw;
        }else{
            break;
        }
    }

    if(i){
        adc_battery /= i;
    }
    
    // ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN1, adc_battery);
    if (do_calibration1_chan1) {
        adc_cali_raw_to_voltage(adc1_cali_chan1_handle, adc_battery, &voltage_mv);//在调用完这个函数后就自动转换成模拟电压了,不需要再转
        // ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d, Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN1, adc_battery, voltage_mv);
    }
    return voltage_mv;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用ESP32 IDF框架的GPIO4进行校准的ADC检测代码示例: ```c #include <stdio.h> #include "esp_system.h" #include "driver/gpio.h" #include "driver/adc.h" #define DEFAULT_VREF 1100 //默认的参考电压值为1.1V #define NO_OF_SAMPLES 64 //采样次数 void calibrate_voltage() { //配置ADC1的通道4,参考电压为1.1V adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_DB_11); //计算ADC1的读数的最大值和最小值 int32_t voltage_min = 4096; int32_t voltage_max = 0; for (int i = 0; i < NO_OF_SAMPLES; i++) { int32_t voltage = adc1_get_raw(ADC1_CHANNEL_4); if (voltage < voltage_min) { voltage_min = voltage; } if (voltage > voltage_max) { voltage_max = voltage; } vTaskDelay(pdMS_TO_TICKS(50)); } //计算出参考电压值 float calibration_value = (float)(DEFAULT_VREF * NO_OF_SAMPLES) / (float)(voltage_max - voltage_min); printf("Calibration value: %f\n", calibration_value); } void read_voltage() { //配置ADC1的通道4,参考电压为1.1V adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_DB_11); //读取ADC1的值,并根据校准值计算出实际电压值 int32_t voltage_raw = 0; for (int i = 0; i < NO_OF_SAMPLES; i++) { voltage_raw += adc1_get_raw(ADC1_CHANNEL_4); vTaskDelay(pdMS_TO_TICKS(50)); } float voltage = ((float)voltage_raw / (float)NO_OF_SAMPLES) * calibration_value; printf("Voltage: %f\n", voltage); } void app_main() { //配置GPIO4为输入模式 gpio_pad_select_gpio(GPIO_NUM_4); gpio_set_direction(GPIO_NUM_4, GPIO_MODE_INPUT); calibrate_voltage(); while (1) { if (gpio_get_level(GPIO_NUM_4) == 1) { read_voltage(); } vTaskDelay(pdMS_TO_TICKS(50)); } } ``` 该示例代码中的`calibrate_voltage()`函数用于校准ADC1通道4的读数,`read_voltage()`函数用于读取ADC1通道4的电压值。在`app_main()`函数中,首先将GPIO4配置为输入模式,然后循环检测GPIO4的状态,如果为高电平则读取电压值并打印。注意,在读取电压值之前需要先进行校准操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值