华南赛区光电组厦门理工学院飓风队技术报告.docx
《华南赛区光电组厦门理工学院飓风队技术报告.docx》由会员分享,可在线阅读,更多相关《华南赛区光电组厦门理工学院飓风队技术报告.docx(20页珍藏版)》请在冰豆网上搜索。
华南赛区光电组厦门理工学院飓风队技术报告
第九届“飞思卡尔”杯全国大学生智能汽车竞赛
技术报告
学校:
厦门理工学院
队伍名称:
飓风队
参赛队员:
蔡勇
谢少伟
连董
带队老师:
周承仙
温玄
关于技术报告和研究论文使用授权的说明
本人完全了解第九届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:
参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日期:
摘要
本文介绍了智能小车设计和制作过程中出现的问题及解决方案,包括小车的软硬件设计和程序设计流程。
本设计以现有车模底盘为基础,通过在底盘上安装舵机、电机、CCD传感器、电路板等达到控制小车所需的基本要求。
实际操作中CCD传感器依靠光感原件采集单条路面信息并结合程序算法分析出道路的中心点与当前车身的偏差,随后通过PWM控制舵机的打角及电机的加减速。
在控制电机的方法上采用了PID闭环控制使电机能较为准确且快速的达到预期的转速。
电机驱动采用自行搭建的MOS管使电机的加减速更加的明显,而且耐压值更高。
经过不断的优化程序和改进机械结构后,小车能按规定路径行进,通过稍微变动参数后能快速适应不同跑道。
关键词:
智能小车;舵机;传感器;PID;闭环控制;
3.1电源模块5
3.2电机驱动模块5
第一章引言
智能车辆是一种集计算机、传感器、信息、自动控制及人工智能等多方面科学领域于一体的综合产物。
在军事、民用及科学研究上,智能车辆已逐步得到推广应用,它为未来道路方面实现智能化、自动化提供了一种新途径。
随着汽车工业的迅速发展,关于汽车的研究也越来越受人关注。
各类大型电子技术竞赛多次出现关于智能小车的题目,全国高校也都非常重视该课题的研究,许多大学生更是乐此不疲的投入到智能小车的制作中。
“飞思卡尔杯”全国大学生智能汽车竞赛是教育部高等学校自动化专业教学指导分委员会主办的一项大型竞赛,内容涵盖了控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科的知识。
这份报告详细的阐述了我们小组对于车模整体设计方案、机械改造、硬件设计、路径识别算法、车辆参数等方面的内容。
第二章车模机械结构的调整
2.1舵机的安装
舵机安装直接影响到转向问题。
如果舵机调整不到位,将很大程度上限制转向角度和转向灵敏度。
车模原始舵机被安放在了车模中心,为了空间的合理利用,我们把舵机转移到了两前轮之间,为小车主板留出了一定的空间。
由于舵机原始只有一个扭转点,存在一定的虚位,我们将其改装成两个扭转点,很好的解决了舵机存在虚位的问题。
我们还垫高了舵机,加长了舵机转动半径,使舵机转向更轻盈、灵巧。
最终舵机安装如图2.1.
图2.1舵机安装
2.2前轮定位和调整
对于汽车而言,要保持车辆直线行驶的稳定性,使之转弯自动回正、转向轻便,必须确定车轮定位参数,包括主销后倾和前轮前束。
主销后倾:
主销后倾角在车轮偏转后形成一回正力矩,阻碍车轮偏转。
主销后倾角越大,车速愈高,车轮偏转后自动回正力越强,但回正力矩过大,将会引起前轮回正过猛,加速前轮摆振,并使转向沉重。
通常后倾角为1°~3°,如图2.2所示。
图2.2主销后倾
前轮前束:
俯视车轮,汽车的两个前轮的旋转平面并不完全平行,而是稍微带一些角度,这种现象称为前轮前束。
车轮前束的作用是减轻或消除因前轮外倾角所造成的不良后果,二者相互协调,保证前轮在汽车行驶中滚动而无滑动。
前轮前束一般为0~12mm。
而现代汽车的前轮外倾角出现减小甚至为负值的趋势,前轮前束也应相应减小甚至也为负值,如图2.3所示。
图2.3前轮前束
提高小车行驶时的转向回正力,可以通过改变主销后倾角和车轮前束。
我们使用的B车模车轮和主销是平行的,将其调成了零度角左右,适当的正前束以提高小车连续转向的反应能力。
2.3CCD的安装
CCD的安装位置及高度影响了小车所能识别的路径范围。
如果CCD安装过低CCD所需的仰角必须很大才能保证前瞻,而且容易受到反光的干扰。
安装过高容易受小车行驶时产生的抖动影响到CCD图像使图像出错,但可以减少反光的影响和坡道的通过率。
因此我们在综合了利弊后我们选取了适当的高度和前瞻,确保了小车能较早的识别到前方的赛道信息。
2.4编码器的安装
由于采用B型车,因此编码器的安装位置都大同小异。
因此主要的差别提现在编码器齿轮的咬合,好的咬合度能使电机开动后声音较为低沉圆滑,咬合不好声音略显毛躁。
编码器的选取上我们选择500线的编码器,更大精度的编码器有利于我们更精确的对电机进行控制。
第三章小车硬件电路的设计
3.1电源模块
首先了解一下不同电源的特点,电源分为开关电源和线性电源,线性电源的电压反馈电路是工作在线性状态,开关电源是指用于电压调整的管子工作在饱和和截至区即开关状态的。
线性电源一般是将输出电压取样然后与参考电压送入比较电压放大器,此电压放大器的输出作为电压调整管的输入,用以控制调整管使其结电压随输入的变化而变化,从而调整其输出电压,但开关电源是通过改变调整管的开和关的时间即占空比来改变输出电压的。
从其主要特点上看:
线性电源技术很成熟,制作成本较低,可以达到很高的稳定度,波纹也很小,而且没有开关电源具有的干扰与噪音,开关电源效率高、损耗小、可以降压也可以升压,但是交流纹波稍大些。
电源模块对于一个控制系统来说极其重要,关系到整个系统是否能够正常工作,因此在设计控制系统时应选好合适的电源模块。
竞赛规则规定,比赛使用智能汽车竞赛统一配发的标准车模用7.2V2000mAhNi-cd供电,而单片机系统、路径识别的光电传感器、光电码编码器等均需要5V电源,伺服电机工作电压范围为4V到6V(我们采用lm29416V供电),直流电机可以使用7.2V2000mAhNi-cd蓄电池直接供电,智能汽车电压调节电路示例见图3.1。
图3.1电源管理模块原理图
5V电源模块用于传感器模块、S-D5等供电。
常用的电源有串联型线性稳压电源(LM2940、TPS系列、7805等)和开关型稳压电源(LM2596、LM2575、AS1015等)两大类。
前者具有纹波小、电路结构简单的优点,但是效率较低,功耗大;后者功耗小,效率高,电流大,但电路却比较复杂,电路的纹波大。
对于单片机,需要提供稳定的3.3V电源,我们则使用LM1117芯片。
3.2电机驱动模块
常用的电机驱动有两种方式:
一、采用集成电机驱动芯片;二、采用N沟道MOSFET和专用栅极驱动芯片设计。
3.2.1驱动芯片的选取
BTS7970:
其标称驱动电流最大可达68A,内阻为7至9毫欧,比MC33886高出一个数量级,其内阻小,功耗小,压降小。
因此我们最初方案使用的是两片BTS7970并联作为驱动芯片。
但是在后面的调试中,发现7970的发热量非常严重,甚至在会出现过热保护,小车停下的情况,后面我们试过使用四块7970,但是效果不甚明显,小车的驱动力不够,导致小车坡爬不上去。
因此最后我们痛下决心,换掉了驱动电路,改成使用四块MOSFET构成H桥的方式。
3.2.2MOS管驱动
四块MOSFET构成H桥的方式方式虽然发热仍然很严重,但是在上坡的驱动力却非常强劲,可以顺利通过坡道,而且因为MOSFET不会发生过热保护,所以小车也不会出现中途停下的情况,所以最后我们采用了此种方案,如图3.2所示
图3.2MOSFET驱动模块原理图
3.3起跑线检测模块
由于CCD的工作周期较长,我们决定采用6路光电管传感器(ST188)检测起跑线。
图3.3.1 ST188光电管内部结构图
工作原理:
当没有物体反射红外线时,ce之间截止,无电流流过,输出电压为电源电压,高电平。
当有物体反射红外线时,be饱和导通ce也就导通了,输出端就相当于接地。
输出电压为低电平
由于此电路在检测过程中会出现较大的死区电压,故我们可以适当的加上电压比较器做辅助电路,于此同时,也可以通过调节比较电压的大小改变ST188的测量灵敏度。
原理图如下
图3.3.2起跑线检测模块电路图
第四章小车软件设计
4.1传感器的驱动与信号的采集
4.1.1电机、舵机的驱动
本设计通过单片机自带的PWM模块发出方波信号控制电机及舵机,电机由PWM控制的H桥驱动,舵机直接5.5V电源供电。
由于S-D5舵机属于伺服电机,因此在舵机的信号端必须提供稳定的方波才能使舵机保持转角。
图4.1S-D5舵机参数
4.1.2CCD的采集
线阵CCD属于CCD摄像头的一种,只不过它只采集图像的一行,因此其采集信息少,曝光时间短。
线阵CCD只能区分出黑白两色,其他深色调也会被识别为黑色。
TSL1401CL线性传感器由128×1列光电二极管,内部集成了电荷放大器电路,以及像素数据保持功能,可同时集成启动和停止所有像素位。
该阵列由128个像素构成,每个像素点都有一个3524.3平方微米的光敏区域。
像素之间有8微米间距。
内部控制逻辑简化了芯片操作,只需要一个串行输入(SI)信号和一个时钟信号(CLK)就可以完成全部逻辑控制,读取AO口的电压就可以完成数据采集。
其工作原理是:
在光电二极管的能量冲击产生的光电流,这是由有源积分电路,与该象素相关的集成。
在积分周期期间,采样电容器连接到积分器的输出通过一个模拟切换。
在每个像素中累积的电荷的量是成正比的光强度和积分时间。
开发的模拟输出(AO)的电压由下式给出:
Vout=Vdrk+(Re)(Ee)(Tint)(4.1)
其中:
Vout是为白色状态的拟输出电压,Vdrk是黑暗条件下的模拟输出电压,Re是器件的响应性,对于一个给定的光的波长在V/(μJ/厘米2),Ee是μW/平方厘米的入射辐的Tint为积分时间,以秒为单位,下面图4.2是TSL1401CL线性传感器操作时序图:
图4.2CCD采集时序
在准确的时序输出后,传感器处于曝光时间,当达到自己所设定的曝光时间后传感器会将采集到的数据通过A0口输出,此时需要利用单片机的AD口将模拟信号转化为数字信号。
为了方便查看采集的数据是否准确,我们利用串口将采集到的数据发送给上位机查看。
图4.3上位机数据
4.2赛道信息的识别
4.2.1二值化处理
线性CCD采集到的值是128个像素的电压值,CCD能监测都整个赛道边沿,由于赛道两边是黑色中间是白色的,通过128个像素的电压值容易识别到赛道边沿。
将采集的128个值二值化为“0”,“1”两个值,连续“0”代表赛道边沿。
通过计算赛道两边的连续出现“0”的位置既能计算出车模中心的位置,车模中心位置与赛道中心位置比较就可以得到方向控制的的差值,差值作为方向控制的输入参数经方向PID控制器输出给电机就可以控制车模的方向。
4.2.2边缘提取
不经过数据二值化,通过阈值识别跳变点的位置来计算车模中心。
跳变法的优点是不用二值化,程序代码少,执行速度快,但对原始数据的准确度,要求较高,不然会出现较多的错误,二值化法,程序运算量大,但通过二值化后的数据在经过滤波去噪声,得到的赛道信息很准确,稳定性好。
我们最后采用了二值化法实现道路识别。
4.3速度的采集
速度采集上我们采用单片机自带的计数器模块实现测试,在相同时间内采集到的脉冲数作为加减速的依据。
只要采集时间一致,并且间隔够短,采集到的数值也较准确。
4.4转向舵机的控制
我们通过测试发现用PD控制来控制舵角可以取得较好的效果。
将图象经过算法处理后得到的黑线位置和对应的舵机PD参照角度处理成二次线性关系。
在Ki置零的情况下,舵机在这种动态随动系统对动态响应性能要求更高。
更重要的是,我们通过合理调节Kp参数,发现车能在直线高速行驶时仍能保持车身非常稳定,没有震荡,所以基本没有必要使用Ki参数;其中,P项是在图像中选出一行,计算出其中黑线与图像中心位置的偏差,将选定行的黑线位置与上一幅图片中的位置相减,从而反映其变化率,在测试中,我们发现增加P项系数可以最强车模的沿线能力,并且可以使车模的转向提前,实现切弯效果。
算法中加入D项后,可以使车模入弯时转向提前,出弯时转向减少,对大S弯切线很有好处。
降低P系数而增加D系数可以使车模在大S弯内切线的程度增加,在大半径弧线中的切线量减少。
通过选择转向参考行、设置PD系数以及调整转角曲线,可以将车模的行车线调整到一个较为理想的状态。
4.5速度控制的策略
本车速度控制是根据赛道的类型控制的,由于本次赛道的规格为两边线,根据双边先求出中线,根据中线的偏移情况判断赛道,本着直道加速,弯道减速的原则控制速度,并利用PID调节速度。
4.6PID算法的介绍及应用
PID控制是自动控制原理中一门比较常用并且有效的课程。
它包括反馈理论的三个部分:
测量、比较和执行。
测量关心的变量,与期望值相比较,用这个偏差纠正调节控制系统的响应。
PID在实际应用中非常广泛,目前已有系列化产品出现。
使用中它仅需设置三个参数(Kp,Ti,Td),在很多情况下甚至连三个参数都不用而仅需一到两个。
因此PID也是简单易用的。
PID的构成由比例单元(P)、积分单元(I)和微分单元(D)组成。
其输入e(t)与输出u(t)的关系为:
u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt]式中积分的上下限分别是0和t,因此它的传递函数为:
G(s)=U(s)/E(s)=kp[1+1/(TI*s)+TD*s]其中kp为比例系数;TI为积分时间常数;TD为微分时间常数
在智能小车的设计中,我们采用了增量是PID来控制小车的行进速度,通过给定不同的期望速度使小车利用PID自动调节速度。
由于小车速度的变化必须是一个快速且准确的过程,因此我们在应用中只用到了PID控制方法中的两个参数(Kp和Ti);
4.5增量式PID示意图
4.6.1位置式PID
位置式PID中,由于计算机输出的u(k)直接去控制执行机构(如阀门),u(k)的值和执行机构的位置(如阀门开度)是一一对应的,所以通常称公式(5.2)为位置式PID控制算法。
位置式PID控制算法的缺点是:
由于全量输出,所以每次输出均与过去的状态有关,计算时要对过去e(k)进行累加,计算机工作量大;而且因为计算机输出的u(k)对应的是执行机构的实际位置,如计算机出现故障,u(k)的大幅度变化,会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成严重的生产事故。
因而产生了增量式PID控制的控制算法,所谓增量式PID是指数字控制器的输出只是控制量的增量△u(k)。
4.6.2增量式PID
当执行机构需要的是控制量的增量(例如:
驱动步进电机)时,可由原式推导出提供增量的PID控制算式。
由原式可以推出式(4.2),原式减去式(4.2)可得式(4.3)。
(4.2)
(4.3)
公式(4.3)称为增量式PID控制算法,可以看出由于一般计算机控制系统采用恒定的采样周期T,一旦确定了KP、TI、TD,只要使用前后三次测量值的偏差,即可由式(4.3)求出控制增量。
第五章开发工具与调试
5.1开发工具
程序的开发是在组委会提供的CodeWarriorIDE下进行的,包括源程序的写、编译和链接,并最终生成可执行文件。
5.2调试过程
在智能车后期硬件和软件都固定后,进一步需要的是进行调试,其中主要对舵机及电机PID参数进行整定。
舵机PID的参数可以通过更改后观察小车实际行进中的情况进行整定,而电机的整定则不那么直观,因此我们采用虚拟示波器将数据发送回来进行观察,反复如此。
虚拟示波器如图5.1所示。
图5.1虚拟示波器
第六章赛车主要技术参数
项目
参数
路径检测方法
光电(CCD)
车模几何尺寸(长、宽、高)(毫米)
310、180365
电路功耗(W)
18
电路电容总量(微法)
1868
传感器种类及个数
13
新增加伺服电机个数
0
赛道信息检测频率(次/秒)
166
车模重量(带有电池)(千克)
1.7
第七章总结
本文主要介绍了队员在为第九届飞思卡尔智能汽车大赛而准备的智能车系统方案。
本智能车系统采用飞思卡尔32位单片机MK60DN512ZVLL10KinetisARMCortex-M4为处理器,通过线阵CCD采集赛道信息,运用PID算法来控制舵机和电机。
报告中智能车设计制作过程中使用的一些方法及开发环境。
其中包括智能车机械结构上的调整,小车电路的设计及软件的设计。
在制作过程中,我们分别对各个部分的模块进行了较为深入的调试,并通过不同方法的尝试寻找最优的方案。
整个制作过程可谓九曲十八弯,付出了艰辛的汗水,在过程中我们收货颇多。
参考文献
[1]卓晴,黄开胜,邵贝贝.学做智能车[M],北京:
北京航空航天大学出版社,2007:
1-369.
[2]王宜怀.嵌入式系统.北京:
北京航空航天大学出版社.
[3]邵贝贝.单片机嵌入式应用的在线开发方法[M],北京:
,清华大学出版社,2004:
1d8-63.
[4]谭浩强.C程序设计[M],北京:
清华大学出版社,1999,87-186.
王晓明.电动机的单片机控制[M].北京.北京航空航天大学出版社.2002.
[5]徐国华.移动机器人的发展现状及其趋势[J].机器人技术与应用,2001(3):
7-14.
[6]尹念东 .智能车辆的研究及前景[J].上海汽车,2002
(2):
10-11.
[7]王荣本.世界智能车辆研究概述[J].公路交通科技,2001(10) :
13-15.
[8]王威.HCS12微控制器原理及应用[M].北京:
北京航空航天大学出版社,2007.
致谢
参加飞思卡尔直到到全国决赛,历时大半年之久。
在这半年的时间里,我们与小车一同成长,伴随着喜怒哀乐,有过挫折,也有过希望。
这份报告凝聚着我们的智慧,是我们共同努力后的成果。
我们的成果离不开学校的大力支持及指导老师悉心的教导和众多人的帮助,感谢温玄、周承仙老师的悉心指导。
最要感谢的是和我们一起努力的队员们,协助、互促、共勉使我们能够走到今天。
附录A:
程序源代码
Init.c
#include"Init.h"
voidALL_Init()
{
PWM_Motor_Init(8000);//电机初始化周期4500
PWM_Angle_Init(2500);//舵机初始化周期2500300HZ
FTM2_QUAD_Iint();//编码器初始化
Speed_PID_Init();//速度PID初始化
hw_gpio_init(PORT_C,14,0,0);
hw_gpio_init(PORT_C,16,0,0);
hw_gpio_init(PORT_C,18,0,0);
hw_gpio_init(PORT_D,1,0,0);
hw_gpio_init(PORT_D,3,0,0);
hw_gpio_init(PORT_D,5,0,0);
hw_gpio_init(PORT_D,7,0,0);//拨码开关初始化
hw_gpio_init(PORT_D,6,0,0);
hw_gpio_init(PORT_D,4,0,0);
hw_gpio_init(PORT_D,2,0,0);
hw_gpio_init(PORT_D,0,0,0);
hw_gpio_init(PORT_C,17,0,0);
hw_gpio_init(PORT_C,11,1,0);
//光电管引脚
hw_gpio_init(PORT_C,12,0,0);
hw_gpio_init(PORT_C,10,0,0);
hw_gpio_init(PORT_C,8,0,0);
hw_gpio_init(PORT_C,6,0,0);
hw_gpio_init(PORT_C,15,0,0);
hw_gpio_init(PORT_B,17,0,0);
//hw_gpio_init(PORT_D,6,0,0);//按键初始化
CCD_init1();//CCD初始化
LCD_Init();//LCD初始化
hw_adc_init(0);//AD0初始化
hw_uart_init(UART_3,115200);//UART3初始化波特率115200
//hw_uart_enable_re_int(UART_3);;//开串口3接收中断
hw_pit_init(0,periph_clk_khz/5);//0.2ms中断
//PWM_Motor_YAngle(1020);
hw_enable_pit_int(0);//开PIT0中断
}
PID.c
#include"PID.h"
intLast_Error=0;//舵机上次偏差
intCurrent_Error=0;//舵机当前偏差
intYLast_Error=0;//摇头舵机上次偏差
intYCurrent_Error=0;//摇头舵机当前偏差
intCurrentSpeed;//当前脉冲数
intD_MaxPWM=1390;//舵机最大值123045
externintMidLineError;
intD_MinPWM=790;//舵机最小值830
intD_MidPWM=1040;//舵机中间值1030
intY_MaxPWM=1540;//舵机最大值
intY_MinPWM=740;//舵机最小值
intY_MidPWM=1140;//舵机中间值
floatAngle_P=3.2;//舵机P
floatAngle_D=18;//舵机D
intMotor_ZhengDuty;//正电机PWM
externuint8qipao;
externintzhidaoadd;
doubleSP;
externintaddzhidao;
externintMidLineError;
intpwm=0;
PIDSPEED;//速度PID变量
/*************************************************************************
*
*
*函数名称:
Speed_PID_Init
*功能说明:
速度PID初始化
*备注:
*************************************************************************/
voidSpeed_PID_Init()//速度PID初始化
{
SPEED.D=0;
SPEED.I=0.3;
SPEED.P=50;
SPEED.PrevError=0;
SPEED.LastError=0;
SPEED.CurrentError=0;
}
/*******************************************************