资源描述
参赛作品说明书
课题名称:单片机控制无线充电
微型电动汽车设计
所属院校:海口经济学院
院系专业:信息工程学院通信工程
制作团队:赵洋涛、范倩、唐轲
指导老师:孙玉轩、何斌
完成时间:2013.6.11 摘 要
本作品主要采用无线充电技术及超级电容,用单片机控制无线充放电切换,无线充电线圈定位,实现了无线充电微型电动汽车设计。本系统使用无线充电及超级电容,可安全,快速,有效为小车提供电能。亲手设计基于单片机无线控制模块电路,并制成了PCB板,通过软件编程实现无线充放电模式自动切换并用LED灯提示,可随时用LCD显示充电电压,充电时间。小车用L298N电机驱动模块进行驱动,并通过无线遥控控制小车行进方向。
关键字:无线充电 超级电容 无线充电控制
目 录
摘 要 2
目 录 3
1概述 4
1.1背景 4
1.2作品优势 4
2总体设计 5
3硬件设计 5
3.1无线充放电控制模块 5
3.1.1A/D转换模块 6
3.1.2显示模块 6
3.1.3最小单片机系统 7
3.2无线充电模块超级电容 7
3.3四键无线遥控控制模块 8
3.4电机驱动模块 9
4 软件设计 10
4.1软件开发环境 10
4.1.1 C语言开发环境 10
4.1.2keil开发环境 10
4.1.3STC-ISP开发环境 10
4.2软件程序设计 11
4.2.1时间显示设计 11
4.2.2电压监控设计 11
4.2.3充放电切换 12
4.2.4无线遥控程序设计 12
5 发展方向 13
6 附录 13
6.1无线充放电控制原理图 13
6.2无线充放电控制PCB图 14
6.3源程序 14
6.3.1无线充放电控制源程序 14
6.3.2无线遥控源程序 19
1概述
1.1背景
当今社会,随着世界工业和社会经济高速发展,人类在能源方面面临着前所未有严峻挑战。因此,研究开发替代性绿色能源有着至关重要现实意义。
手机、MP3和笔记本电脑等便携式电子设备进行充电主要采用是一端连接交流电源,另一端连接便携式电子设备充电电池传统充电方式。这种方式有很多不利地方,首先频繁插拔很容易损坏接头.另外也可能带来触电危险。因此.非接触式感应充电器在上个世纪末期诞生.凭借其携带方便、成本低、无需布线等优势迅速受到各界关注。因此,实现无线充电,能量传输效率高,便于携带成为充电系统研究方向之一。
1.2作品优势
本作品通过硬件搭建,实现对超级电容无线充电,再通过超级电容放电,对小车进行供电,用无线遥控模块遥控小车。全过程使用单片机软件编程进行控制及监控,实现全部功能。本作品优点集中在以下几个方面:
1. 无线充电解决电气接口不同或充电器不兼容问题,增强便携性、美观性以及使用安全性。在小功率充电方面,产生磁场及地球磁场相近不会对人体产生伤害,并且电能转化效率高。
2. 超级电容在各种电能储存方式中具有功率密度高,充电速度快,循环使用寿命长,效率高,充放电过程基本可逆,低温性能优越,控制简单,绿色环保,安全性好优势。使用超级电容能大大提高储存电量。
3. 使用单片机软件编程控制充放电过程安全性好,电路设计简单,软件编程也很容易。技术非常成熟。
4. 使用无线遥控技术控制小车,通过51单片机最小系统软件编程控制,用L298N驱动模块和无线接收模块,实现小车无线控制。
2总体设计
本作品原理框图如下所示:以无线充电为核心,利用超级电容充电迅速,储能多特性,存储电能。使用单片机设计一个无线充放电控制模块,对无线充电进行实时监控。通过无线遥控技术软件编程,使用L298N电机驱动控制小车行驶。
本产品以超级电容组来取代市面上对环境有污染镍镉电池、锂电池,可以改善环境问题。而且超级电容具有存储电量多、充电时间短、使用寿命长等特点。
无线充电,利用电磁耦合原理进行无接触充电,解决了电气接口不同和电源适配等问题,从而增强便携性、美观性,由于线圈发射出磁场及地球磁场类似,对人们无辐射,因此使用很安全
智能控制,制作单片机最小系统,包括A/D转换模块,LCD液晶显示模块,以及充放电切换和指示模块。利用单片机对继电器控制实现电容组充放电自动切换,同时实现对电容组工作状态实时监控。
3硬件设计
3.1无线充放电控制模块
本作品使用AT89C52单片机,设计硬件电路图,并制成PCB板,通过软件编程实现无线充电控制,实现功能有:充放电模式自动切换,并随时显示监控电压,显示充电时间以及指示充放电状态。
3.1.1A/D转换模块
图3.1 A/D转换电路
A/D转换模块使用PCF8591芯片,完成充放电电路电压数模转换。PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件,具有4个模拟输入、1个模拟输出和1个串行I²C总线接口,其工作电压为2.5V-6V。PCF85913个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I²C总线上接入8个PCF8591器件,而无需额外硬件。在PCF8591器件上输入输出地址、控制和数据信号都是通过双线双向I²C总线以串行方式进行传输。本设计使用AIN0模拟输入口,输入充放电电压模电值。
3.1.2显示模块
图3.2显示电路
显示模块使用LCD液晶显示器。1602字符型LCD能够同时显示16*2即32个字符(16列2行)。芯片工作电压:4.5-5.5V。工作电流:2.0mA(5.0V)。1602共16个管脚,但是编程用到主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号); RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。R/W为读写选择,高电平进行读操作,低电平进行写操作。E端为使能端,后面和时序联系在一起。D0~D7分别为8位双向数据线,连接单片机P0口。
3.1.3最小单片机系统
图3.3 单片机最小系统电路
本模块为无线充放电模块核心,使用AT89C52芯片和12MHZ晶振。用作小车充电监控和切换以及电池组保护、监控。
3.2无线充电模块超级电容
本作品无线充电采用“磁耦合共振”这种新技术,当发射端通电时,它并不会向外发射电磁波,而只是在周围形成一个非辐射磁场。这个磁场用来和接收端联络,激发接收端共振, 从而以很小消耗为代价来传输能量。在这项技术中,磁场强度将不过和地球磁场强度相似,不用担心这种技术会对身体和其他设备产生不良影响。
图3.5 无线充电原理图
无线充电模块内部集成了振荡电路、整形电路、检测电路、频率干扰抑制电路、电流自动控制、无线功率发射电路等部分组成。发射模块可以在5~12V电压下工作,输出为5V 500mA。其接收端接收功率由收发距离决定。
图3.6 无线收发模块实物
超级电容就是一个用来存储无线充电能量电池。相对于一般电池,超级电容具有充电时间短、使用寿命长、温度特性好、节约能源和绿色环保等特点。本作品共使用6个耐压值为2.7V超级电容,每三个电容串联,最后把串联电容并联。
3.3四键无线遥控控制模块
无线遥控模块使用集成模块,基本技术参数如下所示:
工作电压(V): DC5V
静态电流(mA): 4.5mA
工作温度: -10℃~+70℃
接收灵敏度(dBm): -105DB
工作频率(MHz):315、433.92MHz(266-433MHZ频率段可任选)
工作方式:M4(点动:按住不松手就输出,一松手就停止输出)、L4(互锁:四路同时只能有一路输出)、T4(自锁:四路相互独立输出、互不影响,按一下输出再按一下停止输出)
天线长度:1/4波长天线接收效果最好,一般采用50欧姆单芯导线,天线长度315M约为23cm,433M约为17cm;
图3.7 无线遥控模块
3.4电机驱动模块
L298N驱动模块,可以直接驱动两路3-30V直流电机,并提供5V输出接口,直接给单片机电路供电,支持3VMCU控制,方便控制直流电机速度和方向。原理图如下:
图3.8 L298N电机驱动原理图
模块接线方法:IN1-IN4接单片机P04-P07I/O接口,OUT1-OUT2接直流电机1,OUT3-OUT4接直流电机2,VCC,GND接超级电容正负极。5V输出直接给单片机供电。
4 软件设计
4.1软件开发环境
4.1.1 C语言开发环境
Visual C++6.0是微软公司推出目前使用极为广泛基于Windows平台可视化集成开发环境,它和Visual Basic、Visual Foxpro、Visual J++等其它软件构成了Visual Studio(又名Developer Studio)程序设计软件包。Developer Studio是一个通用应用程序集成开发环境,包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用Visual Studio,可以完成创建、调试、修改应用程序等各种操作。
VC++6.0除了包含文本编辑器,C/C++混合编译器,连接器和调试器外,还提供了功能强大资源编辑器和图形编辑器,利用“所见即所得”方式完成程序界面设计,大大减轻程序设计劳动强度,提高程序设计效率。
VC++功能强大,用途广泛,不仅可以编写普通应用程序,还能很好地进行系统软件设计及通信软件开发。
4.1.2keil开发环境
keil是基于Windows开发平台,包含一个高效编译器、一个项目管理器和一个MAKE工具。包括C编译器、宏汇编译、连接/定位器、目标代码到HEX转换器。以STC单片机为主芯片,用串口线即可完成程序下载,电源采用USB口供电,更加方便携带,一台计算机足以完成程序开发及下载工作。
普通安装有Windows 7计算机便可按照软件安装指示一步一步安装keil软件。
4.1.3STC-ISP开发环境
STC-ISP 是一款单片机下载编程烧录软件,是针对STC系列单片机而设计,可下载STC89系列、12C205 系列和12C5410等系列STC单片机,使用简便,现已被广泛使用。
1)打开STC-ISP,在MCU Type栏目下选中单片机,如STC89C52RC;
2)根据9针数据线连接情况选中COM端口,波特率一般保持默认;
3)先确认硬件连接正确,按如图点击“打开文件”并在对话框内找到您要下载HEX文件;
4)点击“Download/下载”;
5)手动按下电源开关便即可把可执行文件HEX写入到单片机内;
4.2软件程序设计
4.2.1时间显示设计
时间显示模块,使用单片机内部定时中断器T0,工作在方式1,晶振为12MHZ,通过LCD1602液晶显示器。时间显示格式为:“ Time 00:00:00 ”。
单片机使用是12MHZ晶振,其周期为1us,因此程序设定了count,shi,fen,miao四个计数变量,四个嵌套循环函数。首先设定TH0,TH1初始值,当中断时,count变量加1,直到count等于20时,count变量重新至0,miao变量加1;直到miao等于60时,miao变量重新至0,显示miao,fen变量加1;如此循环,在LCD1602上显示时间。
4.2.2电压监控设计
电压监控模块,使用PCF8591芯片进行A/D转换,通过单片机内部定时中断器T1,工作在方式1,显示在LCD1602液晶显示器上。电压显示格式为:“ V:000.0 ”。
当单片机T1产生中断时,则开启总线,通过移位函数,开始向单片机串行发送数据。单片机选择PCF8591四路模拟输入通道中第一路通道,再重新开启总线,发送数据,通过移位函数,串行接收数据,并且关闭总线。最后写指令和数据,显示在LCD1602液晶显示器上。
4.2.3充放电切换
充放电切换模块,使用两个继电器和LED灯来完成。继电器分别控制超级电容正负两极。LED灯用来指示充放电过程。初始化时,两个LED灯都为灭,继电器为放电状态。
当单片机中断时,从A/D转换模块得到电压值。判断电压值,当电压值小于5V时,继电器切换到充电状态,LED灯指示充电状态。当电压值大于9V时,继电器切换到放电状态,LED灯指示放电状态。否则,继电器保持原本状态,直到电压值满足判断条件,再进行跳变。
4.2.4无线遥控程序设计
无线遥控接收模块直接及单片机P3.4-P3.7I/O接口相连,可直接通过遥控控制。
小车电机驱动及P2.0-P2.3I/O接口相连,通过改变高低电平,实现小车各项操作。
当按下遥控时,无线接收模块接收信号,通过单片机给相应电机至高低电平,改变其状态。
5 发展方向
本作品只是初步实现无线充电功能,还需要进一步完善。比如说,只是进行短距离充电,考虑长距离充电转化效率还能低。充电时间也过长,需要增加充电电压及电流,实现快速充电。超级电容也需要一个保护电路,以免充电过压或过流等。无线充电控制电路功能太过单一,可通过I/O口进行扩充,增加作品功能。
6 附录
6.1无线充放电控制原理图
6.2无线充放电控制PCB图
6.3源程序
6.3.1无线充放电控制源程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5; //定义
sbit rw=P2^6; // 定义读\写端口
sbit e=P2^7; // 定义使能信号引脚
sbit SDA=P3^2;
sbit SCL=P3^3;
uchar num=0;
char shi,fen,miao;
uchar count,mm;
uchar code table[]=":";
uchar code table0[]=" V:000.0";
uchar code table1[]=" Time 00:00:00 ";
/******延时***********************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************************写指令***********************/
void write_com(uchar com)
{
rs=0; // 指令
rw=0; // 写入
e=0;
P0=com;
delay(5);
e=1; //允许
delay(5);
e=0;
}
/*************************写数据********************/
void write_date(uchar date)
{
rs=1; // 数据
rw=0; //写入
e=0;
P0=date;
delay(5);
e=1; // 允许
delay(5);
e=0;
}
///////延时函数//////
//////////启动总线////////
void Start(){
SDA=1;
SCL=1;
delay(5);
SDA=0;
delay(5);
SCL=0;
}
//////////结束总线///////////
void Stop()
{
SDA=0;
SCL=1;
delay(5);
SDA=1;
delay(5);
}
//////非应答函数/////////
void Noack(){
SDA=1;
delay(5);
SCL=1;
delay(5);
SCL=0;
}
void Ack(){
SDA=0;
delay(5);
SCL=1;
delay(5);
SCL=0;
}
/////////数据发送函数//////
void Send(uchar c)
{
uchar bite;
for(bite=0;bite<8;bite++)
{
if((c<<bite)&0x80)SDA=1;
else SDA=0;
SCL=1;
delay(5);
//Delayus();
SCL=0;
}
SDA=1;
delay(5);
}
///////接收函数///////////
uchar Rec()
{
uchar byte,bite;
SDA=1;
for(bite=0;bite<8;bite++)
{
SCL=0;
delay(5);
SCL=1;
delay(5);
byte<<=1;
if(SDA==1)byte+=1;
}
SCL=0;
delay(5);
return(byte);
}
///////////读取数值////////
uchar Read(uchar AI){
uchar z;
Start();
Send(0x90);
Ack();
Send(0x40|AI);
Ack();
Start();
Send(0x91);
Ack();
z=Rec();
Noack();
Stop();
return(z);
}
/**********************LCD初始化***************/
void init(){
uchar n;
shi=0;
fen=0;
miao=0;
write_com(0x38);
write_com(0x0c); //显示控制
write_com(0x06); //地址加1 字符不移动
write_com(0x01); //清零
write_com(0x80);
for(n=0;n<8;n++)
write_date(table0[n]);
delay(5);
write_com(0xc0);
for(n=0;n<16;n++)
write_date(table1[n]);
delay(5);
TMOD|=0x11;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
TH1=(65536-2000)/256; //重新赋值
TL1=(65536-2000)%256;
}
/*************************显示*********************/
void write_sfm(uchar add,uchar date)
{
uchar shi,ge; //对应一个数分离开来 分别送入对应地址显示
shi=date/10;
ge=date%10;
write_com(0xc0+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
/*void write_sf(uchar add,uchar num)
{ uchar i,j,k,l;
i=num/1000;
j=num%100;
k=(num%100)/10;
l= (num%100)%10;
write_com(0x80+add);
write_date(0x30+i);
write_date(0x30+j);
write_date(0x30+k);
write_date(0x30+l);
}
/*********************主函数*************************/
void main()
{
init();
while(1){
num=Read(0);
write_com(0x80+3);
write_date(0x30+num/1000);
write_date(0x30+(num/100)%10);
write_date(0x30+(num%100)/10);
write_com(0x80+7);
write_date(0x30+(num%100)%10);
write_sfm(6,shi); //每次变化后时 数据送入显示
write_sfm(9,fen); // 每次变化后分 数据送入显示
write_sfm(12,miao); // 每次变化后秒 数据送入显示
}
}
void Timer1(void) interrupt 3 {
TH1=(65536-2000)/256; //重新赋值
TL1=(65536-2000)%256;
}
/******************中断处理**********************/
void yy() interrupt 1
{
TH0=(65536-46083)/256;
TL0=(65536-45083)%256;
count++;
if(count==20){
count=0; //count到20清零
miao++; //秒加1
if(miao==60){
miao=0; //秒到60 清零
fen++; //分加1
if(fen==60)
{
fen=0; //分到60清零
shi++; //时加1
if(shi==24)
{
shi=0;//时到24清零
}
} } }}
6.3.2无线遥控源程序
#include <REGX51.H>
#include <stdio.h>
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;
sbit P23=P2^3;
unsigned char a,b;
void delay10ms()
{
for(a=100;a>0;a--)
for(b=225;b>0;b--);
}
sbit A=P3^4;
sbit E=P3^5;
sbit C=P3^6;
sbit D=P3^7;
void main(void)
{
while(1)
{
P23=0;
if(A==1) //前进
{
P04=0;P05=1;P06=0;P07=1;
delay10ms();
}
if(E==1) //后退
{
P04=1;P05=0;P06=1;P07=0;
delay10ms();
}
if(C==1) //左转
{
P04=0;P05=1;P06=1;P07=0;
delay10ms();
}
if(D==1) //右转
{
P04=1;P05=0;P06=0;P07=1;
}
if(A==0&&E==0&&C==0&&D==0) //停止
{
P04=1;P05=1;P06=1;P07=1;
}
}
}
33 / 33
展开阅读全文