电动车跷跷板报告【摘要】:本系统采用遥控电动小汽车改装而成,主要由89C52和模拟电路为核心器件,实现对智能电动车行驶的自动控制。
整车长23 厘米,宽5厘米,运行性能良好,符合设计要求。
电动车平衡检测使用倾角传感器。
电动智能小车电路由平衡检测电路、计时显示电路、电机驱动电路等组成,它不需要遥控就能按要求行走。
一、方案的选择与论证根据题目要求,系统可以以划分为几个基本模块,如图1.1所示图1.11、步进电机驱动调速模块方案一:采用与步进电机相匹配的成品驱动装置。
使用该方法实现步进电机驱动,其优点是工作可靠,节约制作和调试的时间,但成本很高。
方案二:采用集成电机驱动芯片LA298。
采用该方法实现电路驱动,简化了电路,控制比较简单,性能稳定,但成本较高。
方案三:采用互补硅功率达林顿管ULN2003实现步进电机的驱动。
采用该方法实现步进电机的驱动,电路连接比较简单,工作也相对可靠,成本低廉,技术成熟。
基于上述理论分析,最终选择方案三。
2、平衡检测模块方案一:采用精密的倾角传感器,这种传感器对应每个角度输出一个固定电流。
可以实现精确控制,但价格昂贵。
方案二:采用简易的倾角传感器,它直接输出一个开关量。
当其与地面垂直时,两触点断开;若倾斜角度超出一定范围,两触点短接。
这种传感器价格低廉,使用方便。
基于上述分析,最终选择方案二。
3、显示模块方案一:采用数码管显示。
数码管具有经济、低功耗、耐老化和精度比较高等优点,但它与单片机连接时,需要外接存储器进行数据锁存。
此外,数码管只能显示少数几个字符。
方案二:采用LCD进行显示。
LCD具有功耗低、无辐射、显示稳定、抗干扰能力强等特点,而且可以显示汉字。
考虑到本次设计的人性化设计,综合考虑,决定采用方案二。
4、电源选择考虑到本次设计对电源的要求,我们采用四节1.5V的干电池作为供电电源。
二、系统的具体设计与实现系统的组成及原理框图如图所2.1示。
以下分为硬件和软件两个方面进行具体分析。
图2.1系统框图1、系统的硬件设计(1) 步进电机驱动模块的电路设计与实现具体电路如图2.2图2.2步进电机驱动电路步进电机是一种将电脉冲转化为角位移的执行机构。
通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。
当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。
),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。
),八拍(A-AB-B-BC-C-CD-D-DA-A。
)(2) 平衡检测电路的设计平衡检测采用简易式倾角传感器,输出为开关量,可直接与单片机端口连接。
(3) 显示电路的设计显示电路采用液晶显示。
显示占用端口少,程序简单,稳定可靠。
2、系统的软件设计单片机控制电路由一片89C52组成,作为整个控制部分的核心,它负责平衡检测、电机驱动、数据显示等功能。
(1)步进电机驱动程序程序见附录(2) 平衡检测程序由于采用简易的倾角传感器,单片机端口得到的是开关量。
首先第一阶段让小车走到中点C,第二阶段小车先检测是向前倾还是向后倾,如果小车检测到向前倾,则小车继续向前走一段距离S,如果小车检测到向后倾,则小车向后走S/2的距离,一直这样知道找到平衡位置。
由于在前进状态时,在达到平衡状态时需要停止5秒,而在退回状态则不必停车。
因此,在判断小车达到平衡状态后,还需要判断小车状态,以决定是否停车。
平衡检测流程图(3) 显示程序显示程序比较成熟,可移植性好。
这里就不再介绍它的流程图三、总结由于小车是在玩具小车的基础上进行改装的,机械结构改造困难,不容易实现精确定位安装,影响传动效果。
小车改装以后,由于车身强度和车轮的原因,承载电池组等重物时,爬坡,转向困难。
由于平衡检测装置过于灵敏、小车的惯性、程序控制等缺陷,小车很难在平衡位置准确停止。
四、主要程序附录uchar code F_Rotation[]={0xc9,0xc1,0xc3,0xc2,0xc6,0xc4,0xcc,0xc8};//正转表格,前灯亮uchar code B_Rotation[]={0x38,0x3c,0x34,0x36,0x32,0x33,0x31,0x39};//反转表格,后灯亮void RunXCircle(uchar drec,uint num)//轮子跑num圈,drec为0向前,为1向后{uchar i;uint j;while(num--){j=OneCircle;while(j--){for(i=0;i<8;i++) //4相{if(!drec)P1=F_Rotation[i]; //输出对应的相,可以自行换成反转表格elseP1=B_Rotation[i];Delay(speed,110); //改变这个参数可以调整电机转速}}}P1=0xf0;//停止行走,灯熄灭}void RunNCircle(uchar drec,uint num)//轮子转num个最小单位,drec为1向前,为0向后{uchar i;while(num--){for(i=0;i<8;i++) //4相{if(!drec)P1=F_Rotation[i]; //输出对应的相,可以自行换成反转表格elseP1=B_Rotation[i];Delay(speed,110); //改变这个参数可以调整电机转速}}P1=0xf0;//停止行走,灯熄灭}读取倾角传感器的的数据,判断小车倾角:uchar DeltFind()//返回指为2表示平衡了,为0需要向前走,为1需要向后走{uchar angle,result=2;ADST=0;ADST=1;ADST=0;//启动AD0809转换while(!ADEOC);//等待AD0809转换结束angle=P2;//读取转化后的数据if(angle>UpAngle) result=0;//小车向前翘起,需要向前走else if(angle<DownAngle) result=1;//小车向后翘起,需要向后走else result=2;//小车平衡return result;}小车前进后退的驱动程序,可以准确地向前或者向后跑固定距离:void RunFwodBak(uchar drec,uchar jour)//drec为方向,0向前,1向后,jour为路程,单位是cm{RunXCircle(drec,jour/LCircle);//先跑完整圈RunNCircle(drec,(jour%LCircle)*OneCircle/LCircle);//再跑半圈}void RunFind(){uchar delt=0,flag=0;uint jour=FirstJour;TR1=1;//开时钟让AD工作for(delt=DeltFind();;delt=DeltFind()){if(delt==2){Delay(SAOMIAO,110);delt=DeltFind();if(delt==2){WriteCommond(0x86);WriteString(" balanced!");Delay(5000,110);break;}}if(delt!=flag) jour/=2;if(!jour){WriteCommond(0x86);WriteString(" Failed!!!");Delay(3000,110);break;}RunNCircle(delt,jour);flag=delt;Delay(SAOMIAO,110);}TR1=0;//关时钟}小车跑动时界面显示和小车流程程序:void MenuRun(){WriteCommond(0x0c);//不显示光标也不闪烁WindowRun();count[0]=0;count[1]=0;count[2]=0;count[3]=0;TR0=1;//开定时器DispTimeS(count[0]+count[1]+count[2]+count[3],0xc3);for(;step<4;step++){timecount=0;WriteCommond(0x81);WriteData(step+1+'0');WriteCommond(0x86);WriteString("Running...");DispTimeS(count[step],0xcc);switch(protype[step]){case 0:RunFwodBak(0,journey[step]);break;case 1:RunFwodBak(1,journey[step]);break;case 2:RunFind();}WriteCommond(0x86);WriteString("Completed!");if(step==2) Delay(3000,110);Delay(2000,110);}TR0=0;//关定时器step=0;}。