电动车电池防过充节电控制器.docx

上传人:b****6 文档编号:8508150 上传时间:2023-01-31 格式:DOCX 页数:17 大小:161.98KB
下载 相关 举报
电动车电池防过充节电控制器.docx_第1页
第1页 / 共17页
电动车电池防过充节电控制器.docx_第2页
第2页 / 共17页
电动车电池防过充节电控制器.docx_第3页
第3页 / 共17页
电动车电池防过充节电控制器.docx_第4页
第4页 / 共17页
电动车电池防过充节电控制器.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

电动车电池防过充节电控制器.docx

《电动车电池防过充节电控制器.docx》由会员分享,可在线阅读,更多相关《电动车电池防过充节电控制器.docx(17页珍藏版)》请在冰豆网上搜索。

电动车电池防过充节电控制器.docx

电动车电池防过充节电控制器

随着人们对环境意识的加强,节能环保的电动车行业,各种电动车也随之出现。

经过市场调研,我们发现所有电动车的电池充电器都没有自动断电功能,电池已经充满,充电器仍然处于浮充状态,这样不但电池会被充坏也造成了很大的电能浪费,所以对安全性、节能型、智能型的电池充电器的需求也越来越大。

基于此我们设计了电动车电池防过充节电控制器。

本设计是在普通电动车充电器的基础上增加了单片机控制部分,可直接将家用充电器接入本产品的输入端,从产品的输出端接到电动车电池的原充电口,以实现智能充电的目的。

硬件电路由两种工作模式:

定时充电和自动控制充电。

定时充电时,时钟数码管显示定时时间;自动充电时,时钟数码管显示电池两端电压和浮充时间。

电池充满后自动切断电源,本产品具有电池电压检测工能,既可以应用于36V电池控制,又可以应用于48V电池控制,用户只需将自己的电池接至相应的地方,即可直接充电,如果电池接反会自动保护,不让电池损坏,具有良好的通用性和实用性。

二、原理说明:

原理图如图所示:

 

电源部分:

接220端子为输入端,接插座端子为输出端,P3为与单片机AD检测部分的连接排针。

我们用LM7805为控制部分电路提供5V稳定电源。

单片机通过控制继电器的吸合与断开来控制充电电源的开启与闭合,R1,R2,R3,R4为检测电池电压的分压电阻,因为输入单片机IO口的电压不能超过5V,所以要先将所采集的电压经过电阻分压后才能输入单片机。

图中R19为上拉电阻,R6为限流电阻,继电器通过晶体管9013(0.5A)驱动。

当单片机引脚输出低电平时,三极管截止,没有电流流过继电器的线圈,继电器断开,开始充电。

当单片机引脚输出高电平时,三极管导通,继电器吸合,停止充电。

防止电池因过充而导致电池损坏。

当电池充满电时,单片机进入掉电模式,即使是在没人在的时候,也浪费不了多少电。

图中的D3是为电池反接时保护电池设计的。

D4是为了保护继电器设计的。

控制显示部分:

如图所示:

智能充电器控制显示部分主要是以STC12C2052AD单片机为控制核心设计的。

此单片机部带AD转换,十分方便,不需外接比较器;且能很精确的检测到电池两端的电压大小。

外围电路包括输入设备按键,显示设备时钟数码管,发光二极管(红和绿)和充满电报警设备蜂鸣器。

用户可通过按键设置所需的充电模式及充电时间。

两个发光二极管用来指示不同的充电模式及不同的充电阶段。

图中U3即74HC595,为8位串转并移位寄存器,为节省单片机IO口设计的。

四个按键的功能分别为:

S1为模式(自动控制模式和定时模式)选择键,S2为“+”键用来调节定时时间,S3为“确认键”。

时钟数码管在定时模式时显示定时时间的时和分。

而在自动控制模式时,在电池两端电压达到浮充状态之前,数码管显示的是电池两端的电压值的大小,此时中间的一点亮;在电池两端电压达到浮充状态时,数码管显示定时两个小时,显示状态和定时模式时一样。

理论设计计算:

AD采集部分分压电阻的设计计算

对于48V的电池来说,R3为570K,R4为10K,要求当电池电压达到浮充状态即57.2V时,分压后输入单片机的电压不超过5V,为了计算方便取

Vmax=57V:

此时分压后输入单片机的电压为

Vin=Vmax*R3/(R2+R3)=1V

R3的功率为

Pr3=(Vmax/580K)*(Vmax/580K)*20K

<<0.125W

所以取1/4W的电阻

设单片机中AD转换寄存器中的值为ad_data则

ad_data=(Vin/5)*256

若取10位的转换精度,则只需将256换为1024即可。

由此将模拟量转换成数字量,通过数码管显示出来。

三、学习心得体会:

在学习这门课之前,我几乎对51单片机一无所知。

实际上讲,在选这门课之前,我也不知道这门课具体是讲什么的,只知道是电子制作,自己本着想锻炼一下的想法就选了这门课,当老师开始讲课时才知道我们学习的是单片机,是我们大三下学期才开的课程。

真的很庆幸能提前接触,这是一大收获。

在这个课上我了解到了一个单片机开发板的成品的的全过程,从最初的原理图的设计到PCB板的生成,到事物的焊接,最后到程序的调试及输入。

虽然我们在课堂上学过原理图的设计和PCB板的生成,但那大多是照着书上做的,所以比较简单。

然而,在这个实验选修课上则完全是自己动手做的,在自己画原理图时,开始真是觉得有点小困难,因为好多元件元件库里都没有,都需要自己画,也就是说要自己封装,比较麻烦。

对于我这初学者来说,是一种考验。

画原理图基本上用了我两大节课的时间,相对来说,时间比较长,但画完后有一种小小的成就感,这也是我对接下来的学习制作更感兴趣。

如果原理图画的很成功,那么PCB就没那么难了,自动生成很快,但是布局就比较麻烦了,如果PCB能够很好的完成,那么这个制作就基本上完成了三分之一的进程。

这是成功的第一步。

等同学们都完成后,老师给发了一些器件,开始了板子的实物焊接。

由于一些原因,这个焊接我在课上没有完成,下课后我又到同学的实验室里继续焊接,大概两个多小时的时间完全焊完了,看着自己亲手做的板子,心里有一种说不出的高兴,真的有一种成就感,也许这是因为我第一次焊接这样的板子吧!

所以决定以后多往这方面注重些。

接下来的课程就是程序的设计及调试。

在写程序之前老师讲解了关于51单片机的一些知识及应用和一些单片机程序的程序代码,老师还推荐了一些书籍,让同学们下去自学单片机知识。

在写程序期间,觉得很难,比较折磨人,因为不会,毫无头绪,也许是因为还没有深入学习单片机的原因吧!

对于程序的编写及调试,老师要求的不是很严,因为老师知道我们还没有学习单片机,他的这个课程也是为了提前带我们进入单片机的学习,为以后的学习打下基础。

虽然我们还不能熟练掌握51单片机的变成及调试,但是我们对于51单片机的产品开发及制作全过程有了更近一步的了解,不再迷茫和去猜测。

课堂时间毕竟很少,深入的学习就要靠我们自己。

如果想在这方面有过突破有所发展,那么单片机的深入学习是必然的。

通过这个课程的学习,使我对51单片机产品的开发有了一定的了解,同时我也对这门课程产生了憧憬,我觉得这个制作全过程很有意思。

所以我决定,如果大三还有这样的课程我还会去选,如果没有了,我会利用课余时间去做一些这样的课题,又不懂得地方去问老师或一些比较懂得同学。

总之,从这门课中我在一定程度上学到了不少知识。

另外,王俊杰老师的认真辅导也让我们倍感亲切。

还有就是我自己独立的完成了一个电路板的制作,第一次尝到了做东西的成就感。

这给了我很大的信心。

我会以此为契机,好好学习专业知识,提升自己的专业水准。

四、单片机编程代码:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineAD_SPEED0x60//0110,000011270个时钟周期转换一次,

/*数码管IO口设置******************************************************/

sbitST_CP=P1^1;

sbitSH_CP=P1^2;

sbitDS=P1^3;

sbitLED4=P1^4;//数码管

sbitLED3=P1^5;

sbitLED2=P1^6;

sbitLED1=P1^7;

sbitled0=P3^0;//LED

sbitled1=P3^1;

sbits3=P3^2;//按键

sbits2=P3^3;

sbits1=P3^4;

sbitBEE=P3^5;//蜂鸣器

sbitk1=P3^7;//继电器

/*********************/

uchartemp=0;//595数据标识

uintad_data;//AD数据

intcount1=0;//数码管位标识

intcount2=0;

intcount3=0;

intcount4=0;

uintcount_m=0;

ucharcount_f=0;

ucharcount_s=0;

uintcount=0;//ms数码管显示标识

ucharcount0=0;//0.5s

ucharstate=0;//数码管显示标识

ucharshi=0;//时分秒初始设置

ucharfen=0;

ucharmiao=0;

ucharm=0;

ucharq=0;//按键标识

uchark=0;

intk2;//按键标识

ucharad_flag=0;

bittime_flag=0;

bitauto_flag=0;

ucharcountb=0;

uintvoltage=0;//电压初始

uintvoltage1=0;

uchari=0;

ucharflag1=0;

ucharV;

ucharvalue_buf[50];ucharcount5,i5,j5,temp5;//采集的电压

ucharVCC=4.88;//电源参考电压

ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//字符

ucharcodeDSY_CODE1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的字符

//**********************************************

voidADC();/*AD转化函数*/

voidInitADC();//AD设置函数

voidkeyserve(void);//按键设定

voidkeyscan();//键盘扫描

voidDelay(uintx);//延时

voidIn_595();//595函数

voidOut_595();

voidbeek(void);//蜂鸣器继电器

voidinit();//初始化

//*******************************************************

voidmain()

{init();

while

(1)

{

keyscan();

beek();

if(auto_flag==1)

{for(count5=0;count5<50;count5++)

{

value_buf[count5]=V;

Delay(10);

}

for(j5=0;j5<50-1;j5++)

{

for(i5=0;i5<50-j5;i5++)

{

if(value_buf[i5]>value_buf[i5+1])

{

temp5=value_buf[i5];

value_buf[i5]=value_buf[i5+1];

value_buf[i5+1]=temp5;

}

}

}

voltage=(value_buf[0]*1.96);

if(voltage>=395){voltage1=4801;}

if(voltage>=409){voltage1=4902;}

if(voltage>=416){voltage1=5003;}

if(voltage>=425){voltage1=5104;}

if(voltage>=433){voltage1=5205;}

if(voltage>=442){voltage1=5306;}

if(voltage>=460){voltage1=5504;}

if(voltage>=468){voltage1=5601;}

if(voltage>=478){voltage1=5702;}

count1=(voltage1/1000);

count2=((voltage1%1000)/100);

count3=((voltage1%1000%100)/10);

count4=((voltage1%1000%100%10));

Delay(300);

if(voltage>=480)

{BEE=1;Delay(200);BEE=0;

TR1=1;

shi=0;//充满电后的延时时间

fen=1;

miao=15;

ADC_CONTR&=0x6e;

auto_flag=0;flag1=1;

}

if(count_f>2)//自动控制定时时间设定,时间是大于2分钟时继电器断开

{

TR0=0;

TR1=0;

BEE=1;

ADC_CONTR&=0x6e;

k1=0;

Delay(2000);

BEE=0;

auto_flag=0;

count_m=0;//把秒清0,不让蜂鸣器一直响

}

}

}

}

//***********AD初始化*******************************

voidinit()

{TMOD=0x11;

TH0=0xfa;

TL0=0x00;

TH1=(65535-50000)/256;

TL1=(65535-50000)%256;

ET0=1;//开定时器中断

ET1=1;

TR0=1;

TR1=0;

EA=1;

P3M0=0X00;//设置BEE端口

P3M1=0X20;

AUXR|=0x10;

EADC_SPI=1;

LED1=1;

LED2=1;

LED3=1;

LED4=1;

BEE=0;

k1=1;

}

voidInitADC()

{

P1=0xff;

ADC_CONTR=0xe8;

Delay(80);

P1M0|=0x01;//这两个寄存器用来设置P1口四种状态,每一位对应一个P1引脚,按状态组合操作

P1M1&=0xfe;//设置P1.1为开漏状态

}

voidADC()interrupt5

{

if(ad_flag==1)

{

ad_flag=0;

ad_data=ADC_DATA;

V=ad_data;

ADC_CONTR&=0xe7;//清除标志位同时关闭AD采集

ADC_CONTR=0xe8;//开中断ad

}

voidTime0()interrupt1//显示数码管

{

TH0=0xfa;

TL0=0x00;

count++;

if(count==20)//循环20次检测一次电压

{

count=0;

ad_flag=1;

}

state++;

switch(state)

{

case1:

{

temp=DSY_CODE[count1];

In_595();

Out_595();

LED1=0;

LED2=1;

LED3=1;

LED4=1;

}break;

case2:

{

temp=DSY_CODE1[count2];

In_595();

Out_595();

LED1=1;

LED2=0;

LED3=1;

LED4=1;

}break;

case3:

{

temp=DSY_CODE[count3];

In_595();

Out_595();

LED1=1;

LED2=1;

LED3=0;

LED4=1;

}break;

case4:

{

state=0;

temp=DSY_CODE[count4];

In_595();

Out_595();

LED1=1;

LED2=1;

LED3=1;

LED4=0;

}break;

}

}

//****************************************

voidTime1()interrupt3

{

TH1=(65535-50000)/256;

TL1=(65535-50000)%256;

if(auto_flag==0)

{count4=fen%10;

count3=fen/10;

count2=shi%10;

count1=shi/10;

if(++count0==10)

{

count0=0;

miao--;

if(miao==0)

{

fen--;

if((fen==0xff))

{

fen=59;

shi--;

if(shi==0)

{

shi=0;

}}

miao=59;

}}

}

if(auto_flag==1)

{

if(++count0==10)

{

count0=0;

count_m++;

if(count_m==59)

{

count_m=0;

count_f++;

if(count_f==60)

{

count_f=0;

count_s++;

if(count_s==24)

{}

}}}}}

//*********************************************

voidDelay(uintx)

{

uchari;

while(x--)

{

for(i=120;i>0;i--);

}}

//******************************************

voidIn_595()

{

uchari;

for(i=0;i<8;i++)

{

temp<<=1;

DS=CY;

SH_CP=1;

_nop_();

_nop_();

SH_CP=0;

}

}

voidOut_595()

{

ST_CP=0;

_nop_();

ST_CP=1;

_nop_();

ST_CP=0;

}

//*********************************数据处理

voidkeyscan()

{

if(s1==0)

{

//Delay(5);

Delay(200);

if(s1==0)

{

while(!

s1);

//Delay(5);

Delay(200);

while(!

s1);

k=1;

keyserve();

}}

if(s2==0)

{

//Delay(5);

Delay(200);

if(s2==0)

{

while(!

s2);

//Delay(5);

Delay(200);

while(!

s2);

k=2;

keyserve();

}}

if(s3==0)//确认键

{//Delay(5);

Delay(200);

if(s3==0)

{

while(!

s3);

//Delay(5);

Delay(200);

while(!

s3);

k=3;

keyserve();

}}

}//-------------按键功能------------

voidkeyserve()

{

switch(k)

{

case1:

switch(m)

{

case0:

led0=1;led1=0;m=1;break;//led0表示绿色LED,LED1表示红色LED,红灯亮,定时模式

case1:

led1=1;led0=0;m=0;break;//自控模式,绿灯亮

}

break;

case2:

if(time_flag==1)

{shi++;

if(shi==13)

{shi=0;}

}

break;

case3:

switch(m)

{

case1:

ADC_CONTR&=0x7e;TR1=1;time_flag=1;auto_flag=0;shi=0;fen=1;miao=10;break;//定时模式

case0:

TR1=1;time_flag=0;InitADC(),auto_flag=1;break;//自控模式

//default:

break;

}

break;

}}

voidbeek(void)//控制继电器和蜂鸣器

{if((shi==0)&&(fen==0)&&(miao==20))//到一分钟20秒时跳

{k1=0;

TR0=0;TR1=0;

BEE=1;

Delay(1000);

BEE=0;

Delay(500);

BEE=1;

miao++;}

else{BEE=0;}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1