电池电量百分比的计算需要考虑到电池的电压曲线和电量曲线。
电量百分比 = (当前电压值 - 最低电压值)/ (最高电压值 - 最低电压值) * 100%
其中,需考虑电池的实际情况及老化程度进行设定最高/最低电压值,当前电压值为ADC采集值。
u8 i = 0;
int Val = 0; /*暂存ADC采集到的电压值*/
int battery_max = 800; /*电池最高电压值*/
int battery_min = 600; /*电池最低电压值*/
static u8 ValChangeCount = 0; /*电量变化次数*/
static int ValTemp = 0; /*暂存返回电量值*/
const static int Battery_Level_Table[21] = {600, 610, 620, 630, 640, 650, 660, 670,680,690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800};
int toPercentVal(int Volt)
{
Val = Volt;
for (i=0; i<(sizeof(Battery_Level_Table)/sizeof(Battery_Level_Table[0])); i++)
{
if (Val <= sizeof(Battery_Level_Table[i])
{
Val = (Battery_Level_Table[i] - battery_min) / (battery_min - battery_min) * 100;
/*限制电池显示百分比在0-100*/
Val = Temp>100?100:Val;
Val = Temp<0?0:Val;
/*增加消抖处理,预防ADC采集不可靠*/
if (Val != ValTemp)
{
ValChangeCount++;
if (5 == ValChangeCount){
ValChangeCount = 0;
break;
}
Val = ValTemp;
}
else
ValChangeCount = 0;
}
break;
}
if (i > sizeof(Battery_Level_Table)/sizeof(Battery_Level_Table[0]))
Val = 100;
ValTemp = Val;
return Val;
}
其中Battery_Level_Table为电压的参考值,从0~100共21个点,将电池百分比分成20等分,电池电量按5%单位变化显示。
注:C语言printf打印输出百分号%方法:在百分号后加一个百分号便可以输出:%%
例: int battery_val = 20;
printf("当前电量为%d%%\n", battery_val);
输出结果:当前电量为20%