1、脉宽调速也可通过单片机控制继电器的闭合来实现,但是驱动能力有限。为顺利实现电动小汽车的前行与倒车,本设计采用了可逆PWM变换器。可逆PWM变换器主电路的结构式有H型、T型等类型。我们在设计中采用了常用的双极式H型变换器,它是由4个三极电力晶体管和4个续流二极管组成的桥式电路。PWM调速主要是针对功率较小的低惯量电机,具有高的定位速度和精度,低速性能好,稳速精度高,调速范围宽,系统频带宽,动态响应好,抗干扰能力强,且经济可靠,因而有很大的使用价值。调压调速主要是针对饶线式电机,通过串电阻调压调速。价格便宜。在一些精度要求不高,低电压时力矩小,调速范围小的场合。循迹系统本系统采用反射式红外线光电传
2、感器用于检测路面的起始、终点(2cm宽的黑线),玩具车底盘上沿黑线放置一套,以适应起始的记数开始和终点的停车的需要。利用超声波传感器检测障碍。超声波模块电路光线跟踪,采用光敏三极管接收灯泡发出的光线,当感受到光线照射时,其c-e间的阻值下降,检测电路输出高电平,经LM393电压比较器送单片机控制。红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过15cm。对于发射和接收红外线的红外探头,可以自己制作或直接采用
3、集成式红外探头。 红外光的发送接收选用型号为ST168的对管。当小车在白色地面行驶时,装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。将检测到的信号送到单片机I/O口,当I/O口检测到的信号为高电平时,表明红外光被地上的黑色引导线吸收了,表明小车处在黑色的引导线上;同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。此种方法简单,价格便宜,灵敏度可调,但是容易受到周围环境的影响,
4、特别是在较强的日光灯下,对检测到的信号有一定的影响。八对反射式红外发射接收管的组合使用。它们分别安装在小车底两侧,正常行进中,检测线应在其间。只要有一侧检测到黑线信号,立即转向信号方向,保证了小车能沿黑方向行进。使用接近开关:它即有行程开关、微动开关的特性,同时具有传感性能,其动作可靠,性能稳定,频率响应快,应用寿命长,抗干扰能力强等、并具有防水、防震、耐腐蚀等特点。当金属检测体接近开关的感应区域,开关就能无接触,无压力、无火花、迅速发出电气指令,准确反应出运动机构的位置和行程,即使用于一般的行程控制,其定位精度、操作频率、使用寿命、安装调整的方便性和对恶劣环境的适用能力,是一般机械式行程开关
5、所不能相比的。电源模块设计电源模块为系统其它各个模块提供所需要的电源,设计中,除了要考虑到电压范围和电流容量等基本参数之外,还要在电源转换效率、降低噪声、防止干扰和电路简单等方面进行优化。可靠的电源方案是整个硬件电路稳定可靠运行的基础。随着微电子技术的不断进步,系统电源的设计在单片机应用系统设计中显得越来越重要,它对单片机系统是否正常工作起着至关重要的作用。根据系统要求,选择7805稳压管将直流12V电压转成5V输出。7805直流稳压电路图:单片机最小系统设计 单片机是小车的控制中心,单片机最小系统的合理设计是小车平稳运行的前提,图3.2 为52单片机最小系统的几个部分:有少许影响,CX1、C
6、X2可在20pF到100pF之间取值,但在60pF到70pF时振荡器有较高的频率稳定性。所以本设计中,振荡晶体选择6MHZ,电容选择65pF。在设计印刷电路板时,晶体和电容应尽可能靠近单片机芯片安装,以减少寄生电容,更好的保证振荡器稳定和可靠地工作。为了提高温度稳定性,应采用NPO电容。2、复位电路80C51的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。复位电路通常采用上电自动复位和按钮复位两种方式。最简单的上电自动复位电路中上电自动复位是通过外部复位电
7、路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。时钟频率用6MHZ时C取22uF,R取1K。除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。按键手动复位电路见图3.2。时钟频率选用6MHZ时,C取22uF,Rs取200,RK取1K。小车软件设计系统软件设计说明在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件更为重要。为了完成上述任务
8、,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。所谓“模块”,实质上就是所完成一定功能,相对独立的程序段,这种程序设计方法叫模块程序设计法。模块程序设计法的主要优点是:单个模块比起一个完整的程序易编写及调试;模块可以共存,一个模块可以被多个任务在不同条件下调用;模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。本系统软件采用模块化结构,由主程序定时子程序、避障子程序中断子程序显示子程序调速子程序算法子程序构成。本作品的核心电路是一片AT89C52。它是整个控制部分的核心,负责车速控制、电动机驱动、舵机转向、黑线检测等功能。小车夹紧装置步进电机驱动模块步进电机是
9、机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度 或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为
10、两相和五相:两相步进角一般为1.8度而五相步进角一般为0.72度。这种步进电机的应用最为广泛。PROTUES仿真结果向右校正向左校正直行附录:程序#includeintrins.h#define uchar unsigned char#define uint unsigned intsbit Triq=P00;sbit Echo=P01;bit flag=0;uint time;unsigned long s=0;#define m0 1/黑线m1,白线m0#define m1 0#define full_speed_left 50 /方便调节各个状态的占空比 ,可用参数组:(30,35,6,
11、25,30,68000,27000,500);#define full_speed_right 50 / (40,45,6,25,30,68000,27000,500);#define correct_speed 6 /校正时的低速轮的占空比#define turn_speed_left 25#define turn_speed_right 25 #define lenth 68000 /测试数据:10000-100-500-2000-80000-76000-68000#define width 27000 /500-10-2000-60000-30000-27000#define check
12、_right 500 /2000-20-200-500#define midl left1#define midr right5 uchar Duty_left,Duty_right,i=0,j=0; /左右占空比标志,取1-100 sbit mov=P24;sbit IN1=P20;sbit IN2=P21;sbit IN3=P22;sbit IN4=P23;sbit ENA=P10;sbit ENB=P11;/循迹口 五组红外对管,依次对应从左往右第1,2,3,4,5五组sbit left1 =P16;sbit left2 =P15;sbit mid3 =P14;sbit right4=P
13、13;sbit right5=P12;int a8=0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06;void line_left();void line_right();void line_straight()reentrant;/-void delay(long int Delay_time)/延时函数 uint t=Delay_time; while(t-); /-void init() /定时器初始化 left1=m0; /初始化 left2=m0; /白线位置 mid3 =m1; /黑线位置 right4=m0; right5=m0; EA=1; ET0
14、=1; ET1=1; TMOD=0x11; TH1=0; TL1=0; TH0=(65536-66)/256; TL0=(65536-66)%256; TR0=1;/-void time0(void)interrupt 1 /中断程序time+; if(time=50) time=0; Triq=1; _nop_(); Triq=0; i+; /调速在中断中执行 j+; if(i100) ENA=1;i=0; if(j ENB=1;j=0;TH0=(65536-66)/256; /取约150HZ,12M晶振,每次定时66us,分100次,这样开头定义的变量正好直接表示占空比的数值TL0=(65
15、536-66)%256;/-void correct_left()/向左校正,赋值 Duty_left =correct_speed; Duty_right=full_speed_right; IN1=1; IN2=0; IN3=1; IN4=0;/- void correct_right()/向右校正,赋值 Duty_left =full_speed_left; Duty_right=correct_speed;/-void turn_left()/左转,赋值 Duty_left =turn_speed_left; Duty_right=turn_speed_right; IN1=0; /转
16、弯时一个正转,一个反转, IN2=1; /-void turn_right()/右转,赋值 IN3=0; IN4=1;/-void straight() /直走,赋值 /左右电机占空比初始化,调节直线运动速度 /鉴于左右轮电机内部阻力不同,故占空比取不同值,这组值需要单独写程序取值void line_straight()reentrant /函数名后加reentrant可以递归调用,/一直走黑直线时 straight(); if(right5=m1)line_right(); else if(left1=m1)line_left(); else if(left2=m1) /防止校正时,小车冲出
17、过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨 while(left2=m1) correct_left(); if(right5=m1) line_right(); goto label3; else if(left1=m1) line_left(); goto label3; if(right4=m1) /防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨 while(right4=m1) correct_right(); line_right();goto label3; if(left1=m0)&(left2=m0)&(mid3=
18、m0)&(right4=m0)&(right5=m0) /delay(lenth); while(right4=m0) /本来应该是用mid3,但是为了提高灵敏度,选择right4;向左时,可取left2对管 turn_right(); if(mid3=m1) line_straight(); label3: ; /什么都不做/-void line_right() /右边有黑线时/这里的直走是在不管红外检测结果的直行 delay(lenth); turn_right();/执行向右转的赋值label:delay(width); /由width值决定转弯时mid3经过黑线宽度时所需要的时间 if
19、(mid3=m0) while(right4=m0) goto label; if(midr=m1) /-void line_left() /左边出现黑线时 turn_left(); while(left1=m1) if(right5=m1) line_right(); goto label2; delay(check_right);/左边遇到黑线时,左边出了黑线之后,继续延时一段时间,判断右边是否遇到黑线, /若遇到黑线,执行line_right()函数 if(mid3=m1)|(left2=m1)|(right4=m1)line_straight(); while(left2=m0) tu
20、rn_left(); if(midl=m1) line_straight();label2:/-void detect_infrared() /循迹,红外检测 if(left2=m1)correct_left(); if(right4=m1)correct_right();/-void main(void)/主程序部分 init(); while(1) /循环检测红外对管采集的电平信号 detect_infrared(); while(!Echo); TR1=1; while(Echo); TR1=0; i=(TH1*256+TL1); TH1=0; TL1=0; s=(0.17*i);if(mov=0) int m; int n; for( m=5;m0;m-) for(n=0;n8;n+) P1=ai; delay(50);