static const uint8_t lifepo4[NUM_BATT_READINGS][2] = {
{144, 100}, {136, 100}, {134, 99}, {133, 90},
{132, 70}, {131, 40}, {130, 30}, {129, 20},
{128, 17}, {125, 14}, {120, 9}, {100, 0}
};
int16_t measurements_get_batt_perc(int16_t mv)
{
int16_t pct = 0;
int32_t x1, x2, vD, pD;
int32_t theta;
if (mv >= lifepo4[0][0]*100)
pct = lifepo4[0][1]; // cap value at 100%
else
{
for (int i=0; i<NUM_BATT_READINGS-1; i++)
{
// put voltages into mV instead of 100s of mV
x1 = (int32_t)(lifepo4[i][0])*100L; // Higher value
x2 = (int32_t)(lifepo4[i+1][0])*100L; // Lower value
if (mv <= x1 && mv > x2)
{
vD = x1-x2;
pD = (int32_t)(lifepo4[i][1] - lifepo4[i+1][1]);
if (pD != 0)
theta = pD*10000/vD;
else
theta = 0;
pct = lifepo4[i][1] - (x1-mv)*theta/10000;
break;
}
}
}
return pct;
}
该代码基于下表中的LUT计算电池百分比:
https://www.mobile-solarpower.com/diy-lifepo4-solar-battery1.html
有没有人有一个想法或更好的方法来帮助计算电池百分比?电压随负载变化。是否有已知的公式计算电池百分比与变化的负载等?或者说,融合电流与电压的积分的最佳方法是什么?
电池百分比遵循所提供的图表,但它没有考虑到当前负载,因此没有显示准确的估计值。
1条答案
按热度按时间exdqitrt1#
有没有人有一个想法或更好的方法来帮助计算电池百分比?
OP在正确的轨道上。
一些想法:
if (mv <= x1 && mv > x2)
只需要一个monotonic_function测试。lifepo4
的含义不清楚。100L
进行缩放可能会导致64位数学运算。只需要32位。lifepo4[]
驱动BATT_READING_N
,而不是相反。