搜索
bottom↓
回复: 45
打印 上一主题 下一主题

镍氢电池充电代码(远古原始版) 大家看看 多提意见 谢谢

[复制链接]
(396170530)

出0入0汤圆

跳转到指定楼层
1
发表于 2008-4-12 11:11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先贴上一个 充电过程

镍氢电池的充电方法
充电是使放电后的电池恢复容量。为保证能长时间使用电池,必须使用正确的充电方法。在众多的充电方法中,环宇推荐使用下列的充电方法对镍氢电池进行充电。

 6.1快速充电:1CmA(快速充电温度范围:0°C --40°C)
  为对快速充电进行适当的控制,充电电流应在0.5--1.0C之间。充电电流大于1C可能会使电池内压升高而是安全阀启动,造成电池泄漏。当电池充电时温度低于0度或大于45度时,应使用涓流进行充电。

 6.2 用大电流对过放电或深度放电的电池进充电不可能会使电池的容量充分恢复
  对过放电或深度放电的电池充电时,首先用涓流充电,等到电压升高后,改用快速充电电流充电。T

 6.3 快速充电起始电压:约 0.8伏/只
 6.4 充电电压控制上限l: 约 1.8伏/只
  当某些方面出问题电池电压接近1.8伏/只时,充电应转为涓流充电。
 6.5 -△V 值: 5 to 10mV/只.
  快速充电中,电压从峰值下降的值为5-10mV时,快速充电应停止,或转为涓流充电。

 6.6 dT/dt 值: 约1 to 2度/分钟
  在快速充电中,当热电偶或其他测温元件测到单位时间内电池的温升达到预定值后,应停止快速充电,或转向涓流充电。

 6.7 TCO: 55°C
  充电过程中如电池过热会损害电池的循环寿命和其他特性。为防止此类情况发生,当电池温度达到预设值后,快速充电停止并转向涓流充电

 6.8 初始延迟时间: 10分钟.
  这样可以在快速充电开始后的指定时间里-△V 监测电路不会启动。不过这段时间里dT/dt 监测电路可正常工作。

 6.9 涓流充电电流: 0.033--- 0.05CmA.
  当涓流充电电流过高时,电池温升会增大,会使电池性能恶化。
 6.10 快速充电定时器: 72 分钟 ( 1C 充电)

 6.11 总定时器: 10至 20 小时
  当电池发生过充时,即使是涓流充电,也会造成电池性能恶化。为防止电池发生过充,建议采用总时间定时器。T
  注意:由于电池包形状不同、电池数目不同、组合方式和其他因素,镍氢电池的温度和电压均会不同.设计充电方法时应向环宇咨询更多信息。
     推荐使用镍秦电池充电系统*

 (1) 快速充电电流 最大1C 到 0.5 C毫安
 (2)快速充电电压恢复电流 0.2 到 0.3 C毫安
 (3)快速充电起始电压 约0.8伏/只
 (4)充电截至电压 1.65伏/只
 (5)-△V 值 10到20豪伏/只
 (6) dT/dt 值 1 到 2 oC/min
 (7)电池最高温度 TCO 55oC
 (8)初始-△V 监测延迟时间 5 到 10 分钟
 (9)涓流充电电流 0.33 到 0.05C毫安
 (10)快速充电定时器 72 分钟
 (11)总时间定时器 22 到 32 小时
 (12)快速充电温度范围 10oC 到 40oC


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面是远古原始版代码 大家多提意见 另 总的充电控制时间在主循环里

/*******************************************************************************************************
** 函数名称: void NIMH_charger(char channel)
** 功能描述: 具体实施的镍氢电池充电函数
** 输入参数: char channel 电池通道
** 输出参数: 无
********************************************************************************************************/
void NIMH_charger(char channel)
{
  static unsigned int Bat0_count=0;
  static unsigned int Bat1_count=0;
  static char Batt1_status=-1;
  unsigned int bat0_vol;
  unsigned int bat1_vol;
  static unsigned int bat0_max_vol=0;

  
  bat0_vol = ((INT16U)Bat0_Vol_H << 8) + Bat0_Vol_L; //获取当前 batt0的电压值
  bat1_vol = ((INT16U)Bat1_Vol_H << 8) + Bat1_Vol_L; //获取当前 batt1的电压值

  if( 0==channel )
  {
     switch(Batt0_status)
      {
         case -1:{ //预处理 只进来一次 设定预冲电流 直接跳转预冲处理
                  SetPidCur(Bat0_Cur_Pre_CHARGE_H,Bat0_Cur_Pre_CHARGE_L); //设定预冲电流
                  Batt0_status = 0 ; //转预充  
                  putchar('0'); //test output
                 }
                 break;
         case 0:{//预冲 p  
                 if( Bat0_count > 1200 ) //至少预冲2分钟 再察看电池状态 1200*0.1S
                 {  // 如果电压到达预冲结束电压 就转快充
                    if( bat0_vol > ((INT16U)BAT0_Vol_Rre_CHARGE_OVER_H << 8) + BAT0_Vol_Rre_CHARGE_OVER_L )
                     {
                       SetPidCur(BAT0_Cur_Fast_CHARGE_H,BAT0_Cur_Fast_CHARGE_L); //设定快冲电流
                       Batt0_status = 1 ; //转快充
                       putchar('F'); //test output   
                       Bat0_count = 0 ;
                       break;
                     }
                    putchar('P'); //test output
                 }                                                   
                 else Bat0_count++;
                }
                break;
         case 1:{
                if( Bat0_count>1000 ) //延迟一定时间再检测是否到达最高截止电压1700mv
                {                     //因为修改了充电电流 pid控制需要一定的时间稳定下来 1 min
                  //快冲  如果快充的时候电压大于额定最大电压1700mv
                  if(bat0_vol>((INT16U)BAT0_Vol_Fast_CHARGE_MAX_H << 8) + BAT0_Vol_Fast_CHARGE_MAX_L)  
                  {
                     SetPidCur(BAT1_Cur_Stream_CHARGE_H,BAT1_Cur_Stream_CHARGE_L); //设定涓冲电流
                     Batt0_status = 3 ; //转涓充
                     break;
                  }  
                  else
                  {
                    if( Bat0_count>6000 )  //延迟一定的时间让pid电流稳定 6min - 10min
                    {
                      if( 0 == bat0_max_vol ) bat0_max_vol = bat0_vol ;
                      if(( bat0_max_vol - bat0_vol ) > BAT0_DeltaV_Fast_VHARGE ) //负压差出现
                      {
                        SetPidCur(BAT0_Cur_Add_CHARGE_H,BAT0_Cur_Add_CHARGE_L); //设定补冲电流
                        Batt0_status = 2 ; //转补充
                        putchar('A'); //test
                        Bat0_count = 0 ;
                        break;
                      }
                      if( bat0_vol > bat0_max_vol )
                        bat0_max_vol = bat0_vol; //取最大值
                    }//end of if( Bat0_count>6000 )
                    else Bat0_count++;
                  } //end of else
                } //end of if( Bat0_count>1000 )
                else Bat0_count++;
                putchar('F');                       
                }
                break;
         case 2:{ //补充部分时间很短 一般几分钟 只需要控制时间 大家觉得这里需要加上最高电压检测吗
                 if(Bat0_count>=((INT16U)BAT0_Time_Add_CHARGE)*600)
                 {
                   SetPidCur(BAT0_Cur_Stream_CHARGE_H,BAT0_Cur_Stream_CHARGE_L); //设定涓冲电流
                   Batt0_status = 3 ; //转涓充
                   putchar('S'); //test
                   Bat0_count=0;
                   break;
                 }
                 else Bat0_count++;     
                }
                putchar('A'); //test
                break;
         case 3:{//涓充 这部分也是控制时间 然后结束
                 if(Bat0_count>=(((INT16U)BAT0_Time_Stream_CHARGE_H<<8)+BAT0_Time_Stream_CHARGE_L )*600)
                 {
                   Bat0_count=0;
                   SetPidCur(0,0); //设定电流为0
                   BAT0_MODE = MODE_Close; //关闭充电
                   PID_FLAG = 0;
                   break;
                 }
                 else Bat0_count++;
                }
                putchar('S'); //test
                break;   
                                   
         default:putchar('d');break;      
      }//end switch
   }
   else
   {
     switch(Batt0_status=0)
      {
         case 0:
                break;
         case 1:
                break;
         case 2:
                break;
         case 3:
                break;                     
         default:break;      
      }//end switch
   }   
   ReadBatterySTAT(BATTERY0); //简单显示充电情况 以后会改进这里
}
(396165797)

出0入0汤圆

2
发表于 2008-4-12 12:30:49 | 只看该作者
支持!
(396062475)

出0入0汤圆

3
发表于 2008-4-13 17:12:51 | 只看该作者
给虫子扎起
(396061949)

出0入0汤圆

4
发表于 2008-4-13 17:21:37 | 只看该作者
电池可以充到1.8V吗?我记得NiNH是1.44V就可以了啊
(396053540)

出0入0汤圆

5
 楼主| 发表于 2008-4-13 19:41:46 | 只看该作者
楼上的 这个1.8v是在快充的时候ad检测到的 1.8不仅仅是电池的端电压  还有充电电流*电池内阻的电压
(396051858)

出0入0汤圆

6
发表于 2008-4-13 20:09:48 | 只看该作者
镍镉电池充电电池代码什么时候出来啊期待中
(396051815)

出0入0汤圆

7
发表于 2008-4-13 20:10:31 | 只看该作者
支持充电器项目。。顶
(395533085)

出0入0汤圆

8
发表于 2008-4-19 20:16:01 | 只看该作者
留名~~~~~~~~~~~~
头像被屏蔽
(395532358)

出0入0汤圆

9
发表于 2008-4-19 20:28:08 | 只看该作者
谢谢。 Cool !
(395522557)

出0入0汤圆

10
发表于 2008-4-19 23:11:29 | 只看该作者
收了,谢谢
(395522178)

出0入0汤圆

11
发表于 2008-4-19 23:17:48 | 只看该作者
支持
(395516491)

出0入0汤圆

12
发表于 2008-4-20 00:52:35 | 只看该作者
(387828551)

出0入0汤圆

13
发表于 2008-7-18 00:24:55 | 只看该作者
mark
(387707470)

出0入0汤圆

14
发表于 2008-7-19 10:02:56 | 只看该作者
强烈支持
(383594843)

出0入0汤圆

15
发表于 2008-9-5 00:26:43 | 只看该作者
okokokokok!!!!!!!!!!!!!
(383565905)

出0入0汤圆

16
发表于 2008-9-5 08:29:01 | 只看该作者
粗粗看了一下,有点问题,镍电池快速充电的时候测量-△V  应该在停止充电的时候测量,否则不准。所以快冲应该是充几秒后停下来测量,测量完再进行快冲,如此循环。所以楼主说“因为修改了充电电流 pid控制需要一定的时间稳定下来 1 min”这个就太夸张了,我现在做的稳定时间大约100ms,还是太长,需要想办法减少。

5楼问镍镉电池的充电问题,只要在镍氢充电的基础上加上0△V 检测(就是如果电压不增长并且保持一段时间不变,例如十分钟)就差不多了,最多把停止充电的电压再增加一点,因为镍镉电池充电式电压比镍氢电池的高一点
(383564310)

出0入0汤圆

17
发表于 2008-9-5 08:55:36 | 只看该作者
看看,不错
(335308321)

出0入0汤圆

18
发表于 2010-3-17 21:22:05 | 只看该作者
收藏,谢谢
(335307022)

出0入0汤圆

19
发表于 2010-3-17 21:43:44 | 只看该作者
收藏,COOL
(335296122)

出0入4汤圆

20
发表于 2010-3-18 00:45:24 | 只看该作者
case 0:{//预冲 p   
                 if( Bat0_count > 1200 ) //至少预冲2分钟 再察看电池状态 1200*0.1S
                 {  // 如果电压到达预冲结束电压 就转快充
                    if( bat0_vol > ((INT16U)BAT0_Vol_Rre_CHARGE_OVER_H << 8) + BAT0_Vol_Rre_CHARGE_OVER_L )
                     {
                       SetPidCur(BAT0_Cur_Fast_CHARGE_H,BAT0_Cur_Fast_CHARGE_L); //设定快冲电流
                       Batt0_status = 1 ; //转快充
                       putchar('F'); //test output   
                       Bat0_count = 0 ;  
                       break;
                     }  
                    putchar('P'); //test output
                 }                                                   
                 else Bat0_count++;
                }
                .........
粗略分析了上面小部分代码,函数void NIMH_charger(char channel)的执行频率应该是由定时器控制的(Bat0_count 每0.1秒加1)。
我觉得把Bat0_count++;语句放到函数void NIMH_charger(char channel)外面好一点。这样函数void NIMH_charger(char channel)的执行频率就可灵活处理了。
(332137804)

出0入0汤圆

21
发表于 2010-4-23 14:04:02 | 只看该作者
mark
(332128826)

出0入0汤圆

22
发表于 2010-4-23 16:33:40 | 只看该作者
学习
(332100280)

出0入0汤圆

23
发表于 2010-4-24 00:29:26 | 只看该作者
ppp
(322556482)

出0入0汤圆

24
发表于 2010-8-12 11:32:44 | 只看该作者
mark
(284157826)

出0入0汤圆

25
发表于 2011-10-30 21:50:20 | 只看该作者
学习!~!
(270580963)

出0入0汤圆

26
发表于 2012-4-5 01:11:23 | 只看该作者
电压检测应该在停止充电一段时间后进行,为了防止电池本身的电容效应造成的检测电压虚高问题,还要在电压检测前做个极短的放电脉冲,这样效果会比较好!
(270430125)

出0入0汤圆

27
发表于 2012-4-6 19:05:21 | 只看该作者
终于找到充电过程的详细描述了,有空自己做个充电器玩玩
(270429889)

出0入0汤圆

28
发表于 2012-4-6 19:09:17 | 只看该作者
学习了
(262921831)

出0入0汤圆

29
发表于 2012-7-2 16:43:35 | 只看该作者
very good.cool
(260876991)

出0入0汤圆

30
发表于 2012-7-26 08:44:15 | 只看该作者
现在正在做镍氢的充电器,顶
(247011703)

出0入0汤圆

31
发表于 2013-1-2 20:12:23 | 只看该作者
好东西,学习了,自己也准备做一个...
(236228018)

出0入0汤圆

32
发表于 2013-5-7 15:40:28 | 只看该作者
留下以后参考
(220138432)

出0入0汤圆

33
发表于 2013-11-9 21:00:14 | 只看该作者
好,谢谢楼主,正需要。
(216706867)

出0入0汤圆

34
发表于 2013-12-19 14:12:59 | 只看该作者

终于找到充电过程的详细描述了,有空自己做个充电器玩玩
(216696931)

出0入0汤圆

35
发表于 2013-12-19 16:58:35 | 只看该作者
不错!还是要智能一点的充电器好啊
(208346123)

出0入0汤圆

36
发表于 2014-3-26 08:38:43 | 只看该作者
1.8V充电截止电压。。。这个太高了吧,如果是10节镍氢,充电电压都要18V了。
(207186939)

出0入0汤圆

37
发表于 2014-4-8 18:38:27 | 只看该作者
very good.mark
(207184511)

出0入0汤圆

38
发表于 2014-4-8 19:18:55 | 只看该作者
好东西啊。。
(207182582)

出0入0汤圆

39
发表于 2014-4-8 19:51:04 | 只看该作者
make 正想做个数控降压带充电管理功能的的电源哈哈 顶一个
(207093689)

出0入0汤圆

40
发表于 2014-4-9 20:32:37 | 只看该作者
mark,谢谢分享
(182513347)

出0入0汤圆

41
发表于 2015-1-19 08:24:59 | 只看该作者
谢谢分享
(182511803)

出0入0汤圆

42
发表于 2015-1-19 08:50:43 | 只看该作者
收藏了,原理讲的蛮透彻。
(182374186)

出0入0汤圆

43
发表于 2015-1-20 23:04:20 | 只看该作者
mark  充电代码
(182371111)

出0入0汤圆

44
发表于 2015-1-20 23:55:35 来自手机 | 只看该作者
我就是0.3c恒流充,再检测上限电压,限制时间,,判断负电压变化难做,,
(182324618)

出0入0汤圆

45
发表于 2015-1-21 12:50:28 | 只看该作者
镍氢电池充电代码,好,回头看看
(131395237)

出0入0汤圆

46
发表于 2016-9-1 23:53:29 | 只看该作者
不错的资料哟
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-10-31 18:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表