单片机检测锂电池电量 单片机锂电池容量测试仪设计小创意 附后实物及软件语言源代码

小编 2024-11-28 资讯中心 23 0

单片机锂电池容量测试仪设计小创意 附后实物及软件语言源代码

前几天在家看到我家的锂电吸尘器没电了,但是充满后用了一会就又没了,电量明明显示还有两格,心想这个东西太不靠谱了,于是就寻思如果能测试出电池的容量就好了,便自己动手做了一个锂电容量测试仪,然后实际测试了一下,发现准确度和精度都还可以,下面分享出来供大家学习参考一下。

说明:本次实验项目是用汇编语言开发的,如果感兴趣的小伙伴也可以试着用C语言开发一下哦!

老规矩废话不多说,先上实物图:

工作原理:此设计是用万能板搭建,显示用12864字库屏,主板与屏幕分开,这个单片机电池容量测试仪对于锂电/镍氢程序实现自动识别。该设备会自动识别电池类型(锂电池还是镍氢电池)。

识别的方法:电压高于2.7就是锂电,低于2.7高于2V就是锂电低电压,会有提示;高于1低于2,就是镍氢电池。左下角放电测试时会显示截止电压。

本设计仅供参考如果设计有不合理之处请大神勿喷,再次仅仅起到学习和抛砖引玉的效果。

本设计汇编语言参考源代码如下:

;-------------------------

; LCD12864.ASM

;

;12864液晶屏显示驱动程序

;-------------------------

SENDI:;------串行控制命令写入------------------------

; LCALL FD ;等忙时间

MOV RAM0,#15

DJNZ RAM0,$

;------------第一字节,11111000,从MCU到屏,控制字 ,rs,rw都为0

SETB RS ;片选为1

MOV R7,#5

SENDI1: SETB RW ;前四位都为1

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDI1

MOV R7,#3

SENDI2: CLR RW

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDI2

;-------第二三字节,8位的高四位------------------

MOV R6,#2

SENDI5: MOV R7,#4

SENDI3: RLC A

MOV RW,C

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDI3

MOV R7,#4

CLR C

SENDI4: MOV RW,C ;后4位全为0

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDI4

DJNZ R6,SENDI5

CLR RS

RET

;-----------------------------------------------

SENDD: ;------串行数据字节写入---------------------

; LCALL FD ;等忙时间

MOV RAM0,#15

DJNZ RAM0,$

;------------第一字节,11111000,从MCU到屏,控制字

SETB RS ;片选为1

MOV R7,#5

SENDD1: SETB RW ;前四位都为1

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDD1

CLR RW ;第三位,从MCU到LCD,0

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

SETB RW ;第二位,数据,1

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

CLR RW ;第1位,,0

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

;-------第二三字节,8位的高四位------------------

MOV R6,#2

SENDD5: MOV R7,#4

SENDD3: RLC A

MOV RW,C

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDD3

MOV R7,#4

CLR C

SENDD4: MOV RW,C ;后4位全为0

NOP

NOP

CLR E

NOP

NOP

NOP

NOP

SETB E

DJNZ R7,SENDD4

DJNZ R6,SENDD5

CLR RS

RET

/*从缓存取数据送显示*/

LCDDS: MOV DPTR,#TAB1F ;

LCDDS1: MOV A,@R0 ;取列表

MOVC A,@A+DPTR

LCALL SENDD

INC R0

DJNZ DSDAT,LCDDS1 ;取完N个数

RET

LCDDS2: MOV DPTR,#TAB1F

LCDDS3: MOV A,R0

MOV CA,@A+DPTR

LCALL SENDD

INC R0

DJNZ DSDAT,LCDDS3

RET

TAB10: DB " 电池容量测试 " ;

TAB11: DB "V=0.00V I=0.00A "

TAB12: DB "0:00:00 0mAh "

TAB13: DB "SV2.70V SR0.00A"

; 0 10 141618 22 30

TAB1F: DB "0123456789: -.=VRLAmD 待机....SV已结束! ",0

/*

TAB1:

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,96,0,0,96,0,0,0,0;

DB 0,0,192,0,102,0,195,128,99,0,99,96,49,128,0,0;

DB 0,0,192,0,99,0,222,0,97,128,99,252,49,128,0,0;

DB 0,0,192,0,96,0,198,192,96,240,103,96,49,128,0,0;

DB 0,0,192,0,126,0,255,128,127,176,121,240,49,240,0,0;

DB 0,0,248,7,192,3,204,3,248,1,231,48,63,176,0,0;

DB 0,31,152,0,243,0,219,128,126,192,103,240,241,224,0,0;

DB 0,1,152,0,243,0,254,0,118,96,118,48,49,252,0,0;

DB 0,1,176,1,182,1,247,240,236,0,251,224,63,128,0,0;

DB 0,3,48,1,188,15,254,1,225,193,225,188,113,128,0,0;

DB 0,3,48,195,56,96,198,199,111,3,111,225,195,192,0,0;

DB 0,6,48,198,112,96,222,192,99,0,97,192,6,96,0,0;

DB 0,12,48,204,240,97,223,193,227,240,99,96,12,56,0,0;

DB 0,56,31,152,31,224,248,192,254,0,102,48,56,30,0,0;

DB 0,0,0,0,0,0,0,0,0,0,124,28,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,48,0,3,0,0,48,1,128,24,0,0,0,0;

DB 0,0,0,96,0,115,1,158,48,97,176,27,48,0,0,0;

DB 0,0,0,96,3,195,0,246,48,49,152,49,176,0,0,0;

DB 0,0,0,254,0,3,224,103,176,1,128,49,176,0,0,0;

DB 0,0,1,134,0,127,102,127,176,1,240,108,48,0,0,0;

DB 0,0,1,134,7,195,99,127,176,239,128,118,96,0,0,0;

DB 0,0,1,246,0,195,96,127,179,225,128,243,96,0,0,0;

DB 0,0,1,134,1,182,96,255,176,99,193,177,224,0,0,0;

DB 0,0,1,134,3,118,97,255,176,110,192,48,192,0,0,0;

DB 0,0,1,246,3,252,193,156,48,102,96,49,224,0,0,0;

DB 0,0,1,134,0,24,195,54,48,119,236,51,56,0,0,0;

DB 0,0,1,254,0,51,192,102,112,124,60,62,30,0,0,0;

DB 0,0,1,206,0,97,128,192,48,0,28,48,0,0,0,0;

DB 0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 7,156,243,224,12,32,15,128,0,0,0,0,13,136,0,192;

DB 8,136,74,64,18,96,10,128,0,0,0,0,5,24,1,32;

DB 8,8,72,143,130,35,226,0,0,0,0,0,5,8,1,32;

DB 8,8,72,128,12,32,2,0,0,0,0,0,5,8,1,32;

DB 8,8,73,0,2,32,2,0,0,0,0,0,5,8,1,32;

DB 8,136,73,32,18,32,2,0,0,0,0,0,2,8,1,32;

DB 7,8,243,224,12,112,7,0,0,0,0,0,2,28,64,192;

DB 0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

/* (128 X 64 )*

TAB2:

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,24,0,0,0,0,0,0,0,0,0,0,192,0,0;

DB 0,0,28,0,0,0,0,0,1,192,56,0,48,112,0,0;

DB 0,0,28,0,0,222,0,0,1,192,24,0,48,96,0,0;

DB 0,0,62,0,0,254,3,128,1,192,24,0,112,96,0,0;

DB 0,0,119,0,0,206,31,192,3,224,24,0,112,96,0,0;

DB 0,0,115,128,0,207,249,128,3,123,24,0,224,126,0,0;

DB 0,0,225,192,0,206,219,128,7,61,152,0,195,240,0,0;

DB 0,1,192,224,0,254,219,128,14,13,152,1,192,96,0,0;

DB 0,3,128,112,0,254,219,0,12,1,152,3,192,96,0,0;

DB 0,3,15,252,0,206,223,128,24,225,152,3,192,127,128,0;

DB 0,6,126,63,128,206,240,0,63,241,152,6,195,240,0,0;

DB 0,12,0,31,192,254,192,0,110,97,152,12,206,224,0,0;

DB 0,56,0,0,0,238,192,0,198,97,152,24,192,96,0,0;

DB 0,96,1,128,1,204,192,24,7,225,152,0,192,96,0,0;

DB 0,0,31,192,1,140,192,24,6,225,152,0,192,252,0,0;

DB 0,3,241,224,1,140,192,56,6,192,24,0,195,224,0,0;

DB 0,1,129,192,3,140,224,120,6,12,24,0,192,96,0,0;

DB 0,1,193,128,3,60,127,248,6,28,24,0,192,96,0,0;

DB 0,0,193,128,6,28,31,192,7,252,24,0,192,127,192,0;

DB 0,0,255,128,6,28,0,0,1,240,248,1,255,240,0,0;

DB 0,0,224,0,0,24,0,0,0,0,120,0,192,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,56,0,192,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0;

DB 1,0,0,128,0,0,0,0,0,128,0,0,0,0,0,0;

DB 1,0,1,224,3,0,7,240,1,128,0,240,3,0,0,248;

DB 25,112,7,192,3,0,5,80,1,248,61,160,1,128,7,16;

DB 24,192,7,0,3,224,7,96,31,0,41,32,4,192,0,16;

DB 0,96,2,128,31,48,1,120,18,224,41,160,12,96,3,144;

DB 17,128,7,224,23,176,15,192,3,32,41,96,9,48,28,16;

DB 48,224,7,128,23,32,2,96,6,160,57,216,19,24,7,144;

DB 39,160,0,248,15,160,4,48,11,32,41,224,54,28,25,144;

DB 36,36,31,128,15,224,15,252,50,160,34,96,69,198,15,16;

DB 40,36,32,128,3,2,53,167,3,32,34,16,15,32,14,16;

DB 24,38,0,128,1,6,6,96,2,32,34,78,31,96,0,16;

DB 0,54,0,128,0,254,0,0,2,32,35,130,0,0,0,112;

DB 0,14,0,128,0,0,0,0,0,96,0,0,0,0,0,16;

DB 0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;

DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;"

汇编语言显得有些复杂,感兴趣的小伙伴也可以用C语言试一下哦!

鉴于篇幅有限,只能写部分参考代码,如果需要完整源代码请私信我或者留言,谢谢!

如果喜欢我的文章请评论转发加关注哦。

RT9422A芯片:锂电池电量计电路方案

工程师,在开发一些项目,尤其是锂电池供电的项目,可能就会碰到一个电路问题

如何测量锂电池剩余的电量呢?

这是因为,锂电池的电量,它不是一直保持不变的,是随着使用的时间,逐渐会被消耗的。如果不准确实时地知道锂电池的电量信息,整个项目都有可能会因为突然断电,而被迫停止工作。

锂电池

怎么办呢?

常规的做法,工程师是通过一个单片机的ADC采集,实时采集锂电池的电压;稍微更好一点的做法,是再加上一个ADC采集,还采集锂电池的电流。

这样做,芯片哥认为是可行的,而且也比较受工程师喜欢。只是,它只适合一般的项目,对于要求比较高的项目,显然是远远不够的。

比如,锂电池的电量是2000mAh,标准的电压是4.2V。在项目工作一段时候后,它还有多少电量呢?

两个ADC采集,只能检测锂电池的电压和电流,却不知道它的电量信息。因此,需要换种其他的解决方案。

01 RT9422A芯片

RT9422A芯片,是一个精确测量单节锂电池电量计的芯片,它能检测的电池信息,包括实时电压、实时电流、平均电压、平均电流、温度、剩余电量、剩余工作时间、充电状态、使用次数。

其中电压测量的精度是在±7.5mV,电流测量的精度是±1%。

RT9422A芯片引脚图

在这个芯片中,它有12个Pin脚。分别是

VBATS & VBATG:芯片检测锂电池电压的两个引脚CSP & CSN:芯片检测锂电池电流的两个引脚VPTS & TS: 芯片检测温度的两个引脚ALERT & SAFE:芯片的两个安全保护引脚SDA & SCL:芯片的两个IIC通信引脚VDD & VSS:芯片工作的两个电源引脚

工程师,可以借助RT9422A芯片的VBATS引脚与VBATG引脚,实现测量锂电池的实时电压和平均电压值;

可以借助CSP引脚与CSN引脚,实现测量锂电池的实时电流和平均电流值;

借助VPTS引脚与TS引脚,实现测量锂电池的当前温度值;

然后利用芯片内部的自有算法,可以通过IIC通信,向外输出锂电池的剩余电量值、剩余的工作时间、充电状态和循环使用的次数。

02 RT9422A芯片应用电路方案

既然RT9422A芯片,能测量锂电池这么多的信息,那到底该怎么开发出它的应用电路呢?别急,芯片哥会给出的。

RT9422A芯片应用电路方案

左边BATT是锂电池,它直接输入到芯片的Pin4引脚VBATS和Pin2引脚VBATG,同时还作为电源,连接到Pin3引脚VDD和Pin6引脚VSS。

可以看到,锂电池电压的两端,是直接并联在VBATS引脚和VBATG引脚上的。也就是说RT9422A芯片,通过内部的ADC 采集,就可以直接测量到锂电池实时电压值的。

RT9422A芯片内部电路

另外,电阻R2的电流,由于与锂电池是串联关系,所以它们的电流是相同的。通过芯片的CSP引脚与CSN引脚测量电阻R2两端的电压,就能测量出电池的实时电流值。

其中电阻R3和电阻R4,是限流作用,防止电池的大电流倒灌到芯片CSP引脚和CSN引脚,起到保护作用。

而电容C3、C4和C5,是一个简单的滤波作用,让采集的值更可靠稳定一些。

温度的测量是如何进行的呢?

电阻RT1,是一个热敏电阻,也是一个温度传感器,是直接可以采集温度信息的。VPTS引脚,输出一个稳定的1.2V电压源,作为温度传感器ADC采集的参考电压。

这样,电阻RT1与电阻R1,简单的分压电路,就能测量锂电池的温度值。

RT9422A芯片IIC通信输出数据

至于说,锂电池的剩余电量、剩余工作时间、充电状态和循环使用次数这些信息,是芯片根据采集到的锂电池信息,自带的内部算法提供的,工程师只需要通过IIC通信,读取它的相应寄存器值,就能获取到。

03 结尾总结

RT9422A芯片,作为锂电池电量计芯片,它的待机功耗低至0.5uA。如果采样电阻R2是10mΩ,测量电流的最大值可以达到200A。

电压呢?最小可以测量到2.5V。

稍微遗憾的是,它只能适用一节锂电池供电的项目,不适合多节串联的电池。

最后,两种方法对比一下

如果不需要特别精确的电池信息,只是大概判断一下它的实时电压,用单片机ADC采集的方法就可以胜任了,没必要用专用的电量计芯片。

如果是项目对电池的状态要求比较高,则优先考虑使用类似RT9422A电量计芯片了,一方面是采集电池的信息比较多,而且还比较精确。

请持续关注【芯片哥】,后面会定期更新有关于电子元器件和芯片,包括一些电子产品项目开发案例的相关内容。

相关问答

如何用上位机实现 锂电池电量 显示?

用单片机的话主要是测量当前电池的电压,因为电压与电量之间有一定的关系,并不方便直接测量电量。实际上电量是通过计算得到的,比如知道充入了多少电量,放了多...

单片机 怎么控制一个MOS对 锂电池 进行充电?-ZOL问答

单片机控制一个MOS对锂电池进行充电的程序:while(1){if(P1_0){//电池没有达到上限电压4.2vP1_1=1;delay(5000);//开始充电5秒P1_1=0;...

电池 供电的 单片机 系统一般都用什么 电池 ?

锂电池或者镍氢电池。这两种电池都具有高能量密度、长寿命和较小的体积,非常适合单片机系统的供电需求。锂电池因其轻量化...电池供电的单片机系统一般会选...

谁给我个简单 锂电池 4.2v 电量 显示电路图啊,不能有单机片,手...

[最佳回答]电阻分压,三极管驱动的检测电路可以实现,但是会对锂电池放电。

8.4v 锂电池电量 指示电路?

1、显示8.4V两节锂电池的电量:按一下按钮,唤醒休眠,显示电量剩余值,7秒后自动熄灭,进入休眠状态。电池电压低于7.4V时能报警显示。检测电压值精度为0.1V。2...

请问用输出电压为6.8V的太阳能板给3.7V的 锂电池 充电,再用3.7V的 锂电池 ,给5V的 单片机 供电?

为了多挣钱呗,太阳能板,mppt控制器,锂电池,齐活。控制器直接输出12v为了多挣钱呗,太阳能板,mppt控制器,锂电池,齐活。控制器直接输出12v

单片机 与手机如何实现远距离通信?

单片机与手机实现远距离通信,有很多种可实施的方案。例举其中两个方案进行讲解:一:2G/4G移动通信方案器件选型1,单片机选用Cortex-M3内核,国产兆易创新...单...

10440(7号) 锂电池 3.7V是输出电压,4.2V是充电电压 为何我买...

锂电池标称电压一般是3.7V,4.2V是充电限制电压,即最高充电电压不能高于4.2V,锂电池在放电期间,有效电压范围为3.7V-4.2V之间,电压越高,说明电量越足,当锂电池电...

如何解决 锂电池 、控制器和电机之间的匹配问题?

😚😏真巧,能具备锂电池,电机,控制器的产品的话,目前最火爆的几款小家电。果汁杯,摇摇杯。吸尘器,扫地机。还有一种电热水壶。以上几款产品都会用到电池,...

36v10串的 锂电池 保护板连接控制器后,输出端没电是什么原因?

首先来了解一下锂电池控制器和保护板技术一、控制器分组合逻辑控制器和微程序控制器,两种控制器各有长处和短处。组合逻辑控制器设计麻烦,结构复杂,被称硬布...