星火燎原队报告
华东交通大学﹒智能车双基竞赛(技术报告)
技
术
报
告
比赛组别:光电组
队名: 星火燎原
负 责 人:蔡宗楷
其他成员:杨鑫
袁颖
指导老师:杨云
二○一六年 十一月
摘 要
本比赛完成采用红外反射式传感器的自寻迹小车的设计与实现。采用与白色地面色差很大的黑色路线引导小车按照既定路线前进,在意外偏离引导线的情况下自动回位,。
本设计采用单片机STC12c5a60s2作为小车检测、控制显示核心,以单面铜板做的车架为车体,两直流机为主驱动,各模块电路构成整体电路。自动寻迹的功能采用红外对管ST188实现,信号经LM339电压比较器比较之后送给控制器,控制器通过控制驱动芯片L298N驱动电动小车的电机,实现小车的动作;通过控制舵机转角控制小车方向。
关键词:红外反射试;自寻迹;自动回位;单片机;模块;控制器;舵机
Abstract
The design and implementation of the self -tracking car with infrared reflective sensor is completed in this competition. A large black line with white ground color difference to guide the car in accordance with the established route forward, in the case of accidental departure from the guide line automatically back,.
This design uses the monolithic integrated circuit STC12c5a60s2 as the vehicle detection, the control display core, the single side copper plate makes the vehicle body, the two direct current machine is the main drive, each module circuit constitutes the whole circuit. The automatic tracing function uses the infrared tube ST188, signal by the LM339 voltage comparator is sent after the controller, the controller through the drive motor control chip L298N drive electric car, the car moves; by controlling the steering angle control car direction.
Keywords:Infrared reflection test; self-tracing; automatic return; single chip microcomputer; module; controller; steering
目 录
摘要 ....................................................................................................................................... 2
ABSTRACT ............................................................................................................................... 2
第1章绪论 ........................................................................................................................... 3
1.1 本小车制作的背景和意义 ................................................................................... 3
1.2 本次小车制作的主要方法和研究进展 ............................................................... 4
1.3 本技术报告的主要内容 ....................................................................................... 4
1.4 本技术报告的结构安排 ....................................................................................... 4
第2章硬件设计 ................................................................................................................... 5
2.1硬件设计整体思路 ................................................................................................. 5
2.2各硬件模块分析(附原理图及分析) ................................................................. 5
第3章软件系统设计 ......................................................................................................... 12
3.1软件设计整体程序框图 ....................................................................................... 12
3.2各模块程序实现说明(附程序及分析) ........................................................... 12
第4 章系统整体调试 ........................................................................................................ 19 结论 ..................................................................................................... 错误!未定义书签。 参考文献 ............................................................................................. 错误!未定义书签。 附录 1 标题 ....................................................................................... 错误!未定义书签。 字体要求说明(各章题序及标题小2号黑体) ............................. 错误!未定义书签。
2.1 各节点一级题序及标题小3号黑体 ................................... 错误!未定义书签。
2.1.1 各节的二级题序及标题4号黑体 ........................... 错误!未定义书签。
2.2 页眉、页脚说明 ................................................................... 错误!未定义书签。
2.3 段落、字体说明 ................................................................... 错误!未定义书签。
2.4 公式、插图和插表说明 ....................................................... 错误!未定义书签。
第1章 绪 论
1.1 本小车制作的背景和意义
目前,国内外的许多大学及研究机构都在积极投入人力,财力研究开发针对特殊条件下的安全监测系统。其中包括研究使用远程无人的方法来进行实现,如机器人、远程监控等。无线传输的发展使得测量变得相对简单而且使得处理数据的速度变得很快甚至可以达到实时处理。
该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、驱动部分、CPU。机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的进行线路,并检测障碍物自动躲避。
通过构建智能小车系统,培养设计并实现自动控制系统的能力。在实践过程中熟悉以单片机为核心控制芯片,设计小车的检测、驱动和显示灯外围电路,采用智能控制算法实现小车的智能循迹。灵活应用机电等相关学科的理论知识,联系实际电路设计的具体实验方法,达到理论与实践的统一。在此过程中,加深对控制理论的理解和认识。
1.2 本次小车制作的主要方法和研究进展 现代智能小车发展很快,从智能玩具到其它各行业都有实质成果。其基本可实现循迹、避障、检测贴片、寻光入库、避崖等基本功能,这几节的电子设计大赛智能小车又在向声控系统发展。比较出名的飞思卡尔智能小车更是走在前列。此次的设计主要实现循迹这个功能。
1.3 本技术报告的主要内容
红外智能自动寻迹小车系统由小车主体部分、比较器模块、寻迹传感器模块、电机驱动块、电源模块、最小系统模块和指示灯模块构成。
采用单片机来作为整机的控制单元。黑线检测采用红外对管对光源信号进行采集,经电压比较器使输出转化为数字信号送到单片机系统处理。此系统比较灵活,采用软件方法来解决复杂的硬件电路部分,使系统硬件简洁化,各类功能易于实现,能很好地满足比赛的要求。该方案简洁、灵活、可扩展性好,能达到比赛的设计要求,因此采用该方案来实现。
1.4 本技术报告的结构安排
第2章 硬件设计
2.1硬件设计整体思路
车体的整体布局是很重要的一方面,好的布局不仅能够增强小车的美观性, 也能够提高小车的整体性能。首先是电路板的放置,很多自己搭建的电路板要合理的安装在小车上, 还要考虑到比赛过程中可能的冲撞给电路板带来的损害,在电路板的安装中尤其注意循迹模块的安装,由于循迹模块安装在小车的前部,伸出车体的长短都有讲究在设计时要有所考虑。其次是电池 的放置,由于电池较重,电池的放置直接影响到小车的重心,在追求速度的比赛中对电池安装的位 置也要有所考虑。还有就是舵机的安装,既要保证小车转向灵活 ,又要使小车有足够大的转向角。
2.2各硬件模块分析(附原理图及分析)
2.2.1 电源模块
电源就好比车的心脏。电源是整个系统稳定工作的前提,因此必须有一个合理的电源设计,对于小车来说电源设计应注意两点: 1. 与一般的稳压电源不同,小车的电池电压一般在 12v左右,还要考虑在电池损耗的情况下电压的降低,因此常用的 78 系列稳压芯片不再能够满足要求,因此必须采用低压差的稳压芯片。2. 单片机必须与大电流器件分开供电,避免大电流器件对单片机造成干扰,影响单片机的稳定运行。对于本设计应该主要注意稳压压差和最大输出电流两个指标能否满足设计要求。 电源模块电路图:
电源模块实物图:
2.2.1最小系统模块
单片机是小车的控制大脑,单片机最小系统的合理设计是小车平稳运行的前提,所谓最小系统, 就是能够保证单片机运行的最精简的硬件设计,由于设计时间有限,不可能设计一块统一规划,功能刚好符合要求的电路板,因此需要设计若干系统板组合使用。在本次竞赛中各位选手可以根据需 要选择不同的单片机,使用红外对管作为传感器则,使用的芯片是STC12c5A60S2的型号的单片机。
最小系统模块电路图:
最小系统模块电路图:
2.2.2红外检测模块
检测模块为小车的眼睛。红外一体式发射接收器由于感应的是红外光,常见光对它的干扰较小,是在小车、机器人等制 作中广泛采用的一种方式。红外一体式发射接收器检测黑线的原理为,由于黑色吸光,当红外发射 管发出的光照射在上面后反射的部分就较小,接收管接收到的红外线也就较少,表现为电阻比较大, 通过外接的电路就可以读出检测的状态,同理当照射在白色表面时发射的红外线就比较多,表现为接收管的电阻比较小。
红外检测模块电路图:
红外检测模块实物图:
2.2.3比较器模块
比较器模块电路图:
比较器模块实物图:
2.2.4驱动模块
由于单片机的驱动能力不足,无法驱动像电机这样的大功率外部器件,因此 必须外加驱动电路。电机常用的驱动芯片很多,在本设计中我们选用硬件设计简单,驱动效率较高的L298N 作为电机驱动芯片
驱动模块电路图:
驱动模块实物图:
2.2.5指示电路模块 指示灯电路图:
指示灯实物图:
小车实物图:
第3章软件系统设计
3.1软件设计整体程序框图
3.2各模块程序实现说明(附程序及分析)
#include"stc12c5a60s2.h" #define uint unsigned int #define uchar unsigned char #define v0 0X00; //100% // #define v1 0XD; //95% #define v2 0X19; //90% #define v3 0X26; //85% #define v4 0X33; //80% #define v5 0X41; //75% #define v6 0X4C; //70% #define v7 89; //65% #define v8 0X66; //60% #define v9 115; #define v10 128; #define v11 140; #define v12 154; #define v13 160; #define v14 170; #define tlz20 217; //1830 11 #define tlz19 207; //1840
11
速度定义
#define tlz18 197; //1850 11 #define tlz17 187; #define tlz16 177; //1870 #define tlz15 167; #define tlz14 157; //1880 #define tlz13 147; #define tlz12 137; //1900 11 #define tlz11 127; //10 #define tlz10 117; //10 #define tlz9 107; #define tlz8 97;
#define tlz7 87; // #define tlz6 77; //10 #define tlz5 67; //10 #define tlz4 57; #define tlz3 47; //10 #define tlz2 37; #define tlz1 27; // #define tl0 17; //开始 10 #define tly1 7; #define tly2 253; #define tly3 243; #define tly4 233; #define tly5 223; //10 #define tly6 213; #define tly7 203; //10 #define tly8 193; //9 #define tly9 183; //9 #define tly10 173; //9 #define tly11 163; #define tly12 153; #define tly13 143; #define tly14 133; #define tly15 123; #define tly16 113; #define tly17 103; #define tly18 93; #define tly19 83;
#define tly20 73; // 9 #define thz 248; //9 #define thy 247;
/*------------------------------------------------
变量定义
------------------------------------------------*/
uint count1=0,count2=11,t=1800,d0,d1,d2,d3,d4,d5,d6,d7,Vl,Vr,h,l; /*------------------------------------------------
管脚定义
------------------------------------------------*/ sbit pwm1=P3^5; //舵机信号 sbit l1=P0^0; //检测口 sbit l2=P0^1; sbit l3=P0^2; sbit l4=P0^3; sbit l5=P0^4; sbit l6=P0^5; sbit R1=P2^0; sbit R2=P2^1; sbit R3=P2^2; sbit R4=P2^3; sbit R5=P2^4; sbit R6=P2^5; //sbit stop=P3^4; //sbit go=P3^3; sbit outl1=P1^2; // 电机信号 //sbit outl2=P1^3; //sbit outr1=P1^4; sbit outr2=P1^5;
sbit s1=P1^0; sbit s2=P1^1; sbit s3=P1^6; sbit s4=P1^7;
/*------------------------------------------------
//选挡
电机速度选择 ------------------------------------------------*/ void Speed_Motor() { CCAP0H=Vl; //占空比调节 CCAP0L=Vl; CCAP1H=Vr; //占空比调节 CCAP1L=Vr; }
/*****************************************************
初始化
******************************************************/
void Pwm_Motor() //电机初始化 { CCON=0; //PCA初始化
CL=0; //PCA的16位计数器低八位 CH=0; //PCA的16位计数器高八位 CMOD=0x00; //选择 系统时钟/12 为计数脉冲,则PWM的频率f=sysclk/256/12; CCAP0H=0x00; // 占空比控制 CCAP0L=0x00; CCAP1H=0x00; // 占空比控制 CCAP1L=0x00; PCA_PWM0=0x00; //控制占空比的第九位为0 PCA_PWM1=0x00; CCAPM0=0x42; //允许P13作为PWM输出 CCAPM1=0x42; //允许P14作为PWM输出 CR=1; //启动PCA计数器 }
void Timer_Init() //舵机(定时器)初始化 { TMOD=0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH0=h; TL0=l; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; }
/************************************************ 舵机
**************************************************/ void servo() {
if(count1
pwm1=0;
if (count1>=count2) count1=0; }
/*-------------------------------------------------------------------------------------------
------------------------------------延时函数--------------------------------------------------- ----------------------------------------------------------------------------------------------*/ void delay(uint z) {
int x,y;
for(x=z;x>0;x--) for(y=110;y>0;y--); }
/*------------------------------------------------------------------------------------------- ------------------------------------主函数--------------------------------------------------- ---------------------------------------------------------------------------------------------*/ void main() {
P0=0xff; P2=0xff; while(1) { Timer_Init(); Pwm_Motor(); if(s4==0){d0=v0;d1=v1;d2=v2;d3=v3;d4=v4;d5=v5;d6=v6;d7=v7;break;} //4挡 100% ` if(s3==0){d0=v2;d1=v3;d2=v4;d3=v5;d4=v6;d5=v7;d6=v8;d7=v9;break;} //3挡 90% if(s2==0){d0=v3;d1=v4;d2=v5;d3=v6;d4=v7;d5=v8;d6=v9;d7=v10;break;} // 2挡 80% if(s1==0){d0=v7;d1=v8;d2=v9;d3=v10;d4=v11;d5=v11;d6=v12;d7=v12;break;} //
//1挡 65% }
delay(1000); delay(1000); delay(1000); h=thz; l=tl0;
//初始化
count2=11; outl1=0; outr2=0; while(!s1) {
if(l1==0){h=thz;l=tlz20;count2=11;Vl=d2;Vr=d4;} if(l2==0){h=thz;l=tlz20;count2=11;Vl=d2;Vr=d2;} if(l3==0){h=thz;l=tlz18;count2=11;Vl=d3;Vr=d0;} if(l4==0){h=thz;l=tlz17;count2=11;Vl=d3;Vr=d0;} if(l5==0){h=thz;l=tlz10;count2=10;Vl=d1;Vr=d1;}
// // //
//
if(l6==0 && R6==1){h=thz;l=tlz5;count2=10;Vl=d0;Vr=d0;} if(l6==0 && R6==0 ){h=thz;l=tl0;count2=10;Vl=d0;Vr=d0;} //中心、直线 2030 0度在有右 if(l6==1 && R6==0){h=thy;l=tly5;count2=10;Vl=d0;Vr=d0;} if(R5==0){h=thy;l=tly10;count2=10;Vl=d1;Vr=d1;} // if(R4==0){h=thy;l=tly17;count2=9;Vl=d0;Vr=d3;} // if(R3==0){h=thy;l=tly18 ;count2=9;Vl=d0;Vr=d3;} // if(R2==0){h=thy;l=tly20;count2=9;Vl=d2;Vr=d2;} // if(R1==0){h=thy;l=tly20;count2=9;Vl=d4;Vr=d2;} // servo(); Speed_Motor(); } while(!s2) { if(l1==0){h=thz;l=tlz20;count2=11;Vl=d1;Vr=d4;} // if(l2==0){h=thz;l=tlz20;count2=11;Vl=d4;Vr=d1;} // if(l3==0){h=thz;l=tlz20;count2=11;Vl=d3;Vr=d1;} // if(l4==0){h=thz;l=tlz12;count2=11;Vl=d3;Vr=d1;} // if(l5==0){h=thz;l=tlz6;count2=10;Vl=d2;Vr=d2;} // if(l6==0 && R6==1){h=thz;l=tlz5;count2=10;Vl=d0;Vr=d0;} if(l6==0 && R6==0 ){h=thz;l=tl0;count2=10;Vl=d0;Vr=d0;} 直线 2030 0度在有右 if(l6==1 && R6==0){h=thy;l=tly4;count2=10;Vl=d0;Vr=d0;} if(R5==0){h=thy;l=tly6;count2=10;Vl=d2;Vr=d2;} if(R4==0){h=thy;l=tly12;count2=9;Vl=d1;Vr=d3;} // if(R3==0){h=thy;l=tly20;count2=9;Vl=d1;Vr=d3;} // if(R2==0){h=thy;l=tly20;count2=9;Vl=d1;Vr=d4;} // if(R1==0){h=thy;l=tly20;count2=9;Vl=d4;Vr=d1;} // servo(); Speed_Motor(); } while(!s3) { if(l1==0){h=thz;l=tlz20;count2=11;Vl=d2;Vr=d4;} // if(l2==0){h=thz;l=tlz20;count2=11;Vl=d5;Vr=d2;} // if(l3==0){h=thz;l=tlz17;count2=11;Vl=d4;Vr=d2;} // if(l4==0){h=thz;l=tlz9;count2=11;Vl=d4;Vr=d0;} //
//中心、 //
if(l5==0){h=thz;l=tlz4;count2=10;Vl=d3;Vr=d3;} // if(l6==0 && R6==1){h=thz;l=tlz2;count2=10;Vl=d0;Vr=d0;} if(l6==0 && R6==0){h=thz;l=tl0;count2=10;Vl=d0;Vr=d0;} //中心、直线 2030 0度在有右 if(l6==1 && R6==0){h=thy;l=tly2;count2=10;Vl=d0;Vr=d0;} if(R5==0){h=thy;l=tly4;count2=8;Vl=d3;Vr=d3;} // if(R4==0){h=thy;l=tly9;count2=9;Vl=d0;Vr=d1;} // if(R3==0){h=thy;l=tly17;count2=9;Vl=d2;Vr=d4;} // if(R2==0){h=thy;l=tly20;count2=9;Vl=d2;Vr=d5;} // if(R1==0){h=thy;l=tly20;count2=9;Vl=d4;Vr=d2;} // servo(); Speed_Motor(); } while(!s4) { if(l1==0){h=thz;l=tlz20;count2=11;Vl=d0;Vr=d4;} // if(l2==0){h=thz;l=tlz20;count2=11;Vl=d4;Vr=d0;} // if(l3==0){h=thz;l=tlz16;count2=11;Vl=d3;Vr=d0;} // if(l4==0){h=thz;l=tlz9;count2=11;Vl=d2;Vr=d1;} // if(l5==0){h=thz;l=tlz6;count2=10;Vl=d1;Vr=d1;} // if(l6==0 && R6==1){h=thz;l=tlz2;count2=10;Vl=d0;Vr=d0;} if(l6==0 && R6==0 ){h=thz;l=tl0;count2=10;Vl=d0;Vr=d0;} 中心、直线 2030 0度在有右 if(l6==1 && R6==0){h=thy;l=tly2;count2=10;Vl=d0;Vr=d0;} if(R5==0){h=thy;l=tly6;count2=10;Vl=d1;Vr=d1;} if(R4==0){h=thy;l=tly9;count2=9;Vl=d1;Vr=d2;} // if(R3==0){h=thy;l=tly16;count2=9;Vl=d0;Vr=d3;} // if(R2==0){h=thy;l=tly20;count2=9;Vl=d0;Vr=d4;} // if(R1==0){h=thy;l=tly20;count2=9;Vl=d4;Vr=d0;} // servo(); Speed_Motor(); } }
/*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Time_1() interrupt 1
////
{ TH0=h; TL0=l; count1++; }
第4 章系统整体调试
4.1 测试与调试
首先说测试,何为测试,测试就是检验元件好坏,电路能否正常工作,因此特别是在硬件设计中,开始一个模块设计之前和完成一个模块设计之后都要进行测试。在设计之前很多同学刚入门,对很多元器件没有搞清楚,基本的封装和引脚都不清楚就轻率的进行焊接和画 PCB 板,最终浪费了 大量时间并对心理造成负面影响。因此在动手之前请务必查清楚所用元件资料,不清楚的利用手头的仪器进行测试。在稍微复杂一点的电路设计之前可以先搭建其中的一部分电路,测试一下是否正常,然后在进行总的电路设计。这样循序渐进的进行设计可以节省时间保证电路的正确性。同样, 程序方面的设计也是如此。没见过哪个牛人上来就是哗哗的把整个程序都写好的,基本上都是从最 简单的程序开始,慢慢的调试和扩充。电路设计之后的测试也同样重要,特别是和程序有关的外围 检测、驱动等模块,如果不排除硬件故障在调试的时候很难让你分清到底是硬件还是软件的问题, 因此硬件设计完成之后首先需要测试硬件能够正常工作,这样在遇到问题时才能够排除硬件的干扰 找出问题的所在。 测试完成之后再说调试部分,所谓调试就是在基本功能实现的基础之上调整参数,实现最佳的 性能。真正从比赛的角度上来说需要在调试上花一定的时间。如果从总的角度上来说大家在做的时候可以先做一个个模块,基本功能实现后可以去尝试在原有的基础之上去扩展并提高性能,最后根据前一阶段的测试结果有针对性的重新设计电路板,最终将硬件部分测试下来,后面的时间主要就可以从软件的角度去调整参数。另外需要强调一点就是,在硬件设计阶段就要留出参数选择接口和指示模块,如使用拨码开关 作为参数选择使用 LCD 作为信息显示,同时也可以留出无线通讯端口如无线串口模块方便后期的参 数采集和调试。同时针对赛场上的突发状况需要在软件中预置几种状况,最起码要预置几种速度选择,这样一旦在比赛是初始方案无法正常运行可以及时通过车身上的拨码开关等选择另一种方案,这一点希望大家在硬件设计的时候就要考虑进去。
4.2 智能车的测试步骤
对于小车的整体来说测试要按照模块来进行,一般我认为应分为以下几个步骤: ①首先测试电源的工作情况,各个模块能否得到良好供电。 ②光电管安装完成后测试每个光电管的电压变化情况,完成后根据测试数据调节电位器选择合适的参考电压然后依次测量比较器或运放的输出端有无根据检测到黑线的情况产生相应的电平变化,若没有则检查相应的电路和元件好坏,测试成功后进行下一步。
③检查单片机能否能正常得烧写程序和工作。
④用单片机产生不同占空比的信号控制舵机进行转角测试,找出小车转向的参考点和对应的 PWM 设置参数。
⑤测试后轮电机的工作情况,并试验在不同频率和占空比的情况下电机的驱动能力。 ⑥将光电管和舵机联合,编写程序测试转向情况。 ⑦编写测试程序让小车初步运行。
⑧反复测试各参数变化对小车的影响,找出最有效的配置。
⑨对小车运行过程中各种可能出现的情况进行测试,发现问题、找出解决方法。 ⑩整理数据,优化算法和程序设计。