我将正常使用LIFEPO4 3.3v(最大3.6v)或18650 3.7v / 4.2v最大
答案 0 :(得分:1)
根据docs:
默认的ADC满量程电压为1.1V。读取更高的电压 (最高为引脚最大电压,通常为3.3V)要求设置> 0dB 该ADC通道的信号衰减。
因此,我将其设置为1.1v时为零,接下来您可以简单地读取电压(为了获得更高的精度而在循环中),然后将其转换为有效电压并找到电池电量的百分比。
在下面的示例中,该函数将返回电池电量百分比。切记根据电池电压水平编辑battery_max
和battery_min
。我假设您将电池连接到ADC1通道0(GPIO 36)。
此外,我建议您创建一个电阻分压器电路以降低电压电平,因为如果您的输入电源下降,那么Arduino将直接从模拟输入端馈电,这是不希望的,还请记住您的电压电平不应超过3.9v。
#include <driver/adc.h>
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 = 3.6; //maximum voltage of battery
const float battery_min = 3.3; //minimum voltage of battery before shutdown
float R1 = 100000.0; // resistance of R1 (100K)
float R2 = 10000.0; // resistance of R2 (10K)
for (int i = 0; i < 500; i++)
{
sum += adc1_get_voltage(ADC1_CHANNEL_0);
delayMicroseconds(1000);
}
// calculate the voltage
voltage = sum / (float)500;
voltage = (voltage * 1.1) / 4096.0; //for internal 1.1v reference
// use if added divider circuit
// voltage = voltage / (R2/(R1+R2));
//round value by two precision
voltage = roundf(voltage * 100) / 100;
Serial.print("voltage: ");
Serial.println(voltage, 2);
output = ((voltage - battery_min) / (battery_max - battery_min)) * 100;
if (output < 100)
return output;
else
return 100.0f;
}
void setup()
{
adc1_config_width(ADC_WIDTH_12Bit);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_0db); //set reference voltage to internal
Serial.begin(9600);
}
void loop()
{
Serial.print("Battery Level: ");
Serial.println(battery_read(), 2);
delay(1000);
}
如果添加分频器电路,请根据分频器电路的新输出更改battery_min
和battery_max
。