标题: 电池容量检测芯片ds2780底层驱动(STM32源程序与资料) [打印本页]

作者: tk.minh    时间: 2018-12-25 10:44
标题: 电池容量检测芯片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, 下载次数: 446)



作者: baiyang314    时间: 2019-2-13 10:57
zhichi  支持
作者: 213333    时间: 2019-2-13 15:37
谢谢楼主给出的资料!先学习一下
作者: dasme    时间: 2019-2-14 22:13
好想知道那个检查电阻能不能选1豪欧?版主能否告知?
作者: liguang70217    时间: 2019-2-17 19:30
谢谢楼主                                 
作者: lixiaolong7223    时间: 2019-3-29 15:09
谢谢楼主给出的资料!先学习一下
作者: 龟头剩    时间: 2019-3-31 11:23
不错,资瓷。
作者: qypt_klzeng    时间: 2019-4-30 16:49
楼主,这程序是温度传感器的例程,不是电池电量监控显示的吧
作者: binkui227    时间: 2019-5-1 18:51
很不错的diy资料
作者: ealoo    时间: 2019-5-4 18:05
不错,进来学习下
作者: 18748420942    时间: 2019-5-10 18:08
有2780和stm32的连接电路图吗,有赏哦!
作者: AS23qq    时间: 2019-6-3 20:48
我也想学习一下这个如果接24V或者12V电池的话,怎么处理的。希望能分享一个电路图
作者: jxndcl301    时间: 2019-6-11 15:54
学习一下
作者: w1179benp    时间: 2019-6-13 10:02
不错不错,学习学习.................
作者: tlhmcu    时间: 2019-8-23 23:00
感谢楼主提供这么宝贵的资料
作者: CBDcbd    时间: 2019-10-12 17:26
怎么下载下来啥都没有?
作者: jikmio    时间: 2019-11-13 11:00
支持一下楼主
作者: 47okey    时间: 2019-11-13 11:48
好东西,不过分享的代码好像不对?
作者: jikmio    时间: 2019-11-21 19:25
楼主有DS2780的代码吗,还是说DS18B20和DS2780的时序是一样的?
作者: Sky丶蓝天    时间: 2019-11-22 15:57
第一张图看起来不错,不过提供的资料有限还得自己琢磨一下
作者: 初雪    时间: 2020-1-4 17:19
谢谢楼主给出的资料!先学习一下
作者: hxgjindiao    时间: 2020-2-10 13:53

谢谢楼主的资料
作者: tong0210    时间: 2020-2-11 17:13
谢谢楼主给出的资料!先学习一下
作者: 淇少爷    时间: 2020-3-13 10:32
感谢楼主分享
作者: polebear1223    时间: 2020-3-27 13:23
这个资料应该不错下载下来看看
作者: tk.minh    时间: 2020-5-20 15:05
这是在网上看到的  后面我用STC15+0.96OLED 液晶屏+DS2788有做了一款  其实基本框架不变的
有人问说怎么是DS18B20的 这是我网上找到 使用我只是转发的
但是1-WIRE通讯的原理差不多 只是时序不对而已
作者: yyd1123    时间: 2020-9-15 14:30
这个是充放电检测吗
作者: flyfishworld    时间: 2021-3-7 16:04
CBDcbd 发表于 2019-10-12 17:26
怎么下载下来啥都没有?

有的,程序在ds18b20.c文件里面,里面有测温度,电压和电量的函数
作者: flyfishworld    时间: 2021-3-7 16:05
刚下载下来,还没有试,试了之后再来问问
作者: flyfishworld    时间: 2021-3-8 15:54
楼主,我试了一下你发的电量测量DS2780的程序,是没有问题的,也能正确显示电量,温度。但是遇到了一个新的问题,在初始化的时候我设置的ACR电量为2600mAh, 但是如果我后面换了一块另外的电池,同样一个程序的情况下,怎么去测量新的电池的电量?
作者: 爱学习的小朋友    时间: 2021-3-8 16:30
看起来好厉害的感觉,顶一个,51黑有你更精彩!!!
作者: 小瑞瑞-er    时间: 2021-4-21 09:06
请问这个代码ds2788通用吗
作者: cooleaf    时间: 2021-4-24 20:21
电池电量显示,有没有不记录充放电电流与电压和时间数值,通过计算电压就可大致计算出剩余容量的算法?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1