毕业设计(论文)
基于红外传感器的自动寻迹智能小车设计
系 别 专 业 班级学号 姓 名 指导教师
基于红外传感器的自动寻迹智能小车设计
摘 要
介绍了一种自动寻迹智能车的设计,研究了采用红外反射式光电传感器作为路径采集模块实现自动寻迹的软硬件设计方法。系统采用Freescale 16 位单片机MC9S12DG128 为核心控制器,利用12个红外光电传感器构成的光电传感器阵列采集路面信息,单片机获得传感器采集的路面信息和车速信息,经过分析后控制智能车的舵机转向,同时对直流电机进行调速,从而实现智能车沿给定的黑线快速平稳地行驶。介绍了光电传感器的寻迹原理,讨论了光电传感器排列方法、布局等对寻迹结果的影响及速度和转向控制的PID算法的研究和参数整定。
关键字:光电传感器,寻迹,路径识别,PWM,PID
Design of autonomous tracing smart car based on infrared sensors
Author:Xue Changliang
Tutor:Gu Deying
Abstract
A design of autonomous tracing system in intelligent vehicle is introduced. The software and hardware design method which realizes the autonomous tracing using the infrared Reflective photoelectric sensors as the path recognition module is researched. The system employs Freescale HCS series 16 bit single-chip microcomputer MC9SDG128 as its main controller and an array of photoelectric sensors for recognizing the path information. Single-chip Microcomputer energizes the PWM signal to steer and control the speed of the DC electric motor according to the analysis of the path and speed information from sensors. Consequently, this intelligent vehicle can track the black-guide-line automatically and move forward following the line quickly and smoothly. The autonomous tracing principle of photoelectric sensor is presented. The effects of sensor s’ array method, overall arrangement on the autonomous trace are discussed. And the use of PID algorithm in speed and steering control.
Key words : photoelectric sensor ,autonomous tracing, path recognition, PWM,PID
目 录
第1章 绪论 ............................................................. 1
1.1 课题的研究背景 ........................................................................................................ 1 1.2 国内外智能车的研究现状 ........................................................................................ 1 1.3 本文内容及结构安排 ................................................................................................ 3 第2章 红外传感器的寻迹原理及布局对寻迹的影响 ........................... 4
2.1 红外传感器寻迹原理 ................................................................................................ 4 2.2 传感器布局对路径识别的影响 ................................................................................ 6
2.2.1 布局相关参数 .................................................................................................. 6 2.2.2 一字型与八字型布局研究 .............................................................................. 6
第3章 智能车机械结构的调整 ............................................. 9
3.1 赛车参数 .................................................................................................................... 9 3.2 舵机安装方式调整 .................................................................................................. 10 3.3 前轮定位 .................................................................................................................. 10
3.3.1 主销后倾角 .................................................................................................... 10 3.3.2 主销内倾角 .................................................................................................... 11 3.3.3 前轮外倾角 .................................................................................................... 12 3.3.4 前轮前束 ........................................................................................................ 13 3.4 重心位置 .................................................................................................................. 13 3.5 齿轮传动间距调整 .................................................................................................. 14 3.6 后轮差速机构调整 .................................................................................................. 14 第4章 系统硬件设计 .................................................... 15
4.1 S12控制核心 ........................................................................................................... 16 4.2 电源管理模块 .......................................................................................................... 17
4.2.1 单片机稳压电源电路设计 ............................................................................ 17 4.2.2 舵机电源模块设计 ........................................................................................ 19 4.3 电机驱动模块 .......................................................................................................... 20 4.4 速度检测模块 .......................................................................................................... 23 4.5 路径识别模块 .......................................................................................................... 25 第5章 系统软件设计 .................................................... 27
5.1 系统的模块化结构 .................................................................................................. 28
5.1.1 时钟初始化 .................................................................................................... 28 5.1.2 串口初始化 .................................................................................................... 28 5.1.3 AD初始化 ..................................................................................................... 29 5.1.4 PWM初始化 .................................................................................................. 30 5.2 路径信息处理 .......................................................................................................... 32 5.3 数字滤波算法 .......................................................................................................... 33 5.4 小车控制算法 .......................................................................................................... 35
5.4.1 PID算法 ......................................................................................................... 37 5.4.2 舵机控制 ........................................................................................................ 39 5.4.3 电机控制 ........................................................................................................ 39
第6章 系统调试 ........................................................ 40
6.1 开发调试工具 .......................................................................................................... 40 6.2 无线调试模块 .......................................................................................................... 42 6.3 拨码开关调试 .......................................................................................................... 42 6.4 试验结果分析 .......................................................................................................... 42 结 论 ................................................................ 44 致 谢 ................................................................ 45 参考文献 ................................................................ 46 附 录 ................................................................. 47
附录A 硬件原理图 ....................................................................................................... 47 附录B 程序源代码 ....................................................................................................... 49 附录C Sorting out PID controller differences ............................................................... 69
第1章 绪论
1.1 课题的研究背景
汽车工业发展已有100多年的历史。1953年,世界上第一台无人驾驶牵引车诞生,这是一部采用埋线电磁感应方式跟踪路径的自动导向车。20世纪80年代以来,智能控制理论与技术在交通运输工程中越来越多的被应用,在这一背景下,智能汽车的概念应运而生。
智能车即轮式移动机器人,是一种集环境感知、决策规划、自动行驶等功能于一体的综合智能系统,智能车集中地运用了自动控制、模式识别、传感器技术、汽车电子、电气、计算机、机械等多个学科的知识 。随着控制技术、计算机技术和信息技术的发展,智能车在工业生产和日常生活中已经扮演了非常重要的角色,近年来,智能车在野外、道路、现代物流及柔性制造系统中都有广泛运用,已成为人工智能领域研究和发展的热点。目前,智能车领域的研究已经能够在具有一定标记的道路上为司机提供辅助驾驶系统甚至实现无人驾驶,这些智能车的设计通常依靠特定道路标记完成识别,通过推理判断模仿人工驾驶进行操作[1]。 1.2 国内外智能车的研究现状
智能汽车是一种高新技术密集型的新型汽车,是今后的主流汽车产品。而研究智能汽车所必需的理论与技术支持大部分已经基本具备。正是基于这一点,国际上正在形成智能汽车研究、设计、开发、竞赛的热潮。
美国是世界上对智能汽车最为关注的国家。美国交通部已开始一项五年计划,投入3500万美元,与通用汽车公司合作开发一种前后防撞系统。同时,美国俄亥俄州立大学和加州大学以及其他一些研究机构正在进行全自动车辆的研制和改进工作。CMU大学的NabLab5实验智能车是由Potiac运动跑车改装而成的,装有便携式计算机、摄像头、GPS全球定位系统、雷达和其他辅助设备。1995年6月,NabLab5进行了横穿美国的NHAA(No Hands Across America),从宾州的匹茨堡到加州的圣地亚哥,行程4587km,其中自主驾驶部分占98.2%。美国移动导航子系统(MNA)能计算出最佳行驶路径,还能不断地接收现场的最新交通状况,给出连续更新的指向,让车辆始终沿着理想的路径向前行驶。此外,美国还将智能汽车的研究用于军事上,美国国防部采用无人车去执行危险地带的巡逻任务,目前正在进行第三代军用智能汽车的研究,称为Demo Ⅲ,能满足有路和无
路条件下的车辆自动驾驶。
在此基础上,美国国防部与民间的大学、企业和发明家联合开展了全球领先的智能汽车竞赛。2007年11月,美国第三届智能汽车大赛在加利福尼亚州维克托尔举行。参赛的无人驾驶车俩的头顶有旋转的激光器,两边还有转动的照相机,内部安装有电脑装置。这些无人驾驶的汽车完全由电脑控制,利用卫星导航、摄像、雷达和激光,人工智能系统可判断出汽车的位置和方向,随后将指令传输到负责驾驶车辆的系统,丝毫不受人的干涉,用传感器策划和选择它们的路线。参赛的无人驾驶智能汽车沿着附近的公路飞奔。
欧洲开发基金资助进行驾驶员监测、道路环境的感知、视觉增强、前车距控制以及传感器融合方面的研究。同时,欧洲的一些国家正试验智能速度适应(Intelligent Speed Adaptation,ISA)作为提高车辆安全性的手段,其构想是通过路边标志信息或卫星定位信息以及车载数字地图进行车辆导航,并自动控制车辆速度。实验结果表明,采用该系统能使交通事故减少20%。德国慕尼黑联邦国防大学与奔驰汽车公司合作研制开发了VaMP试验车,它是由一辆豪华型的奔驰500SEL改装而成,视觉系统主要包括道路检测与跟踪RDT和障碍物检测与跟踪ODT两个模块。在整个试验中,系统行使了1600公里,其中95%的部分是自动驾驶的。
目前在日本,夜视和后视报警系统已应用在某些汽车上,三菱公司和尼桑公司已发布其近期可使用的防撞设备,前方防撞和车道偏离有望在1~2年内实现。本田公司、尼桑公司和丰田公司也在各自先进安全性车辆计划中发展行车安全子系统,它们包括:车道定位系统、前车距离控制系统、自动控制系统、障碍物报警系统、驾驶员打盹报警系统和夜间行人报警系统等。日本智能公路(SmartWay)计划中,提出车辆上采用诸如:车道保持、十字路口防撞、行人避让和车距保持等Ⅳ项技术。2003年日本将开始实施一个示范计划,到2015年将在日本全国范围内实施SmartWay计划。
韩国借助于本国当前蓬勃发展的汽车工业,致力于全新的智能汽车技术在年轻一代中的跨越式发展,在全国率先开展了大学智能汽车竞赛。每年韩国大约有100余支队伍参赛,该项赛事得到了众多高校和大学生的欢迎,也逐渐得到了企业的关注[2]。
国内智能汽车的研究也不断发展。清华大学汽车研究所是国内最早成立的主要从事智能汽车及智能交通的研究单位之一,在汽车导航、主动避撞、车载微机等方面进行了广泛而深入的研究。清华智能车THMR - V 采用分层递阶的体系结构,基于以大网通信,集成有CCD、摄像机、激光雷达、磁罗盘- 光码盘、GPS 等多种传感器,并建立了相应
的方向、油门、刹车三个自动控制系统。基于扩充转移网络(ATN) 的道路理解技术和基于混合模糊逻辑的控制方法,实现了车道线自动跟踪的平均车速为100km/ h ,最高车速达到150km/ h 。清华智能车THMR - V 课题组在车道线自动跟踪技术研究方面处于国内领先,达到国际先进的水平。上海市“智能汽车车内自主导航系统”的一种样车,2000年7月19日通过市科委鉴定,它标志着上海智能交通系统进入实质性实施阶段。国防科大成功试验了无人驾驶汽车,它的最高时速达到了75.6km。同时,以韩国大学生智能汽车竞赛为蓝本,我国也组织了自己国内的大学生智能汽车竞赛,并受到了众多高校和大学生的欢迎。 1.3 本文内容及结构安排
本文所述智能车就是一种自动导引小车,能够在给定的区域内沿着轨迹自动进行行进。小车运行过程由方向检测和电机驱动两个部分控制,采用与白色地面颜色有较大差别的黑色线条作引导。智能车寻迹系统采用红外反射式光电管识别路径上的黑线,并以最短的时间完成寻迹,用单片机MC9S12DG128扫描光电传感器组, 对采集到的信号进行分析处理并做出逻辑判断后, 得到行进方向,再通过加长转臂的舵机驱动前轮转向,实现智能车的循迹行进。智能车的驱动采用直流电机,并采用PWM 实现直流电机的调速,为了使智能车快速、平稳地行驶,系统必须把路径识别、相应的转向伺服电机控制以及直流驱动电机控制准确地结合在一起。
论文共六章,包括小车的框架结构、智能车模型的调整、小车的硬件和软件的设计和控制算法的研究等。其中,第一章为引言,主要介绍了智能车研究背景和发展现状;第二章为红外传感器寻迹原理及布局对寻迹的影响,主要介绍了路径检测传感器的原理及布局对寻迹的影响。第三章为智能车模型的机械结构调整,分别介绍了智能车模型的基本参数,以及车体前轮倾角、舵机力臂、车体重心、后轮差速和齿轮不同程度调整对智能车性能的影响;第四章为智能车的硬件系统设计,介绍了构成系统的电源管理模块,路径识别模块、车速检测模块、显示模块、转向舵机控制模块和直流电机驱动模块;第五章为智能车软件系统设计,包括小车软件设计的整体流程,时钟模块初始化,A/D模块初始化,PWM模块初始化,ECT模块初始化,以及小车控制算法的研究;第六章介绍了在智能车设计过程中遇到的一系列问题和解决办法。
第2章 红外传感器的寻迹原理及布局对寻迹的影响
路径识别系统相当于智能车的眼睛,是整车设计的关键。实现智能车的路径识别功能有多种方式,针对此大体有以下两种方案:
1)使用CCD摄像头进行图像采集和识别。具体识别过程还涉及图像采集、图像处理及识别等步骤。此种方法虽然有分辨率比较高,对路面的信息处理准确等优点,但对硬件处理速度和软件算法的要求都比较严格,实时性欠佳,且成本较大。
2)使用反射式光电传感器进行路径识别。这种传感器在智能识别技术中有着广泛的应用。它可以用来检测地面明暗和颜色的变化,也可以探测有无接近的物体采用这种方法易于实现,响应速度较快,算法相对于CCD较简单,实时性比较好,成本较低。缺点也是显而易见的,分辨率不高,易受外界环境光线影响,同时占用单片机端口比较多。经过慎重分析选择,最终选定了第二种识别方案,即采用反射式传感器进行路径识别。 2.1 红外传感器寻迹原理
光电传感器按检测方式通常分为对射式和反射式。反射式光电传感器的光源有多种,常见的有红外发光二极管、普通发光二极管和激光二极管,前两种光源容易受到外界光源的干扰,而激光二极管发出的光的频率较集中,传感器只接收很窄的频率范围信号,不容易被干扰,但价格较贵。红外反射式光电传感器工作时会受到多种不确定因素的影响,如反射表面的形状、颜色、光洁度,以及日光等,因此,为了提高系统的可靠性和准确性,通常是将发射信号经调制后送红外管发射,再由光敏管接收调制的红外信号[3]。同时,要保证发射管和接收管的波长匹配。接收的反射光强度经检测电路转换得到的输出信号电压Vout 是反射面与传感器之间距离 x 的函数,当反射面物质为同种物质时, x 与Vout 的响应曲线是非线性的,如图1 所示。设定输出电压达到某一阈值时作为目标,不同的目标距离阈值电压是不同的。
图2.1 输出信号与距离的关系曲线
当x 一定时,接收的反射光强度还与反射面的特性有关。在智能车系统中,红外发射管发射的红外线具有一定的方向性, 当红外线照射到白色地面时会有较大的反射,如果距离x 取值合适,红外接收管接收到反射回的红外线强度就较大;如果红外线照射黑色标志线,黑色标志线会吸收大部分红外光,红外接收管接收到红外线强度就很弱。这样,利用红外光电传感器检测智能车行驶道路上的黑色标志线,就可以实现智能车的自动寻迹。
红外光电传感器的输出可分为数字式与模拟式两种。数字式红外传感器具有与微处理器相对应的接口,硬件电路简单,但存在采集路径信息粗糙、丢失路径信息的缺点。模拟式红外传感器输出的模拟信号,通过将多个模拟式红外传感器进行适当的组合形成光电传感器阵列,可以再现道路的准确信息,具有较高的可靠性与稳定性。图2 为沿车道黑色标志线分布的阵列光电传感器的输出。实际工作时利用传感器对白色和黑色的反射率大小,把最大、最小值之间分为n 个index 区间, 通过对各个传感器index 值的组合来获得车身相对路径标志线的位置,从而对位置和行驶方向都能做较精确的控制。
图2.2 沿黑色标志线分布的阵列光电传感器输出
2.2 传感器布局对路径识别的影响
使用光电传感器实现智能车的路径识别,除了要求使用的发射/ 接收器件的波长特性一致,发射/接收传感器组对时,各方面性能尽量接近外,传感器的安装布局对寻迹效果也有非常大的影响[4]。 2.2.1 布局相关参数 (1)传感器间隔
各个传感器的布局间隔对智能车行车是有一定的影响的。道路中间黑色导引线的宽度为25mm,因此如果要求传感器间不出现同时感应现象(即每次采集只出现一个传感器值为1),那么传感器间隔就必须大于25mm。如果将间隔设计成小于25mm,从而产生更多的情况,有利于模型车与道路偏移距离的判断。此外,如果间隔过大,还会出现另一种情况,即在间隔之间出现空白对于防飞车能力,可以用最大速度来衡量。20mm间隔的最大速度在3m/s,40mm间隔的最大速度则为3.3m/s。经过分析后可知,这是由于传感器间隔大造成车的横向控制范围较大(40mm的车控制在±13mm内,而20mm的则在±7mm内),因此它不易造成迷失。 (2)径向探出距离
径向探出距离是指光电传感器离车头的径向距离。它主要影响智能车的预测性能。对于未知的路径,如果能早一步了解到前方道路的情况,那么就可以早些做出调整,从而使车以相应最优策略通过道路。所以,理论上探出距离是越大越好,但是如果距离过大,智能车可能会发生重心偏移,造成行驶不稳、振动等一系列问题。因此,为了既能增加径向距离,又不引起重心偏移,本文可以采用带倾角的传感器安装方式。 2.2.2 一字型与八字型布局研究 (1)一字型布局
一字型布局是传感器最常用的布局形式,即各个传感器都在一条直线上,从而保证纵向的一致性,使其控制策略主要集中在横向上。对于不同的间隔选择,其出现情况数也相对不同。本文仿真试验采用的是间隔大于25mm且两两并列的布局方式,这样在跑车时可以产生13种不同的情况。首先,对于传感器有输出值的(即其中有一传感器照到黑道)情况,则根据其所在的位置进行相应控制;其次,对于迷失情况,可利用之前哪
个传感器输出情况来推断模型车时进入了哪一段区域。本文选用两两并列就是为了能明确区分出具体区域,如果不这样排列,则当出现迷失时,将无法判断黑道在左边还是右边。
(2)八字型布局
八字型布局从横向来看与一字型类似,但它增加了纵向的特性,从而具有了一定的前瞻性。将中间两传感器进行前置的主要目的在于能够早一步了解到车前方是否为直道,从而可以进行加速。
值得一提的是,由于纵向的排列不一致,就比一字型更增加了多传感器同时感应的可能性(一字型只可能是所有传感器同时感应,而八字型则可能出现几个传感器同时感应的现象)。
因此,在决定控制策略时,必须要考虑这种情况,但反过来说,我们也可以利用这种情况的发生来完成一些特定的判断(比如某弯道角度的确定等)。
最终选定一字型排布方式。发射管选择亿光生产的大功率红外管HIR383(如图2.3), 在应用时串联一个50Ω的限流电阻,发射电流增大到100mA。对应选取波长与HIR383相近的pt334作为接收管。并且把接收电阻增大到50KΩ,放大接收到的光电信号。此外,由于采用分离式红外接收管,增大了发射功率和发射半径,相邻的红外发射管会对同一个接收管产生干扰,因此,给每个接收管套上热缩管,使得每个接收管只在相对应的一小块区域内接受红外信号。
图2.3 HIR383C发射管
图2.4 单排HIR333C红外光电管实物图
第3章 智能车机械结构的调整
车体结构是硬件中一个很重要的方面,从控制的角度来说,这部分既是系统的执行机构又是被控对象。车模底盘参数优化和前轮参数优化等调整可以保证车体在机械结构方面具有良好的性能,使其拥有较强的执行能力,其重要性丝毫不亚于良好的控制决策;而保证被控对象的轻便与灵活同样有利于提高控制效果。所以,在整车的机械结构方面,我们对转向机构、前轮定位、重心位置、车模底盘、后轮差速及齿轮传动进行了改进。 3.1赛车参数
我们选用1/10 Matiz仿真车模。车模基本尺寸参数如表3.1。
表3.1 车模基本尺寸 基本参数 轴距 前轮距 后轮距 车轮直径 车长 车宽 传动比 尺寸 197mm 124mm 136mm 5cm 316mm 172mm 18/76
智能车参数(如表3.2):
表3.2 模型车主要技术参数说明
车模长(cm) 车模宽(cm) 车模高(cm) 电路功耗 探测距离(cm) 传感器个数 车模重量(kg) 增加电机个数 赛道检测精度 赛道检测频率(次/S) 38.5 24.5 13 2A 32 13 1.2 0 5ms 20
3.2 舵机安装方式调整
舵机转动一定角度有时间延时,时间延时正比于旋转过的角度,反比于舵机的响应速度。通过控制策略分析可知,舵机的响应速度直接影响模型车通过转弯通道时的最高速度,提高舵机的响应速度是提高模型车平均速度的一个关键。提高舵机响应速度有二个方法,一是提高舵机的工作电压;二是在机械上进行调整,根据杠杆原理,将舵机的输出舵盘适当加长,将转向传动杆连接在加长的输出盘的末端。这样就可以在舵机输出较小的转角下,取得最大的前轮转角,提高了舵机的响应的灵敏度。 3.3 前轮定位
现代汽车在正常行驶过程中,为了使汽车直线行驶稳定,转向轻便,转向后能自动回正,并减少轮胎和转向零件的磨损等,在转向轮、转向节和前轴之间须形成一定的相对安装位置,称作车轮定位,其主要定位参数包括:主销后倾、主销内倾、车轮外倾和前束。Matiz车模前轮的四项定位参数均可调[5]。 3.3.1 主销后倾角
主销指转向轮在转向是围绕其转动的轴。主销在汽车的纵向平面内由一个向后的倾角γ,即主销轴线与地面垂直线在汽车纵向平面内的夹角,成为“主销后倾角”,如图3.1所示。采用主销后请的原因是由于汽车在车轮偏转后会产生一回正力矩,纠正车轮
的偏转。后倾角γ越大,车速越高,车轮偏转后自动恢复能力越强。而回正力矩过大,会引起前轮回正过猛,加速前轮摆震,并导致转向沉重。
图3.1 主销后倾角
实验中发现,在其他情况相同的条件下,主销后倾角对车体的影响主要有以下三个方面:
(l)主销后倾角太小造成不稳定:主销后倾角γ接近0°甚至小于0°的情况下,当车
模在较高速度行驶时,转向后车模缺乏自动回正能力,舵机对转向控制过于灵活。车速高时发飘,更容易在直道行驶时产生震荡。
(2)主销后倾角太大造成转向不灵活:主销后倾角γ大于6°的情况下,前轮的转向能
力明显受到,表现为转向沉重,控制滞后严重。
(3)主销后倾角不对称造成跑偏:左、右两轮之主销后倾角不相等时,车模出现跑偏,跑偏方向朝向主销后倾角较小的一侧。
基于以上分析,结合试验,将主销后倾角γ调整为2°左右。这种情况下,汽车转向
较灵活,而且在高速行驶的时候,转向后车体有一定的自动回正能力,可以使车体运动轨迹更加平稳,行驶路线平滑。 3.3.2 主销内倾角
主销在汽车的横向平面内向内侧倾斜一个β角,即主销轴线与地面垂直线在汽车横向断面内的夹角,成为“主销内倾角”,如图3.2所示。主销内倾角β也有利于车轮自动回正作用。当转向轮在外力作用下发生偏转时,由于主销内倾的原因,车轮连同整个汽车的前部将被抬起一定高度,当外力消失后,车轮就会在重力作用下恢复到原来的正中
位置。另外,主销内倾还会使主销轴线延长线与路面的交点到车轮中心平面的距离减小,同时转向时路面作用在转向轮上的阻力矩也会减小,从而可减小转向时驾驶员(舵机)施加在方向盘上的力,使转向操纵轻便,同时也减小了由于路面不平而从转向轮输出到转向盘上的力反馈。但是主销内倾角不宜过大,否则在转向时车轮绕主销偏转的过程中,轮胎与路面间将产生较大的滑动,从而增加轮胎与路面之间的摩擦阻力。这不仅会使转向变的沉重,还将加速轮胎的磨损,也容易在转向是造成前轮的滑移。
图3.2 主销内倾角与前轮外倾角
模型车通过调整前轮定位螺杆长度来改变主销内倾角,通过实验证实6°~ 8°的主
销内倾角对于智能车对期望轨迹跟踪的稳定性、行驶路线的平滑性以及汽车的控制能力都比较有利,在实际调试的过程中也选择了这样的主销内倾角。 3.3.3 前轮外倾角
通过车轮中心的汽车横向平面与车轮平面的交线与地面垂线之间的夹角α,称为“前轮外倾角”,如图3.2所示。前轮外倾角一方面可以在汽车重载时减小或者消除主销与衬套、轮与轴承等处的装配间隙,使车轮接近垂直路面滚动而滑动,同时减小转向阻力,使汽车转向轻便;另一方面还可以防止由于路面对车轮垂直反作用力的轴向分力对外端轴承的压迫,减少轴承及其锁紧螺母的载荷,从而增加这部分零件的使用寿命,提高汽
车的安全性。一般前轮外倾角为1°左右。而现代汽车高速化、急转向等工况要求前轮
外倾角减小甚至为负值。
模型车前轮某配件用来调整前轮外倾角。实验中发现:由于智能车主要用于竞速,在设计中必然要求尽可能减轻重量,所以底盘承重不大,而且前轮外倾角只有两档可调,
故设定为0°即可,关键是前轮前束要与之匹配。
3.3.4 前轮前束
当车轮有了外倾角后,在滚动是就类似于圆锥滚动,从而导致两侧车轮向外滚开。由于转向横拉杆和车桥的约束使车轮不可能向外滚开,车轮将在地面上出现边滚动边滑移的现象,从而增加轮胎的磨损。在安装车轮是,为消除车轮外倾带来的这种不良后果,可以使汽车两前轮的中心面不平行,并使两轮前边缘距离小于后边缘距离,距离之差称为“车轮前束”。内八字样的前端小后端大的称为“前束”,而外八字样后端小前端大的称为“后束”或者“负前束”。
图3.3 前轮前束
3.4 重心位置
汽车重心的位置通常用重心距前轴中心线的水平距离和重心距水平路面的高度来表示。可通过实验法、估算法测出重心位置。
模型车的控制方面,如果重心靠近后轴,对模型车的动力性能有益,后轮抓地力增加,增大转向灵敏度,但会减少转向;如果重心靠近前轴,则对模型车的制动性和操纵稳定性有益,会增加转向,但会降低转向灵敏度,并且降低了后轮的抓地力。考虑到模型车频繁转向,对于智能车的动力性要求没有操纵稳定性和制动性的要求高,所以在不增加车重和重心垂直位置尽量低的前提下,通过电路板设计安装来使模型车的重心适当前移。
通过理论分析并结合大量实验,我们将汽车模型的重心调整在前后轴之间五分之二左右的位置,并使其靠近前轴,这时智能车的行驶比较稳定,转向也比较灵活,行驶路线平滑。
3.5 齿轮传动间距调整
车模后轮采用RS-380SH-4045 电机驱动,电机轴与后轮轴之间的传动比为 9:38(电机轴齿轮齿数为18,后轮轴传动轮齿数为76),齿轮传动机构对车模的驱动能力有很大的影响。齿轮传动部分安装位置的不恰当,会大大增加电机驱动后轮的负载,从而影响到最终成绩。调整的原则是:两传动齿轮轴保持平行, 齿轮间的配合间隙要合适,过松容易打坏齿轮,过紧又会增加传动阻力,白白浪费动力;传动部分要轻松、顺畅,容易转动,不能有卡住或迟滞现象.
判断齿轮传动是否调整好的一个依据是,听一下电机带动后轮空转时的声音。声音刺耳响亮,说明齿轮间的配合间隙过大,传动中有撞齿现象;声音闷而且有迟滞,则说明齿轮间的配合间隙过小,或者两齿轮轴不平行,电机负载加大。调整好的齿轮传动噪音小,并且不会有碰撞类的杂音。 3.6 后轮差速机构调整
差速机构的作用是在车模转弯的时候,降低后轮与地面之间的滑动;并且还可以保证在轮胎抱死的情况下不会损害到电机。
当车辆在正常的过弯行进中 (假设:无转向不足亦无转向过度),此时4 个轮子的转速(轮速)皆不相同,依序为:外侧前轮>外侧后轮>内侧前轮>内侧后轮。此次所使用车模配备的是后轮差速机构。差速器的特性是:阻力越大的一侧,驱动齿轮的转速越低;而阻力越小的一侧,驱动齿轮的转速越高‧以此次使用的后轮差速器为例,在过弯时,因外侧前轮轮胎所遇的阻力较小,轮速便较高;而内侧前轮轮胎所遇的阻力较大,轮速便较低。
差速器的调整中要注意滚珠轮盘间的间隙,过松过紧都会使差速器性能降低,转弯时阻力小的车轮会打滑,从而影响车模的过弯性能。好的差速机构,在电机不转的情况下,右轮向前转过的角度与左轮向后转过的角度之间误差很小,不会有迟滞或者过转动情况发生。
第4章 系统硬件设计
该智能车系统采用飞思卡尔MC9S12DG128B单片机为检测和控制核心;以红外传感器为路径检测传感器,自动检测跑道上的黑线;并根据采集到的黑线信息,通过软件对小车进行转向和速度的控制,再通过速度反馈和小车的位置,实时监控调节智能车的行进状态,整体结构框图如下:
路径识别模块舵机控制信号 舵机驱动模块 车速信号 测速模块 MC9S12 单片机控制 核心 后轮驱动 PWM方波信直流电机驱动模块
图4.1 智能车整体框架结构图
硬件系统是智能车中除机械结构以外的另一个重要的部分。是智能车系统可靠、稳定运行的基础。简单、合理而抗干扰能力较强的电路对于电子系运行的稳定、控制的精度都有着直接的影响。本系统硬件结构主要由S12控制核心、电源管理模块,路径识别模块、车速检测模块、显示模块、转向舵机控制模块和直流电机驱动模块组成,其系统硬件结构简图如下所示。
电机 PWM信号 TD340 5V 显示模块 5V 速度检测模块 MOSFET驱动 信号 PWM信号 路径识别模块 5V 信号 TPS7350 7.2V电源 MC9S12DG128 5V PWM信号 6V 舵机 TPS7350 TPS7350
图4.2 硬件电路框图
4.1 S12控制核心
系统的控制芯片采用飞思卡尔公司的MC9S12DG128B,该芯片采用增强型16位S12CPU,片内总线时钟频率最高可达25MHZ;片内资源包括8KBRAM、128KB FLASH、2KBEEPROM;SCI、SPI、PWM串行接口模块;还提供2个8路10位精度A/D转换器、控制器局域网模块CAN和增强型捕捉定时器,并支持背景调试模块(BDM)。本系统I/O的具体分配如下:
PWM1输出舵机的控制信号;PWM2、PWM3输出光电发射管的驱动脉冲;PWM4、
PWM5输出电机控制信号;PAD0-PAD11用于小车前面路面识别的输入口;PH0-PH3用于设置不同的速度;I/O1口用于速度检测信号的输入口;ADDR0-ADDR10输出显示电路的控制信号。 4.2 电源管理模块
高性能的电源管理系统对于电子系统稳定运行是至关重要的。作为智能车动力的来源,电源模块为系统的控制器,执行机构,传感器等各个模块提供可靠的工作电压。设计中,除了需要考虑电压范围和电流容量等基本参数之外,还要在电源转换效率、降低噪声、防止干扰和电路简单等方面进行优化。
电源管理模块的功能是对电池进行分配和电压调节,为其他各个模块的正常工作提供可靠的工作电压。智能车控制系统中,不同电路模块需要的工作电压和电流容量各不相同,因此电源模块应该包含多个稳压电路。电源模块的框图如图4.3所示。
电源 稳压器
TPS7350 5V 主电源 7.2V 2Ah镍镉电池 TPS7350 5V 单片机模块 路径传感器模块 速度传感器模块 图4.3 系统电源模块框图
TPS7350 6V 用电 模块
显示 模块 转向舵机模块 驱动电机模块 4.2.1单片机稳压电源电路设计
单片机是整个智能车的核心部分,它的性能是否稳定性直接关系到赛车的行驶状
况,如果稳压电源选择不好,将会导致单片机容易复位、抗干扰性能差。单片机工作电压范围为 +4.5 ~ 5.25V,典型电压是 +5 V,工作电流为80mA ~ 150mA,电流大小跟I/O端口对外围驱动以及系统超频有关。适合的芯片有7805、LM2576、TPS7350等。
选择芯片主要以电源特性、输入电压范围、压差、输出电流大小为标准。电源特性主要分为线性稳压器和开关稳压器,其中线性稳压器稳压精度高,但在工作中会造成较大的\"热损失\" (其值为V 压降 ×I负荷) ,效率较低;开关稳压器效率较高,但有较高的电源噪音耗音,耗电量较大的电路适合采用。输入电压范围主要考虑电池两端的电压在模型车运行过程中会逐渐降低,特别是在模型车启动或制动过程中,电池提供大的电流时,电池两端电压会降低很多,当电压降到某一值时,稳压芯片不能正常工作。所以需要选择一些工作压差小的稳压芯片,压差即芯片能正常工作时的输入电压与输出电压的差值。输出电流大小主要考虑满足负载需求,如果负载电流大于稳压芯片电流,则负载不能正常工作,甚至可能会芯片内自带过流保护启动,没有电流输出。在都可以实现其功能时,稳压电路的设计需要简单可靠,同时便于检测,所以还会以其芯片外围电路的相对复杂程度选用尽可能简单的芯片。
以下为这几种芯片的性能比较:
表 4.1 7805、LM2576、TPS7350性能比较
最小压降 最小静态工作电流 输出噪声 使用外围元件个数 输出电容的容量 成本
7805 1.7V 6mA 40uV 3 中 低 LM2576 1.0V 5mA 与滤波元件有关 4 高 高 TPS7350 0.035V 340uA 2uV 2 低 中 通过上表可以看出,在相同的输出条件下,TPS7350具有更低的工作压降和最小的静态工作电流,也就体现了其低功耗的优点。在智能车控制系统中,由于系统电源为电
池供电,自然TPS7350 也就成为电源调节器件的首选。
TPS73XX 是美国TI 公司生产的微功耗、低压差电源管理芯片,它具有节电关断模式与输出电压监控功能,极低的静态电流且不随负载变化;集成延时微处理器复位功能保证系统的正常工作;具有完善的保护电路,包括过热、过流及电压反接保护。利用该器件只需极少的外围器件便可构成高效稳压电路。
TPS73XX 具有输入电压范围大,过热、过流及电压反接保护,输出电流为150mA 时压差小于0.1V 等特点,特别是当其输出电流为100mA时,压差仅仅为0.035V,如TPS73XX系列中的TPS7350 可保证电池电压在+7V~+5.1V 范围内变化时,输出稳定的5V电压,显著的提高了电源的利用效率。本智能车控制系统的电源管理都是围绕TPS7350的使用而展开的。
单片机的供电电压为5V,由TPS7350供电,供电电路如图4.4:
图4.4 单片机供电电路
4.2.2 舵机电源模块设计
舵机型号:Futaba S3010。
舵机本身是一个位置随动系统。它由舵盘、减速齿轮组、位置反馈电位计、直流电机和控制电路组成。通过内部的位置反馈,使它的舵盘输出转角正比于给定的控制信号,因此对于它的控制可以使用开环控制。在负载力矩小于其最大输出力矩的情况下,它的输出转角正比于给定的脉冲宽度。
舵机接口一般采用三线连接方法,黑线为地线,红线为电源线,另外一根为控制信号线。控制信号是周期在20ms左右的脉冲信号,脉冲信号的宽度决定舵机输出舵盘的角度。
舵机输入电压为4.0V-6.0V,下表为舵机的速度和转矩参数:
表4.2 舵机主要参数
速度: 0.20 sec/60° @4.8V 0.16 sec/60° @6.0V 转矩: 72 oz-in(5.2kg-cm) @4.8V 90 oz-in(6.5kg-cm) @6V
由上表数据可以看出随着舵机输入电压的提高,舵机的速度和转矩也随着增大。因此设计舵机的输入电压为6V。然而TPS7350的输出电压为+5V,为了实现+6V 输出,需要在图4.4的基础上增加2个二极管,提高对地参考电位,即可满足稳定+6V 输出的要求,体现了使用TPS7350进行电路设计的简洁性。舵机电源供电电路如图4.5。
图4.5 舵机供电电路
4.3 电机驱动模块
直流电机脉宽调速通过改变控制电压的脉冲宽度来改变加在直流电机上的平均电枢电压的大小,从而改变直流电机的转速。图 4.6所示为可逆的PWM变换器主电路的H型结构形式。IN1输入的PWM占空比控制电机的转速,IN2输入高低电平控制电机的正反转。
图4.6 H桥电路原理图
图中,4个MOSFET管的基极驱动电压分为两组,其中Q1H和Q4L为一组,Q2H和Q3L为一组。当IN2接收低电平信号时,Q2H常开;而Q4L截止。Q3L接收到IN1输入的PWM信号时,脉冲波的高电平导通,Q1H则相反,高电平时截止。这时,电机两端得到电压而旋转,而且占空比越大,转速越高。电机反转时道理相同。
电机型号为RS-380,工作电压为7.2V,空载电流为0.5A转速16200r/min。
图4.7 电机特性曲线
由上图可以看出,当负载转矩较大时所需电流也较大,所需功率较大。因而采用TD340芯片和四片N沟道MOSFET管构成的H桥直流电机方案。此电路具有元件需求少、所占空间小,装配成本低等优点。实践证明,此电路可靠性高、控制方便、效率高、驱动电流大,具有较高的实用价值。
TD340驱动器芯片是ST微电子公司推出的一种用于直流电机的控制器件,可用于驱动N沟道MOSFET管。图4.8为TD340外形和引脚图。
图4.8 TD340引脚封装
各引脚具体说明如下表:
表4.3 TD340各引脚功能
L1、L2:低边门极驱动 VOUT:用于微处理器的5V电压 H1、H2:高边门极驱动 CF:设置PWM频率的外部电容接入端 STBY:待机模式 IN1:模拟或数字信号输入 WD:看门狗信号输入 IN2:电机旋转方向控制端 CWD:设置看门狗电容端 VBATT、GND:电源正端和地端
由TD340构成的电机驱动电路如图4.9。
图4.9 电机驱动电路
TD340内集成有可驱动N沟道高边功率MOS管的电荷泵和内部PWM发生器,可进行速度和方向控制而且功耗很低,同时具有过压(>20V)、欠压(<6.2V)保护功能,以及反向电源有源保护功能。TD340内含可调的频率开关(0~25KHZ)及待机模式,且集成有看门狗和复位电路。除此之外,TD340芯片还具有H桥直流电机部分和微控制器之间的必要接口。直流电机的速度和方向可由外界输入给TD340的信号来控制。其中速度由PWM来控制,当然
也可以接受外部的PWM信号。当TD340的CF端通过电
容接地时,0~5V的模拟输入即可产生PWM输出。实际上,当CF端直接接地时,输入TD340的数字信号就可直接产生PWM信号。
上图中的MOSFET管采用IRF3205。IRF3205的优点是开关速度快,通路电阻低和电压门信号低,适合于大电流和低电压运行。当加上一个足够的门信号电压时,功率MOSFET的通路电阻小于常规二极管
而在没有门信号电压的情况下,它具有常规二极
管的反向特性。每个MOSFET并联一个稳压管,使得任何一个通路导通时直流电机两端电压恒定。 4.4 速度检测模块
测速原理:速度传感模块采用光电传感器加法兰盘的方式实现。把具有20个齿的法兰盘安装在小车后轮轴,随电机驱动后轴转动使法兰盘随之等速度转动。利用红外透射
式传感器检测到的通断脉冲个数就能测量出小车后轮转速,再结合已知轮胎直径(5cm)就能计算出小车的行驶速度,达到测速的目的。
小车后轮旋转带动光码盘旋转,当红外发射管发射出的红外光遇到法兰盘的齿的时候,红外光被遮挡,至红外接收管接收不到发射管发射的红外光,光电开关处于断开状态;而当红外光遇到间隙的时候,接收管便可接受到红外光线,红外接收管处于导通状态。这样,红外接收管输出间隔的高低电平。将此信号再通过CD40106进行整形,送入单片机中,便可实现对车速的检测。速度检测原理图如图4.10。
图4.10 速度检测原理图
假设n为后轴的转速(单位为r/s);N为一个采样周期T内ECT模块记录的脉冲的个数;P为法兰盘的齿数;T为采样周期(单位为s)。则:
N=T*n*P
因此小车后轮的转速为:
n=N/(P*T)
那么,小车的瞬时速度为:
V=3.14*n*D
这样,就完成了对小车速度的测量。
4.5 路径识别模块
本系统采用12个HIR383设计的单排一字型排列方式。在设计检测电路PCB板的时候,考虑到小车重心应尽量靠近小车后轴,这样不但可以防止小车前倾、稳定性下降、转弯不稳的状况,同时,也可以提高小车的动力性能。所以将检测电路的PCB板尽量简化,并设计接口电路,使得检测电路与小车的控制电路连接简单,准确。采集板原理图如图4.11。
图4.11 采集板原理图
考虑到红外传感器的检测范围,应注意安装的相对地面高度、探出距离与角度。安装红外传感器的过程中,做了反复的测试。从检测结果来看,将传感器安装在距为最佳位置,在此位置,红外接收管可接受到良好的红外光。光电检测电路板的支架采用具有一定硬度的铝合金制作,安装牢固可靠,使在小车发生急转弯或撞车的时候,检测电路板不至发生晃动,甚至变形,影响检测效果。采集板安装实物图如图4.12。
图4.12 采集板安装实物图
对于外界环境对光电管的影响,以及相邻发射管的相互干扰问题,除了选用发射与接收一体化的红外传感器,用它们的外壳来抑制相互干扰之外,还将每个红外传感器安装上等长的热收缩管,实践证明,当安装上长度适宜的套管之后,相邻发射管的干扰可完全抑制住。
第5章 系统软件设计
由于要求小车能够自主识别路线,按照设定的轨迹行走,在不冲出跑道的前提下追求速度。因此,程序设计的基本原则是,首先考虑小车的稳定性,在此基础上,尽量提高小车的速度。 (1):主程序流程图:
主程序入口 各个模块初始化 开中断 Y 有中断? N 路径信息识别 等待 N 信号有效? Y 与上次路径信息比较,进行PID运算 传感器信号输入 对电机和舵机进行控制
图5.1 主程序流程图
5.1系统的模块化结构
为了体现程序的系统性和连贯性,智能小车的控制软件采用模块化的程序结构。各个模块有相应的数据接口,方便其它模块调用,这样,系统条理显得清晰。主要包括:系统初始化模块、路径数据采集模块、数据处理模块、速度检测模块、起跑线识别模块,再有,为了系统调试方便,本系统还设计了串口调试模块等。 5.1.1时钟初始化
单片机的晶振是16MHz,MC9S12DG128在时钟初始化后可以通过锁相环将系统时钟系统时钟提高到48MHz,这里就用到了一些寄存器中的某些位,倍频公式如下:
BUS_CLK2OSCCLK_VALUEREFDVSYNR_VALUE1_VALUE1 (5.1)
其中,OSCCLK_VALUE——系统的外部晶振;
REFDV_VALUE——系统时钟分频系数,在初始化中,它的值为3; SYNR_VALUE——倍频系数,它的值为3。
而SYNR=SYNR_VALUE,REFDV=REFDV_VALUE,SYNR、REFDV就是寄存器中的对应位。
void CLK_init(void){ SYNR=2; REFDV=1;
//PLL=2*OSC*(SYNR+1)/(REFDV+1)
//锁相环24M
while(!(CRGFLG & 0x08)){} //等待锁相环稳定
CLKSEL=CLKSEL_PLLSEL_MASK; //设置锁相环为内部时钟 }
5.1.2 串口初始化
可以看到,不论8位、16位还是32位单片机的最小系统都是通过异步串行口与人沟通的。使用串行通信接口SCI(Serial Communication Interface)通信是计算机与人对话最传统、最基本的方法,异步通信接口也成为通用异步接受器/发送器UART(Universal
Asynchronous Receiver/Tansmitter)[6]。
为了便于调试,本系统利用串口通信接口SCI实现数据的传输。
串口部分程序主要是初始化各寄存器,其中包括设置波特率、数据格式、接受发送功能使能、设置接受模式等。
串口初始化函数:SCI_Init(uchar BUS_CLK, unsigned long BR),它有两个输入变量,其中BUS_CLK是系统的时钟频率,BR为波特率。通过此函数可直接设置串口的时钟频率、波特率。 5.1.3 AD初始化
AD的初始化主要是设置一些相关的寄存器位,以ATD0为例,相应的初始化如下。ATD0CTL2寄存器的ADPU置1,因为ADPU是AD的电源开关,置1打开电源;把AFFC置1,这样可使ADC上电,快速清零, 无等待模式, 禁止外部触发, 禁止中断;ATD0CTL3的S1C置1,表示每个序列1次转换, No FIFO, Freeze模式下继续转换;ATD0CTL4的SRES8置1,这样可实现8位精度,因为ATDClock=[BusClock*0.5]/[PRS+1],其中BusClock =24MHz,PRS=1, 所以分频系数为4,即AD时钟为6MHz;最后执行ATD0DIEN=0x00,实现禁止数字输入[7]。 void AD_Init(void) //AD初始化
{ ATD0CTL2 = 0xC0 ; //控制寄存器2:上电,标志位快速清零,关中断
ATD0CTL3 = 0x7C; //控制寄存器3:转换序列长度为8,FIFO模式
ATD0CTL4 = 0x83; //控制寄存器4:8位转换精度,8分频
ATD0CTL5 = 0xB0; //控制寄存器5:从0通道开始的多道连续无符号转换,
转换结果右对齐方式
ATD0DIEN=0x00; // 禁止数字输入缓冲
ATD1CTL2 = 0xC0 ; //控制寄存器2:上电,标志位快速清零,关中断 ; ATD1CTL3 = 0x7C; //控制寄存器3:转换序列长度为8,FIFO模式
ATD1CTL4 = 0x83; //控制寄存器4:8位转换精度,8分频
ATD1CTL5 = 0xB0; //控制寄存器5:从0通道开始的多道连续无符号转换,转
换结果右对齐方式
ATD1DIEN=0x00; //禁止数字输出
5.1.4 PWM初始化
PWM(Pulse Width Modulation)即脉宽调制,脉宽调制波是一种可用程序来控制波形占空比、周期、相位的波形。它在电动机驱动、D/A变换等场合有着广泛的应用。
PWM模块特点:
8个带周期占空比可程控的PWM通道 4个可程控选择的时钟源 每个PWM通道有专用的计数器 PWM每个通道脉冲极性可以选择 每个PWM通道可使能/禁止 周期和占空比双缓冲
每个通道有中心对齐和边缘对齐方式 分辨率: 8位(8通道),16位(4通道) 带中断功能的紧急切断
PWM在本系统中主要用于驱动两个伺服电机,一个是电机,另一个是舵机,而控制这两个电机的PWM信号是经过路径识别和系统决策后给出的,这样就能实现小车的循线跑。
对于控制电机的PWM信号的频率应小于25KHZ 。
舵机的响应时间对于控制非常重要,一方面可以通过修改PWM周期获得。另一方面也可以通过机械方式,利用舵机的输出转矩余量,将角度进行放大,加快舵机的响应速度。而舵机的脉冲范围,它对应舵机旋转角度,在设置时一方面应考虑到舵机的极限位置;另一方面还要考虑到车模转向的极限。本设计中,通过测试找到了40度对应的脉冲宽度。
还有一个PWM信号用于驱动路径识别传感器,本系统设计了12对光电传感器用于
路径识别,同时,为了提高检测前瞻距离,需要加大红外发射功率使得返回的红外线的强度提高,来抑制外界环境光线的干扰。这样,不仅使得电池电能的消耗量增加,同时也会缩短红外发射管的寿命,甚至会烧毁红外发射管。为了解决这个问题,本设计采用了脉冲发射/接收的方法。具体来说,由于红外接收管响应速度快,而道路检测周期一般为十几毫秒,相比之下,红外接收管对于道路反射光的响应时间以及单片机通过A/D端口读取该信号的十几都很短,一般在几十微妙。因此,在一个检测周期内大部分时间,红外发射管不需要工作,只要在检测瞬间发射红外线即可。用PWM信号周期信号驱动大功率MOSFET管,这样红外发射管工作在周期窄脉冲方式下,大大降低了平均工作电流,从而降低了整个发射电路的电量消耗。图5.2是PWM初始化程序流程图
开始 允许PWM通道 选择PWM时钟 选择极性、脉宽对齐方式 选择周期、脉宽 结束
图5.2 PWM初始化流程图
具体程序如下: void pwminitial(void) {
PWMCTL_CON01 = 1; // PWM01 合并 16 bt PWMPRCLK = 0x20; // A=24M/1=24M,B=24/4=6M PWMSCLA =12; // SA=A/2/12=1M PWMSCLB =150; // SB=B/2/150=20KHz
PWMCLK = 0x3E; // PWM0,1-SA;PWM4,5-SA,PWM2,3-SB; PWMPOL = 0xff; // 位极性=1 Duty=High Time PWMCAE = 0x00; // 对齐方式-左对齐 PWMPER01 = 20000; PWMDTY01 =1430 ;
PWMPER4 = 100; //Frequency=SA/300=10KHz PWMPER5 = 100; //Frequency=SA/300=10KHz PWMDTY4 = 0; PWMDTY5 = 0;
PWME = 0x32; // 舵机使能
}
5.2 路径信息处理
此智能车的路径识别传感器,在车的前方均匀排成一字型,每二个传感器的间距为1.6cm,即足够大但不大于黑线的宽度,这样,保证了在赛车压到黑线的时候,总有传感器能检测到黑线,而且能得到比较精确的位置。 为了得到智能车的精准位置,需要做一下处理:
(1):将12个红外传感器信号通过单片机内部的A/D模块进行处理,将其转变为数字量, 读入单片机中。
(2):归一化处理:由于各个光电管的性能特性存在很大差异,特别是电压波动范围相差较大。因此,为了给算法制定统一的标准,给数据处理带来方便,须对A/D传感器采集来的信号做归一化处理。此设计中的具体方法是通过公式,将各传感器电压值都处理成相对该传感器最大电压和最小电压,使得传感器输出电压值都保持在0到101之间。
(3):确定传感器出现的所有情况:在12对传感器中,如果某对传感器的输出电压值小于50,则可以认为此对传感器已经检测到黑线。对检测到黑线的传感器进行记录,并将这些检测到黑线的传感器的A/D值进行处理,得出小车可能出现的23种情况。具体实现方法是建立一个数学模型,将各种情况下小车的水平偏移量求出来,即可得到小车的即时位置。具体情况如下:
①:当6、7号传感器同时检测到黑线的时候,即小车在跑道,小车的水平偏移量E为0;
②:当只有6号传感器检测到黑线的时候,即小车偏右了一个单位,水平偏移量E为-1;
③:当只有7号传感器检测到黑线的时候,即小车偏左了一个单位,水平偏移量E为1; ······
依此类推,当只有1号传感器检测到黑线的时候,即小车向右偏转最大角度,水平
偏移量为-11,此时应让舵机控制轮胎向左转;当只有12号传感器检测到黑线的时候,小车向左偏转最大角度,此时应让舵机控制轮胎向右转,水平偏移的越大,那么转向程度也越大。所以,再加上没有检测到黑线,以及遇见交叉线或跑道的情况,共有25种情况。对于每种情况,对舵机以及小车速度做不同的处理控制,使小车能稳定、快速的前进。
5.3 数字滤波算法
在微机控制系统的模拟输入信号中,一般均含有各种噪声和干扰,他们来自被测信号源本身、传感器、外界干扰等。为了进行准确测量和控制,必须消除被测信号中的噪
声和干扰。噪声有2大类:一类为周期性的,其典型代表为50 Hz的工频干扰,对于这类信号,采用积分时间等于20 ms整倍数的双积分A/D转换器,可有效地消除其影响;另一类为非周期的不规则随机信号,对于随机干扰,可以用数字滤波方法予以削弱或滤除。所谓数字滤波,就是通过一定的计算或判断程序减少干扰信号在有用信号中的比重,因此他实际上是一个程序滤波[8]。
数字滤波器克服了模拟滤波器的许多不足,他与模拟滤波器相比有以下优点: (1)数字滤波器是用软件实现的,不需要增加硬设备,因而可靠性高、稳定性好,不存在阻抗匹配问题。
(2)模拟滤波器通常是各通道专用,而数字滤波器则可多通道共享,从而降低了成本。 (3)数字滤波器可以对频率很低(如0.01 Hz)的信号进行滤波,而模拟滤波器由于受电容容量的,频率不可能太低。
(4)数字滤波器可以根据信号的不同,采用不同的滤波方法或滤波参数,具有灵活、方便、功能强的特点。
常用数字滤波算法有算术平均值滤波,加权平均值滤波,滑动平均值滤波,中值滤波,防脉冲干扰平均值滤波,限幅滤波,限速滤波,低通滤波等等。根据智能车路径检测的特点,采用限幅滤波算法。
限幅滤波把两次相邻的采样值相减,求出其增量(以绝对值表示),然后与两次采样允许的最大差值(由被控对象的实际情况决定)ΔY进行比较,若小于或等于ΔY,则取本次采样值;若大于ΔY,则仍取上次采样值作为本次采样值。即:
Y=Y(K), |Y(K)-Y(K-1)|<=ΔY Y=Y(K-1), |Y(K)-Y(K-1)|>ΔY
限幅滤波主要用于变化比较缓慢的参数,如温度、物理位置等测量系统。具体应用时,关键的问题是最大允差ΔY的选取,ΔY太大,各种干扰信号将“乘虚而入”,使系统误差增大;ΔY太小,又会使某些有用信号被“拒之门外”,使计算机采样效率变低。因此,门限值ΔY的选取是非常重要的。通常可根据经验数据获得,必要时也可由实验得出。
因为系统的采样周期设置为5ms,时间很短,在相邻的两个采样周期内,检测正常的情况下,小车的水平位移量不会发生太大的变化,即检测到黑线的传感器号数不会发生
跳变。经过试验,发现检测到黑线的传感器不会变化两个数量(即两个区间)以上,所以设定ΔY=3。程序如下:
if((sensorblack[0]-tempblack[0])>3 || (sensorblack[0]-tempblack[0])<-3 ) sensorblack[0]=tempblack[0];
if((sensorblack[1]-tempblack[1])>3|| (sensorblack[1]-tempblack[1])<-3 ) sensorblack[1]=tempblack[1]; tempblack[0]=sensorblack[0]; tempblack[1]=sensorblack[1];
其中,sensorblack为本次采样检测到的传感器位置值,tempblack为上次采样检测到的传感器位置值。 5.4 小车控制算法
车体控制是整个控制算法的核心,它直接关系到小车的性能好坏。小车控制主要包括对舵机和电机的控制,结合各种算法的优缺点,对舵机的控制选用了改进后的PD算法思想,对电机的控制,由于涉及到速度的准确性问题,选用了PID算法的思想。舵机,电机控制流程图如图5.3,5.4所示。
控制周期入口设定传感器最大最小值对采集数据进行归一化处理偏差计算位置式PD计算是否超过最大右转角是输出最大右转角否是否超过最大左转角是输出最大左转角 否返回伺服电机占空比
图5.3 舵机控制流程图
程序入口设定速度给定值偏差计算位置式PID计算是否超过最大值是输出最大值否是否低于最小值是输出最小值 否返回直流电机占空比
图5.4 电机控制流程图
5.4.1 PID算法
PID 控制是工程实际中应用最为广泛的调节器控制规律。问世至今70 年多年来,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
PID的控制结构图如下:
Kp + Ki + + U G(S) R + - e Y Kd 图5.5 PID控制结构图
e 代表理想输入与实际输出的误差,这个误差信号被送到控制器,控制器计算出误差信号的积分值和微分值,并将它们与原误差信号进行线性组合,得到输出量U。
deukpekiedtkd (5.2)
dt其中,其中kp,ki,kd分别称为比例系数、积分系数、微分系数。u 接着被送到了执行机构,这样就获得了新的输出信号Y。这个新的输出信号被再次送到感应器以发现新的误差信号,这个过程就这样周而复始地进行[9]。
运用PID 控制的关键是调整三个比例系数,即参数整定。PID 控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用[10]。
一般来说,增大比例系数能够减小上升时间,并减小稳态误差,但不能消除。增大积分系数能够消除稳态误差,但会使瞬时响应变差。增大微分系数能够增强系统的稳定特性,减小超调,并且改善瞬时响应。
以上简要介绍了PID 算法的原理和特性,实际过程中,由于传感器是按一定间隔周期获取输出信号的,因此必须将连续PID 控制离散化,这样得到的就是数字PID 算法。
Tu(k)kp{e(k)Tie(j)j0kTd[e(k)e(k1)]} (5.3) T其中,e(k)为本次控制周期偏差,e(k-1)为上次控制周期偏差。T为采样周期。 5.4.2 舵机控制
经过测试发现,如果利用PD控制的话,在小S道,舵机的转向过于频繁,这样行驶下来不仅增加了小车行驶的路程,而且如果速度过快的话,小车会来不及转向,而冲出跑道,而且由于智能车系统检测周期为10ms,在10ms内小车所走过的距离很短,并不能反映路径的变化状况。基于以上两点,对PD算法进行了改进。首先,对PD公式中的偏差变化量进行改进,车身长度40cm,,大致估计小车平均速度2m/s,所以取小车的前20次的偏差与本次偏差相减作为偏差变化量,经过试验发现能较好的反映小车当前所在的路径状况。改进后的PD公式如下:
Tdu(k)kp{e(k)[e(k)e(k20)]} (5.4)
T对于小S道,舵机转向过于频繁的问题,由于舵机的转向所用时间是随着转角的增大而增大,存在滞后性。因此采用了分段式PD控制的思想,即在偏差比较小的时候将Kp和Kd值调小,保证舵机的转向幅度不大,能及时来回转向。而在偏差比较大的时候增大Kp和Kd值,使其能够转到正确的位置。 5.4.3电机控制
对于电机控制,在最初时采用的是bang-bang控制,即当检测速度小于给定速度时,PWM输出占空比80%,当检测速度大于给定速度时,PWM输出占空比50%。但是在实际测试中发现效果并不理想,速度超调现象很严重。而要改善bang-bang控制效果,必须在跑道上测出不同PWM占空比所对应的速度值,再根据所要设定速度上下限来确定PWM占空比的值。但是对于摩擦力不同的跑道,PWM占空比的值又必须通过重新做实验才能计算出,方法十分繁琐。所以,改用PID控制调速。在用PID调速时,借鉴了炉温控制的方法,当速度小于某个值(通常是设定的整个跑道最小值)的时候,直接给定PWM输出占空比100%,让小车全力加速;当检测速度大于那个值的时候,就切换成PID控制进行调速。
第6章 系统调试
6.1 开发调试工具
在制作过程中,运行的编译环境为 CodeWarrior 4.6 。CodeWarrior4.6是Metrowerks公司一套比较著名的集成开发环境,具有直观,易用的优点。CodeWarrior4.6包括项目管理,代码生成,语法敏感编辑器等,具有快速下载,单步的特点,同时可以融合C语言和汇编语言的混合编程。CodeWarrior4.6具有在线调试,单步运行程序的功能,同时能够观察到主程序中定义的所有的变量的值。这一功能在进行程序错误检查和改正时起到了至关重要的作用。下图即为CodeWarrior4.6的编程界面:
图6.1 CodeWarrior4.6编程界面
如图6.2所示,利用BDM和CodeWarrior4.6的调试界面,可以进行一系列的调试工作,如黑白线的电压值,路径采集状态,各个寄存器值,程序调试的变量值,能够很好的监视摄像头的状态,小车舵机和电机的当前值等,给调试提供了极大的方便。
图6.2 调试界面
图6.3 调试的变量
6.2 无线调试模块
在系统调试初期,虽然利用CodeWarrior4.6的调试界面,可以观察小车的运行状态,但是,CodeWarrior4.6的调试环境只能观察一些当前值,不能实时的调试观察,例如小车的速度值,所以利用了串口线把小车的一些状态值发送到PC机上进行观察,但是由于串口线的距离有限,最后使用了无限串口调试,这样的话,即使在小车的行驶过程中,也可以观察小车的运行状态。 6.3 拨码开关调试
由于比赛时不知道跑道状况,如果跑道状况过于复杂,不利于小车高速运行的话,就要适当降低小车的速度或者改变小车的一些调试参数,这个时候就需要利用拨码开关,给小车设定几个运行状态,以根据实际情况让小车走出最理想的状态。
图6.4 拨码开关电路
6.4 试验结果分析
在调试过程中发现,小车不同行驶速度下,要使小车沿着既定的跑道前进,舵机的PD参数需要进行一定的调整,具体的调试过程如表6.1所示。
由表6.1可知,随着小车速度的提高,KP值不断增大,会提高舵机的响应速度,从而让小车在最短的时间内调整车身,让小车沿着黑线行驶;同时,为了减小系统的超调量,加入KD系数,在动态响应不变的前提下,使小车尽可能的不冲出跑道。
表6.1 PD参数和占空比关系
占空比 PD值 KP KD 13 10 14.7 10 16.7 12 17.7 12 18.7 13 18.7 15 45 50 55 60 70 80
结 论
在此论文中,主要介绍了制作智能车系统的基本思路,包括机械,电路,以及最重要的控制算法的创新思想。
在机械方面,在参考了W型,A型,V型等排布方法的优缺点后,考虑到程序的稳定性、简便性,最后敲定了一字形12个红外发射接收管的排布方案,并通过反复实践决定了传感器的数量和位置。
在电路方面,以模块形式分类,在电源管理,速度检测,路径识别这三个模块分别设计,在查找资料的基础上各准备了几套方案;然后进行了实验,最后以论文中所提到的形式决定了最终的电路图。
在算法方面,使用C语言编程,利用在线开发工具调试程序,经过不断的研究、改进,终于设计出一套比较通用的,稳定的程序。在这套算法中,结合路况调整车速,使用分段式PD算法控制舵机,开环和PID算法切换控制电机,做到直线加速,弯道减速。
经过不断的调试,最终小车能够很好的沿着赛道稳定快速的前进,速度最快达2.5m/s,而且小车能够很好的驶过赛道中的15º角的斜坡和边长为25cm的黑色正三角区,全程平均速度可达2.3m/s。
为了使性能更稳定,速度更高,尝试了许多新想法,主要体现在以下两个方面: (1)反向制动
理论上,如果赛车的制动性能越好,直道速度就可以设置得越高,这样能大大提高平均速度。为此设计时,采用TD340与MOSFET构成的大功率驱动电路使电机实现了正反转,这样高速入弯时适当采用反向制动即可平稳过弯。
(2)速度控制
速度控制是智能车比赛的关键所在,如何使赛车速度响应迅速、平稳是设计的焦点。本次比赛采用了精度更高的测速方法,同时PID控制做了大量测试工作,最终使速度控制达到了满意的效果。
致 谢
参考文献
[1] 徐春友,王荣本.世界智能车辆近况综述.汽车工程[J].2001,23(5):297-300. [2] 卓 晴,黄开胜,邵贝贝.学做智能车—挑战“飞思卡尔”杯[M].北京: 北京航空航天大学出版社,2007.
[3] 高月华.基于红外传光电感器的智能车自动寻迹系统设计[J].半导体光电,2009(2):134-137.
[4] 周 斌,李立国,黄开胜. 智能车光电传感器布局对路径识别的影响研究[J]. 电子 产品世界,2006 (9) :139-140.
[5] 陈 宋,李立国,黄开胜.智能模型车底盘分析[J].电子产品世界,2006(6):150-153. [6] 邵贝贝.单片机嵌入式应用的在线开发方法[M].北京:清华大学出版社,2004. [7] 王威. HCS12微控制器原理及应用[M].北京:北京航空航天大学出版社,2007. [8] 顾德英.计算机控制技术[M].北京: 北京邮电大学出版社,2006
[9] 陈立锋.PID控制技术及其参数整定方法[J].济宁学院学报,2008(12):23-24. [10] 历凤满.数字PID控制算法的研究[J].辽宁大学学报,2005(4):367-370.
附 录
附录A 硬件原理图
A1 系统原理图
A2 系统印刷电路板
附录B 程序源代码 declaration.h
#define N 12 //AD传感器个数
unsigned char sensor_Min[N]={51,59,,67,74,60,72,92,76,63,92,83}; //黑线对应AD值
unsigned char sensor_Max[N]={170,201,187,226,202,201,215,232,230,203,217,200}; //白线对应AD值 unsigned char allblack=0; unsigned char nonblack=0;
unsigned char AD_Gdata[N]; //传感器AD值 char E=0; //偏差范围-11到11 char deltaE=0; //偏差变化
unsigned int k=0; //偏差测试数组下表
unsigned char sensorblack[N]={0};//保存黑线传感器值 unsigned char flag=0; //RTI转换完成标志位 char Kp=4; char Kd=1; char angle=0; int i=0;
char recordE[30]={0};//偏差代数值数组 uint recordspeed[30]={0}; unsigned char C ;
unsigned int givenspeed; // given speed according to the warp E int abssumE=0; //偏差绝对值累加值 int algebrasumE=0;// 偏差代数值累加 char lastE=0;
unsigned char tempblack[2]={0};//保存上组正常检测到黑线的传感器值 unsigned char sensorss[N]={0};
unsigned char tempindex[2]={0}; //保存上次起跑线的两个距离间值
unsigned char start_flag=0;
unsigned char curve_flag=0; //弯道标志位 unsigned char direct_flag=0;//直道标志位 unsigned char Scurve_flag=0;//S弯标志位 unsigned char maystart=0; unsigned char cross_flag=0; unsigned char loop=0;//起跑线圈数
unsigned char loopset;//根据PTH1设定起跑线圈数 unsigned char speedbase=0;//根据PTH3设定速度基数 unsigned char stop_flag=0;
unsigned char PDcount=0;//检测偏差间隔,为3个周期15ms unsigned char leftCnt=0; unsigned char rightCnt=0; uchar TcntOverCounter;
word testTcnt1,testTcnt2,testTcnt3; uchar SpeedStartFlag=1; dword SpeedPer; uint speed; int count=0;
unsigned char speedflag=0;
unsigned char curvestart_flag=0;//偏差大于10标志位
unsigned char danger_flag=0;//当偏差超过11,认为危险状态,应当增大角度,让前
轮适当抱死
int Output0=0,Output1=0; int e1=0,e2=0,e0=0; int PartP=0;
int PartI=0,PartD=0;
void Allblack(void); //全黑线处理函数 void Nonblack(void); //无黑线处理函数
void CLK_init(void);// 初始化时钟 void pwminitial(void);//PWM初始化 void AD_Init(void);//AD初始化
void initialize_RTI(void);//实时中断初始化 void Sensor(void);//传感器处理滤波 void AD_Convert(void);//AD转换 void controller();//控制器输出 void set_angle();//角度输出 void speedpid(void);//速度控制 void INT_RTI(void);//中断函数 void TcntOver(void);//
void Capture0Sucess(void);//速度检测 void Speed_init(void);//速度检测初始化 void judgestart(void);//起跑线处理程序 initial.h
/*********************************************************************** 初始化时钟
***********************************************************************/ void CLK_init(void){ SYNR=2; REFDV=1;
//PLL=2*OSC*(SYNR+1)/(REFDV+1)
//锁相环24M
while(!(CRGFLG & 0x08)){} //等待锁相环稳定
CLKSEL=CLKSEL_PLLSEL_MASK; //设置锁相环为内部时钟 }
/***********************************************************************
初始化PWM
***********************************************************************/ void pwminitial(void) {
PWMCTL_CON01 = 1; // PWM01 合并 16 bt PWMPRCLK = 0x20; // A=24M/1=24M,B=24/4=6M PWMSCLA =12; // SA=A/2/12=1M PWMSCLB =150; // SB=B/2/150=20KHz
PWMCLK = 0x3E; // PWM0,1-SA;PWM4,5-SA,PWM2,3-SB; PWMPOL = 0xff; // 位极性=1 Duty=High Time PWMCAE = 0x00; // 对齐方式-左对齐 PWMPER01 = 20000; // PWMDTY01 =1425 ;////
PWMPER4 = 100; //Frequency=SA/300=10KHz PWMPER5 = 100; //Frequency=SA/300=10KHz PWMDTY4 = 0; PWMDTY5 = 0;
PWME = 0x32; // 舵机enable }
/*********************************************************************** 初始化AD
***********************************************************************/ void AD_Init(void) //AD初始化 {
ATD0CTL2 = 0xC0 ; //控制寄存器2;上电,标志位快速清零,关中断 ; ATD0CTL3 = 0x7C; //控制寄存器3:转换序列长度为8,FIFO模式 ATD0CTL4 = 0x83; //控制寄存器4:8位转换精度,8分频
ATD0CTL5 = 0xB0; //控制寄存器5:从0通道开始的多道连续无符号转
换,转换结果右对齐方式
ATD0DIEN=0x00; // 禁止数字输入缓冲
ATD1CTL2 = 0xC0 ; //控制寄存器2;上电,标志位快速清零,关中断 ; ATD1CTL3 = 0x7C; //控制寄存器3:转换序列长度为8,FIFO模式 ATD1CTL4 = 0x83; //控制寄存器4:8位转换精度,8分频
ATD1CTL5 = 0xB0; //控制寄存器5:从0通道开始的多道连续无符号转
换,转换结果右对齐方式
ATD1DIEN=0x00; // 禁止数字输入缓冲 }
/*********************************************************************** 初始化RTI
***********************************************************************/ void initialize_RTI(void) {
RTICTL = 0x ; /*设定实时中断周期约为5ms*/ CRGINT_RTIE =1; /*开启实时中断*/ EnableInterrupts; }
/*********************************************************************** speed measure initial
***********************************************************************/ void Speed_init(void){ asm sei;
TIOS_IOS1=0; ///0;INTPUT 1;OUTPUT TSCR2_TCRE=0; TCTL4_EDG1B=0; TCTL4_EDG1A=1;
TSCR1_TFFCA=0; TSCR2_TOI=1; TSCR2_PR=4;//24/16=1.5M; ICOVW_NOVW1=1;
TIE_C1I=1;//ENABLE INPUT CAPTURE INTERRUPT TSCR1_TEN=1; EnableInterrupts; }
processing.h
/*********************************************************************** 数据处理
***********************************************************************/ void Sensor(void) { unsigned char i,j=0;
unsigned char sensor[N]={0};//保存归一化处理后的值 long temp; for(i=0;i else if(AD_Gdata[i] for(i=0;i PORTB|=sensorss[i+2]; PORTB<<=1; } if((0==sensorblack[0]) ) Nonblack(); else if(0==nonblack){ if(sensorblack[2]>0){ //有3个检测到黑线认为是交叉线或者是起跑线 j=0; if(1==maystart){ for(i=0;i } } Allblack(); } else{ if((1==maystart)&&(0==cross_flag)){ loop++; } //起跑圈数+1 maystart=0; //标志位清0 cross_flag=0; if(0==allblack){ if((sensorblack[0]-tempblack[0])>3 || (sensorblack[0]-tempblack[0])<-3 ) sensorblack[0]=tempblack[0]; if((sensorblack[1]-tempblack[1])>3 || (sensorblack[1]-tempblack[1])<-3 ) sensorblack[1]=tempblack[1]; //认为检测到一个或两个时黑线不可能跳变超过3个区间,以此作为过滤层 if(0==sensorblack[1]) sensorblack[1]=sensorblack[0];//只有一个测到黑线 } tempblack[0]=sensorblack[0]; tempblack[1]=sensorblack[1]; } } nonblack=0; allblack=0; E=sensorblack[0]+sensorblack[1]-13; for(i=29;i>0;i--){ recordE[i]=recordE[i-1]; recordspeed[i]=recordspeed[i-1]; } lastE=E; recordE[0]=lastE; recordspeed[0]=speed; if(2==PDcount){ for(i=0;i<=29;i++){ if(recordE[i]<=-3) leftCnt++; if(recordE[i]>=3) rightCnt++; } PDcount=0; } PDcount++; deltaE=recordE[0]-recordE[19]; for(i=0;i if(sensorblack[3]>0){ for(index=0;sensorblack[index]!=0;index++){ if((sensorblack[index+1]-sensorblack[index])>=2 ){ tempindex[0]=sensorblack[index]; tempindex[1]=sensorblack[index+1]; maystart=1; //如果检测到黑线传感器的位置差值有一个大于1,认为是起 跑线 } } for(index=0;sensorblack[index]!=0;index++){ if((sensorblack[index]==tempblack[0]-1) &&(sensorblack[index+1]==tempblack[0]) &&(sensorblack[index+2]==tempblack[0]+1)) cross_flag=1; if((sensorblack[index]==tempblack[0]) &&(sensorblack[index+1]==tempblack[0]+1) &&(sensorblack[index+2]==tempblack[0]+2)) cross_flag=1; } } sensorblack[0]=tempblack[0]; sensorblack[1]=tempblack[1]; }; //全黑线处理函数 void Nonblack(void){ if((tempblack[0]>=-7)&&(tempblack[1]<=7)){ sensorblack[0]=tempblack[0]; sensorblack[1]=tempblack[1]; }else{ if(lastE>0){ sensorblack[0]=12; sensorblack[1]=12; } if(lastE<0){ sensorblack[0]=1; sensorblack[1]=1; } } }; //无黑线处理函数 /*********************************************************************** AD程序 ***********************************************************************/ void AD_Convert(void){ DDRP=0xff; PTP_PTP2=1; PTP_PTP3=1; for(i=0;i<1000;i++){ asm(\"nop\"); } i=0; while(!ATD0STAT0_SCF){;}; //采用查询方式 asm (\"nop\"); asm (\"nop\"); asm (\"nop\"); //等待转换结束 ATD0STAT0_SCF=1; AD_Gdata[11] = ATD0DR0; //将结果寄存器中的值存放到数组中 AD_Gdata[10] = ATD0DR1; //将结果寄存器中的值存放到数组中 AD_Gdata[9] = ATD0DR2; //将结果寄存器中的值存放到数组中 AD_Gdata[8] = ATD0DR3; AD_Gdata[7] = ATD0DR4; AD_Gdata[6] = ATD0DR5; AD_Gdata[5] = ATD0DR6; AD_Gdata[4] = ATD0DR7;//开另一个口控制MOSFET进行AD转换 while(!ATD1STAT0_SCF){;}; // 等待转换结束 asm (\"nop\"); asm (\"nop\"); asm (\"nop\"); ATD1STAT0_SCF=1; AD_Gdata[3]=ATD1DR0; AD_Gdata[2]=ATD1DR1; AD_Gdata[1]=ATD1DR2; AD_Gdata[0]=ATD1DR3; } /*********************************************************************** 起跑线识别程序 ***********************************************************************/ void judgestart(void) { if((3-PTH_PTH1)==loop){ DDRB=0xff; PORTB=0x0f; PWMDTY4 = 0; PWMDTY5=50; if(speed<=80){ PWMDTY5=20; }else if(0==speed) PWMDTY5=0; } } /*********************************************************************** 中断服务程序 ***********************************************************************/ #pragma CODE_SEG NON_BANKED #pragma TRAP_PROC void INT_RTI(void) { CRGFLG_RTIF = 1; //PORTA=0x00; AD_Convert(); // PORTA=0x01; asm (\"nop\"); asm (\"nop\"); asm (\"nop\"); PTP_PTP2=0; PTP_PTP3=0; flag=1; } #pragma CODE_SEG DEFAULT /*********************************************************************** PID程序 ***********************************************************************/ void controller(){ PWMDTY4=0; PWMDTY5=0; stop_flag=0; danger_flag=0;//清除危险状态 direct_flag=0; curvestart_flag=0; speedbase=(PTH_PTH3+PTH_PTH2)*10; switch(E) { case(0): case(-1): case(1):{Kp=2;Kd=0;givenspeed=255;direct_flag=1;break;} case(-2): case(2):{Kp=3;Kd=0;givenspeed=255;direct_flag=1;break;} case(-3): case(3):{Kp=4;Kd=1;givenspeed=230;break;} case(-4): case(4):{Kp=4;Kd=1;givenspeed=210;break;} case(-5): case(5):{Kp=4;Kd=1;givenspeed=205;break;} case(-6): case(6):{Kp=4;Kd=1;givenspeed=200;break;} case(-7): case(7):{Kp=4;Kd=1;givenspeed=195;break;} case(-8): case(8):{Kp=4;Kd=1;givenspeed=195;break;} case(-9): case(9):{Kp=4;Kd=1;givenspeed=190;break;} case(-10): case(10):{Kp=5;Kd=2;givenspeed=190;break;} case(-11): case(11):{Kp=5;Kd=2;givenspeed=185;break;} case(-12): case(12):{Kp=5;Kd=2;givenspeed=185;break;} //前轮稍微抱死 } for(i=0;i<5;i++){ if(((0==recordE[i])||(-1==recordE[i])||(1==recordE[i])||(-2==recordE[i])||(2==recordE[i]))&&(recordspeed[i]>=225-speedbase)) speedflag=1;//表示前面有直道 if((recordE[i]>=10)||(recordE[i]<=-10)) curvestart_flag=1; } if((((E>=6)||(E<=-6))&&(speed<=205-speedbase)) ||(speed<=195-speedbase) ) curve_flag=0; if(1==speedflag){ if(((4==E)||(-4==E))&&(speed>=215-speedbase) ){ //说明原来是直道,进入弯道 speedflag=0; curve_flag=1; //认为是直道进弯,标志位置1 } if(((5==E)||(-5==E))&&(speed>=210-speedbase) ){ //说明原来是直道,进入弯道 speedflag=0; curve_flag=1; //认为是直道进弯,标志位置1 } if(((6==E)||(-6==E))&&(speed>=205-speedbase) ){ //说明原来是直道,进入弯道 speedflag=0; curve_flag=1; //认为是直道进弯,标志位置1 } } if(1==curve_flag){ //认为是直道进弯,减速 stop_flag=1; PWMDTY5=1; //电机反向 PWMDTY4=75; } if(((E>=7)&&(E<=9))||((E<=-7)&&(E>=-9))){ if(speed>=210) PWMDTY5=1; //电机反向 PWMDTY4=30; if((speed<=200-speedbase)&&(1==curvestart_flag)) givenspeed=220-speedbase; } givenspeed=givenspeed-speedbase;//当拨码导通时PTH3为0,高速;断开低速 angle=Kp*E+Kd*deltaE; if(angle>=42) angle=42; if(angle<=-42) angle=-42; //以上为横向控制 } void set_angle(){ PWMDTY01=1425+ angle*35/10;// 1425为中心,乘3.5倍 if(1==danger_flag){ if(E>0) PWMDTY01=1570; if(E<0) PWMDTY01=1280; } asm (\"nop\"); asm (\"nop\"); asm (\"nop\"); } void speedpid(void){ e2=(givenspeed-speed); PartP = 4 * e2; PartI+=e2; PartI=PartI/100; if(PartI>=100) PartI=100; PartD = e2 - e1; Output0 = (PartP + PartI +PartD)+10; //位置式pid e0=e1; e1=e2; if(Output0>=100) Output0=100; if(Output0<=0) Output0=0; if(speed>=260-speedbase) Output0=50; if(speed<=200){ //当检测速度小于2m/s时,直接输出PWM占空比90% PWMDTY5=0; //电机正向 PWMDTY4=90; } else{ PWMDTY4=Output0; //否则输出PID控制器的值 } } speed_measure.h /*********************************************************************** speed measure ***********************************************************************/ #pragma CODE_SEG NON_BANKED #pragma TRAP_PROC void TcntOver(void){ TFLG2_TOF=1; count=~count; TcntOverCounter++; if( TcntOverCounter>2){ speed=0; TcntOverCounter=0; } } #pragma CODE_SEG DEFAULT #pragma CODE_SEG NON_BANKED #pragma TRAP_PROC void Capture0Sucess(void){ static uchar Tc1counter=0; static uint LastSpeed=0,LastLastSpeed=0,LastLastLastSpeed=0; TFLG1_C1F=1; if(SpeedStartFlag==1){ Tc1counter=TcntOverCounter; testTcnt1=TC1; SpeedStartFlag=0; } else if( SpeedStartFlag==0) { testTcnt2=TC1; SpeedStartFlag=1; if( TcntOverCounter>=Tc1counter+1 ) { SpeedPer=(TcntOverCounter-Tc1counter)*65536+testTcnt2-testTcnt1; } else if(TcntOverCounter==Tc1counter){ SpeedPer=testTcnt2-testTcnt1; } speed=(uint)(11286/SpeedPer); //16.3cm 2042035(8) mm/s speed=(LastLastLastSpeed+LastLastSpeed+LastSpeed+ speed)/4; LastLastLastSpeed=LastLastSpeed; LastLastSpeed=LastSpeed; LastSpeed=speed; TcntOverCounter=0; } } #pragma CODE_SEG DEFAULT main.c #include #pragma LINK_INFO DERIVATIVE \"mc9s12dg128b\" /*********************************************************************** 主程序 ***********************************************************************/ void main(void) { DDRH=0x00; PIEH=0x00; PERH_PERH1=1; PERH_PERH3=1; //设置PH口为输入,下拉电阻方式 DDRB=0xFF; PORTB=0xff; //小灯开始状态为全灭 while(1) { if(1==flag){ Sensor(); controller(); set_angle(); judgestart(); speedpid(); flag=0; } } } 附录C Sorting out PID controller differences Back in college, I learned that the ubiquitous proportional-integral-derivative (PID) control algorithm consists of three operators or terms acting on the error signal as shown in the “Theoretical PID algorithm” graphic. The Controller calculates the integral and derivative of the error between the process variable and set-point, then generates a control effort by adding those two quantities to the error itself. A user chooses the tuning parameters—proportional gain (P), integral gain (I) and derivative gain (D)—to give more or less weight to each term, thereby adjusting the controller's performance. The corrective effort that a PID controller applies to a process is the sum of the proportional action generated by the proportional term (top), the integral action generated by the integral term (middle), and the derivative action generated by the derivative term (bottom). The P, I and D tuning parameters determind the relative contribution of each term. This arrangement is also described as the non-interaction or independent algorithm since changing one tuning parameter does not affect the contributions of the other two terms. I proceeded to write my first PID tutorial for Control Engineering assuming that commercial PID controllers work just that way. I soon learned that commercial PID controllers do compute the error signal, its integral and its derivative, but they typically combine those three quantities using the standard form of the PID algorithm as shown in the “Standard PID algorithm” graphic. It accomplishes the same end result as the theoretical algorithm, but it uses a slightly rearranged PID equation with a different set of tuning parameters – controller gain (Kp), integral time (Ti) and derivative time (Td). Potential for confusion Fortunately, it's easy enough to compare the two algorithms and relate P, I and D to K p, T i and T d as follows: P = Kp I = Kp / Ti D = Kp · Td The proportional gain P is the same as the controller gain Kp, so users unaware of the difference between the theoretical and standard PID algorithms might also assume (as I did) that “integral gain” is synonymous with “integral time” and “derivative gain” is synonymous with “derivative time.” Unfortunately, that mistake makes tuning the loop virtually impossible. Suppose for example, that a student in Control Engineering 101 class has determined that a particular feedback loop requires a theoretical Controller with a proportional gain of 3, an integral ga in of 2, and a derivative gain of 1. Entering those three values into a standard commercial controller under the headings of controller gain, integral time, and derivative time would be akin to setting: P = 3 I = 3 / 2 = 1.5 D = 3 · 1 = 3 The controller would end up with the desired degree of proportional action but 25% less integral action (with a gain of 1.5 rather than 2) and three times as much derivative action as the student intended. The standard or ISA standard form of the PID algorithm allows a user to simultaneously adjust the contributions of all three terms by means of a single tuning parameter Kp. The proportional, integral and derivative actions all depend on the value of Kp ; hence the alternative label dependent or dependent ideal PID. This arrangement is occasionally labeled the academic algorithm even though academicians rarely use it. Which PID is it anyway? Incompatible tuning parameters are not just a problem for inexperienced academicians. Some commercial controllers use the series or serial form of the PID algorithm that relies on yet a third set of tuning parameters. See the “Series PID algorithm” graphic. An industrial user trying to tune two controllers in otherwise identical loops will get different results if one controller happens to use the standard algorithm and the other happens to use the series algorithm. Worse still, both the theoretical and standard algorithms are sometimes described as the ideal algorithm, even though they're different. Consequently, some techniques for tuning ideal Controllers won't work on some ideal controllers. On the other hand, the phrase parallel or ideal parallel seems to refer exclusively to the theoretical algorithm in which the proportional, integral and derivative terms operate in parallel rather than in series. Ironically, the three terms in the standard algorithm also operate in parallel, but “standard” and “parallel” are almost never used synonymously. In this arrangement of the PID algorithm, the proportional, integral and derivative terms operate in series. The actions of each depends on the other two; hence the alternative label interacting or dependent interacting PID. The series PID algorithm happened to be easier to implement back in the days of analog controllers, and though virtually all commercial controllers are now implemented with digital microprocessors, the series algorithm is still sometimes used in order to preserve the tuning parameters when replacing an analog controller with a digital version. Tuning terminology The tuning parameters themselves also have different labels depending on who's describing them. When PID controllers were first developed, the derivative action was known as the pre-act mode because the derivative term seemed to act preemptively, accelerating the controller's corrective efforts beyond what the proportional term could manage on its own. Early users increased or decreased the degree of preemptive (derivative) action by selecting a larger or smaller pre-act time. Today's PID vendors typically describe a controller's derivative action as its rate. Integral action was originally known as automatic reset because the integral term seemed to automatically adjust the set-point to the exact value required to eliminate the steady-state offset caused by the proportional term (see “The Three Faces of PID,” Control Engineering, March 2007 for more on this curious phenomenon). Some users still specify the reset time when tuning a Controller's integral action, but a higher reset time corresponds to less integral action, not more. Alternately, the degree of integral action is sometimes specified in terms of the reset rate, which is the inverse of the reset time and entirely unrelated to the derivative rate. Confusing “reset” and “reset rate” leads to increased integral action when the user wants less, and vice versa. Likewise, the proportional gain in some PID controllers is specified in terms of its inverse known as the proportional band. More precisely, the proportional band is 100 divided by the proportional gain so that it represents the percent change in the error signal necessary to cause a full-scale change in the proportional term's output. Confusing “proportional band” with “proportional gain” leads to decreased proportional action when the user wants more, and vice versa. Even more variations Compounding the confusion are various ad hoc enhancements that have been developed over the years to improve a PID controller's performance. Fortunately, all these enhancements work no matter which PID algorithm a particular controller uses, and most are available at least as options on most commercial controllers. On the other hand, it's not always obvious which options have been selected for a particular controller that is already in operation. For example, the process variable signal is often filtered before it enters the PID calculation so as to remove measurement noise that would otherwise cause the control effort to fluctuate unnecessarily (see “The Basics of Numerical Filtering,” Control Engineering, October 2008). The derivative term is especially sensitive to measurement noise. Unfortunately, filtering the process variable also tends to make the controller look sluggish. A user unaware of the filter might try to make the controller more responsive by turning up the controller's gains. The desired closed-loop performance might be achievable, but the filter and the PID algorithm will end up working against each other. Deadband is another mechanism used to minimize excessive fluctuations in the control effort. A Controller equipped with a deadband will do nothing until the calculated control effort changes by more than a set amount. This prevents the controller from moving the control loop's actuator every time the process variable changes only slightly. A user unaware of this function might conclude that the controller is not working at all, es pecially if deadband happens to be set to a particularly large value. With so many variations on “the” PID algorithm in use today, when re-tuning or otherwise modifying an existing controller, the first step has to be determining exactly which kind of PID controller it is. 中文译文 在学校,我得知无处不比例积分微分(PID控制器)控制算法由三个作用于偏差信号的控制器组成,如“理论PID算法”所示。控制器计算过程变量与设定值之间偏差的积分和微分,然后依靠增加这两个数量给偏差本身,来产生控制效果。用户可以选择调试参数——比例增益(P),积分增益(I)和微分增益(D)——给每个控制器合适的加权值,从而调节控制器的性能。 一个应用于过程的PID控制器所产生的正确效果是由比例项产生的比例行为,积分项产生的积分行为以及微分项产生的微分行为所组成的和。P,I,D的调试参数决定了它们每项对于控制效果的贡献。这种协定也可以描述为非相互作用或者算法。这从改变其中一个调试参数而不能改变其他两项的贡献可以看出。 我接着写我的第一次控制工程PID教程,并假定商业用的PID控制器也是如此工作。我很快认识到商业用的PID控制器也是计算偏差信号以及它的积分和微分,但是它们用标准形式的PID算法来处理这三个量,就像“标准PID算法”图中所示一样。它与理论算法完成同样的结果,但是它使用稍微变化点的PID公式,这个公式有一套不同的参数,控制器增益(Kp),积分时间(Ti)和微分时间(Td)。 潜在的混乱。 幸运的是,很容易比较这两个算法,并将P,I,D转换为Kp , Ti, Td。 P = Kp I = Kp / Ti D = Kp · Td 比例增益P和控制器增益Kp一样。所以不清楚理论PID和标准PID算法之间差异 的用户可能也会认为积分增益等同于积分时间,微分增益等同于微分时间。不幸的是,这样认为将使调试回路系统变得不可能。 例如,假设一个在控制工程101班的学生已经决定一个特殊反馈回路的理论控制器参数为比例增益3,积分增益2,微分增益1。根据比例增益,积分时间,微分时间的定义输入这三个值到标准商业用PID控制器,它的设置也是相似的: P=3; I=3/2=1.5; D=3/1=3; 这个控制器将得到预期的比例作用,但是积分作用少了25%,微分作用增加了3倍。 PID算法的标准形式允许用户同时调整所有三项参数的作用——依靠调节Kp的方法,因为比例,积分,微分的作用都与Kp的值有关。这种方法有时候被认为是理论方法,尽管理论学者很少这样用。 到底PID是什么 不合适的调试参数不仅对理论学家们是个问题。一些商业用的PID控制器使用PID算法的连续形式,这种形式依赖于第三套调试参数,参见“连续PID算法”图。一个工业用户想要调试同一个回路里两个控制器,如果一个控制器使用标准算法,而另一个控制器使用连续算法,那么他将等到不同的结果。 更糟糕的是,理论和标准算法有时候都被认为是理想算法,即使它们是不同的。因此,一些调试理想控制器的技巧将不能用于某些理想控制器。 另一方面,相似的叙述好像只涉及理论算法,它的比例,积分,微分项的操作与连续算法相似。讽刺的是,这三项的操作在标准算法中也是相似的,但“标准”和“相似”几 乎从来没有一致过。 在PID算法的这种定义中,比例,积分,微分三项以串联方式工作,每项的作用都与另外两项有关。连续型PID算法在模拟器件的年代比较容易实现,然而现在的商业用控制器实际上都是用数字微处理器实现的。当一个数字控制器替代原来的模拟器件时,为了保持原来的调试参数,连续型算法仍然会被使用。 调试技巧 不同的人对于调试参数有不同的描述符号。在PID控制发展的初期,微分作用就被认为是超前模式,因为微分项看起来像是提前作用,加快控制器的校正效果——在比例项开始作用之前。早期使用者依靠选择“提前作用时间”的大小来增大或减少微分作用。而现在PID使用者称之为比率。 积分作用最初被认为是自动复位,因为积分项看上去能自动调整设定点的精确值,消除有比例项产生的稳态误差。一些用户在调试控制器的积分作用时仍然认为是复位时间,但是较高的复位时间对应的是较小的积分作用。 积分作用的程度有时候被认为是与复位比率有关,但是复位比率是与复位时间相反,而且与微分比率无关。如果对“复位”和”复位比率”困惑,那当使用者想要更小的积分作用时反而会增加它的作用,反之亦然。 同样的,一些PID控制器用比例增益的相反面描述它,称之为比例带。更精确地说,比例带是100除以比例增益,这样它可以按百分比来描述误差信号的变化,这个变化可以引起比例项输出的全面变化。对于“比例带”和“比例增益”的困惑,会导致使用者想增大比例作用时反而减小了它作用,反之亦然。 更多变化 人们这几年都在提高PID控制器的表现。幸运的是,控制者使用的各种PID算法都在增强和改进,而且这些PID算法作为一种选择在商业用的PID控制器上都可以看见。另一方面,在已经运行的某个特殊控制器上这些选择是不常见的。 例如,过程变量信号在它进入PID计算之前通常会被滤波,用来消除测量噪声。否则这些噪声会引起控制器效果不必要的波动。 不幸的是,过滤这个过程变量也将使控制器滞后。比如,一个不清楚滤波器作用的用户想调大控制器的增益使控制器反应良好。预期的闭环回路效果可能可以达到,但滤波器和PID算法最终将影响对方。 死区是用来减小控制器输出过多波动的另一种方法。在高于设定值而使相应的控制输出变化前,一个带死区的控制器不会做任何反应。这样,控制回路的执行器就不会因为过程变量只变化一点而每次都移动。而不清楚死区功能的用户可能就认为这是控制器不总是在工作的原因,特别是当死区设为一个比较大的值的时候。 现在PID算法有很多变化,所以当重新调试或者修改一个已经存在的控制器时,第一步是要确定它究竟是那种类型的PID控制器。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务