单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7144|回复: 4
收起左侧

单片机构成的电瓶放电容量检测仪

[复制链接]
dzdiy 发表于 2015-4-12 02:50 | 显示全部楼层 |阅读模式
      电瓶是电动车的能量来源,直接关系到电动车性能的好坏,是电动车最容易损坏的部件,直接关系到电动车的经济成本,在一定周期内对电瓶的容量检测,能及时了解电瓶性能及发现个别电池容量的不足,对电瓶组进行调整配对,使电瓶充分发挥其性能。单片机构成的电瓶放电容量检测仪,由89C2051单片机组成的时钟电路及电池电压检测和放电控制电路组成。原理图如图所示。

       单片机构成的电瓶放电容量检测仪工作原理:电瓶电压经接线端子SP1输入分成三路,一路经7805供电给由89C2051组成的时钟电路,一路经7808供电给由集成块U4 LM358组成的电池电压检测电路,另一路为主放电通路,由Q5,Q6,继电器JDQ1及放电负载组成。当电池接入电路后, U4 LM358检测电池电压,如果电池电压高于放电下限10.5V,取样电压经RP1,R19与电阻R20分压后加至比较器反相输入端,此时反相输入端电压高于同相输入端电压,LM358输出低电平,单片机89C2051的P3.4端口检测到低电平,等待启动,按下启动按钮K1,单片机启动,时钟电路开始计时,端口P3.7输出低电平,Q5 ,Q6导通,继电器JDQ1吸合,放电通路接通,开始放电,当电池放电到放电极限10.5V时,比较器反相端电压低于同相端电压,LM358输出高电平,单片机检测到高电平后,时钟电路停止,并保持时钟数据显示,端口P3.7输出高电平,Q5 ,Q6截止,继电器JDQ1释放,放电停止,此时可记下放电时间,然后乘以放电电流就是电瓶容量。只有断开电瓶线或重新按下启动按钮,时钟电路才清零重新计时。
       电瓶放电容量检测仪装于一个机箱内,引出两对接电池的接线夹子,机箱后安装了两对接线端子,用于接放电负载,测试时先用电动车充电器充满电,然后拆开电瓶外壳,接好本放电器,启动电路,两块电瓶同时放电,这样,48V电瓶只需两次就可测完,最后根据电瓶放电记录,就可估测出电瓶的容量,如果电瓶容量相差悬殊,那就要对电瓶重新配对,使一组电瓶的各个电池容量相近,如果电瓶容量低于标称容量的50%,那就需要根据实际情况加水或去硫化处理了。
       本电瓶放电容量检测仪还可用于电瓶放电保护器,只要通过本电路接上12V照明灯具就可放心使用,不必担心过放电损坏电池。注意,本电路只适用于12V电池。
       单片机构成的电瓶放电容量检测仪源程序:
  1. //89C2051单片机电瓶容量检测仪
  2. #include<reg51.h>
  3. // 包含51单片机寄存器定义的头文件
  4. unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5. //数字0~9的段码
  6. unsigned char int_time ;
  7. //中断次数计数变量
  8. unsigned char minute; //分钟计数变量
  9. unsigned char hour; //小时计数变量
  10. unsigned char second; //秒计数变量
  11. sbit out=P3^7; //将OUT位定义为P3.7
  12. sbit shuru=P3^4;
  13. //将SHURU位定义为P3.4
  14. sbit S1=P3^5; //将K1位定义为P3.5
  15. sbit led0=P3^0;
  16. sbit led1=P3^1;
  17. sbit led2=P3^2;
  18. sbit led3=P3^3;
  19. void delay(void) ; 数码管扫描延时
  20. {
  21. unsigned char j;
  22. for(j=0;j<200;j++)
  23. }
  24. /******函数功能:键盘扫描延时**********/
  25. void delay60ms(void)
  26. {
  27. unsigned char i,j;
  28. for(i=0;i<200;i++)
  29. for(j=0;j<100;j++)
  30. }
  31. void DisplayMinute(unsigned char m)
  32. {
  33. led1=0; // P3.1引脚输出低电平
  34. P1=Tab[m/10]; //显示十位
  35. delay();
  36. led0=1; //关闭所有数码管
  37. led1=1;
  38. led2=1;
  39. led3=1;
  40. delay();
  41. led0=0; // P3.0引脚输出低电平
  42. P1=Tab[m%10]; //显示个位
  43. delay();
  44. led0=1; //关闭所有数码管
  45. led1=1;
  46. led2=1;
  47. led3=1;
  48. }
  49. void DisplayHour(unsigned char h)
  50. {
  51. led3=0; //P3.3引脚输出低电平
  52. P1=Tab[h/10]; //显示十位
  53. delay();
  54. led0=1; //关闭所有数码管
  55. led1=1;
  56. led2=1;
  57. led3=1;
  58. delay();
  59. led2=0; //P3.2引脚输出低电平
  60. P1=Tab[h%10]; //显示个位
  61. delay();
  62. led0=1; //关闭所有数码管
  63. led1=1;
  64. led2=1;
  65. led3=1;
  66. }
  67. void key_scan(void)
  68. {
  69. if(S1==0) //如果是K1键按下
  70. {
  71. delay60ms(); //延时60ms再检测
  72. if(S1==0) //如果是K1键按下
  73. {
  74. second=0;
  75. minute=0;
  76. hour=0;
  77. out=0; //启动输出
  78. TR0=1; //启动定时器T0
  79. }
  80. }
  81. if(shuru==1) //如果SHURU是高电平
  82. {
  83. delay60ms(); //延时60ms再检测
  84. if(shuru==1) //如果是SHURU高电平
  85. {
  86. TR0=0; //停止定时器T0
  87. out=1; //停止输出
  88. }
  89. }
  90. }
  91. /*******函数功能:主函数************/
  92. void main(void)
  93. {
  94. TMOD=0x01; //使用定时器T0 EA=1; //开中断总允许
  95. ET0=1; //允许T0中断
  96. TH0=(65536-46083)/256;
  97. //定时器高八位赋初值
  98. TL0=(65536-46083)%256;
  99. //定时器低八位赋初值
  100. out=0;
  101. int_time=0; //中断计数变量初始化
  102. second=0; //秒计数变量初始化
  103. minute=0; //分钟计数变量初始化
  104. hour=0; //小时计数变量初始化
  105. while(1)
  106. {
  107. key_scan(); //执行键盘扫描 DisplayMinute(minute);
  108. //调用分钟显示子程序
  109. DisplayHour(hour);
  110. //调用小时显示子程序
  111. }
  112. }
  113. void interserve(void ) interrupt 1 using 1 //using Time0
  114. {
  115. TR0=0; //关闭定时器T0
  116. int_time++; //中断次数加1
  117. if(int_time==20) //如果中断次数满20
  118. {
  119. int_time=0; //中断计数变量清0
  120. second++; //秒计数变量加1
  121. }
  122. if(second==60) //如果秒计满60
  123. {
  124. second=0;
  125. //如果秒计满60,将秒计数变量清0
  126. minute++; //分钟计数变量加1
  127. }
  128. if(minute==60) //如果分钟计满60
  129. {
  130. minute=0;
  131. //如果分钟计满60,将分钟计数变量清0
  132. hour++; //小时计数变量加1
  133. }
  134. if(hour==24) //如果小时计满24
  135. {
  136. hour=0;
  137. //如果小时计满24,将小时计数变量清0
  138. }
  139. TH0=(65536-46083)/256;
  140. //定时器T0高四位赋值
  141. TL0=(65536-46083)%256;
  142. //定时器T 0低四位赋值
  143. TR0=1; //启动定时器T0
  144. }
复制代码




回复

使用道具 举报

wuyibin2003 发表于 2016-9-1 15:27 | 显示全部楼层
很不错 改天也做个玩玩
回复

使用道具 举报

qqlong11 发表于 2016-12-23 20:06 | 显示全部楼层
不错,那天也可以做一个玩玩
回复

使用道具 举报

sanils 发表于 2017-2-27 13:53 | 显示全部楼层
请问楼主放电电流怎么看
回复

使用道具 举报

胡明 发表于 2017-6-2 08:53 | 显示全部楼层
放电下限10.5V怎么算的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

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