基于单片机的锂离子电池充电器含程序和电路图Word格式文档下载.docx
《基于单片机的锂离子电池充电器含程序和电路图Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的锂离子电池充电器含程序和电路图Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
2.2差模放大滤波电路
单体差模放大滤波电路如图2所示。
集成运算放大器采用LM358,LM358内部包括两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。
LM358内部结构
图2差模放大滤波电路
差模放大电路:
本课题电阻选取1M,进行输入电压1:
1测量。
滤波电路:
R=100K,C=10nf,f=1/2*pi*RC。
f=160Hz,实现低通滤波作用。
(3)A/D转换
A/D转换芯片采用PCF8591,内部结构如图4所示。
它具有I2C总线接口的8位A/D及D/A转换器。
有4路A/D转换输入,1路D/A模拟输出。
这就是说,它既可以作A/D转换,也可以作D/A转换。
A/D转换为逐次比较型。
图3PCF8591
A/D转换芯片PCF8591:
将差模放大滤波电路测量得到的模拟量转换成相对应的数字量。
3控制电路的设计
本课题所研究的对象是聚合物锂电池,根据《力神》公司提供的聚合物锂电池的数据手册,聚合物锂离子电池额定电压为3.7V,容量为10Ah,电源电压为5V。
电池的控制电路设计如图4所示,当电池端电压小于3.3V时,对电池进行大电流充电,此时绿色二极管和红色二极管导通,两灯都亮;
当电池端电压为3.3V~3.7V时,单片机给P1.0口高电平,给P1.1口低电平,此时绿色的二极管截止,只有红色的二极管亮,对电池进行涓流充电;
当电池两端的电压大于3.7V时,两个二极管截止,此时对电池停止充电。
图4控制电路
4SOC的估计
4.1电池SOC估算方法概述
目前国内外常用的荷电状态估计的方法主要有放电实验法、安时(从)计量法、开路电压法、负载电压法、电化学阻抗频谱法、内阻法、线性模型法、神经网络法和卡尔曼滤波法。
以下就这几种方法进行逐一简单的介绍。
4.1.1放电实验法
放电实验法是最可靠的电池荷电状态(SOC)估计方法,采用恒定电流进行连续放电,放电电流与时间的乘积即为剩余电量。
放电实验法在实验室中经常使用,适用于所有电池,但它也存在两处显著缺陷:
第一花费时间长;
第二要必须中断蓄电池正在进行的工作。
放电实验法不适合行驶中的电动汽车,但可以用于电动汽车电池的检修。
4.1.2安时(A.h)计量法
安时(A.h)计量法是目前最常用的电池荷电状态(SOC)估计方法。
假设放电(或充电)起始状态为
,那么当前状态(
时刻)的电池荷电状态(SOC)表示如下。
----额定容量;
----电池电流;
----充放电效率,不是常数。
4.1.3开路电压法
电池的开路电压在数值上接近电池电动势。
电池电动势是电解液浓度的函数,液密度随电池放电成比例降低,用开路电压可估计蓄电池荷电状态(SOC)。
其对应关系也可以估计SOC,尤其在充电初期和末期效果较好。
开路电压法的显著缺点是需要电池长时静置,以达到电压稳定,电池状态从工作恢复到稳定,需要几个小时甚至十几个小时,这给测量造成困难;
静置时间如何确定也是一个问题.
4.1.4负载电压法
电池放电开始瞬间,电压迅速从开路电压状态进入负载电压状态,在电池负载电流保持不变时,负载电压随电池荷电状态变化的规律与开路电压随电池荷电状态的变化规律相似。
负载电压法的优点是:
能够实时估计电池组的电池荷电状态,在恒流放电时,具有较好的效果。
实际应用中,剧烈波动的电池电压给负载电压法应用带来困难。
解决该问题,要贮存大量电压数据,建立动态负载电压和电池荷电状态的数学模型。
负载电压法很少应用到实车上,但常用来作为电池充放电截止的判据。
4.1.5内阻法
电池内阻有交流内阻(impedance,常称为交流阻抗)和直流内阻(resistanee)之分,它们都与SOC有密切关系。
电池交流阻抗为电池电压与电流之间的传递函数,是一个复数变量,表示电池对交流电的反抗能力,用交流阻抗仪来测量。
电池交流阻抗受温度影响大,是对电池处于静置后的开路状态,还是对电池在充放电过程中进行交流阻抗测量,存在争议,所以很少用于实车上。
交流阻抗法原理及应用。
直流内阻表示电池对直流电的反抗能力,等于在同一很短的时间段内,电池电压变化量与电流变化量的比值。
实际测量中,将电池从开路状态开始恒流充电或放电,相同时间里负载电压和开路电压的差值除以电流值就是直流内阻。
铅酸电池在放电后期,直流内阻明显目前国内外常用的荷电状态估计的方法主
要有放电实验法、安时(从)计量法、开路电压法、负载电压法、电化学阻抗频谱法、内阻法、线性模型法、神经网络法和卡尔曼滤波法。
4.1.6神经网络法
电池是高度非线性的系统,对其充放电过程很难建立准确的数学模型。
神经网络具有非线性的基本特性,并具有并行结构和学习能力,对于外部激励,能给出相应的输出,所以能够模拟电池的动态特性来估算电池荷电状态。
估计电池荷电状态常采用三层典型神经网络即:
输入层、中间层和输出层。
输入、输出层神经元个数根据实际问题的需要来确定,一般为线性函数,常用电压、电流、累积放出电量、温度、内阻及环境温度等作为输入变量;
中间层神经元个数取决于问题的复杂程度及分析精度。
神经网络法适用于各种电池,缺点是需要大量的参考数据进行训练,估计误差受训练数据和训练方法的影响很大。
4.1.7卡尔曼滤波法
利用卡尔曼滤波方法估算电池荷电状态的研究是在近几年才开始的,卡尔曼滤波的一个显著特点是,用状态空间的概念来描述其数学公式。
卡尔曼滤波另一个新颖特点是,他的解是递归计算的,而且可不加修改地应用于平稳和非平稳环境。
4.2采用开路电压法估计SOC
因为本课题为电池的闭环充电过程。
Soc要求精度不高,重要的是对电池进行充电控制。
Soc只需要随着充电过程的进行,实现相关指示便可。
所以课题采用开路电压法估计soc。
本课题所采用的是开路电压法,利用检测电路实时检测电池两端的电压,再通过数据手册提供的SOC-U计算公式计算相对应的soc。
设x为电池的开路电压,SOC-U计算公式如下:
存在问题:
因为电池内部是一个化学反应过程,所以达到内部化学平衡时候,测量的电池端电压才相对准确。
所以实时测量电池端电压,必然存在一定范围的误差。
5扩展部分
因为锂离子电池超过55℃存在爆炸危险,所以成熟的锂离子电池充电器都具有温度控制功能,当超过警戒值时候,切断充电电路进行纯降温操作。
本课题扩展了电池温度检测部分。
利用一个DS18B20温度传感器实时检测电池的温度变化,并显示于PC机上。
为电池的温度控制提供基础。
温度信号采集是采用美国Dallas半导体公司的数字化温度传感器DS1820来完成的,DS18B20与传统的热敏电阻相比,无需外加A/D,能够直接读出被测温度并且可根据实际要求通过简单的编程实现9一12位的数字值读数方式。
可以分别在93.75ms和750ms内完成9位和12位的数字量转换。
DS18B20芯片可以采用寄生电源和外部电源两种供电方式。
本文中采用外接5v电源,内部结构如图6所示。
图6DS18B20内部结构
6结论
利用检测电路实时检测电池的端电压、温度,再利用开路电压法估算SOC值,计算出相对应的容量,然后利用控制电路选择相对应的充电参数。
充电对象为聚合物锂离子电池,采用先大电流充电至容量的75%,再进行小电流充电至容量的99%,最后关断电池充电。
同时,该闭环充电系统也存在相关问题。
因为电池充放电过程实质是电池内部的各种化学反应过程,测量电池端电压需要等待电池内部反应平衡时才能实现小误差的的测量。
课题采用实时测量电池的端电压,未等到电池内部反应平衡,所以必然存在一定范围的误差,致使得到的SOC也只是一个粗略的值。
因此测量SOC值的方法还有待改进。
7参考文献
[1]胡弊,宋慧.电动汽车【M】,北京:
人民交通出版社,2002.
[2]郑杭波.新型电动汽车鲤电池管理系统的研究与实现【D】:
[硕士学位论文].北京:
清华大学,
2004.
[3]李兴虎.电动汽车概论【M】.北京:
北京理工大学出版社,2005.
[4]杨太安,纯电动汽车电源管理系统的研究【D】:
[硕士学位论文].武汉:
武汉理工大学2006.
[5]张翔,赵韩,钱立军等.国内各主要单位电动汽车研发项目进展情况及主要产品介绍[J].汽车技术,2004:
42一44.
[6]万刚.中国电动汽车的现状和发展[J],中国环保产业,2003
(2):
30-33.
[7]廖晓军,何莉萍,钟志华等.电池管理系统国内外现状及其未来发展趋势[J].汽车工程,2006.
8附录
附录一程序
/**********聚合物锂电池3.7V10AH充电器程序*************/
#include<
reg52.h>
stdio.h>
#include"
I2C.h"
18b20.h>
#definePCF85910x90//PCF8591地址
bitack;
/*应答标志位*/
intwendu;
bitflag=0;
inti,j,xms,w,x;
unsignedcharAD_CHANNEL;
unsignedintD[32];
unsignedintcount=0;
floatq,y,z,t;
sbitLED1=P1^0;
sbitLED2=P1^1;
initSci()//相关寄存器初值确定
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xF3;
TL1=0xF3;
TR1=1;
}
inittimer()//T0计数器赋初值
{
TMOD|=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=1;
/*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bitISendByte(unsignedcharsla,unsignedcharc)
Start_I2c();
//启动总线
SendByte(sla);
//发送器件地址
if(ack==0)return(0);
SendByte(c);
//发送数据
Stop_I2c();
//结束总线
return
(1);
ADC读字节数据函数
unsignedcharIRcvByte(unsignedcharsla)
{unsignedcharc;
SendByte(sla+1);
c=RcvByte();
//读取数据0
Ack_I2c
(1);
//发送非就答位
return(c);
//*******************************************************************
voiddelayms(intxms)//延时函数
for(q=xms;
q>
0;
q--)
for(w=110;
w>
w--);
voidmain()
{initSci();
inittimer();
while
(1)//主函数无限循环,电池充电过程中,时时对电池电压、电量进行检测
{
switch(0)//A/D转换芯片,选择0通道
{
case0:
ISendByte(PCF8591,0x40);
D[0]=IRcvByte(PCF8591)*2;
//ADC2模数转换0,放大2倍显示
break;
case1:
ISendByte(PCF8591,0x41);
D[1]=IRcvByte(PCF8591)*2;
//ADC3模数转换2
case2:
ISendByte(PCF8591,0x42);
D[2]=IRcvByte(PCF8591)*2;
//ADC1模数转换3
case3:
ISendByte(PCF8591,0x43);
D[3]=IRcvByte(PCF8591)*2;
//ADC0模数转换4
break;
}
if(++AD_CHANNEL>
3)AD_CHANNEL=0;
while(D[0]<
330)//聚合物锂电池端电压低于3.3v时,控制电路全部导通进行大电流充电
LED1=0;
LED2=1;
break;
}
x=10*D[0];
t=D[0]*0.01;
//将A/D转换的数值表示成端电压大小
if(x>
3335)//根据soc与端电压的关系,计算电池soc
y=1;
elseif(3327<
x&
&
x<
=3335)
y=1-(8.4745*x*x-56710*x+94872550)*6.89*0.00001;
elseif(3297<
=3327)
y=1-(-0.26997*x*x+1740*x-2798620)*6.89*0.00001;
elseif(3283<
=3297)
y=1-(7.1293*x*x-47222*x+78219350)*6.89*0.00001;
elseif(3179<
=3283)
y=1-(-0.2017*x*x+1256.2*x-1941900)*6.89*0.00001;
elseif(2823<
=3179)
y=1-(-0.00735*x*x+40.533*x-41359)*6.89*0.00001;
elseif(x<
=2823)
y=0;
z=y*10000;
//计算电池的电量
q=y*100;
//将soc用百分数形式表示
while(330<
D[0])//充电过程中端电压高于3.3v时,关断小电阻支路,进行涓流充电
LED2=0;
while(D[0]>
370)//充电过程中端电压高于3.7v以后,关断两条支路,停止充电
LED1=1;
wendu=ReadTemperature();
//时时对电池进行温度测量
wendu=wendu/10;
if(flag==1)//串口调试工具进行相关参数的显示
flag=0;
ES=0;
TI=1;
printf("
当前温度%d度\n"
wendu);
当前电压%0.2fv\n"
t);
当前电量%0.1f毫安时\n"
z);
电量剩余百分之%0.2f\n"
q);
while(!
TI);
TI=0;
ES=1;
delayms(1000);
voidtimer()interrupt1//T0计数器中断1
count++;
if(count==100)
count=0;
flag=1;
附录二总闭环充电系统电路图
图7闭环充电系统