避障车电路 加源程序+很详细
- 格式:doc
- 大小:678.32 KB
- 文档页数:35
智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。
智能小车原理图及源程序智能小车避障、圣光报警程序/*用T0计时器中断进行对小车方向的调节用INT0外部中断进行声光报警用INT1外部中断进行超声避障用T1计时器进行对时间的测量*/#include<reg52.h>#include<stdio.h>sbit P00=P1^0; //循迹口sbit P01=P1^1;sbit P02=P1^2;sbit P03=P0^3; //声光信号P03接蜂鸣器,P04接LED sbit P04=P0^4;sbit P20=P2^0; //电机1 左轮sbit P21=P2^1;sbit P22=P2^2; //电机2sbit P23=P2^3;void zhuanxiang(char,char,char);void delay1ms(void);void delaynms(int);unsigned int i=0,j=0; //特殊情况旗标void kongzhi(void) interrupt 1 //PWM信号进行电机控制{if(P00==0&&P01==1&&P02==0) //小车直线快走定时0.02ms{TH0=0X1F;TL0=0XEC;P20=0; //电机1 左轮P21=1;P22=1; //电机2 右转P23=0;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=1; //电机1 左轮P21=1;P22=1; //电机2P23=0;i=1;}if(P00==0&&P01==0&&P02==0&&i==1) // 特别{TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=0;j=0;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;P20=0; //电机1P21=1;P22=1; //电机2P23=1;j=1;}if(P00==0&&P01==0&&P02==0&&j==1) // 特别{TH0=0X1F;TL0=0XCE;P20=0;P21=1;P22=1;P23=1;i=0;}if(P00==1&&P01==1&&P02==1){ //全部检测到黑线时车停TH0=0X1F;TL0=0XCE;P20=1;P21=1;P22=1;P23=1;}}void shengguang(void) interrupt 0 //停车并产生声光2s{unsigned int i,j;P20=1;P21=1;P22=1;P23=1;delaynms(500);for(i=0;i<20;i++){P04=0;for(j=0;j<100;j++){P03=0;delay1ms();P03=~P03;}}P03=1; //关闭声光P04=1;delaynms(500);P20=0;//继续行车P21=1;P22=1;P23=0;}void chaoshengbo(void) interrupt 2 //超声波测距避障程序{}void main(){while(1){P20=1;P21=1;P22=1;P23=1;//小车停P03=1;P04=1;PX0=1;TMOD=0X10;//T0用方式0,T1用方式1EA=1; //开启中断总开关EX0=1;//T0中断EX1=1; //T1中断ET0=1;//INT0中断ET1=1; //INT1中断TR1=1; //开启T1计时器zhuanxiang(P00,P01,P02);}}void zhuanxiang(char P00,char P01,char P02){if(P00==0&&P01==1&&P02==0) // 小车直走{ //0.01msTH0=0X1F;TL0=0XF6;;TR0=1;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.05ms{TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==0&&P02==0) //小车左转定时0.05ms {TH0=0X1F;TL0=0XCE;TR0=1;}if(P00==1&&P01==1&&P02==1) //全部检测到黑线时车停{TH0=0X1F;TL0=0XCE;TR0=1;}}void delay1ms(void){int i;for(i=0;i<120;i++);}void delaynms(int n){int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}诺基亚显示程序:#include <reg51.h>#include <stdio.h>#include<string.h>sbit SCLK = P1^5; // pin 2 header 5sbit SDIN = P1^4; // pin 3 header 4sbit LCD_DC = P1^3; // pin 4 header 3sbit LCD_CE = P1^2; // pin 5 header 2sbit LCD_RST = P1^1; // pin 9 header 1void LCD_init(void);void LCD_clear(void);void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row);void LCD_write_char(unsigned char c);void LCD_write_byte(unsigned char dat, unsigned char dc);void LCD_set_XY(unsigned char X, unsigned char Y);void delay_1us(void);unsigned char font6x8[5][4]={{'a','s','d','f'},{'j','k','f','e'},{'j','y','i','o'},{'t','f','j','g'},{'d','s',' ','g'}}; unsigned char write_chinese[3][1]={{'1'},{'g'},{'h'}};void main(void){LCD_init(); //初始化液晶LCD_clear();while(1){LCD_init();//设置基本功能LCD_clear();//清屏LCD_set_XY(0,0);//设置坐标X:0-83,Y:0-5LCD_write_chinese_string(12,4,12,4,0,5);//写入汉字}}void LCD_init(void){// 产生一个让LCD复位的低电平脉冲LCD_RST = 0;delay_1us();LCD_RST = 1;// 关闭LCDLCD_CE = 0;delay_1us();// 使能LCDLCD_CE = 1;delay_1us();LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式LCD_write_byte(0xc8, 0); // 设置偏置电压LCD_write_byte(0x06, 0); // 温度校正LCD_write_byte(0x13, 0); // 1:48LCD_write_byte(0x20, 0); // 使用基本命令LCD_clear(); // 清屏LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示// 关闭LCDLCD_CE = 0;}void LCD_clear(void) //LCD_clear : LCD清屏函数{unsigned int i;LCD_write_byte(0x0c, 0);LCD_write_byte(0x80, 0);for (i=0; i<504; i++)LCD_write_byte(0, 1);}/* LCD_set_XY : 设置LCD坐标函数输入参数:X :0-83Y :0-5*/void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0); // columnLCD_write_byte(0x80 | X, 0); // row}/*-----------------------------------------------------------------------LCD_write_char : 显示英文字符输入参数:c :显示的字符;*/void LCD_write_char(unsigned char c){unsigned char line;c -= 32;for (line=0; line<6; line++)LCD_write_byte(font6x8[c][line], 1);}/*----------------------------------------LCD_write_chinese_string: 在LCD上显示汉字输入参数:X、Y :显示汉字的起始X、Y坐标;ch_with :汉字点阵的宽度num :显示汉字的个数;line :汉字点阵数组中的起始行数row :汉字显示的行间距例如:LCD_write_chi(0,0,12,7,0,0);-------------------------------------------*/void LCD_write_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,unsigned char num,unsigned char line,unsigned char row){unsigned char i,n;LCD_set_XY(X,Y); //设置初始位置for (i=0;i<num;){for (n=0; n<ch_with*2; n++) //写一个汉字{if (n==ch_with) //写汉字的下半部分{if (i==0) LCD_set_XY(X,Y+1);elseLCD_set_XY((X+(ch_with+row)*i),Y+1);}LCD_write_byte(write_chinese[line+i][n],1);}i++;LCD_set_XY((X+(ch_with+row)*i),Y);}}/*-----------------------------------------------------------------------LCD_write_byte : 使用SPI接口写数据到LCD输入参数:data :写入的数据;command :写数据/命令选择;-----------------------------------------------------------------------*/void LCD_write_byte(unsigned char dat, unsigned char command) {unsigned char i;//PORTB &= ~LCD_CE ; // 使能LCDLCD_CE = 0;if (command == 0)// PORTB &= ~LCD_DC ; // 传送命令LCD_DC = 0;else// PORTB |= LCD_DC ; // 传送数据LCD_DC = 1;for(i=0;i<8;i++){if(dat&0x80)SDIN = 1;elseSDIN = 0;SCLK = 0;dat = dat << 1;SCLK = 1;}// SPDR = data; // 传送数据到SPI寄存器//while ((SPSR & 0x80) == 0); // 等待数据传送完毕//PORTB |= LCD_CE ; // 关闭LCDLCD_CE = 1;}。
武汉理工大学开放性实验报告项目名称:避障小车实验室名称:612-36 创新实验室学生姓名:欧阳飞,张思成,秦淮,潘浩,赵唯时,崔永新创新实验项目报告书反转/ / 低高/ 高停止低低/ / / 高使用D触发器进行边沿检测的传感器电路也是让发光管亮暗交替,但亮的时间很短,电流很大,亮度很高,把接收端门限调的很高,然后用D触发器进行边沿检测。
这样可以屏避外界一般强度光(可以是高频的)的干扰,而耗电不会增加。
但如果使用简单的比较型电路,加大电流就会增大功耗,甚至烧毁发光管。
下图是一个成品光电开关,就是光电管=>两级交流放大=>CD4013检测这种方式的,CD4013的另一个单元D触发器作方波振荡源,通过驱动电路带动LED。
可以看出,LED的限流电阻是20欧,短时间通过LED的电流很大。
红外遥控有发送和接收两个组成部分。
发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。
红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。
为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,周期约26μs) 接收红外信号,它同时对信号进行放大、检波、整形得到TTL 电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。
红外接收头输出的原始遥控数据信号,正好和发射端倒向.也就是以前发射端原始信号是高电平,那接收头输出的就是低电平,反之.三、实验步骤(记录实验流程,提炼关键步骤)1、车体设计2、电源电路3、红外避障模块4、小车程序设计5、避障测试与调试四、实验结果(详细列出实验数据、protel实际电路图和结论分析)1、车体选用本设计采用的小车为履带式车轮,经实验证明,该方式使小车运动平稳,转向灵活,可以绕自身中轴线回转,可以原地转向从而顺利躲避障碍物。
我们设计的履带由驱动轮、承重轮、紧张轮和履带组成。
/*****************循迹避障小车程序*************************************//**********************dragon*************************************/Qufu normal unversity#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar count0 = 0;//低电平的占空比uchar count1 = 0;//高电平的占空比uchar count = 0; //0.1ms 次数标识uchar jd,time; //角度标识uchar yz = 0; //遇障标志uint distance,t;sbit Trig=P3^0; //控制端超声波sbit Echo=P3^2; //接收端sbit pwm = P1^1; //舵机控制信号sbit rclf = P3^6; //循迹红外sbit rcrt = P3^7;sbit jz = P3^5;sbit PWM1=P1^4;//PWM 通道1,反转脉冲sbit PWM2=P1^3;//PWM 通道2,正转脉冲sbit PWM3=P1^6;//PWM 通道3,反转脉冲sbit PWM4=P1^5;//PWM 通道4,正转脉冲/***延时1ms***/void delay(uint x){uchar i,j;for(i=0;i<x;i++)for(j=0;j<110;j++);}/************电机运行**************/void Motor_run(void){PWM1 = 1;if(++count1 < count0){PWM2 = 0;}else{PWM2 = 1;}if(count1 >= 100){count1 = 0;}}/**********************红外探测部分*************************************/void ir_ch(void){if(jz == 1){jd = 14;count0 = 80 ;}if((rclf == 1 && rcrt == 0 && jd == 14) || (rclf == 1 && jz == 1) ){count0 = 70 ;jd = 13;}if((rcrt == 1 && rclf == 0 && jd == 13) || (rcrt == 1 && jz == 1) ){count0 = 90 ;jd = 15;}if((rcrt == 1 && rclf == 0 && jd == 14) || (rcrt == 1 && jz == 1) ){count0 = 90 ;jd = 15;}if((rclf == 1 && rcrt == 0 && jd == 15) || (rclf == 1 && jz == 1) ) {count0 = 90 ;jd= 13;}}/********************* 超声波************//***延时1us***/void delay_us(uchar m ){while(m--);}void ceju(void){Trig=1; //发射置高delay_us(15); //延时10usTrig=0; //发射置低//while(Echo==0); //等待接收端准备接收TR0=1; //启动定时器0//while(Echo==1); //等待接收端接收delay(3); // 等待处理数据}void panduan(void){uint n;if(distance<245){yz = 1;for(n=0;n<7000;n++){jd = 13;Motor_run();}}else{if(yz == 1)jd = 15;yz = 0;}else{ir_ch();}}}/***********定时器1舵机***********/void timer0init(void) // 1初始化{TMOD = 0X19; //定时器1工作1 定时器1工作1TH1 = 0Xff; //高第八位清零TL1 = 0Xa0;TH0=0;TL0=0;EA = 1; //打开全局中断允许位(中断允许寄存器IE)TR1 = 1; //寄存器TCON,置一启动定时器0ET1 = 1; //允许定时器1中断ET0 = 1; //允许定时器1中断IT0=1;//下降沿触发EX0=1;//外部中断0允许中断}/*********主函数********************/void main(void){timer0init(); //定时器1初始化Trig=0;jd = 14;count = 0;delay(10);while(1)ceju();panduan();Motor_run();}}/***外部中断超声波***/void int0() interrupt 0{TR0=0; //关定时器t=TH0*256+TL0;distance=t*0.173;//取346m/sTH0=0;TL0=0;}void Time_Int() interrupt 3{TH1 = 0xff;TL1 = 0xa0;if(count < jd)pwm = 1;elsepwm = 0;count += 1;count = count%200;}。
52单片机循迹避障小车电源电路设计下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!52单片机循迹避障小车电源电路设计概述在设计52单片机循迹避障小车时,电源电路的设计尤为重要。
---------------------------------------------------------------范文最新推荐------------------------------------------------------ 移动机器人的避障实验设计+源程序+流程图摘要:随着科学技术的日益,机器人越来越融入到人们的生活。
近年来,特别是智能机器人的开发与研究引起了很多学者的关注。
其中,机器人的避障问题成为了机器人研究的热点。
传统的避障方法如可视图法、栅格法、自由空间法等算法可以解决障碍物信息己知时的情况。
但在试验条件确定的情况下,很多方法就比较复杂,因此,我根据现有的红外探头进行了简单的避障算法设计。
算法设计出来之后,对小车建立运动学模型,主要分为两块,一个是小车自身的运动学模型,一个是避障算法的建模。
建好之后就编程控制小车的运动,试验得到数据。
5267关键词:移动机器人避障算法运动学红外测距Mobile robot obstacle avoidance test design1 / 22Abstract:With the growing science and technology, robots become more integrated into people's lives.In recent years, in particular the development and research of intelligent robots has aroused the concern of many scholars.Robot obstacle avoidance has become a hot research spot.Traditional obstacle avoidance algorithm such as view method, grid method, free space method can solve obstacle information knownsituation.However, a lot more complicated in the case of the test condition determining.Therefore, in accordance with existing infrared probe I do simple obstacle avoidance algorithm design,Algorithm is designed, the kinematic model is established on the robot, mainly pided into two, one is the kinematic model of the trolley, another is obstacle avoidance algorithm modeling. Modeling programmed to control the movement of the trolley, then get the test data.Key words:Mobile robot, Obstacle avoidance algorithm, Kinematics, Infrared range目录---------------------------------------------------------------范文最新推荐------------------------------------------------------ 目录1绪论41.1引言41.2机器人概述41.3移动机器人国内外发展现状6其中移动机器人的智能避障更是机器人研究领域的研究热点。
1、设计要求小车从无障碍地区启动前进,感应前进路线上的障碍物后,根据障碍物的位置选择下一步行进方向。
并可通过两个独立按键对小车进行控速。
2、小车自动避障的原理小车车头处装有三个光电开关,中间一个光电开关对向正前方,两侧的光电开关向两边各分开30度,(如右图所示)。
小车在行进过程中由光电开关向前方发射出红外线,当红外线遇到障碍物时发生漫反射,反射光被光电开关接收。
小车根据三个光电开关接受信号的情况来判断前方障碍物的分布并做出相应的动作。
光电开关的平均探测距离为30cm。
3、模块方案比较及论证根据设计要求,我们的自动避障小车主要由六个模块构成:车体框架、电源及稳压模块、主控模块、逻辑模块、探测模块、电机驱动模块组成。
各模块分述如下:3.1车体框架在设计车体框架时,我们有两套起始方案,自己制作和直接购买玩具电动车。
方案一:自己设计制作车架自己制作小车底盘,用两个直流减速电机作为主动轮,利用两电机的转速差完成直行、左转、右转、左后转、右后转、倒车等动作。
减速电机扭矩大,转速较慢,易于控制和调速,符合避障小车的要求。
而且自己制作小车框架,可以根据电路板及传感器安装需求设计空间,使得车体美观紧凑。
但自己制作小车设计制作周期较长,且费用较高,因而我们放弃这一方案。
方案二:购买玩具电动车玩具电动车价格低廉,有完整的驱动、传动和控制单元,其中传动装置是我们所需的,缩短了开发周期。
但玩具电动车采用普通直流电机驱动,带负载能力差,调速方面对程序要求较高。
同时,玩具电动车转向依靠前轮电机带动前轮转向完成,精度低。
考虑到利用玩具电动小车做车架开发周期短,可留够充分的时间用于系统调试,且硬件上的不足我们有信心用优良的算法来弥补,故我们选择方案二。
3.2电源及稳压模块方案一:采用交流电经直流稳压处理后供电采用交流电提供直流稳压电源,电流驱动能力及电压稳定性最好,且负载对电源影响也最小。
但由于需要电线对小车供电,极大影响了壁障小车行动的灵活性及地形的适应能力。
DIY智能循迹避障小车百分百成功DIY,跟着步骤就可以制作出属于自己的智能循迹避障小车,培养动手能力,感受科技制作的乐趣。
坚持,坚持,再坚持。
后面有源程序代码。
第一,准备好硬件:温馨提醒一下,这些看上去很多,但准备的时候花不了多少钱,放心就行,有很多以后还可以家用。
模块准备:1.51单片机 40P锁紧座小型系统板1个(带四组外接电源接其他模块用)。
2.STC89C52R单片机1个。
3.L9110S四路驱动直流电机驱动板1个。
4.DC3V-6V直流减速电机加轮胎一套的4套。
5.HY-SRF05五针超声波模块1个。
6.循迹模块2个。
7.四节电池盒1个,三节电池盒1个。
8.南孚5号电池7节。
9.CH340下载器模块1个。
车体及其他材料准备:10.双母头杜邦线一排(40根)。
11.1米长2×2cm木条1根。
12.尼龙扎带(越长越好)至少8根(买一袋最好,以后还用得到),用来固定减速电机。
13. 5.5*2.1MM DC电源线1根。
14.循迹黑胶带1卷(也可在家中找找黑色的布条)。
15.木锯1个。
16.白乳胶1小瓶,用来粘木条。
17.小木板或硬纸板1张。
18.小螺丝刀1个。
19.小刀1个。
20.绝缘胶带1卷。
21.2mm小木棒一捆。
22.(选买)有条件的可以准备热熔胶枪加胶棒,用来将减速电机粘到木条上,结合扎带使用更加结实。
第二,开始制作:1、制作车体:将木条锯成9cm长,5cm款各两个,首先在长木条上利用尼龙扎带将电机固定,并利用白乳胶将四段粘合成车体,需要等至少12个小时才能凝固好,车体结实后装上轮胎,再将木板粘到车上。
如图:2、模块连接:电机与电机驱动模块连接图:“上”为贴近木条端模块之间连接图:用杜邦线与单片机系统板连接,P??为针名。
DC电源线连接电池盒与系统板实物图:以下为模块在小车上的摆放位置,仅供参考。
第三、下载程序(此步可第一步就操作)图中蓝线接P30,黄线接P31,绿线接地线。
系统采用采用了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电路图电池(7.2v ) 2000mAh Ni-cd稳压电路电机图4.1系统电压调节图 5V对管单片机舵机测速板6V7.2V图4.3 电源模块示意图4.2电机驱动电路电机驱动使用飞思卡尔专用电机驱动芯片MC33886。
驱动电路如图4.4 所示。
为了增大驱动能力,减少单片发热量,电路采用两片MC33886 并联的方案。
系统使用PWM 控制电机转速,充分利用单片机的PWM 模块资源。
电机PWM 频率设定为8KHz。
MC33886芯片的工作电压为5-40V,导通电阻为140毫欧姆,PWM频率小于10KHz,具有短路保护、欠压保护、过温保护等功能。
电机驱动芯片安装在制作的电机驱动PCB板上,在PCB 板设计时,考虑到芯片散热问题,在芯片腹部设计了方型的通孔,实际运行效果表明芯片散热均匀,设计合理。
为了防止电动机突然停止时产生的电磁干扰,在电动机的两端焊接了一个0.1μF 滤波电容。
AGND 1FS2IN13V+4V+5OUT16OUT17DNC 8PGND 9PGND 10PGND 11PGND 12D213OUT214OUT215V+16Ccp 17D118IN219DNC 20U3MC33886AGND 1FS2IN13V+4V+5OUT16OUT17DNC 8PGND 9PGND 10PGND 11PGND 12D213OUT214OUT215V+16Ccp 17D118IN219DNC 20U5MC338861.3KR4Res21.3KR7Res247pFC12Cap 47pFC14Cap VCCPWM5PWM312P14Header 2DS2LED21KR5Res2231S2SW-SPDT+7.2V1KR10Res21KR15Res2图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===300VCC33K32184ALM35810K5.1K VCCVCC 5.1KIOC0RPR220图4.6测速电路4.4红外对管检测电路由于我们采用了大功率对管,所以红外对管的电路是整个电路中要求最高的,不紧要保证对管正常工作,而且还要考虑整个电路的能耗和发热问题。
经测试我们发现单个对管在通以100mA到170mA电流时可以。
保证抬高20到30厘米的距离。
此时每个对管的管压降为1.2到1.5伏。
为了进一步加大发光量,我们采用了双发射管的办法,即一个接受管对应两个发射管。
为了降低整体的能耗。
我们让同一对的发射管串联,14对发射管再并联。
同时使用了irf540进行开关控制。
控制对管脉冲发光。
开关频率为200HZ。
这样既保证了大前瞻探测的需要,又降低了整体的能耗和对电源的冲击图4.7 先串联再并联的脉冲发光对管电路图。
图4.8对管实物图反面图4.9 对管实物图正面4.5拨码开关电路由于在智能车比赛开始后,不能够对智能车硬件及软件进行修改,在保证了硬件有效可靠的同时,软件有可能不能够适应新场地,所以设计拨码开关对智能车有关参数进行设置也是必要的。
拨码开关电路如下图所示:12345678161514131211109S1SW-DIP8123456789R1Header 9VCC SW0SW1SW2SW3SW4SW5SW6SW7图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。