c - esp32中内部ADC的精度问题

标签 c arduino esp32 adc

我现在测量电池的电路是 esp32、nrf24l01 和 18650。我使用 18650 3.6V 标称/4.2 最大电池为 esp32 供电。运行分压器 100k、27k,则测量点为 0.893V。在 3.6V 测量点,如 ~0.72。

我使用内部 1.1V ADC,但为什么我在显示器上只接收到 ~3V My circuit

float battery_read()
{
    //read battery voltage per %
    long sum = 0;                  // sum of samples taken
    float voltage = 0.0;           // calculated voltage
    float output = 0.0;            //output value
    const float battery_max = 4.2; //maximum voltage of battery
    const float battery_min = 3.0; //minimum voltage of battery before shutdown

    float R1 = 100000.0; // resistance of R1 (100K)
    float R2 = 27000.0;  // resistance of R2 (10K)

    for (int i = 0; i < 100; i++)
    {
        sum += adc1_get_voltage(ADC1_CHANNEL_0);
        delayMicroseconds(1000);
    }
    // calculate the voltage*/

    voltage = sum / (float)100;
    Serial.println(voltage);
    voltage = (voltage *1.1) / 2047.0; //for internal 1.1v reference
    // use if added divider circuit
    voltage = voltage / (R2/(R1+R2));

最佳答案

我假设您使用的是 ESP32-WROOM-32 模块。

如果您希望从 channel ADC1_CHANNEL_0 而不是 EN 引脚读取数据,您的寄存器分频器应连接到 SENSOR_VP (VP) 引脚。

ADC1_CHANNEL_0 映射到 SENSOR_VP (VP) 引脚。

您的 EN 引脚应通过 RC 网络(R-> 10k 和 C-> 0.1uF)连接到 +3.3VDC。我怀疑你的模块是否正在启动,因为它处于高电平有效状态,并且在每次重置后进入高电平之前需要 150uS 的延迟。

确保在第一次调用 adc1_get_Voltage() 之前执行 adc1_config_width()adc1_config_channel_atten()

关于c - esp32中内部ADC的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56880534/

相关文章:

c - MIT OpenCourseWARE C/C++ 作业 1 无输出问题

c# - 拔掉USB后COM口消失

c++ - 直接数字合成 - 什么是相位截断?

c - 将 esp-32 摄像头流式传输到 YouTube 等 RTMP 服务器

c - 如何处理嵌入式 c 项目运行时设置的更改?

c - 24bpp 到 8bpp 转换 C 与原始图像数据

c++ - 为什么 malloc_trim() 只适用于主场?

c - 写C程序时如何设置内存使用限制,一旦超过这个限制会怎样?

c++ - 带两个按钮和一个 LED 的 SR 闩锁 (Arduino)

curl - 如何在 ESP32 中发布 OTA 的 bin 文件,而无需在网络服务器托管的浏览器中手动打开页面