智能车模块源程序很详细

合集下载

智能循迹小车详细制作过程

智能循迹小车详细制作过程

第二届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告目录第一章引言 (1)1.1 智能车制作概述 (1)1.2 参考文献综述 (1)1.3 技术报告内容与结构 (1)第二章设计方案概述 (3)2.1 总体设计 (3)2.2 具体方案 (3)2.2.1 道路识别模块 (3)2.2.2 速度检测模块 (4)第三章模型车整体设计 (5)3.1 机械部分的调整 (5)3.2 传感器设计与安装 (5)3.2.1 光电管安装: (5)3.2.2 摄像头安装: (6)3.2.3 测速装置 (7)第四章硬件电路设计 (9)4.1 整体介绍 (9)4.2 各模块电路介绍 (10)第五章控制算法实现 (15)5.1 总体软件设计 (15)5.2 路径识别算法 (16)5.2.2 基于光电管的模糊控制算法 (16)5.2.2 基于CMOS的算法 (18)5.2.3 两者的结合 (20)5.3 速度控制算法 (20)第六章调试及主要问题解决 (23)6.1 调试工具 (23)6.2 调试过程 (24)6.3 主要技术参数说明 (25)第七章结论 (27)附录A 参考书目 (I)附录B 部分程序...................................................................................... I I第一章引言1.1 智能车制作概述本队在小车制作过程中,先对比赛内容,要求与规则进行了详细分析,然后按照要求制订了几种设计方案,并对几种方案进行比较敲定最后方案。

根据方案完成小车的总体设计和详细设计(包括底层硬件设计和总体软件设计),在完成了车模组装和改造后,完成了各个模块的硬件电路设计与安装,并进行了控制算法的设计和软件实现,最后进行了整车的调试和优化。

1.2 参考文献综述方案设计过程中参考了一些相关文献,如参考文献所列。

例如文献 1 与 2 单片机嵌入式系统在线开发方法。

智能循迹小车详细制作过程

智能循迹小车详细制作过程

(穿山乙工作室)三天三十元做出智能车基本设计思路:1.基本车架(两个电机一体轮子+一个万向轮)2.单片机主控模块3.电机驱动模块(内置5V电源输出)4.黑白线循迹模块0.准备所需基本元器件1).基本二驱车体一台。

(本课以穿山乙推出的基本车体为例讲解)2).5x7cm洞洞板、单片机卡槽、51单片机、石英晶体、红色LED、1K电阻、10K排阻各一个;2个瓷片电容、排针40个。

3).5x7cm洞洞板、7805稳压芯片、红色LED、1K电阻各一个;双孔接线柱三个、10u电解电容2个、排针12个、9110驱动芯片2个。

4).5x7cm洞洞板、LM324比较器芯片各一个;红外对管三对、4.7K电阻3个、330电阻三个、红色3mmLED三个。

一、组装车体(图中显示的很清晰吧,照着上螺丝就行了)二、制作单片机控制模块材料:5x7cm洞洞板、单片机卡槽、51单片机、石英晶体、红色LED、1K电阻、10K排阻各一个;2个瓷片电容、排针40个。

电路图如下,主要目的是把单片机的各个引脚用排针引出来,便于使用。

我们也有焊接好的实物图供你参考。

(如果你选用的是STC98系列的单片机在这里可以省掉复位电路不焊,仍能正常工作。

我实物图中就没焊复位)三、制作电机驱动模块材料:5x7cm洞洞板、7805稳压芯片、红色LED、1K电阻各一个;双孔接线柱三个、10u电解电容2个、排针12个、9110驱动芯片2个。

电路图如下,这里我们把电源模块与驱动模块含在了同一个电路板上。

因为电机驱动模块所需的电压是+9V左右(6—15V 均可),而单片机主控和循迹模块所需电压均为+5V。

这里用了一个7805稳压芯片将+9V电压稳出+5V电压。

+9V +9V这是工作室做的电源+驱动模块,仅作参考四、制作循迹模块材料:5x7cm洞洞板、LM324比较器芯片各一个;红外对管三对、4.7K电阻3个、330电阻三个、红色3mmLED三个。

LM324电压比较器工作原理:该芯片内部有四组比较器,原理就是反相输入端Vi—与同相输入端Vi+的电压进行比较,若Vi+大于Vi—则比较器的输出端OUT输出高电平+5V;若Vi+小于Vi—则比较器的输出端OUT输出低电平0V;TCRT5000红外对管工作原理:工作时由蓝色发射管发射红外线,红外线由遮挡物反射回来被接收管接收。

基于51单片机WiFi智能小车制作

基于51单片机WiFi智能小车制作

基于51单片机WiFi智能小车制作基于51单片机WiFi智能小车制作一、基本原理51单片机WiFi智能小车是利用PC或手机作为控制端,通过手机连接wifi模块(路由器)以获得wifi信号,同时车载也连接wifi模块以获得和手机相同的IP地址,实现手机和小车的连接,然后利用PC或手机上的控制软件以wifi网络信号为载体发送相关信号,wifi模块接收PC 或手机端发送来的相关信号并分析转换成TTL 电平信号,然后发送给单片机,单片机接收到的电平信号处理、分析、计算,转化成控制指令并发送给电机驱动模块以实现小车的前进、后退、左拐、右拐等功能。

二、购买所需材料了解51单片机WiFi智能小车基本原理后,需要购买所需材料进行制作。

下面列出所需制作材料:序号材料备注图例6 小车底盘7 摄像头 根据固件支持摄像头购买8 电源根据自己需要购买种类9 杜邦线及小配件制作所需工具:序号工具名备注图例称1 电烙铁一套 包括松香焊锡2 螺丝刀 平口、十字等3 微型电钻 可以自制4手工刀5 剪刀6 万用表7 热熔胶枪或快干胶8US B下载器三、开始制作1、制作流程开始制作前,我们首先需要看购买路由器的型号,笔者采用的是703n 路由器,所以需要引出ttl 线。

总体步骤为:路由器引TTL 线→路由器刷OpenWrt 固件→制作51单片机最小系统→下载下位机程序到51单片机→安装上位机程序至PC 或手机→测试上、下位机通信→组装→调试完成。

2、路由器引ttl线首先打开703n路由器,按照下图标示位置焊接ttl线。

注意:1、焊接的时候要小心焊接,焊好后微拉下查看松紧2、焊接最好采用软线焊接,防止意外整块拉掉焊点3、焊好后一定用胶固定,最好采用热熔胶下图为引好ttl线样子3 刷OpenWrt固件何为OpenWrt固件,OpenWrt可以被描述为一个嵌入式的Linux 发行版,(主流路由器固件有dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的,静态的系统。

智能小车方案

智能小车方案

智能小车寻迹与避障方案总体方案:整个电路系统分为寻迹检测、避障检测、控制、驱动四个模块。

首先利用检测模块对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。

检测模块:在该模块中包括有速度信息检测和位置信息检测两个子模块,分别检测小车当前的位置信息和速度信息,并将检测到的信息传给MCU,其核心是传感器。

控制模块:控制模块包括信息处理和控制,其核心是MCU,MCU接收到检测来的信号,对信号进行处理后作出判断,并发出控制命令。

驱动模块:该模块包括了驱动电机,当接收到MCU的命令后便执行相应的操作,同时检测模块又检测到电机的状态信息,反馈给MCU 。

从而整个系统构成一个闭环系统,在运行过程中,系统自动调节而达到正确行驶的目的。

智能小车寻迹与避障系统框图一.方案论证与选择1.1小车方案方案一:三轮智能小车。

三轮智能小车的结构简单,易于操作,前轮的方向由舵机控制。

但该方案的缺点也十分明显,在小车在行驶过程中的稳定性不足,并且行驶速度过慢。

方案二:四轮智能小车。

四轮智能小车相对于三轮智能小车在结构上更为复杂,但其稳定性得到明显加强。

两个电机分别控制小车的两个后轮,驱动小车前进。

同时四轮小车在转弯的控制性上更好。

综合以上信息,在本次试验中,四轮驱动小车的性能更为优越,也更符合设计的目的和要求。

所以此次智能小车方案选择四轮小车作为小车模型。

1.2电源管理模块方案一:三端固定输出电压式稳压电源L7805:运用其器件内部电路来实现过压保护、过流保护、过热保护,这使它的性能很稳定。

能够实现1A以上的输出电流器件具有良好的温度系数。

L7805有多种电压输出值5V~24V,因此它的应用范围很广泛,可以运用本地调节来消除噪声影响,解决了与单点调节相关的分散问题,输出电压误差精度分为±3%和±5%。

而且它的价格低廉。

方案二:LM1117是一个低压差电压调节器系列。

智能小车源代码

智能小车源代码

include<>include <>xe”软件上(de)数据设置/define leftdata 0x11define rightdata 0x22define forwarddata 0x33define backdata 0x44define stopdata 0x55define uchar unsigned chardefine uint unsigned intunsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration();/电机端口定义/sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转/无线遥控模块定义/sbit Key_A = P2^0; //B键信号端对应D0sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2sbit Key_D = P2^3; //C键信号端void delay0(int a);void delay15us(void);void delay1ms(int z);void di(); //蜂鸣器函数声明unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离(de)值char flag =0; //量程溢出标志位char f1,f2,f3,f4,n0;int a;int n;//运行次数判断标志int s_left,s_right;void Delay10us(unsigned char i){unsigned char j;do{j = 10;do{_nop_();}while(--j);}while(--i);}///电机程序/ //void loop(){IN1=1; //左电机IN2=0;IN3=1; //右电机IN4=0;}void runfront(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车后退函数void runback(){IN1=0; //左电机 IN2=1;IN3=1; //右电机 IN4=0;}//小车左转void runleft(){IN1=0; //左电机 IN2=0;IN3=0; //右电机 IN4=1;}//小车右转void runright(){IN1=1; //左电机 IN2=0;IN3=0; //右电机 IN4=0;}////小车左后转//void runbackleft() //{// IN1=0; //左电机// IN2=0;// IN3=0; //右电机// IN4=1;//}////小车右后转//void runbackright() //{// IN1=1; //左电机// IN2=0;// IN3=0; //右电机// IN4=0;//}//小车停止函数void stop(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=0;}///蓝牙程序///void delay(unsigned int a){unsigned int b;for(;a>0;a--)for(b=3;b>0;b--);}//左电机转void left_motor_runfront(unsigned int a) {IN1=1; //左电机IN2=0;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_runfront(unsigned int a){IN3=0; //右电机IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_back(unsigned int a) {IN1=0; //左电机IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_back(unsigned int a) {IN3=1; //右电机IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_stop(){IN1=0; //左电机IN2=0;}void right_motor_stop(){IN3=0; //左电机IN4=0;}//PWM调速void PWM_RUNFRONT(unsigned int a,unsigned int b) //a属于0~100{left_motor_runfront(a);right_motor_runfront(b);}void PWM_RUNBACK(unsigned int a,unsigned int b) //a属于0~100{left_motor_back(a);right_motor_back(b);}void PWM_RUNLEFT(unsigned int a) //a属于0~100{right_motor_runfront(a);left_motor_stop();}void PWM_RUNRIGHT(unsigned int a) //a属于0~100{right_motor_stop();left_motor_runfront(a);}void bluestop(){left_motor_stop() ;right_motor_stop() ;}void UsartConfiguration(){SCON=0X50; //设置为工作方式1TMOD=TMOD|0x21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XFA; //计数器初始值设置,注意波特率是4800(de) TL1=0XFA;ES=1; //打开接收中断EA=1; //打开总中断TR1=1;TH0=0;TL0=0;ET0=1; //打开计数器}/函数名 :Delay(unsigned int i)函数功能 : 延时函数输入 : 无输出 : 无void Usart() interrupt 4{receiveData=SBUF;//出去接收到(de)数据RI = 0;//清除接收中断标志位if(receiveData==0x66){low_velosity=1;high_velosity=0;// write_com(0x80);}if(receiveData==0x77){low_velosity=0;high_velosity=1;}}///舵机程序/void delayx(int t){char j;for(;t>0;t--)for(j=19;j>0;j--);}void degree0(){int i;for(i=0;i<10;i++){PWM=1;delayx(10);//1msPWM=0;delayx(390);//19ms }}void degree90(){int i;for(i=0;i<10;i++)PWM=1;delayx(24);//50PWM=0;delayx(376);//}}void degree180(){int i;for(i=0;i<15;i++){PWM=1;delayx(40);//PWM=0;delayx(360);//}}///超声波程序/ ///A键被按下后,前进/void Count1(void){time=TH1256+TL1;TH1=0;TL1=0;S=(time/100;n++;if(S<=30&&n==1){led1=0;stop();degree0();di();}if(S>30&&n==1){led1=1;runfront();n=0;}if(n==2){s_left=S;degree180();di();}if(n==3){s_right=S;degree90();di();n=0; //标志位清零if(s_left>s_right){led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delayx(1250);}else{led3=1;delay(800);led3=0;delay(500);runleft();delayx(1250);}}}/超声波高电平脉冲宽度计算程序/void Timer_Count(void){TR1=1; //开启计数while(RX); //当RX为1计数并等待TR1=0; //关闭计数//Count1(); //计算}//void StartModule() //启动模块{TX=1; //启动一次模块 Delay10us(2);TX=0;}///主程序///void main(void){UsartConfiguration();while(1){if(k1==0&&n0==0){delay1ms(20);if(k1==0){n0++;}}else if(k1==0&&n0==1){delay1ms(20);if(k1==0){n0--;}if(n0==0){if(Key_B==0&&Key_D==0&&Key_C==0&&Key_A==1) //A键被按下{f1=1;f2=0;f3=0;f4=0;di();}else if(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下{f1=0;f2=1;f3=0;f4=0;di();}else if(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下{f1=0;f2=0;f3=1;f4=0;di();}else if(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下{f1=0;f2=0;f3=0;f4=1;di();if(f1){StartModule();for(a=951;a>0;a--){if(RX==1){Timer_Count();Count1();}}}if(f2){runback();}if(f3){loop();}if(f4){stop();}}if(n0==1){if(low_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(30); break;case rightdata: PWM_RUNRIGHT(30); break;case forwarddata: PWM_RUNFRONT(64,70); break;case backdata: PWM_RUNBACK(64,70); break;case stopdata: bluestop(); break;}}if(high_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(50); break;case rightdata: PWM_RUNRIGHT(50); break;case forwarddata: PWM_RUNFRONT(94,100); break;case backdata: PWM_RUNBACK(94,100); break;case stopdata: stop(); break;}}}}}/蜂鸣器/void di(){int i;for(i=0;i<150;i++){Beep= 1;delay0(20);}Beep=0;}void delay0(int a){char j;int i;for(i=a; i > 0; i--)for(j = 200; j > 0; j--); }void delay1ms(int z) //延时1ms {int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。

智能小车控制系统设计实现

智能小车控制系统设计实现

关键词:智能小车;控制系统;设计和实现1智能小车控制系统概述智能小车控制系统是一个综合、复杂的系统,其既有多种技术,也含有嵌入式的软件设备和硬件设备、图像识别、自动控制和电力传动、机械结构等技术知识,智能小车的控制系统主要是围绕嵌入式控制系统进行的,将其作为操控的中心,并借助计算机系统,最终完成自动造作和控制的过程[1]。

智能小车的控制系统流程图见图1所示。

2智能小车的设计和实现2.1智能小车的硬件设计硬件设计是保证智能小车平稳运行的必要条件,它关系着控制系统的精度和稳定性,因此在设计时需要用在模块化设计思想,该研究是通过采取硬件系统K60芯片作为核心控制器,并通过图像采集模块和电机、舵机驱动模块、测速模块、电源模块等组成硬件设计系统图,见图2。

首先,电源电路设计,该设计时智能小车的动力来源,为小车运行提供不断的电力,一般采取7.3V、容量为2000mAh的可充电型的镍铬电池作为电源,但是其不能直接为控制器传输电力,需要在转变电路后才可以进行传输。

转变电路可以保证控制器直接对电池内的电压进行调节,保证不同模块可以正常工作和运行,智能小车主要是依靠控制电力和电机驱动进行转变的。

其次是K60最小系统板,在设计时需要将K60的管脚部分做成最小系统的单独电路板,这样可以简化电路板的设计,促使调试更加顺利,K60系统板主要由K60芯片、复位电路、时钟电路、JTAG下载电路、电源滤波电路组成。

再其次是电机驱动电路,该电路是在集成芯片的驱动下进行的,可以为控制器更其他模块提供较大的电流最终集成电机驱动芯片,但是要特别注意这部分因为在电机驱动过程中有较大的分功率,会导致小车在进行调试时因为过大的电流导致小车电路发生堵塞现象,而使小车电路被烧毁,因此需要设计者避免这种现象,可以将驱动电路做成驱动板[2]。

最后是舵机接口电路。

在智能小车设计中,舵机主要保证小车可以顺利转向,因此舵机的运行电压、转向动作、转向速度都是需要考虑的因素,一般选择舵机时主要选择Futaba3010,选择供电电压为6V。

详解自动驾驶安全软件开发流程

详解自动驾驶安全软件开发流程

1 引言自动驾驶汽车开发越来越重视性能、质量和性价比,自动驾驶口碑成为新技术应用取得市场成功的关键,而口碑的建立依赖于相关软件开发流程、周期、时间和质量。

一家汽车企业只有拥有或者其软件开发供应商具有成熟的软件开发团队、软件开发流程、可复用的软件流程资源库,才能在日益激烈的自动驾驶产业竞争中获得一席之地。

目前,国际上应用于汽车行业的软件开发成熟度评估标准主要有能力成熟度模型集成(Capability Ma⁃turity Model IntegraTIon,CMMI)和汽车软件过程改进及能力评定模型框架(AutomoTIve Software Process Im⁃provement and Capacity DeterminaTIon,ASPICE)。

CMMI拥有全球公认的软件、产品和系统开发优良实践过程改进模型,能够帮助组织提升绩效,具有普适性,而ASPICE标准基于软件过程评估国际标准ISO15504,主要针对汽车行业软件开发过程框架,是现今汽车企业主要依据的过程评估标准。

与典型传统软件开发过程,例如线性瀑布模型相比,以V开发模式为导向的ASPICE软件过程域,从客户需求、系统架构、软件需求、软件架构、软件详细设计、单元构建到测试验证之间都存在一致性与双向追溯性关系,从最初的系统需求分析开始,测试人员就参与进行对应验证标准的设计,将设计和测试在项目开始初期就关联起来,在整个软件开发生命周期都有着重要的指导意义。

传统软件开发重视业务过程和文档,若软件开发人员完全按照设计文档进行程序开发,经过很长的开发周期后提交软件程序,会导致早期错误可能要等到开发过程后期才能发现,风险与修正成本不可控制。

敏捷软件开发模式强调沟通,通过各子项目的集成和运行,构建成上层软件项目,软件开发成员拥有充分的自主权,可自行寻找最佳工作方式完成工作,不必拘泥于设计文档。

开发过程循环迭代,开发人员针对前期需求,尽可能早地提交一个完整可独立运行的源程序,供测试验证,发现问题后提出需求变更请求,开发人员再次按照新需求开发并提交源程序,如此循环直至软件从整体构架至各个细节完全符合需求,从而实现完美的人机结合。

Arduino技术智能小车设计论文

Arduino技术智能小车设计论文

Arduino技术智能小车设计论文摘要:目前,研究Arduino人越来越多,众多技术爱好者都希望能亲手设计一个智能小车,智能小车的设计应该包括硬件设计和软件设计两部分,在硬件设计部分包括电源模块、单片机系统、循迹模块、鸵机转向模块、后轮电机驱动模块等内容,在软件设计部分包括PWM设计、舵机控制、后轮电机控制、主程序设计等几部分。

1 Arduino及智能小车的基本概念Arduino源于意大利的一位教授的研究,它一个开源的单板机控制器,向所有人开放其源代码、软硬件平台和开发环境,目前有大量的学者使用这一平台进行研究。

我们所说的智能小车应该区别于普通的遥控汽车和玩具,它应该具有环境的感知能力,通过各种传感器采集环境信息并做出相应反应,能按要求自动行驶,不需要人工操纵和干预。

2 智能小车车体结构设计智能小车首先应该确定小车的基本结构,其主要包括以下几个部分:(1)循迹模块:指小车利用红外发射装置发射红外线后,照射物体表面返回量的多少来测定小车的具体的位置,以进行循迹。

(2)舵机转向模块:指通过设置一定占空比的方波来控制舵机转过的角度,舵机由于力矩大,响应速度快等优点,经常使用在自动小车转向装置中。

(3)电机驱动模块:指通过专用电路对电机进行驱动,单片机给出控制信号控制电机正常运转。

(4)单片机模块:这是小车的控制中心,为设计方便,文章使用51单片机。

(5)电源模块:因设计需要,我们给小车单独供电,设置独立的电源模块,使之稳定运行。

3 硬件设计3.1 电源模块设计小车电源是整个系统稳定工作的前提,所以因此电源设计合理,小车电池电压要求在6-8V左右,在考虑电池损耗和稳压的情况下,我们采用低压差的稳压芯片。

同时为防止大电流器件对单片机形成的干扰,大电流器件和单片机要分开供电。

3.2 单片机系统设计单片机是小车的控制中心,设计一个小巧单片机系统是智能小车平稳运行重要保证,在设计单片机系统时需要合理考虑调试扩展的需要,原则上要把所有IO口引出,合理集成LED显示、蜂鸣器等外围模块。

智能小车程序(完整)

智能小车程序(完整)

智能小车程序---------超长完整版---------#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type) {unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++){P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}。

智能小车用灭火模块设计方案

智能小车用灭火模块设计方案

智能小车灭火模块设计方案包括电路原理图、实物图、器件表以及参考程序源代码灭火模块PCB图正面灭火模块PCB图背面灭火模块器件(BOM)表实物图直插封装直插直插直插PIN2.54mmPIN2.54mm直插直插封装表贴灭火模块用到的电机灭火模块用到的扇叶灭火模块实物图灭火模块电路板正面灭火模块电路板背面智能小车循迹灭火实验参考程序源代码/*************************智能小车循迹灭火**************************开发环境:KEIL。

处理器:STC89C52RC,晶振频率:11.0592M。

该实验需要用到循迹模块、灭火模块和火焰传感器。

*******************************************************************/#include <reg51.h> //包含51系统头文件#include "car.h" //包含zncar.h智能小车头文件unsigned char pwmval_left = 0; //变量定义unsigned char pwmval_right = 0;unsigned char pwmval_left_init = 6;//左电机占空比调节,调节值在0到20之间,调节此值可调节小车速度。

unsigned char pwmval_right_init = 6;//右电机占空比调节,调节值在0到20之间,调节此值可调节小车速度。

bit right_pwm = 1; //右电机PWM开关,为1时打开bit left_pwm = 1; //左电机PWM开关,为1时打开/***************************延时函数*******************************/void delay(int In,int Out) //定义延时函数{int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/***********************智能小车控制函数***************************/void forward(void) //智能小车前进{IN1=1;IN2=0; //左车轮的正转IN3=1;IN4=0; //右车轮的正转}void left_turn(void) //智能小车左转{IN1=1;IN2=0; //左车轮停转IN3=0;IN4=0; //右车轮正转}void right_turn(void) //智能小车右转{IN1=0;IN2=0; //左车论的正转IN3=1;IN4=0; //右车轮停转}void stop(void) //智能小车停车{IN1=0;IN2=0; //左电机不动IN3=0;IN4=0; //右电机正转}/***********************智能小车PWM调速函数************************/ void left_moto(void){if(left_pwm){if(pwmval_left<=pwmval_left_init){EN1=1;}else{EN1=0;}if(pwmval_left>=20){pwmval_left=0;}}else{EN1=0;}}void right_moto(void){if(right_pwm){if(pwmval_right<=pwmval_right_init){EN2=1;}else{EN2=0;}if(pwmval_right>=20){pwmval_right=0;}}else{EN2=0;}}/***************************按键扫描函数****************************/void keyscan(void) //按键扫描函数{loop:if(SWITCH_S5 == 0) //判断是否有按下信号{delay(5,10); //延时10msif(SWITCH_S5 == 0) //再次判断是否按下{BEEP_IO = 0; //蜂鸣器响while(SWITCH_S5 == 0); //判断是否松开按键BEEP_IO = 1; //蜂鸣器停止}else{goto loop;} //跳转到loop重新检测}else{goto loop;} //跳转到loop重新检测}/************************定时器0初始化函数*************************/void timer_init(){TMOD=0x01;TH0=0xfc;TL0=0x66; //1ms定时TR0=1;ET0=1;EA=1; //开器定时器0中断}/******************************主函数******************************/void main(void) //主函数{MH_ctl=1;IN1=0;IN2=0;IN3=0;IN4=0;EN1=0;EN2=0; //关电机keyscan(); //按键启动检测delay(100,1000);BEEP_IO=1;timer_init();while(1) //无限循环{if(HUO == 1){MH_ctl=1;BEEP_IO=1;//有信号为0 没有信号为1if((left_led==0)&&(right_led==0)){forward();} //调用前进函数else if((left_led==1)&&(right_led==1)){forward();}else{if((left_led==1)&&(right_led==0)) //左边检测到黑线{delay(2,2);if((left_led==1)&&(right_led==0)){left_turn();} //左边检测到黑线,小车左转}if((right_led==1)&&(left_led==0)) //右边检测到黑线{delay(2,2);if((right_led==1)&&(left_led==0)){right_turn();} //右边检测到黑线,小车右转 }}}else{loop:stop();MH_ctl=0;BEEP_IO=0;delay(500,1000);if(HUO==0){goto loop;}}}}/***********************定时器0中断处理函数***********************/void timer0()interrupt 1 using 2{TH0=0xfc;TL0=0x66; //1Ms定时pwmval_left =pwmval_left +1;pwmval_right=pwmval_right+1;left_moto();right_moto();}。

51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图、电路器件表从控制电路角度划分,智能小车电路板分为核心板和驱动板。

核心板上的处理器的芯片型号是:STC15W4K56S4,这是一款51单片机。

驱动板上有电源电路、电机驱动电路以及一些功能模块接口。

智能小车前进只要控制智能小车四个轮子向前转动就可以了。

智能小车四个轮子由四个直流减速电机驱动。

直流减速电机驱动芯片采用L293D,一片电机驱动芯片L293D可以驱动两个直流减速电机,智能小车用到4个直流减速电机,需要用到两片L293D电机驱动芯片。

但有时候我们需要控制智能小车的速度,不希望智能小车全速前进。

比如在“智能小车循迹实验”中,如果智能小车速度过快,来不及反应做出方向的调整,智能小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。

那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。

智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。

在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。

不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。

这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。

这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。

智能小车PWM调速前进程序如下:首先,定义了2个变量,这2个变量用于设置智能小车的速度。

unsigned char pwmval_left_init=6; //调节此值可以调节小车的速度。

unsigned char pwmval_right_init=6; //调节此值可以调节小车的速度。

通过以下函数初始化定时器0,每1毫秒中断一次。

void Timer0_Init(void) //定时器0初始化{TMOD=0x01;TH0=0xf8;TL0=0xcd;TR0=1;ET0=1;EA=1;}下面我们看定时器0的中断处理函数。

51单片机智能小车

51单片机智能小车

51单片机智能小车51单片机智能小车一、介绍本文档是关于使用51单片机制作智能小车的详细指南。

智能小车是一种能够自主感知周围环境并做出相应行动的。

通过学习本文档,您将了解到如何使用51单片机搭建一个具有基本功能的智能小车。

二、硬件准备1、51单片机开发板2、电机驱动模块3、电源模块4、超声波传感器5、电机6、小车底盘三、电路搭建1、将51单片机开发板和电机驱动模块连接起来,确保电机正常工作。

2、将超声波传感器连接到51单片机开发板上。

3、将电源模块连接到开发板和电机驱动模块上,确保电源供应稳定。

四、程序设计1、编写51单片机的C语言程序,实现小车的基本功能,例如前进、后退、左转、右转等。

2、利用超声波传感器进行障碍物检测,并在检测到障碍物时进行相应的避障行动。

3、可以根据需要添加其他功能,例如跟随线路行驶、遥控操作等。

五、调试与测试1、使用烧录器将程序烧录到51单片机开发板中。

2、将电机驱动模块和超声波传感器连接到开发板后,进行电路的连通测试。

3、使用遥控器或其他方式控制小车的运动,观察小车是否根据预期进行动作。

4、进行避障测试,将障碍物放在小车前方,观察小车是否能够正确避开障碍物。

附件:1、51单片机开发板连接图2、电机驱动模块接线图3、超声波传感器接线图法律名词及注释:1、版权:指著作权法所保护的有关著作权人对其创作作品享有的复制、发表、展览、上演、放映、广播、信息网络传播、出版等权利。

2、专利:指在法律规定的范围内以注册的形式保护发明创造的独占权。

3、商标:指为了区别商品来源而使用,具有识别性、区分性和专用性的标志。

4、法律责任:指根据法律规定,个人或者单位在违反法律规范时应承担的法律后果。

基于AT89C52的智能避障小车设计

基于AT89C52的智能避障小车设计

基于AT89C52的智能避障小车设计全文共四篇示例,供读者参考第一篇示例:基于AT89C52的智能避障小车设计智能小车是一种基于单片机控制的智能移动设备,能够根据周围环境的变化自主地进行导航和避障。

在现代社会,智能小车已经得到广泛的应用,比如在工业生产中的物流运输、家庭服务机器人等领域。

本文将介绍基于AT89C52的智能避障小车的设计方案,并详细解析各个模块的功能和工作原理。

一、硬件设计1.主控模块主控模块选用AT89C52单片机,其具有较强的计算和控制能力,并且易于编程和驱动外部设备。

AT89C52还具有丰富的外设接口,可以方便地与其他传感器和执行器进行连接。

2.传感器模块智能避障小车需要搭载多种传感器,用于感知周围的环境,并做出相应的反应。

一般包括超声波传感器、红外传感器和摄像头等。

超声波传感器可用于探测障碍物的距离,红外传感器可用于检测地面的黑线以进行自动寻迹,摄像头可用于图像识别和路标识别。

3.执行器模块执行器模块包括直流电机、舵机等,用于驱动小车的轮子和转向,实现前进、后退、左转、右转等动作。

4.电源模块智能避障小车需要稳定可靠的电源供应,一般采用锂电池或者干电池进行供电。

二、软件设计1.传感器数据处理传感器模块采集到的数据需要进行处理和分析,以确定当前环境的状态。

比如利用超声波传感器测量到的距离数据,可以计算出周围障碍物的位置和距离。

2.路径规划根据传感器模块采集到的数据,主控模块需要根据预设的算法来规划小车的行驶路径,避开障碍物并找到最优的行驶路线。

3.运动控制执行器模块需要根据路径规划模块给出的指令来控制小车的运动,包括轮子的速度和方向等。

4.用户界面智能小车设计还需要考虑用户界面的设计,一般通过蓝牙或者Wi-Fi模块,将小车的状态和控制权传输到手机App或者PC端,方便用户进行监控和控制。

三、系统整合在完成硬件和软件模块的设计后,还需要对系统进行整合调试。

首先需要进行硬件电路的连接和焊接,然后对软件进行编译和下载,最后将各个模块进行组合测试,验证整个系统的功能和性能。

智能循迹小车详细源代码程序(MSP430,PID)

智能循迹小车详细源代码程序(MSP430,PID)
80 }
81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

由于今年组委会光电管和摄像头分开比赛。

所以传感器部分我们选择了光电管,比赛以小车的速度记成绩,为了让小车更快更稳得跑完全程,传感器的探测距离必须要远,既要有大的前瞻,普通的红外对管由于功率较小,探测距离增大时,干扰严重,所以我们自制了大功率对管,同时采用了程序控制脉冲发光的办法,有效的降低了发热,提高了系统的稳定性。

系统采用采用了7.2V 2000mAh Ni-Cd蓄电池作为系统能源,并且通过稳压电路分出6伏,5伏已分别给舵机和单片机供电。

直流电机驱动模块接收速度控制信号控制驱动电机运行,达到控制车速目的。

转向伺服模块控制舵机转向,进而控制智能车转弯。

速度测量模块实时测量智能车车速,用于系统的车速闭环控制,以精确控制车速。

系统充分使用了MC9S12DG128单片机的外围模块,具体使用到的模块包括:ADC模拟数字转换模块、定时器模块、PWM脉冲宽度调制模块、中断模块、I/O 端口和实时时钟模块等。

系统调试过程中,使用了组委会提供的代码调试环境CodeWarrior IDE,同时使用了清华的Plastid2软件进行了仿真试验。

图1.1 系统结构框图3.1舵机部分为了使转弯更加灵活,对舵机相关部分作了部分改动。

首先,我们将舵机力臂加长85mm。

这样,对于同样的转弯角度值,只需更小的舵机转角,减小了舵机转弯时惯性带来的弊端。

其次,我们将舵机反装,使舵机连杆水平,因为此时舵机提供的力全部用在转弯上。

3.2前轮部分为了增加前轮转弯时的稳定性,对前轮相关部分进行了部分改动。

首先,更改前后垫片的数量,使前轮主销后倾,这样,车轮具有更好的自动回正功能。

其次,更改连杆的长度,使车轮外倾,车轮转弯时,前半部分重心上移,促使赛车转弯更加稳定。

再次,我们通过更改舵机连杆的长度,增加前轮前束,同样增加了前轮的稳定性。

3.3底盘部分为了提高赛车运行时的稳定性,对地盘相关部分作了部分改动。

首先,前轮相关位置加垫片,降低了前轮重心。

其次,更改后轮车轴处的调节块,使后轮重心升高,这样,车身前倾,一定程度上,增加了车的稳定性。

3.4后轮部分首先,更换后轮轮距调节块,使后轮两轮之间间距加大。

这样,车在转弯时不容易产生侧滑。

其次,调节后轮差速,使赛车转弯更加灵活。

4.1电源部分为了能使智能车系统能正常工作,就需要对电池电压调节。

其中,单片机系统、车速传感器电路需要5V电压,路径识别的光电传感器和接收器电路电压工作为5V、伺服电机工作电压范围4.8V到6V(或直接由电池提供),直流电机可以使用7.2V 2000mAh Ni-cd蓄电池直接供电。

考虑到由于驱动电机引起的电压瞬间下降的现象,因此采用低压降的三端稳压器成为必然。

我们在采用lm7805,和lm7806作为稳牙芯片。

经试验电压纹波小,完全可以满足要求。

图4.2 7805电路图图4.3 电源模块示意图稳压电路电机图4.1系统电压调节图 5V对管单片机舵机测速板6V7.2V4.2电机驱动电路电机驱动使用飞思卡尔专用电机驱动芯片MC33886。

驱动电路如图4.4 所示。

为了增大驱动能力,减少单片发热量,电路采用两片MC33886 并联的方案。

系统使用PWM 控制电机转速,充分利用单片机的PWM 模块资源。

电机PWM 频率设定为8KHz。

MC33886芯片的工作电压为5-40V,导通电阻为140毫欧姆,PWM频率小于10KHz,具有短路保护、欠压保护、过温保护等功能。

电机驱动芯片安装在制作的电机驱动PCB板上,在PCB 板设计时,考虑到芯片散热问题,在芯片腹部设计了方型的通孔,实际运行效果表明芯片散热均匀,设计合理。

为了防止电动机突然停止时产生的电磁干扰,在电动机的两端焊接了一个0.1μF 滤波电容。

图4.4 两片MC33886并联使用图4.5 两片MC33886并联使用的实物图在图中可以看到,我们使用PWM23和PWM45作为电机驱动PWM信号,两个PWM通道级联可以使其输出更加精确。

在程序中,我们把PWM值直接转换成了以米/秒为单位的绝对速度,这样使智能车的速度更加直观切易于调试。

4.3测速电路由于考虑到成本需要,我们采用了红外对管和黑白码盘作为测速模块的硬件构成。

其中码盘为32格的黑白相间圆盘,如下图所示:图4.5 码盘红外传感器安装在正对码盘的前方,虽然这样做精度比编码器要低很多,但是成本低廉制作容易,如果智能车速度较快,可以考虑再减少码盘上黑白色条的数量即可。

当圆盘随着齿轮转动时,光电管接收到的反射光强弱交替变化,由此可以得到一系列高低电脉冲。

设置9S12 的ECT 模块,同时捕捉光电管输出的电脉冲的上升沿和下降沿。

通过累计一定时间内的脉冲数,或者记录相邻脉冲的间隔时间,可以得到和速度等价的参数值。

测速电路使用自行研制的红外反射式光电测速传感器。

速度测量电路使用红外反射式光电对管RPR220,自行制作的编码盘,比较电路等组成。

速度测量电路图2.8所示。

红外反射式光电对管的光敏三极管信号通过比较器处理后输入单片机的计数器模块,利用单片机的输入捕捉功能,处理智能车速度信息。

自制的编码盘有24道黑色条纹,电机旋转一周将产生24次输入捕捉中断。

单片机记录两次中断的时间间隔T 。

两次中断对应于智能车前进的距离S 为:16.5/24 cm,即0.6875cm ,其中16.5cm 为智能车后轮实测周长[7]。

智能车实时速度V(cm/s)的计算公式如下:s cm TT T S V /6875.024/5.16===4.4红外对管检测电路由于我们采用了大功率对管,所以红外对管的电路是整个电路中要求最高的,不紧要保证对管正常工作,而且还要考虑整个电路的能耗和发热问题。

经测试我们发现单个对管在通以100mA 到170mA 电流时可以。

保证抬高20到30厘米的距离。

此时每个对管的管压降为1.2到1.5伏。

为了进一步加大发光量,我们采用了双发射管的办法,即一个接受管对应两个发射管。

为了降低整体的能耗。

我们让同一对的发射管串联,14对发射管再并联。

同时使用了irf540进行开关控制。

控制对管脉冲发光。

开关频率为200HZ 。

这样既保证了大前瞻探测的需要,又降低了整体的能耗和对电源的冲击图4.7 先串联再并联的脉冲发光对管电路图。

图4.8对管实物图反面图4.9 对管实物图正面4.5拨码开关电路由于在智能车比赛开始后,不能够对智能车硬件及软件进行修改,在保证了硬件有效可靠的同时,软件有可能不能够适应新场地,所以设计拨码开关对智能车有关参数进行设置也是必要的。

拨码开关电路如下图所示:图4.9 拨码开关这是一个八段的拨码开关,我们把它成成上下连个部分,显然,每个部分都有16种状态,前四个来改变舵机参数,后四个改变直流电机参数,这样对于适应新的场地很有好处。

5.1路径搜索算法对于本控制系统采用14对光电对管的方案,单排排列在车体头部10cm处。

编号为6、7的光电对管处于正中央位置。

利用14对传感器进行道路识别。

传感器对白色的反射率比黑色的大。

单片机ADC读入值相应也大。

在程序中对传感器信号进行处理,判断传感器是否检测到黑色引导线。

将单个传感器对白色和黑色路面的ADC值之差分为平均的两段,每次处理实时传感器信号时,判断本次采样的ADC值与黑色路面ADC值之差落在两段中的哪一段。

如果在靠近黑色的一段,则判定该传感器检测到黑线,将该传感器对应的变量置为判定值1;如果在靠近白色的一段,则判定该传感器检测到白线,将该传感器对应的变量置为判定值1;为了增强判断的准确性,在对ADC值采样时,采用了中值滤波方法,以去除瞬间的干扰。

路径检测完后,将测的的路径值暂时存储,然后将路径信息传递给舵机和电机控制部分,以选择给定合适的转角和速度。

5.2舵机、电机的控制智能车的舵机和电机都采用了经典的PID控制方法。

但是由于舵机和电机性能的不同要求,分别对其进行了不同的修改。

PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。

其输入e (t)与输出u(t)的关系为式中积分的上下限分别是0和t因此它的传递函数为:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+TD*s)其中kp为比例系数;TI为积分时间常数;TD为微分时间常数比例KP用来控制当前,误差值和一个负常数P(表示比例)相乘,然后和预定的值相加。

P只是在控制器的输出和系统的误差成比例的时候成立,KP能够快速的跟随变化量。

及时的产生与之相关的调节作用。

但是KP是有差调节,无法消除静态误差。

积分KI来控制过去,误差值是过去一段时间的误差和,然后乘以一个负常数I,然后和预定值相加。

I从过去的平均误差值来找到系统的输出结果和预定值的平均误差。

一个简单的比例系统会振荡,会在预定值的附近来回变化,因为系统无法消除多余的纠正。

通过加上一个负的平均误差比例值,平均的系统误差值就会总是减少。

所以,最终这个PID回路系统会在预定值定下来。

微分KD 来控制将来, 计算误差的一阶导,并和一个负常数D相乘,最后和预定值相加。

这个导数的控制会对系统的改变作出反应。

导数的结果越大,那么控制系统就对输出结果作出更快速的反应。

这个D参数也是PID被成为可预测的控制器的原因。

D参数对减少控制器短期的改变很有帮助。

一些实际中的速度缓慢的系统可以不需要D参数。

舵机PID由于舵机是一个具有大的延迟的执行机构,所以在PID控制中不能加入积分环节。

否则会导致小车震荡。

所以小车采用PD控制。

同时加入一个一阶惯性环节,构成不完全微分,给小车一个超前的调节。

实际使用中,为了减少计算时间,将位置式PID转化为增量式增量式PID公式:电机PID控制小车行使过程中,随着跑道的不同,需要配合不同的速度值,因此对电机的PID是一个给定值不断变化的PID。

小车的目标速度(Object_Speed)给定规则:1》小车在直道上,Object_Speed为最大值200。

2》小车在大弯道上,Object_Speed为160。

3》小车在小弯道或S型弯道上,Object_Speed为1204》小车冲出跑道,Object_Speed为70。

5》小车由直道进入弯道,Object_Speed逐渐减小。

6》小车由弯道进入直道,Object_Speed逐渐加大。

在实验中发现,PID的超调量主要在第一个波形中起作用,也即单速度由很大到很小的时候,或由低速突然加到高速的过程中,会出现很大的超调。

但是这个超调并不是有害的,因为,当速度要求突变的时候,往往是小车由直道入弯道,或者由弯道入直道的过程,这个过程往往需要很快的大加减速,而由于小车的惯性,一般的PID调节难以满足要求,这时使用大的超调量可以使小车有一个加速或刹车的过程,使之更好的达到要求速度。

6.1 Codewarrior 开发环境在整个开发调试过程中,使用Metrowerks公司为MC9S12 系列专门提供的全套开发工具(Freescale Codewarrior IDE 4.6)。

相关文档
最新文档