C题—智能小车
- 格式:doc
- 大小:298.00 KB
- 文档页数:14
电子设计大赛C题——只能小车智能小车摘要本智能小车以MSP超低功耗单片机系列MSP430F149为核心,完成在规定场地内实现两车交替超车领跑的功能。
在机械结构上,本智能小车选取大功率RP5坦克车体,具有动力性能强、底盘稳定性高、可原地转圈、转弯灵活等特点。
选用L298N驱动芯片控制电机,反射式红外发射-接受器作为黑线检测模块的传感器,nRF905作为无线通信模块,组成智能小车系统。
基于可靠的硬件设计和稳定的软件算法,实现题目要求,而且附加实现显示两车距离、行驶时间等扩展功能。
关键词:MSP430;检测黑线;超车;智能小车。
一、系统方案1、总体方案描述本系统以MSP超低功耗单片机系列MSP430F149为核心,由12V电池供电,选用L298N驱动芯片控制直流电机,反射式红外发射-接受器ST168作为黑线检测模块的传感器,NewMsg_RF905作为无线通信模块,LCD液晶显示模块作为显示模块,组成智能小车系统,如图1所示。
图1 总体系统框图2、方案设计与比较(1)电机驱动模块方案一:采用大功率三极管,二极管,电阻,电容等元件。
采用上述元件搭建两个H桥,通过对各路信号放大来驱动电机,原理简单。
但由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,很难精确控制。
方案二:采用L298N驱动芯片。
L298N芯片是较常用的电机驱动芯片。
该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性能,可用单片机的I/O口提供信号。
其优点是集成度高,电路简单,控制方便可靠,体积小,效率高,具有较高的性价比。
综合分析:方案一虽然原理简单,但是实际操作性不大,运行不稳定,而方案二则具有电路简单,控制方便,效率高等多处优点,符合本系统要求,因此选用L298N驱动芯片作为电机驱动模块。
(2)黑线检测模块方案一:采用可见光发光二极管和光敏二极管采用普通可见光发光管和光敏管组成的发射-接收电路。
其缺点在于易受到环境光源的影响,即便提高发光管亮度也难以抵抗外界光的干扰。
/*-----------------------------------------------------------------------------小车运行主程序---------------------------------------------------------------------------简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。
这样小车便可在其上循迹运行。
@补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。
程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。
编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件2.假定:遇到白线输出0,遇到黑线输出1;如果实际电路是:遇到白线输出1,遇到黑线输出0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。
3.说明1:直行---------------速度full_speed_left,full_speed_right.转弯,调头速度------correct_speed_left,correct_speed_right.微小校正时---------高速轮full_speed_left,full_speed_right;低速轮correct_speed.可以通过调节第六,七,八,九,十条程序,改变各个状态下的占空比(Duty cycle ),以求达到合适的转弯,直行速度4.lenth----------length检测到黑线到启动转动的时间间隔5.width----------mid3在黑线上到脱离黑线的时间差6.mid3-----------作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7.check_right----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延----------------------------------------------------------------------------------------------------------------*/#include<STC12C5A60S2.h>#define uchar unsigned char#define uint unsigned int#define m0 1//黑线m1,白线m0#define m1 0#define full_speed_left 40 //方便调节各个状态的占空比,可用参数组:(30,35,6,25,30,68000,27000,500);#define full_speed_right 45 //(40,45,6,25,30,68000,27000,500);#define correct_speed 6 //校正时的低速轮的占空比#define turn_speed_left 25#define turn_speed_right 30#define lenth 68000 //测试数据:10000--》100--》500--》2000--80000--76000--68000 #define width 27000 //500--》10-->2000--》60000--30000---》27000#define check_right 500 //2000--》20--》200--》500#define midl left1#define midr right5uchar Duty_left,Duty_right,i=0,j=0; //左右占空比标志,取1--100sbit IN1=P2^0;sbit IN2=P2^1;sbit IN3=P2^2;sbit IN4=P2^3;sbit ENA=P1^0;sbit ENB=P1^1;//循迹口五组红外对管,依次对应从左往右第1,2,3,4,5五组sbit left1 =P1^6;sbit left2 =P1^5;sbit mid3 =P1^4;sbit right4=P1^3;sbit right5=P1^2;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;TMOD|=0x01;TH0=(65536-66)/256;TL0=(65536-66)%256;EA=1;ET0=1;TR0=1;ENA=1; //使能端口,初始化ENB=1;}//--------------------------------------------void time0(void)interrupt 1 //中断程序{i++; //调速在中断中执行j++;if(i<=Duty_left)ENA=1;else ENA=0;if(i>100){ENA=1;i=0;}if(j<=Duty_right)ENB=1;else ENB=0;if(j>100){ENB=1;j=0;}TH0=(65536-66)/256; //取约150HZ,12M晶振,每次定时66us,分100次,这样开头定义的变量正好直接表示占空比的数值TL0=(65536-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;IN1=1;IN2=0;IN3=1;IN4=0;}//--------------------------------------------------void turn_left()//左转,赋值{Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=0; //转弯时一个正转,一个反转,IN2=1;IN3=1;IN4=0;}//---------------------------------------------------void turn_right()//右转,赋值{Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=1; //转弯时一个正转,一个反转,IN2=0;IN3=0;IN4=1;}//-----------------------------------------------------void straight() //直走,赋值{Duty_left =full_speed_left; //左右电机占空比初始化,调节直线运动速度Duty_right=full_speed_right; //鉴于左右轮电机内部阻力不同,故占空比取不同值,这组值需要单独写程序取值IN1=1;IN2=0;IN3=1;IN4=0;}//-----------------------------------------------------void line_straight()reentrant //函数名后加reentrant可以递归调用,//一直走黑直线时{straight();if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1) //防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(left2==m1){correct_left();if(right5==m1){line_right();goto label3;}else if(left1==m1){line_left();goto label3;}}elseif(right4==m1) //防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(right4==m1){correct_right();if(right5==m1){ line_right(); goto label3;}else if(left1==m1){line_left();goto label3;}}elseif((left1==m0)&&(left2==m0)&&(mid3==m0)&&(right4==m0)&&(right5==m0)){straight();//delay(lenth);while(right4==m0) //本来应该是用mid3,但是为了提高灵敏度,选择right4;向左时,可取left2对管{turn_right();}if(mid3==m1){line_straight();}}label3: ; //什么都不做}//------------------------------------------------------------------------- void line_right() //右边有黑线时{straight();//这里的直走是在不管红外检测结果的直行delay(lenth);if(mid3==m1){turn_right();//执行向右转的赋值label:delay(width); //由width值决定转弯时mid3经过黑线宽度时所需要的时间 if(mid3==m0)while(right4==m0){}elsegoto label;}elseif(mid3==m0){turn_right();while(right4==m0){}if(midr==m1){line_straight();}}}//-----------------------------------------------------------------void line_left() //左边出现黑线时{while(left1==m1){if(right5==m1){line_right();goto label2;}}delay(check_right);//左边遇到黑线时,左边出了黑线之后,继续延时一段时间,判断右边是否遇到黑线,//若遇到黑线,执行line_right()函数if(right5==m1){line_right();goto label2;}if((mid3==m1)||(left2==m1)||(right4==m1)){line_straight();}else{while(left2==m0){turn_left();}if(midl==m1)line_straight();}label2: ;}//--------------------------------------------------------------------void detect_infrared() //循迹,红外检测{if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1){correct_left();}elseif(right4==m1){correct_right();}elseline_straight();}//--------------------------------------void main(void)//主程序部分{init();while(1) //循环检测红外对管采集的电平信号{detect_infrared();}}。
目录摘要 (3)1.设计任务及规定 (4)1.1设计任务 (4)1.2设计规定 (4)2.系统方案 (5)2.1控制模块旳论证与选择 (5)2.2电源模块旳论证与选择 (5)2.3小车车体旳论证与选择 (6)2.4电机模块旳论证与选择 (6)2.5电机驱动模块旳论证与选择 (6)2.6寻迹模块旳论证与选择 (7)2.7避障模块旳论证与选择 (7)2.8显示模块旳论证与选择 (7)2.9按键模块旳论证与选择 (8)2.10通信模块旳论证与选择 (8)2.11方案选定 (9)3.系统旳理论分析与计算 (10)3.1系统旳信号检测与控制 (10)3.1.1 系统旳信号检测 (10)3.1.2 系统旳信号控制 (10)3.2 两车之间旳通信措施 (11)3.3 节能 (11)4.电路与程序设计 (12)4.1电路旳设计 (12)4.1.1 系统总体框图 (12)4.1.2 控制器旳电路设计 (13)4.1.3 稳压电源旳电路设计 (13)4.1.4 电机驱动电路旳设计 (14)4.2程序旳设计 (15)4.2.1 程序功能描述与设计 (15)4.2.2 程序流程图 (16)5.测试措施与测试成果 (19)5.1测试方案 (19)5.2测试条件与仪器 (19)5.3测试成果及分析 (19)5.3.1 测试数据 (19)5.3.2测试分析与结论 (19)参照文献 (17)附录1 (18)附录2 (19)附录3 (20)智能小车旳设计摘要: 本作品以低功耗旳ATmega16单片机为控制关键;MP2307稳压电路供电;使用光电传感器寻线和避障;LN298N驱动电机;以光电传感器来实现甲乙两车之间旳通信;结合了PWM调速等技术, 设计了一组智能小车。
该小车旳车体由控制、电源、按键、小车硬件、电机、电机驱动、寻迹、避障、显示和光电传感通信等十个模块构成, 可用于无人驾驶、自动探测等人工智能领域。
关键字: ATmega16.MP2307、光电、LN298N1.设计任务及规定1.1设计任务甲车车头紧靠起点标志线,乙车车尾紧靠边界,甲、乙两辆小车同步起动, 先后通过起点标志线, 在行车道同向而行, 实现两车交替超车领跑功能。
//智能小车避障、循迹、红外遥控 C 语言代码// 实现功能有超声波避障, 红外遥控智能小车, 红外传感器实现小车自动循迹, 1602 显示小 车的工作状态,另有三个独立按键分别控制三种状态的转换 // 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起 来比较容易一点 #include <> #include <> #include"" #include <> #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh1[8]=" uchar ENCHAR_PuZh2[8]=" uchar ENCHAR_PuZh3[8]=" ucharENCHAR_PuZh4[8]=" uchar ENCHAR_PuZh5[8]=" run back stop left right "; ";//1602 显示数组 H. H. H. uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW P2 #define PWM /****************************** P1 //红外传感器引脚配置 P2k 口 /* L298N 管脚定义 */ 超声波引脚控制 ******************************/ sbit ECHO=P3A2; sbit TRIG=P3A3;///// 红外控制引脚配置 sbit sbituchar KEY2=P3A7; KEY 仁 P3M;state_total=3,state_2=0;// 2 为红外遥控 ucharuchar time_1 uchar 局变量 // 超声波接收引脚定义 // 超声波发送引脚定义// 红外接收器数据线 // 独立按键控制 总状态控制全局变量 state_1,DAT; // 红外扫描标志位time_1=0,time_2=0;// 定时器 1 中断全局变量 控制转弯延时计数也做延时一次 time,timeH,timeL,state=0;// 超声波测量缓冲变量 count=0;//1602 显示计数 兼红外遥控按键 state_total =2 兼循迹按键 state_total= 0 自动避障 state_total=10 为自动循迹模块 1 为自动避障模块 time_ 2 控制 PWM 脉冲计数 state 为超声波状态检测控制全 uint /**************************/ unsigned char IRC0M[7]; // 红外接收头接收数据缓存 unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; /********* voidvoid voidIRC0M[2 ]存放的为数据 // 红外接收缓存变量 **/ IRdelay(char x); //x* 红外头专用 delay run(); back();void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); void bizhang_test(); void xunji_test(); void hongwai_test();void Delay10ms(void);void init_test()// 定时器 0{ 1 外部中断 // 超声波显示 驱动 0 1 延时初始化 TMOD=0x11; TH1=0Xfe; TL1=0x0c; TF0=0; TF1=0; ET0=1; ET1=1; EA=1;// 设置定时器 0 1 // 装入初值定时一次为工作方式 1 16 位初值定时器2000hz// 定时器 // 定时器 // 允许定时器// 允许定时器 0 方式 1 计数溢出标志 1 方式 1 计数溢出标志 0 中断溢出 1 中断溢出//开总中断 if(state_total==1)// 为超声波模块时初始化 {TRIG=0; ECHO=0; EX0=0; IT0=1;}if(state_total==2)// 发射引脚低电平 // 接收引脚低电平 // 关闭外部中断// 由高电平变低电平,触发外部中断 0// 红外遥控初始化{ IT1=1; EX1=1;TRIG=1;}del ay(60);} void main(){ uint i; delay(50); init_test(); TR1=1; LCD1602_Init() ; delay(50); while(state_2==0)// 外部中断 1 为负跳变触发 // 允许外部中断 1 // 为高电平 I/O 口初始化// 等待硬件操作// 开启定时器 1{if(KEY1==0){Delay10ms(); // 消除抖动 if(KEY1==0) {state_total=0; // 总状态定义 0 为自动循迹模块 1 为自动避障模块2 为红外遥控while((i<30)&&(KEY1==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}}if(TRIG==0){while((i<30)&&(TRIG==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}if(KEY2==0){while((i<30)&&(KEY2==0))// 检测按键是否松开{Delay10ms(); i++; }i=0;// 检测按键 s1 是否按下//检测按键s2是否按下障模块Delay10ms(); // 消除抖动 if(TRIG==0) {state_total=1; 2 为红外遥控//总状态定义 0 为自动循迹模块 1 为自动避// 检测按键 s3 是否按下障模块Delay10ms(); // 消除抖动 if(KEY2==0) {state_total=2; 2 为红外遥控// 总状态定义 0 为自动循迹模块1 为自动避}}} init_test();delay(50); // 等待硬件操作50us TR1=0; // 关闭定时器 1 if(state_total==1) {//SPEED=90; bizhang_test();} if(state_total==0) {// SPEED=98; 电平// 自动循迹速度控制// 自动循迹速度控制高电平持续次数占空比为10 的低电平高电平持续次数占空比为40 的低xunji_test(); }if(state_total== 2){//SPEED=98; // 自动循迹速度控制高电平持续次数占空比为40 的低电平hongwai_test(); }void 断号init0_suspend(void)2 外部中断0 4 串口中断外部中断 1timeH=TH0;timeL=TL0;state=1;EX0=0;}void 断号0{if(state_total==1) { TH0=0X00;TL0=0x00;}if(state_total==0) { TH0=0Xec;TL0=0x78;time_1++;interrupt 0 //3 为定时器 1 的中断号 1 定时器0 的中// 记录高电平次数//// 标志状态为// 关闭外部中断1,表示已接收到返回信号//3 为定时器 1 的中断号2 外部中断0 4 串口中断time0_suspend0(void) interrupt 1外部中断 1// 自动避障初值装入// 装入初值// 自动循迹初值装入// 装入初值定时一次200hz// 控制转弯延时计数1 定时器0 的中}}void IR_IN(void){unsigned char j,k,N=0;EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return;}//确认IR 信号出现//等IR 变为高电平,跳过 9ms 的前导低电平信号。
智能车模型(C题)【本科组】一、任务设计一款智能车模型,其长宽不超过300×150mm,要求在自定义行车轨迹及其以黑色引导线(宽度不超过20mm)作为引导方式下完成行驶过程,行车轨迹长度大于2000mm,且必须有3个以上的拐弯;在轨迹下放置铁片(不少于4个),小车在行驶过程中,可以检测出铁片数量及位置。
二、要求1.基本要求(1)在5分钟内完成从起点沿引导线行驶到终点,并在到达终点时能够自动停止行驶。
(2)在检测到铁片时能提示,并停车5秒(明显停滞)。
然后继续行驶。
(3)实时显示检测到铁片的个数和行驶时间。
(4)记录从第一个铁片开始已行驶的距离,并能够在停车时交替显示行驶时间与距离。
2.发挥部分(1)在行车轨迹的中间,断开300mm的引导线,仍能够在2分钟完成全程行驶。
(2)在行车轨迹的中间,增加一片距离引导线70mm以上的铁片,能够检测出,并在2分钟完成全程行驶。
(3)在小车的顶部放置一500mm长的V型直槽,槽内放置一乒乓球,行驶过程能保持乒乓球不落地或少落地。
(4)其它特色与创新。
三、评分标准项目 满分设计与总结报告:系统基本原理、基本电路设计与论证,理论分析与计算,电路图及有关设计文件,测试方法,测试数据及测试结果分析。
50基本要求实际制作完成情况 50完成第(1)项 12完成第(2)项 13完成第(3)项 15 发挥部分其他 10四、几点说明1、行车轨迹由直行和拐弯相结合,拐弯必须包含左拐弯和右拐弯。
2、拐弯的弧度大于60°,半径在400至600mm。
3、铁片形状为20×20mm的薄片。
可以用胶带固定在行车轨迹上。
(测试时自己准备铁片)4、V型直槽的材质不限、光滑(倾斜15°乒乓球能滚动),两边宽不超过30mm,5、当乒乓球掉落,必须在检测铁片停止时放置回V型直槽中。
6、在检测时,轨迹、铁片位置、断点位置由检测人员确定。
7、在检测时,有三次测试机会,以最好成绩为准。
智能小车C语言程序智能小车黑线循迹C语言程序#include#include#define uchar unsigned char#define uint unsigned intsbit LeftIR=P1^6; //左边红外接收sbit RightIR=P1^7; //右边红外接收sbit ENA=P1^2; // L298的Enable Asbit IN1=P1^0; // L298的Input 1sbit IN2=P1^1; // L298的Input 2sbit ENB=P1^5; // L298的Enable Bsbit IN3=P1^3; // L298的Input 3sbit IN4=P1^4; // L298的Input 4uchar t=0; //中断计数器uchar motor_1=0,motor_2=0; //电机1,2速度值uchar tmp1,tmp2; // 电机当前速度值uchar aa; //定时器1中断计数bit flag=0; //标志位void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) // 电机1的处理{motor_1=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN1=0;IN2=1;}else // 不为负数则正转{IN1=1;IN2=0;}}if(index==2) // 电机1的处理{motor_2=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN3=0;IN4=1;}else // 不为负数则正转{IN3=1;IN4=0;}}}}void init(){TMOD=0x12; // 设定T0的工作模式为2TH0=0x9B; // 装入定时器的初值TL0=0x9B;TH1=(65536-50000)/256; //设置初值定时50msTL1=(65536-50000)%6;EA=1; // 开中断ET0=1; // 定时器0允许中断ET1=1; //定时器1允许中断TR0=0; // 关闭定时器0TR1=0; // 关闭定时器0ENA=0; //关闭电机1ENB=0; //关闭电机2}void main(){int irDetectLeft,irDetectRight;init();while(1)// 电机实际控制演示{irDetectRight = RightIR;//右边接收irDetectLeft = LeftIR;//左边接收if((irDetectLeft==0)&&(irDetectRight==0))//向前进{motor(1,100);motor(2,100);}if((irDetectLeft==0)&&(irDetectRight==1))//右转{motor(1,-100);motor(2,100);}if((irDetectLeft==1)&&(irDetectRight==0))//左转{motor(1,100);motor(2,-100);}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次探测定时器1开始计时{motor(1,100);motor(2,100);TR1=1;}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第二次探测时小车停{TR0=0;ENA=0;ENB=0;}}}void timer0() interrupt 1 // T0中断服务程序{if(t==0) // 1个PWM周期完成后才会接受新数值{tmp1=motor_1;tmp2=motor_2;}if(t ENA=1;elseENA=0; // 产生电机1的PWM信号if(t ENB=1;elseENB=0; // 产生电机2的PWM信号t++;if(t>=100)t=0; // 1个PWM信号由100次中断产生}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%6;aa++;if(aa==40) //定时2s后小车开始运动TR0=1;if(aa==60) //定时3s后置标志位{aa=0;flag=1;}}。
基础知识:1.C51语言与标准C语言的异同点语法结构和标准C语言基本一致,但是C51中定义的库函数、数据类型、存储模式、输入/输出处理、函数使用和标准C语言不同。
单片机:1.STC单片机的特点高速、低功耗、超强抗干扰的单片机,指令代码完全兼容8051单片机。
2.单片机的时序关系?一个机器周期有6个状态,一个状态有2个节拍(12分频)。
3.STC89C52的定时/计数器的个数有几个?分别是什么?共3个16 位定时器/计数器。
即定时器T0、T1、T24.定时器与计数器的区别是什么?定时器对单片机内部的机器周期进行计数,而计数器是对单片机外部脉冲进行计数。
主板电路:1.STC89C52单片机一共多少引脚?与课本中的89C51有什么区别?40引脚,flash 8K、256个字节的RAM,多了一个定时器T22.LCD1602液晶中,16是指什么,02是指什么能够同时显示16x2即32个字符。
(共2行,一行16个字符)3. MAX232在电路中起什么作用?RS-232标准串口电平~TTL电平的转换芯片。
车模:1.简述本次项目中采用车模的特点四轮小车模型,没有舵机,利用电机的差速控制,实现小车的转弯全金属钢架结构,坚固实用。
2.本次项目中采用电池的类型和特点镍氢充电电池,放电电流大。
采样电路部分:1.采样电路中,加滑动变阻器的作用是?调节比较器的门限(门槛)变压,提高路面黑白判定的灵敏度2.TCRT5000红外发射接收对管离地面的最佳距离范围是多少?1mm-12.5mm3.发射管连接的电阻起什么样的作用?接收管连接的电阻起什么样的作用?a)发射管:限流保护b)接收管:上拉电阻4.钽电解电容与普通电解电容的主要区别?漏电电流小,同等参数体积小。
价格贵5.TCRT5000红外光电传感器工作原理?蓝色是发射管,黑色是接收管。
蓝色是发射红外的,分别接电源和地。
黑色是接收部分。
发射端短的接地,接收端长的接地。
采用高射功率红外光电二极管和高灵敏度光电晶体管组成。
摘要本设计是采用增强型51单片机(STC12C5A60S2)为系统核心设计的一款智能小车系统。
本系统由甲、乙两辆小车构成,其中每辆小车都由主控制模块、反射型红外传感器模块、电机驱动模块、红外避障模块、码盘测速模块、数码管显示模块、语音模块等电路模块组成。
本设计的主要特色是使用了一款高性能的51单片机作为主控芯片,功耗很低,采用PWM脉宽调制技术控制小车的速度,使用无线通信模块、传感器和码盘相互配合以及独特的小车架构,能够使小车在行驶的过程中精确快速的完成转弯、检测标志线、检测边界线、调整车身方向以及在超车区超车的任务。
关键词:智能小车、PWM脉宽调制、无线通信模块、反射型红外传感器、超声波测距目录一、系统方案论证与比较 (1)1.1 主控制器方案 (1)1.2电机选择方案 (1)1.3 电机驱动方案 (1)1.4 黑线检测方案 (2)1.5 小车车距保持方案 (2)1.6 电源供电方案 (2)1.7车体选择方案 (3)1.8 系统总体框图 (3)二、理论分析与计算: (3)2.1 两车间的通信方法 (3)2.2 PWM调速原理及算法 (4)2.3 码盘测速原理及算法 (4)2.4 超声波测距原理及算法 (5)2.5 边界线与标志线的区分算法 (5)2.6 能耗分析 (5)三、电路与程序设计: (5)3.1 主控电路 (5)3.2 电机驱动电路 (5)3.3 电源电路 (6)3.4 黑线检测电路 (6)3.5 两辆小车的速度调整 (7)3.6 超车区域的程序设计 (8)四、系统测试: (8)4.1测试仪器与设备 (8)4.2测试方法 (8)4.3指标测试与数据分析 (9)五、设计总结: (11)六、参考文献: (12)附录:控制程序 (12)智能小车(C题)一、系统方案论证与比较1.1 主控制器方案方案一:选用MSP430单片机,其功能和资源都比较丰富,特别是功耗非常低,比较符合设计需要。
但是其封装只有贴片的、引脚过密焊接起来比较困难而且抗干扰能力不太理想。
方案二:选用宏晶公司生产的STC12C5A60S2,它是一款增强型51单片机,完全兼容传统51单片机的指令、功耗低、技术成熟、成本低而且具有丰富的内部资源:1K SARM、60K片内FLASH、SPI通信接口、PWM发生器、200kbps A/D转换器等,完全能够满足设计需要。
经比较,本设计选用方案二。
1.2电机选择方案方案一:采用步进电机来驱动小车,步进电机是将电脉冲信号转变为角位移或线位移的电机。
其具有精度高,控制简单、无累积误差等优点。
但是步进电机的力矩会随转速的升高而下降,调速潜力不大,并且价格昂贵。
方案二:采用直流电机。
直流电机速度快,价格便宜,通过调节电压来改变速度。
其具有驱动电路简单,控制简单,调速范围广,调速特性平滑、低速性能好、运行平稳、噪音低、效率高等优点。
非常满足本设计的需求。
综上所述,本设计选用方案二。
1.3 电机驱动方案方案一:选用分立原件搭建成的H桥电路驱动电机。
这种电路可以很方便的根据实际需要更改电路,但其搭建比较复杂而且工作的可靠性和稳定性不高。
方案二:采用集成芯片L298N。
L298N芯片是较常用的电机驱动芯片。
该芯片有两个TTL/CMOS 兼容电平的输入,具有良好的抗干扰性能,可用单片机的I/O口提供信号,电路简单易用且稳定,具有较高的性价比。
但是其工作时容易发热,可能影响本身以及其他电路的稳定性。
方案三:采用电机控制专用芯片L293来控制后轮电机。
使用L293芯片,不仅可以大大简化驱动电路,而且功率容量大,有利于电机转速的稳定。
L293在电机控制中可以灵活的应用,如对电机输出能力的控制,在单片机中可以进行脉宽调制(PWM),实现对电机调速的精确控制。
基于上述分析,本设计选用方案三。
1.4 黑线检测方案方案一:选用红外反射型传感器TCRT5000。
该传感器的接收灵敏度很好,驱动电路简单易行,价格便宜,功耗低而且在其精度范围内大致呈线性变化,因此用来区分黑白非常适合。
方案二:选用光电传感器。
该传感器驱动电路简单,容易制作和安装调试,而且其中的光敏电阻的灵敏度很高,但是实际制作时发现光敏电阻对黑白的区分能力不强,受环境中的光线干扰很大。
基于上述考虑,为了提高信号采集检测的精度,本设计选用方案一。
1.5 小车车距保持方案方案一:选用超声波测距模块。
该模块控制简单,只有2根信号线与主控芯片相连,一根用做输入一根用做输出,可以提供2cm—400cm的非接触式距离检测功能,测距精度高达3mm,不容易受外界环境因素的干扰,但是该模块的程序开销比较大,而且容易受到其他电路的影响。
方案二:选用反射式红外传感器。
该传感器是利用红外发射管发出红外线碰到反射物被反射回来,主控芯片再根据红外线从发出到被接受到的时间及红外线的传播速度就可以算出所测距离。
该模块反应灵敏、操作简单、程序开销小,采用避障的原理保持两车的距离防止撞车。
基于精度以及稳定性的考虑,本设计采用方案二。
1.6 电源供电方案方案一:选用单电源供电。
电源先经过12V的稳压器产生12V的直流电压供给电机使用再通过5V稳压器产生5V电压供给单片机使用。
这样供电比较简单,但是这样的设计要求电源的电流很大而且功率分配不均,会导致电机转速很不稳定。
方案二:选用双电源供电。
将电机驱动电源与单片机及其周边电路电源完全隔离。
这样没有单电源方便,但是可以彻底消除电机驱动所造成的干扰,提高系统的稳定性。
为了保证系统的稳定性,本设计采用第二种方案。
1.7车体选择方案小车是整个系统的基础,因此小车的性能对整个方案的成败至关重要。
方案一:用减速电机,橡胶轮胎和壳体装配一台自制小车。
这样可以根据自己的设计来改变小车的外形。
但是制作比较繁琐,而且很难找到合适的车身。
方案二:选用玩具车改装。
其优点是比较简单易行,市场上玩具小车的种类比较多。
但是玩具车的减速部分比较简单,速度普遍较快,这加大了控制小车的难度,而且玩具小车的转向性能也不佳,转弯半径过大。
方案三:选用履带式小车。
其优点是能原地转弯,速度也比较适中,有利于对小车的整体控制。
履带小车明显有较大的优势,所以本设计采用方案三。
1.8 系统总体框图图1 系统总体框图二、理论分析与计算:2.1 两车间的通信方法为了使两小车在行驶的过程当中保持适当的距离以及在超车时被超小车接收到超车信号,本设计在两辆小车上都装有无线通信模块NRF24L01。
该模块内置2.4GHz天线,体积小巧,低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
NRF24L01的SPI 接口可以利用单片机的硬件SPI 口连接或用单片机I/O 口进行模拟,内部有FIFO 可以与各种高低速微处理器接口,非常满足本设计的要求。
2.2 PWM 调速原理及算法本设计的主控芯片采用的是STC12C5A60S2,该芯片自带PWM 脉冲输出端口,通过程序设定使其工作在8位PWM 模式,通过设置输出占空比达到调节电机速度的目的。
本设计采用PWM 调速,即通过改变平均电压调节转速。
t t u u o n in o u t ⨯= (1) T n T c c R c u n N T e a N e outβφφ-=-=0 (2)电机装好后,β是一个常数,改变电机电压,可以保持机械特性曲线平行下移,而硬性不改变。
通过对单片机编程可控制脉冲的占空比,即可实现电机调速。
当需要拐弯时,单片机产生两个不同占空比的脉冲,由左右速率差来进行拐弯,能实现90度以上大角度快速拐弯,通过控制转轮的速率和方向确定小车的行进轨迹。
2.3 码盘测速原理及算法码盘电路用于测量小车在行驶当中的速度。
码盘测速就是采用断续式光电开关的原理,将其固定在电机的转轴上面,光电开关固定于码盘的两侧。
每个码盘具有45个栅格,车轴转动1周光电开关则会产生45个脉冲,通过计算脉冲的个数,单片机即可计算出小车行驶的距离以及实时速度,从而能够较好的保持小车在行驶过程中的直线型和稳定性以及实现超车、保持两车车距的功能。
图2 码盘测速电路2.4 超声波测距原理及算法本系统共有两辆小车,为了防止小车发生追尾事件,本设计每辆小车的车头都装有一个超声波测距模块,用来实时检测两车之间的距离以便于调整车速。
超声波发射器向前方发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。
2.5 边界线与标志线的区分算法小车在行驶的过程中一定会检测到黑线,可能是赛道的边界线,也可能是标志线。
标志线和边界线的区别就是边界线宽2CM,标志线宽1CM。
经测试传感器在通过2CM宽带黑线之后产生18个脉冲,由于小车几乎不可能垂直去检测边界线,因此我们通过比较脉冲数量即可判别黑线类型,大于18个脉冲即是边界线,小于18个脉冲即是标志线。
2.6 能耗分析为了体现节能的思想,本设计始终坚持在保证小车性能的前提下尽量降低小车功耗的原则。
首先本设计使用的主控芯片是一款增强型51单片机,该芯片功耗低、技术成熟、成本低;然后小车上用来检测黑线的传感器是TCRT5000,该传感器也具有反应灵敏、功耗低的优势;再有小车上采用的无线通信模块是NRF24L01,该模块体积小、功耗低非常适合在小车上用来通信。
三、电路与程序设计:3.1 主控电路主控电路采用单片机Stc12c5a60s2。
它是一款与51兼容的单片机,与传统51不同的是这款单片机是单时钟周期,因此指令的执行速度较快。
在设计单片机电路时就不需要提高晶振频率来提高速度了,晶振采用常用的11.0592MHZ的晶振。
STC12C5A60S2中P1.3口和P1.4口为单片机PWM输出口,接在L293的使能端口可实现电机调速功能。
3.2 电机驱动电路通过驱动电路控制电机的正转和反转,实现小车的前进和后退。
小车直流电机的驱动采用L293电机专用驱动芯片。
为达到较好的控制效果,同时减少小车的总耗时,在转弯、调整和超车时需要采用不同的速度,使用PWM方式可以很容易的实现调速。
PWM信号由单片机产生,使用非常方便。
驱动电路的控制输入端经光耦与单片机电路隔离,通过对单片机的编程就可以实现两个直流电机的PWM调速以及正反转等功能。
图3 电机驱动电路3.3 电源电路小车电机使用3.7V的锂电池供电,单节电池的容量为3200毫安,共3节电池给电机供电。
小车的单片机控制板由南孚电池供电与电机供电之间用光耦隔离,可以彻底消除电机驱动所造成的干扰,提高系统的稳定性。
3.4 黑线检测电路黑线检测电路采用的是反射型红外传感器模块。