|
前些日子按照AVR官方的文档,用M16做了个充电器,程序也是按照官方的程序稍加修改的,调试的时候,我将实时检测到的充电电压和充电电流每隔3秒钟发送到PC串口上进行观察, 其它问题到不大,就是dV无法准确判断,我手头上有GP600mAH7号镍氢电池/品胜800mAH7号和品胜2300mAH5号电池 , 发现经常会发生过早判断dV导致电池充不满的情况.
我在用1C进行恒流充电的时候,观测串口上的输出,在充电过程当中有多个阶段的充电曲线是很平坦的,也就是0dV,另外方面由于是PWM调制,因此充电电流也是在指定的电流附近稍有跳动的,并不是真正准确恒定的,这也导致了检测出来的电压会有几个LSB的跳动(我是加了中值平均滤波算法的,在不充电的时候检测电池电压是很稳定的,数值几乎不变,最多也就是偶然1LSB的跳动),会引起误判 也会导致提前判断检测到dV.
为了解决dV过早检测到的问题,先加了个判断,以恒流快速充电到一个设定的电压值如1520MV,此期间不检测dV,到达要求后再进行检测dV的恒流快速充电,可是这样也不怎么好,因为发现电池个体不同,他们的充电曲线也是不同的,有的电池过了1520的设定值后马上就检测到dV,实际上这时候电池还没有充满,向品胜2300MAH镍氢电池来说1C充电的时候,真正充满检测到dV时候的充电电压要1600MV以上,而GP600MAH充电基本上达到1540左右如果发生dV就是真正充满了.
搞了好几天实在头痛,想想闭门造车,还不如上来跟大家好好讨论讨论,不知道各位完成了充电器的朋友有没有研究过充电曲线,怎么才能准确的判断真正的dV呢.
我原先用的是官方程序上的方法,发现效果不好,于是自己设了个深度40的队列用来存储每隔3秒采样到的电压值,队列先进先出的,采样到的电压在队列里依此向后移动,以保证队列里面的数据是最近这120秒中的每隔3秒钟依次采样到的电压值.
//以下是用于计算DELTA_V的部分
for(j=0; j<Size; j++)//队列向前移动
{
Data[j] = Data[j+1];
}
Data[Size-1] = (int)temp_V;
sum1 = 0;
sum2 = 0;
for(j=0; j<Size/2; j++)
{
sum1 += Data[j];
}
for(j=Size/2; j<Size; j++)
{
sum2 += Data[j];
}
//检测到-deltaV
if((sum2-sum1<=0))
{
Delta_0_Count++;
if((Delta_0_Count>=5)&&(chkbit( CHARGE_STATUS, FAST)))//确认检测到-dV累计5次
{
Stop_PWM();
cbi( CHARGE_STATUS, FAST );
cbi( CHARGE_STATUS, CONST_C );
#ifdef DEBUG
printf("检测到-dV,快冲结束...\r
");
#endif
return;
}
}
-----此内容被alien2006于2007-07-19,11:33:23编辑过 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|