c - esp32中内部ADC的精度问题
问题描述
我现在测量电池的电路是 esp32、nrf24l01 和 18650。我用 18650 3.6V 标称/4.2 最大电池为 esp32 供电。运行分压器 100k、27k,然后测量点为 0.893V。在 3.6V 测量点,例如 ~0.72。
我使用内部 1.1V ADC,但为什么我只能在显示器上收到 ~3V
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 模块。
如果您希望从通道 ADC1_CHANNEL_0 而不是 EN 引脚读取,您的寄存器分频器应连接到 SENSOR_VP (VP) 引脚。
ADC1_CHANNEL_0 映射到 SENSOR_VP (VP) 引脚。
您的 EN 引脚应通过 RC 网络(R-> 10k 和 C-> 0.1uF)连接到 +3.3VDC。我怀疑您的模块是否甚至可以启动,因为它处于高电平有效状态并且需要 150uS 延迟才能在每次复位后变为高电平。
确保在第一次调用之前adc1_config_width()
执行。adc1_config_channel_atten()
adc1_get_voltage()
推荐阅读
- python - 在函数 Python 中传递未分配的变量
- angular - mat-checkbox 在未定义时禁用
- c# - 当我单击 WPF 中的按钮时,如何更改标签的文本?
- c - GetModuleFileNameW 在当前模块上返回 Null
- google-apps-script - Google Docs Apps 脚本查找和替换为斜体
- python - SqlAlchemy:如果可能,强制转换为 int/测试字符串是否为数字
- javascript - 如何让 php 页面从 html 页面接收 ajax 帖子
- django - 给布尔字段一个css类
- python - 如何将 int 变量添加到 txt 文件
- android - 使用Android volley将文件上传到服务器的正确方法