单片机锂电池容量测试仪设计小创意 附后实物及软件语言源代码
前几天在家看到我家的锂电吸尘器没电了,但是充满后用了一会就又没了,电量明明显示还有两格,心想这个东西太不靠谱了,于是就寻思如果能测试出电池的容量就好了,便自己动手做了一个锂电容量测试仪,然后实际测试了一下,发现准确度和精度都还可以,下面分享出来供大家学习参考一下。
说明:本次实验项目是用汇编语言开发的,如果感兴趣的小伙伴也可以试着用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语言试一下哦!
鉴于篇幅有限,只能写部分参考代码,如果需要完整源代码请私信我或者留言,谢谢!
如果喜欢我的文章请评论转发加关注哦。
怎么标准的测量锂电池内阻?
方法一:双电阻法测量电池内阻
秦辉在他的文章《电池内阻的测量》中介绍了利用双电阻法测量电池内阻的方法。
如图所示,电池串联一个电阻形成回路,测量负载电阻的分压,进而推算电池内阻。这是一个非常简易的方法,从接触电路开始,我们几乎就知道存在这么一个方法。使用这个方法的一个要点是,当外接电阻值与电池内阻越接近,测量结果的误差将越小。电阻计算公式:E/(r+ R)=U/R,所以 r=(E/U- 1)R用单片机实现上述电阻测量原理,框图如下:
单片机主导的电池内阻测量过程如下:单片机复位后,其控制端输出高电平,将模拟开关的控制端IN 置1, 然后连续对电压表进行检测。当检测到电压表有输入电压时, 单片机将模拟开关的IN 控制端置0,则D 端与S2端之间呈断开状态,此时电压表测量所得的电压值为电源的电动势E。单片机通过数据总线将数字电压表测量所得的电压数据存入单片机存储器中。
然后单片机再将模拟开关的IN 端置1, 则D 端与S2 端之间呈导通状态。此时电压表测量所得的电压值为模拟开关、电阻rˊ和R 三者承受的总电压Uˊ,单片机将该电压数据读入到单片机存储器中。利用串联电路分压公式U=100 Uˊ/199.5,单片机计算出U。再利用公式“r=(E/U- 1)R”,单片机计算出电池内阻r(公式中的r1=rˊ+0.5 =99.5Ω)。单片机通过接口电路将计算结果送入电压表显示电路,显示出电池内阻r 的值。
这个方法,可以利用单片机的功能实现自动测量和结果显示,但检测的精度还是由电阻精度和电压表精度决定。
方法二:不平衡电桥法电池内阻测量
作者李舒晨,在他的文章《不平衡电桥法电池内阻测量装置的原理与设计》中介绍了利用不平衡电桥测量电池内阻的方法。
不平衡电桥法测量电池内阻的原理如上图所示。其中R01 , R02 , R03为电桥内设电阻,Rx 为含电动势E 的电池内阻。 电阻R00和开关K跨接在电桥A 至B 之间. 根据戴维南定理,从N、G两点看去,可有图( b)所示的等效电路。其中E0 为开路电压, R0 为等效电阻。当电路满足电桥平衡条件R02 /R01 = R03 /Rx时,上述等效电路电压源E0 和等效电阻R0 均不因开关K的接通与断开状态而改变,即在开关K接通和断开状态下均有:
E0 = E〔( R01+ R02 ) /( R01 + R02 + R03 + Rx )〕=E〔R01 /( R01 + Rx )〕
R0 = ( R01+ R02 ) // ( R03+ Rx ) =( R02// R03 ) + ( R01// Rx )
用上述原理在实验室测试电池内阻时,只要在N , G之间接入一只直流电流表,反复接通和断开开关K,并调节R01或R02,直到开关状态变化时,电流表读数不变,此时便可依公式算出电池内阻:Rx = R01 (R03 /R02 )。
将上述测量过程中使用的开关用电子开关取代,并用周期性电压控制开关反复通断。 将N 、G间的短路电流转换为电压信号,并在开关通断期间对电压信号分别进行采样保持形成两路电压,最后对两路电压进行差分放大送至平衡电压指示表,这就构成一个用不平衡电桥原理测量电池内阻的装置。
电桥电阻R01 、R02、 R03的选择影响测量灵敏度;电阻R00对电桥灵敏度及电池放电有影响。
方法3,电池内阻在线测量
作者陈宝明在他的文章《电池内阻在线测量实验系统的设计与制作》中介绍了一个比较常用的在线测量方法,交流注入法。
基本原理
实现电池内阻在线测量的基本原理如上图所示, 当信号源给电池注入一个交流电流信号,测量出电池两端产生的交流电压信号和输入的电流,就可计算出电池的内阻:r =Vrm/I rms式中:Vrms 为电池两端交流电压信号的有效值;Irms为输入电池中的交流电流信号有效值。
具体实现在线测量的系统框图,如上图所示。系统由输出输入回路、输入转换电路、取样电路、低噪声前置放大器、方波转换电路、乘法器电路、积分器电路、交流恒流信号产生电路、单片机控制系统、显示器电路、接口电路和计算机等组成。输出的交流恒流信号接到电池两端, 再将电池内阻产生的电压信号, 从电池两端直接连接到输入转换开关电路。 注入电流回路和信号测量回路分开, 降低导线阻抗对电池内阻的影响,实现四引线连接。由单片机控制输入转换开关,首先接通取样电路, 检测出注入电池回路中的电流值;再接通电池两端, 检测出内阻上产生的电压信号, 从而根据内阻计算公式,计算出电池内阻并显示。同时, 可通过接口电路,向PC 计算机输送相关信息, 存储相关数据, 并自动绘制充放电特性曲线。
上述方法中,直流内阻测试法,是国内外标准的典型测试方法,测试结果认可度较高;交流注入测试法,则多用在在线测量领域,作为车辆运行过程中,对动力电池性能监测的一种手段。
相关问答
单片机 用 锂电池 供电,如何较为准确的监控实时 电池电量 ?单片机可通过ADC检测电压来监控电池电量我们一般通过检测电压来判断锂电池的电量。单节锂电池标称电压为3.7V,充满电压为4.2V。电压大于等于4.2V我们认为电量为...
如何用 单片机 制作 锂电池 充放电?你先要明白充电的过程和放电的过程。锂电池放电,就是把锂电池正负极接到一电阻,通过这样,把电能耗完。锂电池充电就是把锂电池接到电源上,正负极要接对,进行...
单片机 电压 检测 ?一般检测io电平的变化通过两种方式,下面分别介绍这两种方法。第一种:查询法,cpu通过程序不断的查询单片机IO引脚的状态,如果检测到电平变化,比如由高电平变...
单片机 用 锂电池 供电,肿么判断 锂电池 插入了充电器。Q2是低电...单片机用锂电池供电,肿么判断锂电池插入了充电器。Q2是低电压检测:Vin>3.3输出高电平,否则为低电平。共3条回答9732浏览当锂电池插入充电器时,锂电池处于...
用 单片机检测 电源电压是否大于3.6v其程序如何写?假设单片机电源电压3.3V,这就是基准电压(一般单片机是这样),ADC是10位的,满量程设为VM。由于没法自己测量自己的电压,需要一个参考电压,比如接一个2V稳压...
单片机 控制 电池电量检测 原理[回答]手机电池是靠检测电压来判断电量的。有一种检测汽车蓄电池电量的工具——放电钳,让蓄电池通过较小的电阻放电,通过串接在放电电路中的电流表观察放...
单片机 掉电 检测 与保存该怎么样做?1,单片机掉电,可不代表端口上就没电,电压还是加在单片机上,是没有电流流过单片机,掉电后单片机相当于无穷大电阻,只有微弱有电流留过控制口(一般很小,uA级),以...
单片机 怎么控制一个MOS对 锂电池 进行充电?-ZOL问答单片机控制一个MOS对锂电池进行充电的程序:while(1){if(P1_0){//电池没有达到上限电压4.2vP1_1=1;delay(5000);//开始充电5秒P1_1=0;...
STM32 单片机 怎么 检测 0-24电压和电流?24V可以比例衰减,电流的话需要先通过电阻或者霍尔传感器转成电压,再采样。24V可以比例衰减,电流的话需要先通过电阻或者霍尔传感器转成电压,再采样。
单片机 怎么用AD测电阻?电阻两端加上一个...忽略温度等因素的影响,直接采用串联电阻测电压的方法就可以。原理是采用一只高精度的已知阻值电阻[假设为R0],串联一只被测电阻[R1]将这...