找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17547|回复: 32
打印 上一主题 下一主题
收起左侧

电池容量检测芯片ds2780底层驱动(STM32源程序与资料)

  [复制链接]
跳转到指定楼层
楼主
网上看到的1-wire总线的驱动代码  给需要帮助的人
制作出来的实物图如下:


1991M02X22手上有两块华硕手机的电池,都是报废的,已经有点鼓了,电池已经没什么容量了,但是里面的保护板应该还是好的
尤其是原厂电池,保护板应该不会偷工减料,就拆了出来准备留做备用,报废电池芯留着是个隐患,还是早些扔掉的好。
拆完了发现,这个保护板有点特别,上面是三个芯片,两个SSOP-8,一个SOT23-6,而且电池是4线输出的,
仔细观察,一个芯片上面写着2780,旁边还有一个0.02Ω 电阻,这不是MAXIM的电量计芯片DS2780嘛,想不到居然在这里碰到了。
DS2780用于测量可充电锂离子和锂离子聚合物电池的电压、温度和电流,并估算剩余电量。用于计算的电池特性参数和应用参数存储在片上EEPROM中。根据电流温度特性、放电速率、存储电荷与应用参数对可用电量进行估算。要知道,有些电池的放电曲线非常平缓,单纯靠测量电池端电压判断电池容量并不准确,而这个芯片可以计量经过电池的电量,充进多少电,放出多少电,里面还有多少电,它都能记录下来,配合设备上的MCU就可以很精确的知道电池里的剩余电量了。
有点像银行存款,存入多少,取出多少,账户里省多少,一看账单一清二楚。


就是这么个保护板


还剩下一个电池,先别拆了,通过已经拆下的保护板测出了DS2780的信号线端口,
按此给电池上焊上线,红色正极,黑色负极,蓝色数据线DQ


DS2780采用1-Wire接口,一根线完成通信,好像是美信的独家专利
为了能够接驳电脑,专门跑去买了一颗UART转1-Wire芯片,DS2480
现做了一个UART转1-Wire模块,DS2480目前已经停产了,市场上货源不多
这颗花了我18大洋


上位机的软件采用美信官方的DS2780评估板测试软件
显示电池电压,电流,容量等信息,还能对DS2780内部EEPROM进行读写
设置电池参数等
接上电,软件很快就显示出了电池信息
现在电池空载
电压3.8552V,电流1.9531mA,剩余容量564.6875mAhr,温度29.25摄氏度
容量还有大约一半,这个电池标称是1300mAh的

用万用表测量了下电池电压,3.85V,看来还是很准确的

接了一个10Ω 10W电阻对电池放电

放电时软件显示的信息

放电半小时后

又过了大约1小时,放完电了,这个电池的保护板在电池电压降到3.3V左右时开始保护
自动切断电路,空载的电池电压在3.6V,电池里还剩余大约162mAhr的电量。


下面看看充电,这是USB的5V通过一个10Ω电阻给锂电池充电
电流120mA,剩余电量也开始回升



用USB直接充电速度太慢,而且不安全,接入自制的TP4056充电板
设定的是400mA,显示385mA,是设定电阻的误差引起的



这个软件还能记录文本日志
可以根据需要调整采样时间
这是记录下来的电池充放电情况,这里全是放电记录
充电进行中,电池电压接近4.1V,充电电流明显下降
可以看出,已经充进去600mAhr的电量


电池电压接近4.2V,电流持续下降中,充入大约800mAhr的电量,按这么算
这个电池容量在1000mAh左右,是标称容量的76%左右
看起来损耗不多,但是智能手机已经没法用了


最后是DS2780电路图,这个芯片的外围电路很简单,而且只需要一根
信号线就可以和上位机通信了。
查了一下,这个芯片价格在15-20元左右,要是熟悉单片机编程,用这个芯片来监测锂电池应该还是不错的
结束!谢谢赏评!


STM32单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "ds18b20.h"


  8. int main(void)
  9. {         
  10.         u8 t=0;                           
  11.         short temperature;               

  12.         delay_init();                     //延时函数初始化         
  13.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  14.         uart_init(9600);                 //串口初始化为9600
  15.          LED_Init();                             //LED端口初始化
  16.         LCD_Init();                    //LCD初始化
  17.         KEY_Init();                                 //KEY初始化

  18. //          POINT_COLOR=RED;//设置字体为红色
  19. //         LCD_ShowString(60,50,200,16,16,"WarShip STM32");        
  20. //         LCD_ShowString(60,70,200,16,16,"DS18B20 TEST");        
  21. //         LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  22. //         LCD_ShowString(60,110,200,16,16,"2012/9/12");                  
  23.          
  24.          
  25.          while(DS18B20_Init())        //DS18B20初始化        
  26.         {
  27. //                 LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
  28. //                 delay_ms(200);
  29. //                 LCD_Fill(60,130,239,130+16,WHITE);
  30.                  delay_ms(200);
  31.                 printf("not find");
  32.         }                        
  33. //writeacr();
  34.         
  35. //         LCD_ShowString(60,130,200,16,16,"DS18B20 OK");
  36. //         POINT_COLOR=BLUE;//设置字体为蓝色
  37. //          LCD_ShowString(60,150,200,16,16,"Temp:   . C");         
  38.         while(1)
  39.         {                        
  40.                  if(t%10==0)//每100ms读取一次
  41.                 {               
  42.                         printf("\t%d", current());

  43.                         
  44. //                         temperature=DS18B20_Get_Temp();
  45. //                         printf("%d\t",temperature);
  46. //                         if(temperature<0)
  47. //                         {
  48. //                                 LCD_ShowChar(60+40,150,'-',16,0);                        //显示负号
  49. //                                 temperature=-temperature;                                        //转为正数
  50. //                         }else LCD_ShowChar(60+40,150,' ',16,0);                        //去掉负号
  51. //                         LCD_ShowNum(60+40+8,150,temperature/10,2,16);        //显示正数部分            
  52. //                            LCD_ShowNum(60+40+32,150,temperature%10,1,16);        //显示小数部分                    
  53.                 }                                   
  54.                  delay_ms(10);
  55.                 t++;
  56.                 if(t==20)
  57.                 {
  58.                         t=0;
  59.                         LED0=!LED0;
  60.                 }
  61.         }
  62. }
复制代码


所有程序51hei提供下载(管理提醒:多人贴贴说此文件缺原理图,请谨慎下载):
电池容量检测芯片ds2780底层驱动.rar (4.57 MB, 下载次数: 441)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:476111 发表于 2019-2-13 10:57 | 只看该作者
zhichi  支持
回复

使用道具 举报

板凳
ID:160726 发表于 2019-2-13 15:37 | 只看该作者
谢谢楼主给出的资料!先学习一下
回复

使用道具 举报

地板
ID:418770 发表于 2019-2-14 22:13 | 只看该作者
好想知道那个检查电阻能不能选1豪欧?版主能否告知?
回复

使用道具 举报

5#
ID:146498 发表于 2019-2-17 19:30 | 只看该作者
谢谢楼主                                 
回复

使用道具 举报

6#
ID:500585 发表于 2019-3-29 15:09 | 只看该作者
谢谢楼主给出的资料!先学习一下
回复

使用道具 举报

7#
ID:497758 发表于 2019-3-31 11:23 | 只看该作者
不错,资瓷。
回复

使用道具 举报

8#
ID:211284 发表于 2019-4-30 16:49 | 只看该作者
楼主,这程序是温度传感器的例程,不是电池电量监控显示的吧
回复

使用道具 举报

9#
ID:525679 发表于 2019-5-1 18:51 | 只看该作者
很不错的diy资料
回复

使用道具 举报

10#
ID:517235 发表于 2019-5-4 18:05 | 只看该作者
不错,进来学习下
回复

使用道具 举报

11#
ID:532416 发表于 2019-5-10 18:08 | 只看该作者
有2780和stm32的连接电路图吗,有赏哦!
回复

使用道具 举报

12#
ID:430751 发表于 2019-6-3 20:48 | 只看该作者
我也想学习一下这个如果接24V或者12V电池的话,怎么处理的。希望能分享一个电路图
回复

使用道具 举报

13#
ID:559134 发表于 2019-6-11 15:54 | 只看该作者
学习一下
回复

使用道具 举报

14#
ID:149451 发表于 2019-6-13 10:02 | 只看该作者
不错不错,学习学习.................
回复

使用道具 举报

15#
ID:572979 发表于 2019-8-23 23:00 | 只看该作者
感谢楼主提供这么宝贵的资料
回复

使用道具 举报

16#
ID:622970 发表于 2019-10-12 17:26 | 只看该作者
怎么下载下来啥都没有?
回复

使用道具 举报

17#
ID:516629 发表于 2019-11-13 11:00 | 只看该作者
支持一下楼主
回复

使用道具 举报

18#
ID:105364 发表于 2019-11-13 11:48 | 只看该作者
好东西,不过分享的代码好像不对?
回复

使用道具 举报

19#
ID:516629 发表于 2019-11-21 19:25 | 只看该作者
楼主有DS2780的代码吗,还是说DS18B20和DS2780的时序是一样的?
回复

使用道具 举报

20#
ID:624444 发表于 2019-11-22 15:57 | 只看该作者
第一张图看起来不错,不过提供的资料有限还得自己琢磨一下
回复

使用道具 举报

21#
ID:523221 发表于 2020-1-4 17:19 | 只看该作者
谢谢楼主给出的资料!先学习一下
回复

使用道具 举报

22#
ID:478754 发表于 2020-2-10 13:53 | 只看该作者

谢谢楼主的资料
回复

使用道具 举报

23#
ID:210978 发表于 2020-2-11 17:13 | 只看该作者
谢谢楼主给出的资料!先学习一下
回复

使用道具 举报

24#
ID:406442 发表于 2020-3-13 10:32 | 只看该作者
感谢楼主分享
回复

使用道具 举报

25#
ID:360864 发表于 2020-3-27 13:23 | 只看该作者
这个资料应该不错下载下来看看
回复

使用道具 举报

26#
ID:454155 发表于 2020-5-20 15:05 | 只看该作者
这是在网上看到的  后面我用STC15+0.96OLED 液晶屏+DS2788有做了一款  其实基本框架不变的
有人问说怎么是DS18B20的 这是我网上找到 使用我只是转发的
但是1-WIRE通讯的原理差不多 只是时序不对而已
回复

使用道具 举报

27#
ID:818067 发表于 2020-9-15 14:30 | 只看该作者
这个是充放电检测吗
回复

使用道具 举报

28#
ID:889234 发表于 2021-3-7 16:04 | 只看该作者
CBDcbd 发表于 2019-10-12 17:26
怎么下载下来啥都没有?

有的,程序在ds18b20.c文件里面,里面有测温度,电压和电量的函数
回复

使用道具 举报

29#
ID:889234 发表于 2021-3-7 16:05 | 只看该作者
刚下载下来,还没有试,试了之后再来问问
回复

使用道具 举报

30#
ID:889234 发表于 2021-3-8 15:54 | 只看该作者
楼主,我试了一下你发的电量测量DS2780的程序,是没有问题的,也能正确显示电量,温度。但是遇到了一个新的问题,在初始化的时候我设置的ACR电量为2600mAh, 但是如果我后面换了一块另外的电池,同样一个程序的情况下,怎么去测量新的电池的电量?
回复

使用道具 举报

31#
ID:213113 发表于 2021-3-8 16:30 | 只看该作者
看起来好厉害的感觉,顶一个,51黑有你更精彩!!!
回复

使用道具 举报

32#
ID:909456 发表于 2021-4-21 09:06 | 只看该作者
请问这个代码ds2788通用吗
回复

使用道具 举报

33#
ID:430492 发表于 2021-4-24 20:21 | 只看该作者
电池电量显示,有没有不记录充放电电流与电压和时间数值,通过计算电压就可大致计算出剩余容量的算法?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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