您好,欢迎来到爱站旅游。
搜索
您的当前位置:首页单片机课程设计报告

单片机课程设计报告

来源:爱站旅游


单片机课程设计报告

智能机器小车设计说明书

参赛队员: 孙金林

周扬 龚彦中

二零一五年一月

1

目录

一、题目分析

....................................................................................................................3 二、硬件设计

....................................................................................................................4 三、控制算法

....................................................................................................................7 四、程序流程

..................................................................................................................8 五、程序代码

..................................................................................................................9 六、控制效果及结果分析

..................................................................................................................13 七、心得体会

..................................................................................................................14

2

一、题目分析

任务涉及:

机器人小车巡航(跟踪条纹等);

无条纹区动作:触觉(利用胡须)避障,走转90度,停2秒,直行约15厘米(或引导检测到条纹),再停2秒;

全程要设计信号灯指示工作状态。

1.1.小车巡航(跟踪条纹等)

小车巡航任务为本次课程设计的核心,即搭建的一个路径并编程使机器人沿着该路径无差错运动。

路径中每个条纹带是由三条1/4英寸宽的聚乙烯绝缘带边对边并行放置在白色招贴板上组成的,绝缘带条纹之间不能漏出白色板。图1-1为大致的实验任务图。

图1-1

明确实验任务后,分析已有传感器我们选择使用红外探测发射与接收管作为小车巡航任务的核心传感器。红外线二极管发射红外光,如果机器人前面有障碍物,红外线从物体反射回来,相当于机器人眼睛的红外检测(接收)器,检测到反射回的红外光线,并发出信号来表明检测到从物体反射回红外线。接收器的输出接到单片机的IO口上,51单片机基于这个传感器的输入作出相应控制以实现小车巡航。

IR传感器在此应用用有着非常大的便利性,红外线(IR)接收/检测器有内置的光滤波器,除了需要检测的980 nm波长的红外线外,它几乎不允许其它光通过。红外检测器还有一个电子滤波器,它只允许大约38.5 kHz 的电信号通过。换句话说,检测器只寻找每秒闪烁38,500次的红外光。这就防止了普通光源象太阳光和室内光对IR的干涉。太阳光是直流干涉(0Hz)源,而室内光依赖于所在区域的主电源,闪烁频率接近100或120 Hz。由于120 Hz在电子滤波器的38.5 kHz通带频率之外,它完全被IR探测器忽略。

1.2.无条纹区动作

无条纹区动作可以拆解为几个分动作,触觉(利用胡须)避障,左转90度,停2秒,直行约15厘米(或引导检测到条纹),再停2秒。

首先是触觉避障,也就是在机器人小车上安装有“胡须”,当小车前行过程

3

中遇到障碍物时,会首先触及到小车前的胡须,一旦触及小车的胡须,小车就会启动后退并左右转弯之类的控制,实现避障功能。

而在该任务里要求的也就是触及胡须之后的一系列逻辑行为,首先是左转90度,即调用左转程序,调节延时时间已实现90度的控制;接着就是停2秒,也就是调用延时函数,参数给2秒;然后是直行约15cm,即调用直行函数,具体行走距离也是延时函数的参数问题,根据行走的实际情况,开环调节参数使得行走距离大约15cm;最后又是一段延时函数,使小车停2秒。

1.3.设计信号灯指示工作状态

指示灯的主要作用就是一个人机交互的过程,让使用者能够从一些直观的器件中了解机器目前的工作状态,这里我们使用信号指示灯来指示小车的工作状态。即使用左右两个LED来表明现阶段单片机根据检测得到的信号作出的逻辑判断。当左边的IR检测器检测不到信号(即小车左边在黑线上)即让左边的小灯亮,当右边的IR检测器检测不到信号(即小车右边在黑线上)即让右边的小灯亮。这样便存在了4种情况,左边亮,右边亮,左右同时亮,左右同时灭,即指示小车右偏,小车左偏,小车在黑线上,小车在黑线外。

添加信号灯不仅仅能够使得观看者有一个直观感受,而且在调试的过程中有非常大的用处,可以让开发者清楚得看出来逻辑上需要改进的地方。

二、硬件设计

硬件设计主要由IR发射器与接收器电路、触觉感应(“胡须”)电路、LED信号指示灯电路组成。

2.1.IR发射器与接收器电路

IR发射器与接收器在电路上是分立的,它们之间没有直接的电路连接关系,它们的连接关系是建立在红外光信号的基础上的。图2-1是连接好后的实物物理连接图,图2-2是电路连接图。

图2-1 R发射接收管物理连接图

4

图2-2 IR发射接收管电路图

从图2-2我们可以清晰得看到电路的连接关系,IR发射管正极经470R电阻连接到VCC,负极接到9013三极管的c极,9013的三极管b级经470R电阻接到单片机IO口左边接到P1.3,右边接到P3.6,e极直接接地。而IR接收管1号管脚接VCC,2号接GND,3号接IO口,左边的接收管接P1.2,右边接P3.5。

这里我们要特别提及IR发射管与VCC之间的电阻阻值,这个阻值并不是定制470R,需要我们根据硬件结构来做一些调整,阻值越大,IR发射接收管的可视范围就越小。为了调试的方便,我们最后选择使用可调电位器代替470R的定值电阻,通过调节电位器的阻值调节可视范围。

2.2.触觉感应(“胡须”)电路

每条胡须都是一个机械式的、接地常开的开关。胡须接地(GND)是因为教学板外围的镀金孔都连接到GND。金属支架和螺丝钉提供电气连接给胡须。

通过编程让单片机探测什么时候胡须被触动。

图2-3 “胡须”物理连接简图

5

图2-4 “胡须”电路图

由图2-4可知,由两组排针作为与胡须连接或断开的的端口,两组排针经220R电阻连接到单片机IO口上,左排针连接到P2.3,右排针连接到P1.4,并且排针口都需要经10K上拉电阻接到VCC。这样的连接关系使得IO口默认是高电平,只有当胡须接触到排针时,IO口变为低电平。

连接到每个胡须电路的I/O引脚监视着10K上拉电阻上的电压变化。当胡须没有被触动,连接胡须的I/O管脚的电压是5V,而当胡须被触动时,I/O短接到胡须(GND),所以I/O管脚的电压是0V 。根据IO口电平信号的变化单片机就能实时作出反应,对本次智能小车而言,也就是根据胡须电路作出避障的功能模块。 2.3.LED信号指示灯电路

LED信号指示灯主要起到显示单片机此时的逻辑判断状态的作用,它的显示由单片机控制,电路图如图2-5所示。

VCC1KP2.1

左指示灯VCC1KP1.7右指示灯

图2-5 LED信号指示灯电路

由图2-5可以清晰地看到指示灯的正极经上拉接到VCC,51的IO缺省为高电平,只有当IO给低电平时指示灯亮,IO给高电平时指示灯灭。

6

三、控制算法

对于小车跟踪条纹巡航部分程序主要是逻辑算法以及一些滤波算法,控制算法部分涉及不多。

对于逻辑,就是一些条件判断。对于巡航部分,当左边IR接收器接收到信号而右边没有接收到信号,说明小车在左偏,应该让小车右转;当左边IR没有接收到信号而右边接收到信号,说明小车在右偏,应该让小车左转;当两个IR接收器都没有收到信号,说明小车就在黑线上,小车应该直行;当两个IR接收器都能接收到信号时说明小车已经不在黑线上了,这时代表小车已经走到了路线尽头,我们让电机停止转动。

对于胡须避障部分,如果左边胡须触碰障碍,与左边相连的IO为低电平,小车右转;如果右边胡须触碰障碍,与右边相连的IO为低电平,小车左转。

在调试过程中我们发现,由于传感器自身存在一些缺陷或者是面包板搭建电路存在的电路稳定性差的问题,我们的小车在测试过程中有时会出现反应过激之类的不稳定控制情况。为了排除这些情况,我们在程序的逻辑判断部分加入软件滤波,多次测试取概率最大情况为最种决策依据。后来经改进我们发现可以使用类似单片机按键程序中的消抖算法来实现滤波,可以在判断之后加一小段延时后再次判断,如果两次判断结果相同则执行,若不同则继续执行上一步的判断逻辑。调试后小车系统行走过程平稳性明显提高。

7

四、程序流程 初始化直行左胡须遇障Y右转直行NY右胡须遇障左转NIR发射与接收同时检测到信号P1.2==0且P3.5==0NY延时10ms同时检测到信号P1.2==0且P3.5==0Y停止N左边检测到,右边没有P1.2==0且P3.5==1Y右转N右边检测到,左边没有P1.2==1且P3.5==0Y左转N同时检测不到信号P1.2==1且P3.5==1Y直行

8

五、程序代码

程序片段1:封装好的主程序与宏定义 #include

#define LeftIR P1_2 //左边红外接收连接到P1_2 #define RightIR P3_5 //右边红外接收连接到P3_5 #define LeftLaunch P1_3 //左边红外发射连接到P1_3 #define RightLaunch P3_6 //右边红外发射连接到P3_6 #define LED_L P2_1 #define LED_R P1_7

void main(void) {

int irDetectLeft,irDetectRight; uart_Init();

printf(\"Program Running!\\n\"); Forward(); while(1) {

if(P2_3state()==0) {

left_avoid(); }

else if(P1_4state()==0) {

right_avoid(); } IRLaunch('R'); //右边发射 irDetectRight = RightIR;//右边接收 IRLaunch('L'); //左边发射 irDetectLeft = LeftIR;//左边接收

if((irDetectLeft==0)&&(irDetectRight==0)) {

delay_nms(10);

if((irDetectLeft==0)&&(irDetectRight==0)) {

stop(); LED_L=1; LED_R=1; }

}

9

else if((irDetectLeft==0)) { LED_L=1; LED_R=0;

Right_Turn(); }

else if((irDetectRight==0)) { LED_L=0; LED_R=1; Left_Turn(); } else {

Forward(); LED_L=0; LED_R=0; } } }

程序片段2:子函数的封装 int P1_4state(void) {

return (P1&0x10)?1:0; }

int P2_3state(void) {

return (P2&0x08)?1:0; }

void IRLaunch(unsigned char IR) {

int counter; if(IR=='L')

for(counter=0;counter<38;counter++) {

LeftLaunch=1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LeftLaunch=0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

10

}

if(IR=='R')

for(counter=0;counter<38;counter++)//右边发射 {

RightLaunch=1;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0;

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }

void Forward(void)//向前行走子程序 {

P1_1=1;

delay_nus(1650); P1_1=0; P1_0=1;

delay_nus(1350); P1_0=0;

delay_nms(20); }

void stop(void)//stop子程序 {

P1_1=1;

delay_nus(1500); P1_1=0; P1_0=1;

delay_nus(1500); P1_0=0;

delay_nms(20); }

void Left_Turn(void)//左转子程序 {

P1_1=1;

delay_nus(1550); // left P1_1=0; P1_0=1;

delay_nus(1350); P1_0=0;

delay_nms(20); }

void Right_Turn(void)//右转子程序 {

11

P1_1=1;

delay_nus(1650); P1_1=0; P1_0=1;

delay_nus(1450); P1_0=0;

delay_nms(20); }

void Backward(void)//向后行走子程序 {

int i;

for( i=1;i<=65;i++) {

P1_1=1;

delay_nus(1300); P1_1=0; P1_0=1;

delay_nus(1700); P1_0=0;

delay_nms(20); } }

void left_avoid(void) {

int i;

for( i=1;i<=26;i++) {

P1_1=1;

delay_nus(1430); P1_1=0; P1_0=1;

delay_nus(1430); P1_0=0;

delay_nms(20); }

delay_nms(2000); for( i=1;i<=60;i++) {

P1_1=1;

delay_nus(10); P1_1=0; P1_0=1;

delay_nus(1458);

12

P1_0=0;

delay_nms(20); }

delay_nms(2000); }

void right_avoid(void) {

int i;

for( i=1;i<=35;i++) {

P1_1=1;

delay_nus(1550); P1_1=0; P1_0=1;

delay_nus(1550); P1_0=0;

delay_nms(20); }

delay_nms(2000); for( i=1;i<=60;i++) {

P1_1=1;

delay_nus(10); P1_1=0; P1_0=1;

delay_nus(1458); P1_0=0;

delay_nms(20); }

delay_nms(2000); }

六、控制效果及结果分析

经过几天的调试,我们最后的控制效果还是不错的,小车巡航的整个运动很流畅,胡须避障也是控制得比较稳定。最后我们测试结果是整个运动过程花了16秒,包括其中暂停的2秒,运动速度与调整速度都能满足当初的设想。

调试过程中出现很多问题,但来源基本就两个,一个是单片机的程序逻辑错误,一个是传感器的电路故障与误差信号。对于逻辑错误最好要结合小车的控制过程来查错,易发现逻辑错误;而对于传感器问题,一般是电路连接错误与短路,这些错误可能还会导致元件被烧坏。应该在保证传感器与电路没有问题的情况下去调程序存在的一些逻辑错误。

13

从控制结果来看的话,智能小车的运动完全受控于单片机,极少出现控制失误。

七 心得体会

这学期刚学完单片机,理论知识已经掌握,要开始做实物了,有点兴奋。毕竟学芯片,不是为了考试,而是真真正正做实物,能做出东西来,才表明正真懂了单片机,正真知道它的I/O口,它的定时器,计数器,以及程序的编写。特别是将程序烧进去,正真的让机器动起来,还是很兴奋的,当然很直接的一个问题就是理论不等于实际,这也让我感觉,这次课程设计最重要的,是调试,怎样才能使硬件和程序完美的配合,要我们不断的调试,不能拿别人的程序直接来用,需要自己真正的懂,理解,才能调试出比较好的效果。

这次我们课程设计是做小车,龙人宝贝,刚拿到手很兴奋,还会猜想会不会很难做什么的,打开后看见,我们的主要工作是,搭硬件和软件的调试,一开始困难还是比较大的,无从下手,得慢慢看说明书,特别是面包板,太小,要把电路全搭好,而且不短路什么的,还是比较困难,要合理分配面包板的插孔,线尽量还得用黑胶带包起来,防止短路,这是硬件,软件方面就是在教程程序的基础上,尽量看懂,研究每一步程序是干嘛的,这样在后面的调试中,才有利于我们修改程序。

不过通过这次课程设计,收获也是蛮多的,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在其他同学的帮助下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了单片机各个端口的识别和测试;熟悉了电路的搭建方法;了解了通过程序控制小车的方法;以及如何提高小车性能等等。

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这几天,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能正真的提高自己

14

的实际动手能力和思考的能力。具体就龙人宝贝而言,单片机的接口功能算是理论,调试才是关键,想要小车跑的好,慢慢的调试才能达到效果,最后想说的是,谢谢我的队友们,这次分工还是不错的,没有出现,光是一个人做,其他人看的现象。大家一起做,群策群力,虽然困难很多,但是终究被我们解决

15

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务