收藏 分销(赏)

自循迹小车论文.doc

上传人:xrp****65 文档编号:7032343 上传时间:2024-12-25 格式:DOC 页数:32 大小:397.73KB 下载积分:10 金币
下载 相关 举报
自循迹小车论文.doc_第1页
第1页 / 共32页
自循迹小车论文.doc_第2页
第2页 / 共32页


点击查看更多>>
资源描述
2012年福建省大学生电子设计竞赛 自平衡小车(D题) 【本科组】 2012年9月8日 自平衡小车设计报告 摘要:本设计是基于STC12C5A60S2单片机的自平衡小车的设计与实现,小车完成的基本要求是三轮着地,可沿引导线逆时针方向运行一周,有加速减速,循迹的功能。发挥部分为两轮直立沿引导线逆时针方向运行一周。其中循迹用光电传感器(ST178)模块电路来完成,小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制,直立平衡由9轴气压指南针模块电路完成。 关键字:STC12C5A60S2 L298N ST178 自动循迹 直立自平衡循迹 Summary: This design is based on STC12C5A60S2 SCM self balancing design and realization of the car, the car finish are basic requirements of the three touchdown, can guide the line along the counter clockwise operation week, accelerated speed, tracking function. Play a part in two wheel upright along the guide line counterclockwise running a week. The trace using photoelectric sensor (ST178) module circuit to complete, the car driven by L298N drive circuit completed, speed by single-chip microcomputer output PWM wave to control, vertical balance by 9 axis pressure compass module circuit finish. Key words: STC12C5A60S2 L298N ST178 automatic tracking upright self balancing trace 一、任务与要求: 1 1.1基本要求: 2 1.2发挥部分: 2 二、系统方案设计: 3 2.1系统总体方案设计: 3 2.2小车系统硬件设计与比较: 4 三、硬件电路设计: 6 3.1单片机最小系统的设计: 6 3.2 光电传感循迹模块的设计: 6 3.3电机驱动模块的设计: 7 四、软件设计: 9 4.1程序总统设计说明: 9 4.2 PWM控制: 9 4.3总体软件流程图: 10 4.3小车循迹,加速,减速流程图: 11 4.4中断程序流程图: 12 4.4系统程序: 12 五、测试方法与测试结果: 13 5.1 测试方案与测试条件: 13 5.2 测试结果完整性: 13 六、结束语: 14 七、参考文献: 15 八、附录: 16 28 一、任务与要求: 设计并制作一个自平衡小车。两轮驱动、一轮为万向轮,如图1所示。车体重心必须在驱动轮轴与万向轮之间,小车可以按图3的所场地运行一周。 图1 小车结构示意 图2 小车直立状态示意 图3 场地示意图 1.1基本要求: (1)三轮着地,万向轮在前,可沿引导线逆时针方向运行一周,全程时间不超过3分钟。 (2)引导线的A、B点之间为加速区,B、C区为减速区,车速应有明显变化(时间比约1:2)。 (3)D、E两点为引导线断开区域,小车经过D点时能正常运行,并能寻迹至E点后继续行驶。 (4)E点到F点区域必须按S形路线行驶。 1.2发挥部分: (1) 由人手持小车为直立状态(两轮着地)开始保持平衡,放手后沿引导线逆时针方向运行一周。 (2) (2)(3)(4)项与基本要求的(2)(3)(4)一致。 (5)其他创新功能。 二、系统方案设计: 2.1系统总体方案设计: 我们将系统分为电机驱动模块、小车控制模块、红外对管(ST178)循迹模块以及9轴气压指南针模块这四大模块。 方案一: 系统方块图如下: 光电传感 ST178 STC12C5A60S2 L298N 模块 直流电机 串口下载 方案二: 系统方块图如下: 采用摄像头,然后用CCD处理技术,对采集的信号进行分析 STC12C5A60S2 L298N 模块 步进电机 串口下载 鉴于该小车的功能与使用内存要求较高,为了制作的成本与方便,因此,选择方案一。 2.2小车系统硬件设计与比较: 2.2.1单片机芯片的比较与选择 方案一: 用STC89C52作为小车的主控制芯片,可以完成基本部分,可是其I/O的输入输出功能不大强,存在一定的局限性,较难扩展功能。 方案二: 用STC12C5A60S2作为小车的主控制芯片,该芯片有足够的存储,可以方便下载程序到该芯片,能够满足该系统软件的需要,该芯片提供了足够的计时器中断,采用该芯片可以比较灵活的选择各个模块控制芯片,能够准确的计算出时间,有很好的实时性。 基于以上分析,选择了方案二,采用STC12C5A60S2作为小车的主控制芯片。 2.2.2 电机的比较与选择 方案一: 采用步进电机作为该系统的驱动电机。由于其转过的角度可以精确的定位,可以实现小车的前进路程和位置的精确定位,虽然采用步进电机有诸多优点,步进电机的输出力矩较低,随转速的升高而下降,且在较高转速时会几句下降,不适用与小车等一定速度要求的系统。 方案二: 采用直流电机作为该系统的驱动电机直流电机的控制方法比较简单,只需要电机的两根控制线加上适当的电压即可使电机转动起来,。电压越高则电机转速越快。对于直流电机的速度调节,可以采用改变电压的方法,也可采用PWM调速方法。PWM调速就是使加在直流电机两端的电压为方波形式,通过改变方波的占空比实现对电机转速的调节。。 基于以上的分析,选择方案二,采用直流电机作为该系统的驱动电机。 2.2.3电机控制模块的比较与选择 方案一: 采有SM6135W电机遥控驱动模块控制直流电机,SW6135W是专为遥控车设计的大规模集成电路,能实现前进、后退、向右、向左、加速五个功能,但是其采用的是编码输入控制,而不是电平控制,这样在程序中实现比较麻烦,而且该电机模块价格比较高。 方案二: 采有L298N芯片控制直流电机。L298N为单块集成电路,高电压,高电流 ,四通道驱动,可直接读一电机进行控制。通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,非常方便。 基于以上分析,选择了方案二,采用L298N控制直流电机作为小车的电机控制模块。 2.2.4 红外避线模块的比较与选择 方案一: 采用通过5个红外光电开关传感器ST178对信号进行采集,采集到的信号经比较器LM339处理后传给STC12C5410AD单片机,经单片机处理后,发出控制命令给L298N,驱动2台直流电动机进行相应的动作.。但是,由于其还有用上拉电阻和其精度高不利于调节,导致比较繁琐和成本相对比较高,因此,不宜使用。 方案二: 采用通过5个红外光电开关传感器ST178对信号进行采集,采集到的信号经比较器LM324处理后传给STC12C5410AD单片机,经单片机处理后,发出控制命令给L298N,驱动2台直流电动机进行相应的动作。其相比于LM329,精度比较适中,利于调节,而且成本低。因此。比较适宜使用。 基于以上分析,选择了方案二。 2.2.5电源的比较与选择 方案一: 采用实验室有线电源通过稳压芯片供电,其优点是可稳定的提供5V电压,但占用资源过大,并且不符合要求。 方案二: 采用3支1.5V电池单电源供电和采用3节3.7V的电池单电源供电,满足该小车题目的要求。 由于题目的要求,小车不得外接电源,只能采用电池供电。故电源选择方案二。 三、硬件电路设计: 3.1单片机最小系统的设计: 小车采用STC12C5A60S2单片机作为主控制芯片,图3.1.1是其最小系统电路。主要包括:时钟电路、电源电路、复位电路、单片机工作指示灯电路以及滤波电路。其中各个部分的功能如下: 1、时钟电路:给单片机提供一个外接的12MHz的石英晶振。 2、电源电路:给单片机提供5V电源。 3、复位电路:在电压达到正常值时给单片机一个复位信号。 单片机最小系统如图3.1所示: 图3.1 单片机最小系统 3.2 光电传感循迹模块的设计: 采用通过5个红外光电开关传感器ST178对信号进行采集,采集到的信号经比较器LM324处理后传给STC12C5A60S2单片机,经单片机处理后,发出控制命令给L298N,驱动2台直流电动机进行转弯和加减速。其中用可调电阻来调节红外光电开关传感器ST178采集信号的距离。 光电传感器的模块电路如图3.2所示: 图3.2 光电传感器循迹模块 3.3电机驱动模块的设计: 电机驱动一般采用H桥式驱动电路,L298N内部集成了H桥式驱动电路,从而可以采用L298N电路来驱动电机。通过单片机给予L298N电路PWM信号来控制 小车的速度,起停。其引脚图如图3.3所示: 图3.3 L298N引脚 电机驱动模块的原理图如3.4所示。 图3.4电机驱动模块电路 四、软件设计: 4.1程序总统设计说明: 当光电传感器开始接受信号,通过比较器将信号传入单片机中。小车进入循迹模式,即开始不停地扫描与探测器连接的单片I/O 口,一旦检测到某个I/O 口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态。单片机采用T0定时计数器,通过来产生PWM波,控制电机转速。 4.2 PWM控制: 本系统采用PWM来调节直流电机的速度。PWM是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。 在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。因此,PWM又被称为“开关驱动装置”。 在脉冲作用下,当电机通电时,速度增加;电机断电时,速度逐渐减少。只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。 本系统中通过控制51单片机的定时器T0的初值,从而可以实现P0.4和P0.5输出口 输出不同占空比的脉冲波形。定时计数器若干时间(比如0.1ms)中断一次, 就使P0.4或P0.5产生一个高电平或低电平。 将直流电机的速度分为100个等级, 因此一个周期就有100个脉冲, 周期为100个脉冲的时间。速度等级对应一个周期的高电平脉冲的个数。占空比为高电平脉冲个数占一个周期总脉冲个数的百分数。一个周期加在电机两端的电压为脉冲高电压乘以占空比。占空比越大, 加在电机两端的电压越大, 电机转动越快。电机的平均速度等于在一定的占空比下电机的最大速度乘以占空比。当我们改变占空比时, 就可以得到不同的电机平均速度, 从而达到调速的目的。精确地讲, 平均速度与占空比并不是严格的线性关系, 在一般的应用中, 可以将其近似地看成线性关系。 4.3总体软件流程图: 小车进入寻迹模式后,即开始不停地扫描与探测器连接的单片I/O 口,一旦检测到某个I/O 口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态。软件的主程序流程图如图4-1所示: 开始 系统初始化 任务计数器归零 Y 是否完成本次 任务? Y 结束 N 是否完成本次 任务? 循迹子函数 图4.1 主程序流程图 4.3小车循迹,加速,减速流程图: 小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号,即进入判断处理程序,先确定5个探测器中的哪一个探测到了黑线,如果左面第一级传感器或者左面第二级传感器探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是右面第一级传感器或右面第二级传感器探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作。循迹流程图如图4-2所示: 启动循迹模式 继续前进 小车左转 循S形 S形标志 小车直行 分叉标志 断开区域 小车减速 减速标志 小车加速 加速标志 条件判断程序 是否检测到黑线? 探测黑线 图4.2 小车循迹流程图 4.4中断程序流程图: 这里利用的是51单片机的T0定时计数器,从而让单片机P0口的P0.4和P0.5引脚输出占空比不同的方波, 然后经驱动芯片放大后控制直流电机。定时计数器若干时间(比如0.1ms)比如中断一次, 就使P0.4或P0.5产生一个高电平或低电平。中断程序流程图如图4.3所示: 定时器赋初值 计数变量赋值t=0 计数值t<占空比? P0.4和P0.5 输出高电平 P0.4和P0.5 输出低电平 计数变量t加1 开始 结束 Y N 图4.3 中断流程图 4.4系统程序: 系统程序见附页4.4: 五、测试方法与测试结果: 5.1 测试方案与测试条件: 根据设计要求,需要先调节好光电传感器与车道间的距(5mm~10mm),然后测得光电传感器识别黑色线的信号,当检测到黑线时灯亮,白线时灯灭。需要的仪器有指针万用表和示波器。测量转弯路段的角度与距离,通过单片机PWM调制两端电机的转速。 5.2 测试结果完整性: 经过多次调节三轮着地小车的循迹直行、转弯、加速、减速时的左右轮的PWM值,使小车走得更加平稳。基本可以达到基本要求,但是离发挥部分要求还有很大的差距,由于时间原因及知识掌握不足的原因,发挥部分将在以后完成。 六、结束语: 本次电子大赛系统采用STC12C5A60S2单片机对直流电机进行控制,通过I/O口输出的脉冲作为直流电机的控制信号,同时采用光电传感器检测黑线,再由STC12C5A60S2做出判断,选择正确路线。 这次设计我学到了直流电机、光电传感器、C51语言和仿真软件的使用,更重要的是学会了独立发现问题,解决问题,独立思考的好习惯。 本次设计基本完成了规定的基本要求,发挥部分两轮直立自平衡没有完成,这部分的内容将在日后完成。 七、参考文献: [1] 华成英,童诗白.模拟电子技术基础(第四版)[M].北京:高等教育出版1980.9. [2] 余成波,胡新宇,赵勇.传感器与自动检测技术[M].北京:高等教育出版社,2004.2. [3] 苏家健,曹柏荣等单片机原理及应用技术. [4] 谭浩强. C程序设计(第二版)[M]. 北京:清华大学出版社,1999.12. [5] 王晶,翁显耀,梁业宗 自动寻迹小车的传感器模块设计.武汉理工大学自动化学院 湖北武汉  [6] 刘迎春. 传感器原理设计与应用[M] . 长沙:国防科技大学出版社,1992. 八、附录: 程序: #include<reg51.h> #define uchar unsigned char #define uint unsigned int unsigned char zkb1=0 ; unsigned char zkb2=0 ; unsigned char t=0; unsigned char i,j; sbit out1=P2^0; sbit out2=P2^1; sbit out3=P2^2; sbit out4=P2^3; sbit out5=P2^4; sbit in1=P0^0; sbit in2=P0^1; sbit in3=P0^2; sbit in4=P0^3; sbit en1=P0^4; sbit en2=P0^5; void init() { TMOD=0X01; TH0=(65536-100)/256; TL0=(65536-100)%256; EA=1; ET0=1; TR0=1; en1=1; en2=1; } void time0(void)interrupt 1 { i++; j++; if(i<=zkb1) {en1=1;} else en1=0; if(i==50) {en1=~en1;i=0;} if(j<=zkb2) {en2=1;} else en2=0; if(j==50) {en2=~en2;j=0;} TH0=(65536-100)/256; TL0=(65536-100)%256;} void delay(uint a) { uchar t; while(--a!=0) { for(t=0;t<250;t++); } } //******************直行******************// void qianjin1() //正常速度 { zkb1=19; zkb2=15; } //******************直行******************// void qianjin2() //加速 { zkb1=35; zkb2=35; } void qianjin3() //减速 { zkb1=15; zkb2=13; } void qianjin4() { zkb1=13; zkb2=11; } //***************小左转函数***************// void turn_left1() { zkb1=6; zkb2=15; } //***************大左转函数***************// void turn_left2() { zkb1=0; zkb2=15; } //***************大左转函数***************// void turn_left3() { zkb1=0; zkb2=30; } //***************xiao左转函数***************// void turn_left4() { zkb1=2; zkb2=12; } //***************小右转函数***************// void turn_right4() { zkb1=14; zkb2=0; } //***************小右转函数***************// void turn_right1() { zkb1=15; zkb2=6; } //***************大右转函数***************// void turn_right2() { zkb1=15; zkb2=0; } void turn_right3() { zkb1=30; zkb2=0; } //*********************停止函数***************// void stop() { zkb1=0; zkb2=0; } ///循迹******************//////////////// void xunji(void) { if((out1==1&&out2==1&&out3==0&&out4==1&&out5==1)||(out1==1&&out2==1&&out3==1&&out4==1&&out5==1)) { qianjin1(); } if(out3==1) { while(out3==1)//要是中间的一直都有信号表示没找到黑线 则继续寻找 { if(out1==1&&out2==1&&out3==1&&out4==0&&out5==1)//小车向左偏,右转 { while(out3==1) { turn_right1(); } } else if(out1==1&&out2==0&&out3==1&&out4==1&&out5==1) //小车向右偏,左转 { while(out3==1) { turn_left1(); } } else if(out1==0&&out2==1&&out3==1&&out4==1&&out5==1) // 小车大右偏,大左转 { while(out3==1) { turn_left2(); } } else if(out1==1&&out2==1&&out3==1&&out4==1&&out5==0) // 小车大左偏,大右转 { while(out3==1) { turn_right2(); } } } } } ///循迹******************//////////////// void xunji1(void) { if(out1==1&&out2==1&&out3==0&&out4==1&&out5==1) { qianjin4(); } if(out3==1) { while(out3==1)//要是中间的一直都有信号表示没找到黑线 则继续寻找 { if(out1==1&&out2==1&&out3==1&&out4==0&&out5==1)//小车向左偏,右转 { while(out3==1) { turn_right4(); } } else if(out1==1&&out2==0&&out3==1&&out4==1&&out5==1) //小车向右偏,左转 { while(out3==1) { turn_left4(); } } else if(out1==0&&out2==1&&out3==1&&out4==1&&out5==1) // 小车大右偏,大左转 { while(out3==1) { turn_left4(); } } else if(out1==1&&out2==1&&out3==1&&out4==1&&out5==0) // 小车大左偏,大右转 { while(out3==1) { turn_right4(); } } } } } //************加速循迹**********// void jiasu() { if(out3==0) { qianjin2(); } else if(out3==1) { while(out3==1)//要是中间的一直都有信号表示没找到黑线 则继续寻找 { if(out1==1&&out2==1&&out3==1&&out4==0&&out5==1)//小车向左偏,右转 { while(out3==1) { turn_right1(); } } else if(out1==1&&out2==0&&out3==1&&out4==1&&out5==1) //小车向右偏,左转 { while(out3==1) { turn_left1(); } } else if(out1==0&&out2==1&&out3==1&&out4==1&&out5==1) // 小车大右偏,大左转 { while(out3==1) { turn_left2(); } } else if(out1==1&&out2==1&&out3==1&&out4==1&&out5==0) // 小车大左偏,大右转 { while(out3==1) { turn_right2(); } } } } } //***********减速循迹***********************// void jiansu() { if(out3==0) {qianjin3();} else if(out3==1) { while(out3==1)//要是中间的一直都有信号表示没找到黑线 则继续寻找 { if(out1==1&&out2==1&&out3==1&&out4==0&&out5==1)//小车向左偏,右转 { while(out3==1) { turn_right1(); } } else if(out1==1&&out2==0&&out3==1&&out4==1&&out5==1) //小车向右偏,左转 { while(out3==1) { turn_left1(); } } else if(out1==0&&out2==1&&out3==1&&out4==1&&out5==1) // 小车大右偏,大左转 { while(out3==1) { turn_left2(); } } else if(out1==1&&out2==1&&out3==1&&out4==1&&out5==0) // 小车大左偏,大右转 { while(out3==1) { turn_right2(); } } } } } //***************主函数*******************// void main() { init(); zkb1=19; zkb2=15; while(1) { in1=1; //******给电机加电启动******// in2=0; in3=1; in4=0; en1=1; en2=1; while(1) { while((!(out1==0&&out2==0&&out3==0&&out4==0&&out5==0))&&(!(out1==0&&out2==0&&out3==1&&out4==0&&out5==0)) &&(!(out1==0&&out2==0&&out3==0&&out4==0&&out5==1))&&(!(out1==1&&out2==0&&out3==0&&out4==0&&out5==0)) &&(!(out1==0&&out2==0&&out3==0&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==0&&out5==0)) &&(!(out1==0&&out2==0&&out3==1&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==1&&out4==0&&out5==0)) &&(!(out1==0&&out2==1&&out3==0&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==1&&out5==0)) &&(!(out1==0&&out2==1&&out3==1&&out4==0&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==0&&out5==1)) &&(!(out1==0&&out2==0&&out3==1&&out4==0&&out5==1))&&(!(out1==1&&out2==0&&out3==1&&out4==0&&out5==0))) { xunji(); //第一阶段循迹// } delay(50); stop(); delay(200); //第一次检测跳出循迹变加速// jiasu(); delay(50); //while((!(out1==0&&out2==0&&out3==0&&out4==0&&out5==0))&&(!(out1==0&&out2==0&&out3==1&&out4==0&&out5==0))&&(!(out1==0&&out2==0&&out3==0&&out4==0&&out5==1))&&(!(out1==1&&out2==0&&out3==0&&out4==0&&out5==0))&&(!(out1==0&&out2==0&&out3==0&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==0&&out5==0))&&(!(out1==0&&out2==0&&out3==1&&out4==0&&out5==1))&&(!(out1==1&&out2==0&&out3==1&&out4==0&&out5==0))) while((!(out1==0&&out2==0&&out3==0&&out4==0&&out5==0))&&(!(out1==0&&out2==0&&out3==1&&out4==0&&out5==0)) &&(!(out1==0&&out2==0&&out3==0&&out4==0&&out5==1))&&(!(out1==1&&out2==0&&out3==0&&out4==0&&out5==0)) &&(!(out1==0&&out2==0&&out3==0&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==0&&out5==0)) &&(!(out1==0&&out2==0&&out3==1&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==1&&out4==0&&out5==0)) &&(!(out1==0&&out2==1&&out3==0&&out4==1&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==1&&out5==0)) &&(!(out1==0&&out2==1&&out3==1&&out4==0&&out5==1))&&(!(out1==1&&out2==1&&out3==0&&out4==0&&out5==1)) &&(!(out1==0&&ou
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服