用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. 代码:

cpp 复制代码
#include <Arduino.h>
#include <esp_adc_cal.h>
#include <driver/adc.h>

#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);
}

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

bash 复制代码
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
相关推荐
清风66666623 分钟前
基于51单片机手机无线蓝牙APP控制风扇调速设计
单片机·mongodb·智能手机·毕业设计·51单片机·课程设计
JXNL@23 分钟前
什么是PFC控制器
单片机·嵌入式硬件
RaLi和夕2 小时前
单片机学习笔记.C51存储器类型含义及用法
笔记·单片机·学习
月阳羊2 小时前
【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
java·单片机·嵌入式硬件·面试·职场和发展
计算机小手3 小时前
高效 P2P 文件传输工具:FileSync 利用 WebRTC 技术实现极速安全传输
经验分享·docker·webrtc·开源软件
wdfk_prog4 小时前
Python脚本深度解析:实现基于YMODEM的单片机固件自动化升级
python·单片机·自动化
纳祥科技4 小时前
分享:一种为蓝牙、WIFI、U段音频发射设备提供ARC回传数字音频桥接功能的方案
网络·单片机·音视频
代码总长两年半6 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)
stm32·单片机·物联网
玉~你还好吗7 小时前
【嵌入式电机控制#进阶10】参数辨识(一):电阻辨识
单片机·嵌入式硬件
猫头虎7 小时前
2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
stm32·单片机·嵌入式硬件·物联网·硬件架构·51单片机·硬件工程