我现在用于测量电池的电路是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));
答案 0 :(得分:0)
我假设您正在使用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()
。