浙江大学
浙大一队
浙大
一队
第十届“飞思卡尔”杯全国大学生 智能汽车竞赛 技技 术术 报报 告告 学 校:浙江大学 队伍名称:浙大一队 参赛队员:王誉博 蒙志全 谢敦见 李媛 带队教师:姚维 韩涛 关于技术报告和研究论文使用授权的说明 本人完全了解第十届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。参赛队员签名:王誉博 蒙志全 谢敦见 李媛 带队教师签名:姚维 韩涛 日 期:2015.8.16 目录 第一章 引言.4 第二章 整车设计.5 第三章 机械结构调整.7 3.1 转角舵机的固定与安装.7 3.2 前轮定位.7 3.2.1 主销后倾.7 3.2.2 主销内倾.8 3.2.3 前轮外倾.8 3.3.4 前轮前束.9 3.4 后轮差速机构调整.9 3.5 轮胎的选用.10 3.6 重心的调整.10 3.6 传感器的安装.11 3.6.1 磁场检测电感安装.11 3.6.2 编码器安装.11 3.6.3 超声波模块的安装.12 3.6.4 停止线检测模块的安装.13 37 整车结构.14 第四章 硬件电路的设计.15 4.1 系统电源设计.15 4.2 控制电路设计.15 4.3 检波电路设计.16 4.4 驱动电路设计.17 4.5 硬件按键电路设计.19 4.6 起跑线检测电路设计.20 第五章 软件系统设计.21 5.1PID 控制.21 5.2 转向控制.21 5.3 速度控制.22 5.4 双车距离控制.22 第六章 开发和调试.24 第七章 总结.25 参考文献.26 附录 A 部分程序代码.27 附录 B 电路原理图.57 第一章第一章 引言引言 全国大学生智能汽车竞赛是全国高等教育司委托高等学校自动化专业教学 指导分委会主办,旨在培养创新精神、协作精神,提高工程实践能力的科技活 动。该竞赛是以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感技 术、电子、电气、计算机、机械等多个学科交叉的科技创意性比赛。本智能小车以飞思卡尔 32 位微控制器 MK60DN512VLQ10 作为唯一的核心控 制单元,采用电感线圈和干簧管获取道路信息,通过设计简单的 PID 速度控制 器和简单的 PID 方向控制器实时调整小车的速度与转角。由于本届电磁组要求双车追逐,我们制作了两辆软硬件几乎完全相同的小车,在两车上安装鸳鸯超声波测距模块,测量两车行进过程中的距离,使用距离 PID 调车两车速度。本报告分为九个章节:第一章为引言介绍;第二章为整车设计;第三章具体 介绍了机械结构调整;第四章为硬件电路的设计说明;第五章介绍了软件系统设计;第六章为开发和调试;第七章为结论。第二章第二章 整车设计整车设计 赛车是以检测通以 20KHz、100mA 的导线的电磁场为基础,通过单片机处 理采集到的磁感应电压信号,实现对赛车的转向控制,进而识别赛道达到路径 寻迹的目的。根据电磁寻迹的设计方案,赛车整体包括以下四大模块:1.单片机控制模块 2.电磁传感器模块 3.电机驱动模块 4.电源管理模块等,除此之外系统还有一些外部设备,例如编码器测速、舵机控制转向、直流电机驱动车体,干簧管检测 起跑线、超声波模块等。综上所述,本智能车系统包含了以下几个模块:1.电源模块 2.单片机最小系统模块 3.传感器模块 4.电机模块 5.舵机模块 6.测速模块 7.起跑线检测模块 8.超声波模块 9.陀螺仪模块 10.人机交互模块 系统总体结构如图 2.1 所示。单片机系统电源管理模块编码器电机驱动舵机传感器信号检测起跑线检测人机交互直流电机蓝牙通信模块超声波测距 图图 2.2.1 1 系统结构图系统结构图 表 2.1 模 型车 基本参 数(前车)车体长 730mm 车体宽 220mm 车体高 310mm 总重量 1.251kg 传感器种类及个数 编码器 1 个,干簧管4个,工字电感6个,超声波1个 电容总量 3560.6uf 第三章第三章 机械结构调整机械结构调整 3 3.1 1 转角舵机的转角舵机的固固定定与与安装安装 对于舵机的安装,不难发现,将舵机的摆臂增长可以提高舵机的响应速度。因为舵机的摆臂越长,当车轮转过相同的角度时,舵机转过的角度越小,即时 间越短。但是摆臂过长又会增加舵机的负载,导致转向困难。经过合理的计算,我们组选择卧式的安装方式。图 3.1 舵机安装 3.23.2 前轮定位前轮定位 为了使模型车在直线行驶时更加稳定,转向轻便,转向后能自动回正,并减少轮胎和转向系零件的磨损等,在转向轮、转向节和前轴之间形成一定的相对安装位置,叫车轮定位。其中包括主销后倾、主销内倾、车轮外倾和前束。我们今年的比赛车模主销后倾角与前轮外倾不可直接调整,但是通过对前悬挂系统的适当打磨(规则允许)可以达到一定的调整。接下来主要介绍主销后倾、主销内倾和前束对车子行驶的影响及调教。3 3.2.1.2.1 主销主销后倾后倾 主销后倾是指主销装在前轴、上端略向后倾斜的角度。主销后倾主要影响的也 是前轮稳定性和舵机转向负担。因此要在车子的稳定性和转向灵活性之间做一个权 衡。主销后倾角越大,车速越高,前轮稳定性也愈好,但转向愈沉重。根据我们的 实际情况,我们选择了 4 度左右。图 3.2 主销后倾示意图 3 3.2.2.2 2 主销主销内倾内倾 主销内倾是指主销装在前轴略向内倾斜的角度,它的作用是使前轮自动回正。前轮内倾的优点是增加了前轮的稳定性,但同时也增加了舵机转向的负担。角度越 大前轮自动回正的作用就越强烈,但转向也越费力,轮胎磨损增大;反之,角度越 小则前轮自动回正的作用就越弱。为了保证前轮转向的灵活度,主销内倾不宜过大,故将其调节为 3 度左右,是一个适中的值。图 3.3 主销内倾角 3.2.33.2.3 前轮外倾前轮外倾 前轮外倾角的调整主要影响弯道性能。我们可以通过调整前轮轴平面上方的螺丝长度来影响前轮外倾角。实际调整中,我们小车前轮调成“八”字型,这样调整可以是小车转向时候更加平稳,但是会增加舵机负载引起转向 迟滞。具体的调整长度则需要实验中进行调整。图 3.4 前轮外倾角 3.3.43.3.4 前轮前束前轮前束 前束是指两轮之间的后距离数值与前距离数值之差。前轮前束的作用是保证车 模的行驶性能,减少轮胎与地面的磨擦。前轮在滚动时,其惯性力会将轮胎向内偏 斜,如果前束调节得恰当,轮胎滚动时的偏斜方向就会抵消,轮胎内外侧磨损的现 象会减少。通过试验,将其调至 4.5mm 左右。图 3.5 前轮前束示意图 3.3.4 4 后轮后轮差速机构调整差速机构调整 差速作用就是在电机向两边半轴传递动力的同时,允许两边半轴以不同的转速旋转,满足两边车轮尽可能以纯滚动的形式作不等距行驶,减少轮胎与地面的摩擦。模型车在过弯时车轮的轨线是圆弧,如果向左转弯,在相同的时间里,右侧轮子走的弧线比左侧轮子长,为了平衡这个差异,就要左边轮子慢一点,右边轮子快一点,用不同的转速来弥补距离的差异。我们希望是模型车在加减速的时候,后轮没有差速,而在过大弯道时有很大的差速。这样,即加速快又过弯灵活。但是,实际的差速机构不可能达到这效果,我们调节差速只是平衡两项,在转弯较灵活地方情况下尽量不影响加速性能。B 型模型车采用双滚珠差速,首先将左后轮的防松螺母拧紧,通过调整后轴上的防松螺母压紧小差速盘;通过调整右后轮防松螺母的松紧,实现对大差速齿轮盘松紧的调节。调节后的效果应为:开动电机后,握住一侧轮,另一侧可正常转动;握住两侧轮,差速尺寸无法转动。3.53.5 轮胎的选用轮胎的选用 据说本届智能车官方轮胎采用新配方,赛道也使用了新的 PVC 材料,所以轮胎情况有所不同。在调试中,我们采用过硬地板上铺赛道,导致轮胎的磨损十分严重,轮胎掉屑,影响小车转向。因此调试过程中我们尽量注意轮胎的保养,调整前轮倾角,得到一个不再磨损轮胎的适宜角度。轮胎会随着小车的调试时间越长变软变黏,对于提升摩擦力有帮助,因此我们始终保持保养一套轮胎。3.63.6 重心的调整重心的调整 重心的调整包括重心高度的调整与前后的调整。重心的高度是影响智能车稳定性的因素之一。当重心高度偏高时,智能车在转弯过程中会发生后轮抬起,即抬脚现象,严重时甚至翻车。合理的底盘刚度和底盘高度调节会提高智能车的加速性能。智能车的重心应该越低越好,降低地盘时实现重心下降的较为直接的方式。应注意到底盘高度的调节是将智能车的其他性能提高以后间接的帮助加速性能提高。但是由于赛道中坡道的限制,底盘的高度在低于 5mm 时将会冲撞坡道,并不使地盘受到不必要的磨损和震荡,剧烈的冲击甚至会撞坏转向机构。因此地盘距离地面高度不能低于 5mm。降低底盘的方式可以通过在前桥、后桥处增加垫片来实现。重心的前后同样十分关键,合理的重心位置应当在车身前后轮的重点,靠前会使转向困难,靠后会使后轮甩动。由于电磁车的碳杆在最前方会对重心前后有很大影响,所以我们尽可能地减小前部的重量,如使用细碳杆、固定螺丝与螺柱使用铝柱与尼龙螺丝,将电池尽量靠后放,往低放。3.63.6 传感器的安装传感器的安装 3.6.13.6.1 磁场检测电感安装磁场检测电感安装 电磁车利用工字电感和电容谐振检测 20kHZ 电流产生的磁场,我们使用两排的电感检测磁场以得到偏差。其中前后排分别有一定角度的八字形内偏。此外我们分别使用了一个垂直于车身和平行于车身的横排与竖排电感,可以用于检测十字和直角等特殊赛道。磁场检测电感的安装位置如下图所示。图 3.6 磁场检测电感安装示意图 3.6.23.6.2 编码器安装编码器安装 速度编码器我们采用了欧姆龙编码器,安装方法如下:用十字扳手套筒将车的后轮拆卸后,安装编码器,固定编码器的固定件是根据车得尺寸及与编码器 的相对位置连接固定件。在安装完后轮后,在利用十字扳手套筒将后轮装上。安装时应注意调整好齿轮间隙。齿轮传动机构对车模的驱动能力有很大的影响。齿轮传动部分安装位置的不恰当,会大大增加电机驱动后轮的负载,会严重影响最终成绩。调整的原则是:两传动齿轮轴保持平行,齿轮间的配合间隙要合适,过松容易打坏齿轮,过紧又会增加传动阻力,浪费动力;传动部分要轻松、顺畅,不能有迟滞或周期性振动的现象。判断齿轮传动是否良好的依据是,听一下电机带动后轮空转时的声音。声音刺耳响亮,说明齿轮间的配合间隙过大,传动中有撞齿现象;声音闷而且有迟滞,则说明齿轮间的配合间隙过小,或者两齿轮轴不平行,电机负载变大。调整好的齿轮传动噪音很小,并且不会有碰撞类的杂音,后轮减速齿轮机构就基本上调整好了,动力传递十分流畅。图 3.7 编码器的安装 3.6.3.6.3 3 超声波模块的安装超声波模块的安装 由于本届电磁组规则要求刷车追逐,因此需要实时测量两车在行进过程中的距离,最初我们使用了普通的超声波测距模块,仅由后车发送超声波,由前车反射,但是由于普通的超声波模块会受到周围环境的影响,导致距离测量不准确。最终我们选择了鸳鸯超声波模块,发送模块装在前车后端,接收模块装在后车前端,安装示意图如下。图 3.8 超声波模块的安装 3.6.43.6.4 停止线检测模块的安装停止线检测模块的安装 本届电磁车仍然是在停止线处检测磁钢来控制停车,我们使用常见的干簧管来检测磁钢,为了能够准确地检测停止线,我们使用了四个干簧管并联来检测磁钢。四个干簧管的位置位于中心的四个磁钢的正上方。安装位于主控板的下方,车的正中央。图 3.9 干簧管的安装 3 37 7 整车结构整车结构 经过全车的设计,我们最终完成了如下的的整车设计,整体重心居中,碳杆有大约 50cm 的前瞻,碳杆质轻且有韧性。而两辆车结构设计完全相同。第第四四章章 硬件电路的设计硬件电路的设计 4 4.1.1 系统电源设计系统电源设计 整体电路使用 7.2V 的锂电池供电,而电路中各模块使用的电压等级有 5V、3.3V。系统要稳定工作,需要电源稳定,为了降低干扰,我们在电路中使用多个稳压模块分别为不同的部分进行供电,其中 5V 芯片使人性用 7805 芯片,使用两个 7805 分别作为模拟 5V 和数字 5V 电源。3.3V 芯片使用 LM1117-3.3,使用两个 LM1117-3.3 分别作为单片机与其他芯片的电源。此外,由于舵机工作电压范围为4.5-5.5V,电压越高响应速度越快,因此我们使用AS1015为舵机供电。系统电源电路如下。4 4.2.2 控制电路设计控制电路设计 我们使用大赛指定的 MK60DN512VLQ10 芯片,实际使用中我们使用了三个 FTM通道输出不同频率的 PWM 波分别用于舵机、直流电机和编码器计数,使用了两个串口用于两个蓝牙,使用了 8 个 AD 口用于检波电路的 AD 采样,此外还用了多个普通 IO 口用于其他模块。我们设计了 K60 的外围电路用于保证 K60 的正常工作,引出我们需要的 IO口。设计电路如下。图 4.1 控制电路设计 4 4.3.3 检波电路设计检波电路设计 我们在传感器方案上延续了第一届大多数队伍的传感器方案工字谐振电感。我们熟知的磁传感器是霍尔,磁敏电阻,磁敏二极管,电感,电子罗盘的磁场传感器等。霍尔检测频率一般不能到达 20KHz(组委会特意选的频段)因此排除。赛道产生的磁场小于地磁场,因此电子罗盘的磁场传感器也排除。磁敏电阻和磁敏二极管产生信号太小不利于处理。最终敲定工字电感作为传感器。同时电感加上电容形成 LC 谐振电路。根据经验,挑选电感的时候要选择磁芯磁导率大的,电感圈数比较多的,等效内阻小的。综合考虑后选择 10mH 的工字电感。根据并联谐振电路的频率,带入频率可以得到电容大小。公式为 f=1/2LC。其中L=10mH,得到 C=6.33nF,实际选择 6.8nF。为了保证两侧电感的对称性,我们对电感进行了大量的筛选,测量其电感与电阻值,保证两侧电感的谐振性能和衰减性能一致。由于电感感应出来的感应电动势比较小而且是差分信号,所以需要放大电路 进行调理。为了保证信号放大的线性度,我们使用了双电源运放,采用 NE5532 运算放大器。图 4.2 检波电路 4 4.4.4 驱动电路设计驱动电路设计 常用的电机驱动有两种方式:一、采用集成电机驱动芯片;二、采用 N 沟道MOSFET 和专用栅极驱动芯片设计。市面上常见的集成 H 桥式电机驱动芯片中,7960 是在比赛中非常常用的驱动芯片,是半桥驱动,所以要实现正反转控制需要两片。单片的驱动能力 43A,7970 单片的驱动能力 68A。但是由于比赛电机内阻仅为几毫欧,使用集成芯片会经常出现发热量大的情况,降低了电机的效率和控速的稳定性。所以我们采用了分立的 N 沟道 MOSFET具有极低的导通电阻,大大减小了电枢回路总电阻。在栅极驱动芯片选择方面,我们选择 IR2104 芯片,2104 芯片可以驱动高端和低端两个沟道 MOSFET,提供较大的驱动电流,并有硬件死区,防止同桥臂导通。使用两篇 IR2104 可以构成一个 MOS 管全桥驱动电路。4.3 栅极驱动芯片电路 由于 MOSFET 需要 12V 左右的栅极驱动电压,因此我们使用 MC34063 升压芯片将 7.2V 电压升至 12V 左右,升压电路如下。图 4.4 12V 升压电路 在 MOSFET 选用方面,我们从耐压、导通内阻几个方面,选用 TO-252 封装的IRLR7843 型 MOSFET,VDSS=30V、RDS(on)=3.3m、ID=110A,满足 540 电机的驱动。为了加快驱动电路的开通与关断,提高驱动电路的速度,减少死区,我们使用了多个快速关断二极管,最终设计 H 桥电路如下。图 4.5 H 桥驱动电路 此外,由于 MOS 管的导通电阻只有几毫欧,所以同桥臂导通会导致驱动电路瞬间损害,是电路损坏的主要原因,因此必须从硬件电路方面杜绝。因此,我们使用 74HC02 逻辑门芯片,防止同桥臂导通,电路设计如下。图 4.6 逻辑保护电路 逻辑关系为 4 4.5.5 硬件按键电路设计硬件按键电路设计 为了能够够在线修改小车程序参数,我们设计了人机交互的按键,配合液晶屏。按键电路如下。图 4.7 按键开关点路 4 4.6.6 起跑线检测电路设计起跑线检测电路设计 按照比赛规则,起跑线是 6 个按照一定间隔放置的磁钢(表面磁场强度 3000到 5000 高斯)组成,而且磁钢的极性是随机放置的。如果使用霍尔方式检测那么极性问题就一定要考虑进去,所以一对霍尔传感器至少是两个。但是如果使用干簧管,极性的问题就不用考虑。干簧管一端接地,一端接一个上拉电阻接5V 电源,并与单片机的 IO 口相连。最后只需要用程序去检查低电平,就可以检测出起跑线。4.7 硬件电路整体装配 第五第五章章 软件系统设计软件系统设计 本队所用的软件调试工具为 IAREmbeddedWorkbench 软件,这个软件支持 C语言和汇编语言的混合编程,由于 C 语言操作简单,可修改和移植性强,所以大部分程序都使用 C 语言编写,只有在某些地方加入了汇编语句。5 5.1.1PIDPID 控制控制 控制算法是微机化控制系统的一个重要组成部分,整个系统的控制功能主要由控制算法来实现。目前提出的控制算法有很多。根据偏差的比例(P)、积分(I)、微分(D)进行的控制,称为 PID 控制。实际经验和理论分析都表明,PID 控制能够满足相当多工业对象的控制要求,至今仍是一种应用最为广泛的控制算法之一。PID 控制主要有三部分组成,比例、积分、微分。比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。偏差一旦产生,调节器立即产生控制作用使被控量朝着减小偏差的方向变化,控制作用的强弱取决于 KP。当仅有比例控制时系统输出存在稳态误差。为了消除稳态误差,引入积分控制。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。为了预测预测误差变化的趋势,引入微分的控制器,这样就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。为了方便单片机的数字处理和分析,采用以下公式设计算法。式中:KP 称为比例增益;KI 称为积分系数;KD 称为微分系数。控制上我们采用模糊控制,模糊即对公式中的 KP、KI、KD 进行模糊,即三者的值会随着偏移量或偏移量的变化率而改变,以实现精准控制的目的。5 5.2.2 转向控制转向控制 模糊算法可以解决一些非线性问题,将赛道分为直线、入大小弯、出大小弯、)2()1(2)()()1()()1()()(kekekeKkeKkekeKkukukuDIP 蛇形弯道,对应的直线加速、入大弯减速转方向、入小弯制动转方向、出弯加 速、蛇形弯道直接通过(若可以达到这种前瞻性)。要达到这种控制要通过实际 检测,分析大量赛道磁场信息,找出它们的特征。因此,我们使用模糊 PID 控制策略,对不同的赛道偏差进行分段分别处理,使得小车对于转向和变速的控制更具连续性,也更加迅速。其中,舵机采用模糊 PD 控制,输入为偏差和偏差变化率输出为舵机的 PD控制参数,调试时主要修改模糊表。5 5.3 3 速度速度控制控制 本届电磁组使用的是 B 型车模,采用单电机控制。由车模的姿态确定相应给定的速度,比如直道上应该尽量加速,而检测到入弯时应减速,弯心时要保持一个机械所能适应的恒速,出弯时则因适当加速等等。速度给定的策略对于 B 车模而言是非常重要的,甚至可以说是决定 B 车模平均速度以及稳定性最为重要的一环。当速度给定之后,则可通过编码器获知当前车模实际速度,用这两个值的关系进行速度闭环控制。直流电机系统是一个经典滞后系统。考虑到消除滞后,应该在控制环节里面加入微分项,但是注意到车模运行的给定速度也是一个不可预测量,所以引入微分项基本达不到效果,甚至可能会导致系统发散,故此处只用到经典 PID 理论中的比例积分环节(PI)对电机进行控制。电机采用增量式 PI 的方法控制,控制增量 u(k)的确定仅与最近若干次的采样值有关,容易通过加权处理获得比较好的控制效果,计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小。速度的给定采用模糊控制方法,输入为偏差和偏差的变化率,输出为目标速 度,将计算出来的速度送给控速函数进行速度控制。5 5.4.4 双车距离控制双车距离控制 作为第一届电磁双车,我们为双车制定了一定的策略。由于不可能完全保证两辆车在行进过程中保持距离恒定,因此需要实时纠正。我们使用比较容易的超声波模块加蓝牙通信保证双车距离大致恒定。其中,超声波测距模块使用鸳鸯超声波测距模块,由于鸳鸯超声波测距模 块是前车发送信息,后车接收信息,不会受周围环境影响,因此测量距离比普通超声波稳定,受干扰小。此外,它占用资源少,只需两个 IO 口,且测量周期达到 20ms,可以满足实时控制的要求。此外,我们使用蓝牙模块实现实时通信,在后车接收到距离信息后,使用距离 PID 得到双车的变速修正量,如前车适当减速,后车适当加速,最终保证两车在一定的距离范围内。蓝牙通信还可用于同时发车,利用通信实现双车同步发车。蓝牙通信还可用于双车分别经过停止线之间的通信,由于两车均装干簧管,我们使用前车通过停止线,向后车发出通过信息,过 0.5s 停车。后车收到信息后加速前进,直至通过停止线后停车。这样可以减少时间差。第第六六章章 开发和调试开发和调试 开发工具使用的是大赛组委会提高的 IAR_Embedded_Workbench 开发环境,可以使用 j-link 调试器将程序下载至单片机内。图 6.1 IAR 开发环境 调试方法:我们使用蓝牙模块实现智能车和上位机的通讯,将智能车行进过程中的数据发回到上位机并绘制曲线,用以分析和修改参数。图 6.2 蓝牙发送模块 第第七七章章 总结总结 智能车伴随我们度过了大部分的大三生活,从最初的一无所知到如今能够参加国赛,中途经历了各种瓶颈、突破甚至退步,直至最后的飞跃。由于本届智能车对于规则有较大的变化,为双车追逐。我们最初制定的战略为制作两辆基本相同的 B 车,这样可以两辆车快速复制,然后使用测距模块测量行进距离制定跟车策略。但是由于我们缺乏 B 车模的经验,因此在最初七八个月始终没哟大的提速。经过全组组员的努力,对整车的硬件、机械和程序都进行了很大的改动,包括主控板迭代了六版,重搭了五六次车模,不断提高制作的精度。尤其是在机械方面的琢磨,使我们在后期至少提升了 1m/s。电磁组可以大致分为硬件、机械和控制三个方面,其中机械决定极限,控制能够逼近极限,而硬件的稳定是一切的前提。正式我们全组在各个方面的兼顾和配合,最终使我们能够坚持到现在。在调试本届电磁 B 车的过程中,我们深刻体会到机械的重要性,包括车模的高度对称,轮胎摩擦力的大小。可以说,当小车达到 2m/s 左右的速度时,就必须在机械方面下足功夫,才能继续有大的进步。参考文献参考文献 1Freescale.MK60DN512ZVLQ10.DataSheetOL.Documentation:,2010 2刘金琨.先进 PID 控制 MATLAB 仿真(第 3 版)M.北京.电子工业出版社.2011 3杨东轩,王嵩.ARMCortex-M4 自学笔记:基 KinetisK60M.北京.北京航空航天大学出版社2013 4谭浩强,C 语言程序设计M.清华大学出版社,2006.1 附录附录 A A 部分程序代码部分程序代码 int car_MP=200;int car_MN=0;int car_sd5=480;const int sd5_pwm_z=480;int sensor6;int sensor_max6=10,10,10,10,10,10;int ad_in6;int k_sensor=1000000;int flag_right=0,flag_left=0;int sd5_PB=450;int sd5_DB=350;int sd5_PF=200;int sd5_DF=100;int DF9=-2500,-1200,-900,-650,0,650,900,1200,2500;int SD5PF9=0,0,00,00,00,00,00,0,0;int DCF9=-1500,-1200,-800,-400,0,400,800,1200,1500;int SD5DF9=0,0,0,0,0,0,0,0,0;int speed_goal_F99=/DF0 DCF1 DCF8 200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200 ;int DB9=-2500,-1800,-1000,-400,0,400,1000,1800,2500;int SD5PB9=250,270,330,370,200,370,330,270,250;int DCB9=-800,-500,-300,-100,0,100,300,500,800;int SD5DB9=500,620,780,900,0,900,780,620,500;int speed_goal_B99=200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200 ;int tanx;int DMF20;int DMB20;int DMDB;int DMDF;int flag_rangle=0;int flag_shizi=0;double MB_grade2;double MF_grade2;double MDB_grade2;double MDF_grade2;int i,j,k;void PIT0_IRQHandle(void)DisableInterrupts;PIT_Flag_Clear(PIT0);ad_in0=4*ad_in0+ad_mid(ADC1,AD8,ADC_16bit);ad_in0/=5;ad_in1=4*ad_in1+ad_mid(ADC1,AD9,ADC_16bit);ad_in1/=5;ad_in2=4*ad_in2+ad_mid(ADC1,AD10,ADC_16bit);ad_in2/=5;ad_in3=4*ad_in3+ad_mid(ADC1,AD11,ADC_16bit);ad_in3/=5;ad_in4=4*ad_in4+ad_mid(ADC1,AD12,ADC_16bit);ad_in4/=5;ad_in5=4*ad_in5+ad_mid(ADC1,AD13,ADC_16bit);ad_in5/=5;if(gpio_get(PORTC,6)if(ad_in2-ad_in3-500)LED4_SET(LED_ON);for(i=0;i6;i+)sensor_maxi=ad_ini;else LED4_SET(LED_OFF);else LED4_SET(LED_OFF);for(i=0;i6;i+)sensori=(int)(ad_ini*750/sensor_maxi);for(i=0;i6;i+)if(sensori0;i-)DMBi=DMBi-1;DMFi=DMFi-1;tanx=(int)(ad_in4-2000)*58000/sensor5/sensor_max5);if(tanx330000)tanx=330000;sensor0=sensor1=700;DMF0=(int)(k_sensor+tanx)/sensor0-(k_sensor+tanx)/sensor1);DMB0=(int)(k_sensor+tanx)/sensor2-(k_sensor+tanx)/sensor3);if(DMB0-700&DMB0700&sensor2600&sensor33000&sensor5680)flag_shizi=1;if(sensor2250&sensor3450)flag_right=1;if(DMB0500)|(sensor3500)&(DMB0=-450&DMB0=450)flag_left=0;flag_right=0;if(flag_right&DMB0=-350)DMB0=DB0;if(sensor2700|sensor3700)flag_rangle=0;if(flag_rangle)DMB0=3*DMB0;if(sensor42500|sensor5630)flag_shizi=0;if(flag_shizi)DMB0=DMB0/3;LED3_SET(LED_OFF);/*if(sensor0450&sensor1=-450&DMF0sensor3+50)DMB0=DB0;LED3_SET(LED_ON);if(sensor2DB8)DMB0=DB8;if(DMB0DF8)DMF0=DF8;if(DMF0DCF8)DMDF=DCF8;if(DMDFDCB8)DMDB=DCB8;if(DMDBDCB0)DMDB=DCB0;for(i=0;i=DFi&DMF0=DCFi&DMDF=DBi&DMB0=DCBi&DMDB=DCBi+1)xielv=(SD5DBi+1-SD5DBi)*1.0/(DCBi+1-DCBi);sd5_DB=(int)(SD5DBi+xielv*(DMDB-DCBi);for(i=0;i=DFi&DMF0=DCFi&DMDF=DCFi+1)MDF_grade0=(DCFi+1-DMDF)*1.0/(DCFi+1-DCFi);MDF_grade1=1-MDF_grade0;k=i;car_MP=0;car_MP=(int)(speed_goal_Fkj*MF_grade0*MDF_grade0 +speed_goal_Fkj+1*MF_grade1*MDF_grade0 +speed_goal_Fk+1j*MF_grade0*MDF_grade1 +speed_goal_Fk+1j+1*MF_grade1*MDF_grade1);for(i=0;i=DBi&DMB0=DCBi&DMDB610)car_sd5=610;if(car_sd5350)car_sd5=350;FTM_PWM_Duty(FTM0,CH4,car_sd5);EnableInterrupts;include include.h#include common.h#define LCD_SCL(x)gpio_set(PORTA,17,x)#define LCD_SDA(x)gpio_set(PORTA,16,x)#define LCD_RST(x)gpio_set(PORTA,14,x)#define LCD_DC(x)gpio_set(PORTA,15,x)#define X_WIDTH 128#define Y_WIDTH 64 static const unsigned char F6x86=0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x2f,0 x00,0 x00,0 x00,0 x00,0 x07,0 x00,0 x07,0 x00,0 x00,0 x14,0 x7f,0 x14,0 x7f,0 x14,0 x00,0 x24,0 x2a,0 x7f,0 x2a,0 x12,0 x00,0 x62,0 x64,0 x08,0 x13,0 x23,0 x00,0 x36,0 x49,0 x55,0 x22,0 x50,0 x00,0 x00,0 x05,0 x03,0 x00,0 x00,0 x00,0 x00,0 x1c,0 x22,0 x41,0 x00,0 x00,0 x00,0 x41,0 x22,0 x1c,0 x00,0 x00,0 x14,0 x08,0 x3E,0 x08,0 x14,0 x00,0 x08,0 x08,0 x3E,0 x08,0 x08,0 x00,0 x00,0 x00,0 xA0,0 x60,0 x00,0 x00,0 x08,0 x08,0 x08,0 x08,0 x08,0 x00,0 x00,0 x60,0 x60,0 x00,0 x00,0 x00,0 x20,0 x10,0 x08,0 x04,0 x02,0 x00,0 x3E,0 x51,0 x49,0 x45,0 x3E,0 x00,0 x00,0 x42,0 x7F,0 x40,0 x00,0 x00,0 x42,0 x61,0 x51,0 x49,0 x46,0 x00,0 x21,0 x41,0 x45,0 x4B,0 x31,0 x00,0 x18,0 x14,0 x12,0 x7F,0 x10,0 x00,0 x27,0 x45,0 x45,0 x45,0 x39,0 x00,0 x3C,0 x4A,0 x49,0 x49,0 x30,0 x00,0 x01,0 x71,0 x09,0 x05,0 x03,0 x00,0 x36,0 x49,0 x49,0 x49,0 x36,0 x00,0 x06,0 x49,0 x49,0 x29,0 x1E,0 x00,0 x00,0 x36,0 x36,0 x00,0 x00,0 x00,0 x00,0 x56,0 x36,0 x00,0 x00,0 x00,0 x08,0 x14,0 x22,0 x41,0 x00,0 x00,0 x14,0 x14,0 x14,0 x14,0 x14,0 x00,0 x00,0 x41,0 x22,0 x14,0 x08,0 x00,0 x02,0 x01,0 x51,0 x09,0 x06,0 x00,0 x32,0 x49,0 x59,0 x51,0 x3E,0 x00,0 x7C,0 x12,0 x11,0 x12,0 x7C,0 x00,0 x7F,0 x49,0 x49,0 x49,0 x36,0 x00,0 x3E,0 x41,0 x41,0 x41,0 x22,0 x00,0 x7F,0 x41,0 x41,0 x22,0 x1C,0 x00,0 x7F,0 x49,0 x49,0 x49,0 x41,0 x00,0 x7F,0 x09,0 x09,0 x09,0 x01,0 x00,0 x3E,0 x41,0 x49,0 x49,0 x7A,0 x00,0 x7F,0 x08,0 x08,0 x08,0 x7F,0 x00,0 x00,0 x41,0 x7F,0 x41,0 x00,0 x00,0 x20,0 x40,0 x41,0 x3F,0 x01,0 x00,0 x7F,0 x08,0 x14,0 x22,0 x41,