您的位置:控制工程论坛网论坛 » 自动化软件 » 镍氢电池充电程序 (C语言)

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

镍氢电池充电程序 (C语言)

xilinxue  发表于 2008/11/5 19:43:49      3969 查看 9 回复  [上一主题]  [下一主题]

手机阅读

/*先贴上一个 充电过程 

镍氢电池的充电方法 
充电是使放电后的电池恢复容量。为保证能长时间使用电池,必须使用正确的充电方法。在众多的充电方法中,环宇推荐使用下列的充电方法对镍氢电池进行充电。

 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); //简单显示充电情况 以后会改进这里
}

1楼 0 0 回复
  • semiscone

    semiscone   |   当前状态:在线

    总积分:4800  2024年可用积分:0

    注册时间: 2008-04-29

    最后登录时间: 2013-07-11

    空间 发短消息加为好友

    semiscone   发表于 2008/9/21 9:51:06


    2楼 回复本楼

    引用 semiscone 2008/9/21 9:51:06 发表于2楼的内容

  • rando

    rando   |   当前状态:离线

    总积分:670  2024年可用积分:0

    注册时间: 2008-09-20

    最后登录时间: 2008-09-21

    空间 发短消息加为好友

    rando   发表于 2008/9/21 14:04:54

    3楼 回复本楼

    引用 rando 2008/9/21 14:04:54 发表于3楼的内容

  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2024年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    xilinxue   发表于 2008/11/5 19:43:49

      请问哪里不明白,可以说出来,说的具体点


    虽然现在充电都是带充电芯片,但是那样会加大成本,对那些成本很看重的就是一个比较好的选择了...

    4楼 回复本楼

    引用 xilinxue 2008/11/5 19:43:49 发表于4楼的内容

  • miaoxinniao

    miaoxinniao   |   当前状态:在线

    总积分:52  2024年可用积分:0

    注册时间: 2011-03-22

    最后登录时间: 2011-03-22

    空间 发短消息加为好友

    miaoxinniao   发表于 2011/3/22 20:34:08

    好贴啊  思路很好  顶了 程序不完整 能完整我藏考下嘛 我邮箱 miaoxinniao@163.com

    5楼 回复本楼

    引用 miaoxinniao 2011/3/22 20:34:08 发表于5楼的内容

  • fengclark

    fengclark   |   当前状态:在线

    总积分:102  2024年可用积分:0

    注册时间: 2011-03-10

    最后登录时间: 2011-04-09

    空间 发短消息加为好友

    fengclark   发表于 2011/4/9 10:02:38

    C语言...

    看看先

    圆锥破


    6楼 回复本楼

    引用 fengclark 2011/4/9 10:02:38 发表于6楼的内容

  • wuhx596

    wuhx596   |   当前状态:在线

    总积分:56  2024年可用积分:0

    注册时间: 2012-03-23

    最后登录时间: 2012-03-28

    空间 发短消息加为好友

    wuhx596   发表于 2012/3/23 14:56:04

    您好,能否提供以下完整的程序代码wuhx596@126.co
    7楼 回复本楼

    引用 wuhx596 2012/3/23 14:56:04 发表于7楼的内容

  • wuhx596

    wuhx596   |   当前状态:在线

    总积分:56  2024年可用积分:0

    注册时间: 2012-03-23

    最后登录时间: 2012-03-28

    空间 发短消息加为好友

    wuhx596   发表于 2012/3/23 15:00:41

    您好,能否提供以下完整的程序代码wuhx596@126.com

     static char Batt1_status=-1;
    这个定义程序中没有用上?

    8楼 回复本楼

    引用 wuhx596 2012/3/23 15:00:41 发表于8楼的内容

  • wuhx596

    wuhx596   |   当前状态:在线

    总积分:56  2024年可用积分:0

    注册时间: 2012-03-23

    最后登录时间: 2012-03-28

    空间 发短消息加为好友

    wuhx596   发表于 2012/3/28 15:54:57

    为什么要有补充阶段?
    9楼 回复本楼

    引用 wuhx596 2012/3/28 15:54:57 发表于9楼的内容

  • b1234

    b1234   |   当前状态:在线

    总积分:186  2024年可用积分:0

    注册时间: 2012-08-24

    最后登录时间: 2012-10-29

    空间 发短消息加为好友

    b1234   发表于 2012/10/25 14:17:02

    百盛电子供应CL1100全系列,需要的朋友请联系哦。
    10楼 回复本楼

    引用 b1234 2012/10/25 14:17:02 发表于10楼的内容

总共 , 当前 /