• 用ESP32的ADC引脚,结合分压电路测量电压


    该代码基于ESP32(Arduino库)实现ADC(模拟数字转换器)数据采集。它配置ADC参数、获取校准特性,循环采样并计算平均值,将ADC读数转换为电压,考虑分压电阻影响,计算实际电压值,最后通过串口定期输出测量结果。

    1. 需要准备的软硬件:

    1.1 硬件:

    1. ESP32开发板,其中VP引脚(即36脚,ADC1_CHANNEL_0)接到下一步的V_TEST,你也可以连到任一ADC1或ADC2的引脚
      在这里插入图片描述

    2. 分压电路,如下图,注意图中的+5V并不是实际值,而是我们要测量并计算的电压

    在这里插入图片描述

    1.2 软件

    1. Arduino IDE或者在VS Code里的PlatformIO

    2. 在Arduino IDE或者PlatformIO里选择ESP32开发板

    3. 代码:

    #include 
    #include 
    #include 
    
    #define DEFAULT_VREF    1100    // 默认1.1V的参考电压
    #define NO_OF_SAMPLES   64      // ADC采样次数
    #define ADC_WIDTH       ADC_WIDTH_12Bit  // ADC 12位宽度
    #define ADC_ATTEN       ADC_ATTEN_6db    // 6dB衰减器
    #define ADC_PIN         ADC1_CHANNEL_0    // ADC引脚
    
    //定义分压电阻R1阻值10K,分压电阻R4阻值1K
    #define R4 10000
    #define R2 1000
    
    
    esp_adc_cal_characteristics_t *adc_chars;
    
    /**
     * 初始化函数
     * 该函数负责初始化串口通信并配置ADC相关参数,包括ADC采样宽度、通道衰减以及获取ADC校准特性。
     * 
     * 无参数
     * 无返回值
     */
    void setup() {
        // 初始化串口通信,设置波特率为115200
        Serial.begin(115200);
    
        // 配置ADC1的采样宽度
        adc1_config_width(ADC_WIDTH);
        // 配置ADC1的通道衰减
        adc1_config_channel_atten(ADC_PIN, ADC_ATTEN);
        
        // 分配内存给adc_chars,用于存储ADC校准特性
        adc_chars = (esp_adc_cal_characteristics_t *) malloc(sizeof(esp_adc_cal_characteristics_t));
        // 获取ADC的校准特性
        // esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN, ADC_WIDTH, DEFAULT_VREF, adc_chars);
        esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN, ADC_WIDTH, DEFAULT_VREF, adc_chars);
    
    }
    
    /**
     * 主循环函数
     * 该函数不断地采集ADC(模拟数字转换器)的样本,并计算平均电压值,然后将读数和电压值通过串口打印出来。
     * 该函数没有参数和返回值。
     */
    void loop() {
        uint32_t adc_reading = 0; // 用于存储ADC读数的累加和
    
        // 循环采集NO_OF_SAMPLES个ADC样本,并求和
        for (int i = 0; i < NO_OF_SAMPLES; i++) {
            adc_reading += adc1_get_raw((adc1_channel_t) ADC_PIN);
            delay(1); // 采集每个样本之间加入1ms的延迟
        }
    
        // 计算ADC读数的平均值
        adc_reading /= NO_OF_SAMPLES;
        // 使用ADC校准字符将ADC读数转换为电压值
        uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
    
        // 打印ADC读数和对应的电压值
        Serial.print("ADC Reading: ");
        Serial.print(adc_reading);
        Serial.print("\tVoltage: ");
        Serial.println(voltage);
    
        //根据R1和R4的阻值计算电压值,并将单位由mV转换为V
        float voltage_value = (float) voltage / 1000;
        
        Serial.print("Voltage R2: ");
        Serial.println(voltage_value);//打印R2的电压值
        float voltage_value = (voltage_value * (R4 + R2)) / R2;
        Serial.print("Voltage with resistors: ");
        Serial.println(voltage_value);//打印总电压值
    
        // 每秒打印一次读数
        delay(1000);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    4. 通过串口监视器得到的结果如下,和用万用表测得的数值4.56V非常接近

    ADC Reading: 695        Voltage: 409
    Voltage R2: 0.41
    Voltage with resistors: 4.50
    ADC Reading: 695        Voltage: 409
    Voltage R2: 0.41
    Voltage with resistors: 4.50
    ADC Reading: 695        Voltage: 409
    Voltage R2: 0.41
    Voltage with resistors: 4.50
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    微信小程序实现滑动/点击切换Tab
    java集合之迭代器遍历元素
    对于get请求如何加swagger接口文档的字段注释
    多线程&并发篇---第六篇
    三分钟查询出快递单号物流延误更新的
    非零基础自学Java (老师:韩顺平) 第13章 常用类 13.11 日期类
    Mysql DateTime 问题
    4.合宙Air32F103_LCD
    写给新用户-Mac软件指南篇:让你的Mac更好用
    C++最精准的RGB-HSB(HSV)-HSL的色值转换
  • 原文地址:https://blog.csdn.net/idfengming/article/details/137942632