安徽赛区-电磁组-合肥工业大学-斛兵7队技术报告,合肥工业大学斛滨礼堂,安徽合肥工业大学,合肥工大 斛兵塘 QQ空间素材网 > 合肥工业大学斛兵塘 > 安徽赛区-电磁组-合肥工业大学-斛兵7队技术报告,合肥工业大学斛滨礼堂,安徽合肥工 正文

安徽赛区-电磁组-合肥工业大学-斛兵7队技术报告,合肥工业大学斛滨礼堂,安徽合肥工业大学,合肥工大 斛兵塘

发布时间:2013-09-20 来源: 合肥工业大学斛兵塘

合肥工业大学第十二届“斛兵杯”大学生学术科技作品竞赛终审决赛作品名单 序号 学院 ... 对中部三省(安徽、河南、湖北)的思考 哲学社会科学类社会调查报告 和学术论文 哲学...

第九届“飞思卡尔”杯全国大学生 智能汽车竞赛 技 术 报 告 学 校:合肥工业大学 队伍名称:斛兵 7 队 参赛队员:蔡柏林 陈黎明 田超 带队教师:张阳 史久根 关于技术报告和研究论文使用授权的说明 本人完全了解第九届“飞思卡尔”杯全国大学生智能汽车邀请赛关于保留、 使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组 委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方 案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组 委会出版论文集中。 参赛队员签名:

带队教师签名:

日 期: II 目 录 摘要 .................................................................. 1 Abstract .............................................................. 2 第一章 引 言 ........................................................ 3 1.1 比赛背景 ......................................................... 3 1.2 总体方案介绍 ..................................................... 3 1.3 本文结构 ......................................................... 4 第二章 机械结构部份的设计及调整 ........................................ 5 2.1 整车布局 ......................................................... 5 2.2 转向舵机的安装 ................................................... 5 2.3 传感器的安装 ..................................................... 7 2.4 测速传感器的安装 .................................................. 8 2.5 智能车前轮及后轮定位的调整 ........................................ 9 2.5.1 前轮及后轮定位的定义 ....................................... 9 2.5.2 前后轮定位的调节经验 ...................................... 11 2.6 车底盘的调整 .................................................... 11 第三章 硬件设计 ....................................................... 12 3.1 硬件设计概述 .................................................... 12 3.2 MK60FX512VLQ15 单片机系统设计 ..................................... 12 3.2.1 单片机特性 ............................................... 12 3.2.2 电源电路 ................................................. 13 3.2.3 时钟电路 ................................................. 14 3.2.4 单片机系统引脚分配 ........................................ 14 III 3.3 传感器电路设计 ................................... 错误!未定义书签。

3.4 直流电机驱动模块设计 ............................................. 17 3.5 测速模块设计 .................................................... 17 3.6 人机交互模块设计 ................................................. 19 3.6.1 OLED 模块设计 ............................................ 19 3.6.2 拨码开关电路设计 .......................................... 21 3.7 电源管理模块设计 ................................................ 22 第四章 算法实现及软件设计 ............................................. 24 4.1 路径识别算法分析及选定 ........................................... 24 4.2 起跑线识别程序设计 ................................ 错误!未定义书签。

4.3 转向舵机控制程序设计 ............................................. 25 4.4 电机控制程序设计 ................................................. 26 4.4.1 基于增量式 PID 的电机控制算法 .............................. 26 4.4.2 速度分配 ................................................. 26 4.5 系统程序流程图 .................................................. 27 第五章 智能车系统模块调试 ............................................. 28 5.1 路径探测模块调试 ................................................. 29 5.2 转向舵机调试 .................................................... 29 5.3 系统调试 ........................................................ 30 第六章 智能车主要技术参数说明 ......................................... 31 结 论 ............................................................. 32 参 考 文 献 ........................................................... 33 附 录 A ............................................................ 34 IV 摘要 摘 要 本文以第九届全国大学生智能车竞赛为背景,介绍了智能赛车设计、制作 的技术信息。该比赛采用大赛组委会统一提供的1:10仿真车模,以Freescale 半导体公司生产的32位单片机MK60FX512VLQ15为核心控制器, 采用IAR Embedded Workbench作为开发环境,自主构思控制策略和算法结构,硬件上采用IR2104S 驱动MOS管,用两路PWM波控制电机正反转,传感器采用普通工字电感构成谐振 回路,通过感应赛道导线上方的磁场,控制规定车模在50cm宽的赛道上稳定行 驶。硬件上通过对汽车动力学理论的学习来优化智能车的机械结构,软件上通 过对PID控制,来提高智能车的速度和鲁棒性。

关键词:智能车 单片机 电磁导航 PID 控制器 ABSTRACT This article introduces the information about designing and making the car in the background of the 8th National Intelligent Car Contest for College Students. This contest adopting 1/10 EP on-racing car prescribed by the contest organization committee, Using the provided 32 bit MCU MK60FX512VLQ15 of freescale corporation as the main controller,selecting the IAR Embedded Workbench as the development environment, design the tactics. Using the IR2104 and MOSFET to control the running directions of the motor by two PWM-waves. Adopting the normal DR CORE as the sensor, control the smart car to run on the 50cm-wide-track by inducing the magnetic field above the wire at the center of the track. By studying the automobile dynamics to optimize the mechanism in the hardware and the combination of different control-theories such as PID control , we can make the smart car more steady and more fast and reach higher robustness. 1 第九届全国大学生智能汽车邀请赛技术报告 【Keyword】 Smart-Car Controller MCU Electromagnetic Navigation PID 2 第一章 引言 第一章 引 言 1.1 比赛背景 智能车是一种高新技术密集型的新型汽车,它涵盖的范围广泛包括模式识 别、传感器技术、自动化控制实现、电力电子技术、计算机技术等多个领域。

在国际上已经形成智能汽车研究、设计、开发、竞赛的热潮。

在我国,教育部为了加强大学生实践、创新能力和团队合作精神的培养,委 托教育部高等学校自动化专业教学指导分委员会主办了每年一度的全国大学生 智能汽车竞赛。全国大学生智能汽车竞赛是在竞赛组委会提供的统一汽车模型 平台上,使用飞思卡尔半导体公司的8 位、16 位微控制器作为核心控制模块, 通过设计道路识别传感器和电机驱动电路、编写相应软件及装配模型车,制作 一个能够自主识别道路的模型汽车,按照规定路线(路线赛前未知)行进,以 完成时间最短者为优胜。

智能车竞赛目前已经发展有摄像头与光电组和电磁组三个组别比赛, 赛车速 度与比赛质量也越来越高,竞争更是日趋激烈。 1.2 总体方案介绍 本智能控制系统可以由传感器、信息处理、控制算法、执行机构、速度反馈 五个部分组成。其中,以单片机为核心,配有传感器、测速电路,执行机构以 及它们的驱动电路构成了控制系统的硬件;信息处理与控制算法由运行在单片 机中的控制软件完成。

在检测方面,系统是以电感传感器检测赛道中间的通有 100mA,20KHz 电流 的铜线作为识别路径的手段的,其重点之一就是通过电感传感器来提高获取路 径信息的准确度和速度,从而提高智能车的速度及可靠性。

在控制方面,系统重点研究大赛指定型号舵机和电机的控制方案及算法。舵 机的控制目标:脉宽与转角呈线性变化,能够以较快的速度控制舵机,延迟控 制在 10ms 内,误差控制尽可能的小。电机的控制目标:能根据路况进行快速地 加速和减速,使电机尽可能快地接近目标速度,能够获得很好的期望速度,以 较快的速度跑完整个赛道。 3 第九届全国大学生智能汽车邀请赛技术报告 此外,机械结构的调整是保证智能车系统能够稳定可靠运行的前提。因此, 机械结构的调校是至关重要的,尤其是前轮的调校。机械结构调整的原则是:

减少质量,降低重心,加固安装,使车体的转向惯量尽量最小。 1.3 本文结构 本文共分为五章。

第一章主要是介绍了比赛的背景及智能车系统总体方案的 介绍;第二章从智能车系统的机械结构出发,详细阐述了智能车系统各部分机 械结构的安装和调整;第三章重点介绍了系统中所涉及的硬件设计方案和原理; 第四章是介绍了智能系统的软件算法;第五章则对智能车部分模块的调试仿真 做出相关的介绍;第六章对智能车的技术参数作简要说明。 4 第三章 硬件设计 第二章 机械结构部份的设计及调整 智能车的核心是控制策略和算法,但是,机械结构也是限制赛车速度的巨 大瓶颈,如果一辆赛车的程序架构很好,但是机械部分做的不好的话,其速度 也会被大大的限制。 2.1 整车布局 (1)车模底盘降低,主板低放,以降低重心。

(2)舵机竖直放置,方便控制。

(3)用轻便坚固的碳纤杆作为前端传感器的支撑材料。

(4)电感安装在最前方,碳纤杆的长度大概是 50cm,为了能够提前检测到, 以至车体能够及时反映。

(5)电池后移,从而使智能车重心能够尽量位于车体中间偏后,这样才能保证 智能车在高速行进时的稳定性,减少甩尾现象 图 2.1 整车图 5 第九届全国大学生智能汽车邀请赛技术报告 2.2 转向舵机的安装 舵机转向是整个控制系统中延迟较大的一个环节,为了减小此时间常数, 通过改变舵机的安装位置,而并非改变舵机本身结构的方法可以提高舵机的响 应速度。通过分析舵机控制转向轮转向的原理可以发现,在相同的舵机转向条 件下,转向连杆在舵机一端的连接点离舵机轴心距离越远,转向轮转向变化越 快。这相当于增大力臂长度,提高线速度。

针对上述特性,本设计采用“长连杆”方式将舵机竖直放在前面,大大的 增加了舵机的力臂,如图 2.1 所示。 图 2.2 转向舵机安装示意图 上述安装方式的优点主要有:

(1) 改变了舵机的力臂,使转向更灵敏; (2) 舵机安装在了正中央,使左右转向基本一致,避免了多级传动可能带 来的空程和死区; 6 第三章 硬件设计 (3) 增加前轮下压力,从而提高了前轮的抓地力,当然这样也加重了舵机 的负载; 2.3 传感器的安装 电感传感器安装的高度以及碳纤杆的长度共同决定了前瞻的大小。在本设 计中,最终选取的碳纤杆的长度为 50cm,碳纤杆的长度超过 60cm 后,在过弯的 时候容易内切,而且转弯时盲区比较多。而且我们在保证信号足够的前提下, 应尽量前端电感放高,这样能检测的范围更广。碳纤杆的一段用热熔胶固定在 车模的前面,再用连杆连接到舵机上,保障其固定牢固。如图 2.3.1、2.3.2. 图 2.3.1 7 第九届全国大学生智能汽车邀请赛技术报告 图 2.3.2 2.4 测速传感器的安装 为实现车速的闭环控制,需使用光电编码器测量车速。光电编码器安装主 要考虑的问题是与齿轮的咬合,太紧会使电机转动吃力并且会发出很大的噪声, 太松有时候会丢齿。因此最好使得安装的编码器松紧程度能够调整最好,我们采 用的是 500 线的编码器,每转一圈会产生 500 个脉冲。光电编码器的安装如图 2.4 所示。 图 2.4 光电编码器安装示意图 8 第三章 硬件设计 2.5 智能车前轮及后轮定位的调整 2.5.1 前轮及后轮定位的定义 前后轮的定位对于小车机械性能影响巨大。前轮定位包括主销后倾角、主 销内倾角、前轮外倾角和前轮前束四个内容。后轮定位包括车轮外倾角和逐个 后轮前束。这样前轮定位和后轮定位总起来说叫车轮定位,也就是常说的四轮 定位。车轮定位的作用是使车模保持稳定的直线行驶和转向轻便,并减少车模 在行驶中轮胎和转向机件的磨损。

车轮外倾和主销内倾的情形如图 2.6 所示。所谓主销内倾,是将主销(即 转向轴线)的上端向内倾斜。从智能车的前面看去,主销轴线与通过前轮中心 的垂线之间形成一个夹角,即主销内倾角。主销内倾的作用是使车轮转向后能 及时自动回正和转向轻便。 图 2.5.1 车轮外倾与主销内倾示意图 主销后倾如图 2.7 所示,过车轮中心的铅垂线和真实或假想的转向主销轴 线在车辆纵向对称平面的投影线所夹锐角为主销后倾角,向前为负,向后为正。 9 第九届全国大学生智能汽车邀请赛技术报告 图 2.5.2 主销后倾示意图 车轮前束如图 2.8 所示。从上往下看,两个车轮指向的方向在前端指向内 称为车轮前束,指向外的则称为车轮后束。 图 2.5.3 车轮前束示意图 后轮定位主要包括后轮前束和后轮外倾,其作用与前轮对应定位项目作用 一致。

2.5.2 前后轮定位的调节经验 从理论上讲,主销内倾的作用是使前轮自动回正。角度越大前轮自动回正 的作用就越强烈,但转向时也越费力,轮胎磨损增大;反之,角度越小前轮自 动回正的作用力就越弱, 因此这个主销内倾角都有一个范围, 约 5°~ 8°之间。

而前轮外倾角对智能车的转弯性能有直接影响,它的作用是提高前轮的转向安 全性和转向操纵的轻便性。

由于本车模的主销内倾,前轮外倾界定不明显,本设计按照经验来进行前 轮内外倾角的调节。 10 第三章 硬件设计 前轮内外倾角的调节靠改变相应丝杆长度来实现,丝杆调长可达到前轮外 倾,从经验上来说,前轮外倾有利于小车转向轻便,但是,容易导致前轮抓地 力不足,而前轮内倾可使前轮抓地力增大,使小车在过弯的时候不易出现前轮 打滑的现象,本次设计使用了前轮外倾,这样可以使小车在转向的时候更加轻 便。

对于前轮前束,可以通过调节相应丝杆长度来实现,丝杆调长可以达到前 轮前束,若调短丝杆长度,可以达到前轮后束的作用。

从经验上讲,前轮前束可以让小车在直道上走得更直,但同时会降低小车 转向的灵活性,前轮后束则完全相反。

无论选择怎样的前轮定位,都必须考虑到一个至关重要的忠告,那就是选 择参数要适当,不要太极端,比如前轮的倾角,调节 1°~ 2°即可,绝对不能 调节得让人很远就感到车轮有明显的倾角。 2.6 车底盘的调整 根据总结的智能车机械结构的设计原则,智能车底盘必须足够低。车模底 盘的高度主要由赛道中的坡道以及减速带决定,在顺利过坡的前提下,底盘越 低越好. 此外,适当增大底盘的刚度有利于提高车体走直线的稳定性。通过增加垫 片来增大弹簧的预紧力或调整弹簧的另一个支点的位置来改变预紧力可 以提 高底盘的刚度。 11 第九届全国大学生智能汽车邀请赛技术报告 第三章 硬件设计 3.1 硬件设计概述 以单片机为核心,配有传感器电路、测速电路,执行机构以及它们的驱动电 路构成了智能车的硬件系统,硬件系统结构如图 3.1 所示。 图 3.1 智能车硬件系统结构图 图 3.1 中,MK60FX512VLQ15 是本系统的核心控制器,该控制器拥有 32 位 内核处理器,丰富的硬件资源,满足智能车设计的要求。信号转接板用来获取 前端信息,从而测出偏移量;舵机是用来控制车身的转向;电机驱动与控制模 块是用来控制电机的转动,包括加减速与正反转;测速传感器用来获取电机转 速,以实现电机的闭环控制。键盘显示用于系统参数的设定和系统运行状态的 获取。电源管理模块用来为各个模块供电。起跑线检测模块就是干簧管电路, 用来检测起跑线的。从功耗和工作方式角度可将系统电路分为功率电路和数字 电路。从供电电压角度可以将电路分为 7.2V、6V、5V、12V 电路。本系统中, 电压分配如下:为保证驱动芯片正常工作,将 7.2V 经过升压电路到 12V;舵机 稳压后的 6V 供电;人机接口模块、编码器电路和电感传感器模块由一片 5V 电 源芯片供电,只是主控芯片的 5V 电源单独供给。 12 第三章 硬件设计 3.2 MK60FX512VLQ15 单片机系统设计 3.2.1 单片机特性 MK60FX512VLQ15 单片机为 144 引脚 LQFP 封装的单片机,其特性如下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 单任务、32 位 CPU 核综合体(e200z0) 符合 Power 架构嵌入式类 包括指令集增强功能,允许可变长度编码(VLE),使得代码长度减少。

具有可选的混合 16 位和 32 位混合指令,使代码尺寸显著减少成为可能 高达 512KB 的片上代码 Flash,有 Flash 控制器支持 高达 64KB 的片上数据 Flash,有 Flash 控制器支持 高达 48KB 的片上 SRAM 存储器保护单元(MPU),具有 8 个区域描述和 32 字节区域间隔尺寸 中断控制器(INTC)具有处理 148 个可选择优先级中断源能力 频率调制锁相环(FMPLL) 交叉开关架构,能够并发访问多个总线主机外设、Flash 或 SRAM 引导协助模块(BAM)支持通过一个串行连接(FlexCAN 或 LINFlex)内 部 Flash 编程 定时器支持输入/输出通道提供范围 16 位的输入捕捉、输出比较和脉冲 调试功能(eMIOS) 10 位 ADC 多达 3 个串行外设接口(DSPI)模块 多达 4 个串行通讯接口(LINFlex)模块 LINFlex 1、2 和 3:主机能力 LINFlex 0:主机和从机能力 多达 6 个增强型全速 CAN(FlexCAN)模块,具有 64 个可配置消息缓冲 区 1 个 IIC 模块 多达 123 个可配置通用引脚,支持输入和输出操作 来自 FIRC 或 SIRC 的实时计数器(RTC),支持最大超时时间为 2 秒, 分辨率为 1ms 的自动唤醒 6 个周期中断定时器(PIT),具有 32 位计数器分辨率 1 个系统模块定时器(STM) Nexus 开发接口(NDI) 片上稳压器(VREG)从输入供给为所有内部各级提供电压调节 3.2.2 电源电路 13 第九届全国大学生智能汽车邀请赛技术报告 MK60 单片机使用 5V 供电,I/O 口能够兼容忍受 5V 的输入电压。较低的片 内电压使 CPU 运算速度快、功耗低,故 MK60 单片机特别适合低功耗场合。本设 计采用了 5V 外部电源为 K10 单片机供电。

为了去除单片机运行时产生的高频噪声,本设计在 MK60 电源引脚旁边加了 磁珠和电容典型值为 0.1uF 的去耦电容。

3.2.3 时钟电路 对于 Kinetis 系列单片机,虽然单片机内部有 RC 振荡电路产生的自时钟, 但 RC 时钟的频率不稳定,会随温度变化,主要用来在检测到主时钟电路故障时 起作用,靠自由时钟单片机就能运行,这种运行模式被称为自时钟模式。

为了给单片机提供一个可设定频率并且稳定的工作时钟,单片机需要外接 一个石英或陶瓷振子,产生一个频率稳定的时钟信号,再通过片内的锁相环电 路(PLL)将时钟频率锁定。本系统的时钟电路采用了 8MHz 的晶振,晶振振两 端对地接典型电容值为 10pF 的电容,如图 3.3 所示。 图 3.3 时钟电路原理图 3.2.4 单片机系统引脚分配 单片机系统引脚分配如表3.2所示: 表 3.2 单片机系统引脚分配 14 第三章 硬件设计 模块名称 无线通讯模块 接收数据指示灯 拨码开关 信号转接板 编码器 电机驱动 舵机 NOKIA5510模块 分配引脚 PTB[16,17] PTA[12,13,14,15] PTD[0,1,2,3,4,5,6,7] PTC[0,1,2],PTC[4,5,6,7,8,9,10,11,12] PTE17 PTB[0,1] PTB[18,19],PTC3 PTE[0,1,2,3,4,5,6,16,18,19] 3.3 电感传感器电路设计 组委会规定本次电磁组竞赛车模需要能够通过自动识别赛道中心线位置处 由通有100mA 交变电流的导线所产生的电磁场进行路径检测。

可首先讨论赛道上的直道部分(弯道可以看作很多小直道微元的积分,故 只要直道研究透彻,弯道就可以迎刃而解),如图: 图3.3.1 无限长直导线周围的磁场[5] 利用毕奥-萨伐尔原理可计算得到:无限长直导线通以恒定电流I的时候周 15 第九届全国大学生智能汽车邀请赛技术报告 围的磁场为: 下面在计算放置在无限长直导线周围的电感线圈能感应出的电动势: 图3.3.2 导线周围磁场分布 根据法拉第定律: 将线圈内部小范围内磁场近似认为是均匀分布的,将会得到 即导线周围放置的线圈感应出来的磁场与导线到线圈的直线距离成反比。因此 根据此种特性即可制作出电磁感应传感器。

本设计采用LC谐振放大整流的方法来得到最终的信号。

首先通过一级LC的谐振,达到一个初步的选频滤波功能,即只感应20KHZ的 电流产生的交流磁场,感应信号为正弦波,其幅值随着导线到传感器的距离而 变化。

在查询资料后, 我们摘选出了4中方案, 方案1:

两级放大电路, 通过INA129 初级放大后,再经NE5532二级放大,通过滤波后得到信号。方案2:LMV358一级 放大电路后再接一级RC滤波稳定纹波后得到最终的输出。方案3:LM386一级放 大电路。

方案4:三极管放大电路。电路原理图见图3.3.3、 3.3.4、3.3.5、3.3.6。

经过试验,我们发现方案2比方案3和方案4数据更稳定,而且相对于方案1 电路更加简洁.考虑到这些因素,我们最终选择LMV358的放大电路作为电感信号 的处理电路。 16 第三章 硬件设计 图 3.3.3 电路原理图 图 3.3.4 电路原理图 图 3.3.5 电路原理图 17 第九届全国大学生智能汽车邀请赛技术报告 图 3.3.6 电路原理图 3.4 直流电机驱动模块设计 电机驱动电路板为一个由分立元件制作的直流电动机可逆双极型桥式驱动 器,其功率元件由四支 N 沟道功率 MOSFET 管组成,额定工作电流可以轻易 达到 100A 以上, 大大提高了电动机的工作转矩和转速。

由于C车电机为双电机, 所以,我们用两路相同的驱动器分别驱动两个电机。该驱动器主要由以下部分 组成:PWM 信号输入接口、逻辑换向电路、死区控制电路、电源电路、上桥臂 功率 MOSFET 管栅极驱动电压泵升电路、功率 MOSFET 管栅极驱动电路、桥 式功率驱动电路、缓冲保护电路等,电路如图3.8所示。电路中肖特基二极管 IN5819保证了电平VB_1、VB_2低于12V,VB_1高于MOTOR_A,VB_2高于 MOTOR_B。

电路如下图示,首先使能端为高时,驱动桥这时才会起作用。PWM0为某一 占空比,PWM1为低时,使得IR2104驱动输出分别为低电平和相应的电压值。驱 动桥电路左边上方IRLR7843与右边下侧的IRLR7843导通,另外的两个MOS管不导 通,此时电机正转。因此,一个电机是由两路PWM控制,显然当PWM输出状态与 上述相反则为反转。转速的大小取决于占空比的大小。 18 第三章 硬件设计 图 3.8 电机驱动电路原理图 3.5 测速模块设计 为了精确控制智能车的速度,需要设计速度反馈电路检测智能车运动速度, 同时获取车模运动的里程信息。

本设计采用的是单片机控制编码器的方法来检测小车的电机转速。编码器 选用的是一款旋转编码器,其引出红、黑、白三根线。红色是电源线,黑色是 地线,白色是信号线。编码器的工作电压为 5~12V,可直接将编码器的电源线 接到 5V 电源上。编码器的地线要和单片机的地线连在一起。每转一周,白色信 号线就输出 500 个脉冲,将信号线接到单片机的 PTA10 和 PTC15 口,进行脉冲 累加,再用单片机定时器定时,每 5ms 记一次 PCANT 数据,作为小车速度的参 考值,然后清空脉冲累加器,再定时计数。编码器接口电路如图 3.5 所示。 19 第九届全国大学生智能汽车邀请赛技术报告 图 3.5 编码器接口电路 图 3.9 中,因为编码器信号端是开漏输出结构,所以需在编码器信号输出 端接上拉电阻。信号线上的脉冲信号接至 PTA10 和 PTC15 引脚,供脉冲累加器 计数。 3.6 人机交互模块设计 3.6.1 OLED 模块设计 OLED 模块主要包括 OLED 液晶,4 个背光 LED 灯和 4 个按键。OLED 模块主要 用于显示检测信息,设置控制参数。

OLED 液晶广泛应用于各类便携式设备,与其它类型的产品相比,具有以下 特点:84X48 点阵 LCD,可显示 4 行汉字;采用串行接口与主处理器进行通信, 传输速率达 4Mbps,可全速写入显示数据,无等待时间;可通过导电胶连接模块 与印制版,而不用连接电缆;采用低压供电,正常显示时的工作电流在 200uA 以下。OLED 引脚顺序与含义如表 3.3 所示: 表 3.3 OLED 引脚定义 管脚 1 定义 VDD 说明 电源输入引脚 电平 +5V 备注 3.3-5V 20 第三章 硬件设计 2 3 4 5 6 7 CLK DIN D/C CS RES GND 同步时钟输入 数据输入 数据/命令输入 片选信号 外部时钟输入 地 GND TTL TTL TTL TTL GND 最高可达 4Mbps 时钟上升沿采样 0:命令;1:数据 低电平有效 OLED 模块的背光电路和按键电路原理图分别如图 3.6.1 和图 3.6.2 所示。 V CC R 5 10 K R 4 5K B LC Q 1 85 50 D 0 L ED D 1 L ED D 2 L ED D 3 L ED R 0 47 0 R 1 47 0 R 2 47 0 R 3 47 0 G ND 图 3.6.1 OLED 模块的背光电路 S0 SW -PB K 1 K 2 K 3 K 4 S1 SW -PB S2 S3 G ND SW -PB SW -PB 图 3.6.2 OLED 模块的按键电路 21 第九届全国大学生智能汽车邀请赛技术报告 背光电路中的 4 个 LED 灯采用一个 8550 同时驱动, 8550 控制端接单片机的 PM0 引脚,这样既能保证 LED 的可靠工作,又能降低功耗。按键电路采用的是独 立按键形式,简单而易于编程。按键电路中,K1~K4 分别接至单片机的 PTD7~ PTD10 引脚。

3.6.2 拨码开关电路设计 拨码开关电路如图 3.13 所示。拨码开关有八位,每位可以独立开合。

PTE0/SW1~PTE7/SW8 端分别接单片机的 PTE0~PTE7 I/O 端口。当开关闭合时, 相应端为低电平。当开关断开时,相应端为高电平。改变拨码开关的开合状态, 可以改变单片机 PTE 口的值,单片机根据从 PTE 口读到的值进行相应的操作, 从而实现了单片机的控制,PTE 口采用内部上拉。 图 3.13 拨码开关电路 3.7 电源管理模块设计 智能车电池提供的是 7.2V 的电压。为了使智能车正常工作,需要将 7.2V 的电压转化为 5V 和 6V 的电压。

智能车系统用的 5V 稳压芯片是 LM2940 。

LM2940 可以提供较大的稳压电流,具有较好的稳压性能,且纹波电压较小。主控芯片和 电感传感器、编码器等都需要 5V 供电,为减少单片电源芯片的功耗,避免电感 传感器、编码器等影响主控芯片工作,本设计采用了一片 LM2940 和一片 LT1086 分别为主控芯片和其他需要 5V 的模块供电。 22 第三章 硬件设计 电源管理模块框图如图 3.7.1 所示: 图 3.7.1 电源管理框图 其中 5V LM2940 稳压电路如图 3.7.2 所示。 D 43 40 04 V ou t 3 C 42 0.1u F 43 +C 10 uF /1 6V 5V D 42 1N 5 81 9 图 3.7.2 5V 稳压电路 其中 5V LT1086 稳压电路如图 3.7.3 所示。 2 C 41 0.1u F GND 7.2V 1 U 4 L M2 94 0 V in 23 第九届全国大学生智能汽车邀请赛技术报告 图 3.7.3 5V 稳压电路 驱动电路采用的 12V 升压电路给驱动芯片供电,稳压电路如图 3.7.4 所示。 图 3.7.4 12V 升压电路 智能车采用的 6V 稳压芯片是 LM2941,稳压电路如图 3.7.5 所示,用于为转 向控制舵机供电。 7.2V C 52 G ND U 5 0.1u F 5 R 52 3.9K O N/ OF F A DJ 1 R 53 1K L M 2 94 1 + C 51 22 uF /1 6V C 53 0.1u F 6V 4 2 GND 3 G ND 图 3.7.5 6V 稳压电路 图 3.7.5 中,LM4951 OUT 端输出的电压值与 R52、R53 之间的关系式为: V_OUT = 1.257 * (1 + R52/R53) 6 GND IN O UT 24 第四章 算法实现及软件设计 第四章 算法实现及软件设计 软件是存在于单片机内一系列指令的集合,是智能车设计的核心部分,需 要花费很多的精力去设计编写。优秀的软件运行在良好的硬件平台上,将使智 能车能够平稳高速地行驶。 4.1 路径识别算法分析及选定 智能车的路径识别算法是智能车设计的关键部分,智能车设计的大部分工 作都是围绕它来展开的。

经过分析,利用电感传感器识别路径一般有两种不同的方法: (1) 数字型寻线算法。利用多个水平放置的电感传感器,将整个赛道分为 多个区域,感应电动势最大的电感是最靠近导线的电感,来判断电磁线的位置。

这种查询方式的优势在于算法简单,易于实现。但是这种方法采集到的信息是 离散的点,不利于精细控制;且要用到多个电感,会加重车头重量,增大小车 的转动惯量,造成小车在高速行驶时发生甩尾;且多个电感“一”字排布,不 得不考虑离得太近时相邻电感的互感作用。

(2) 模拟型寻线算法。使用少数传感器,直接使用感应电动势的模拟量精 确值来进行赛道的精确定位。该方式可以达到赛道精确定位的目的,同时可以 利用归一化的方法来解决每个电感线圈不完全相同的问题。这种方法的特点是 用了较少个数的传感器进行道路识别,而且充分利用 MCU 里的 ADC 功能。

最终我们选择了方案二,即模拟型寻线算法。我们利用对称电感的差值斜 率方法来解算车体相对于导线偏离的距离。这种方法简单直观,对于 MCU 的负 担较小,但是其两端线性度不高,且其是基于无限长直导线周围的磁场来拟合 的,所以误差较大,但是经过分析,误差在我们可以接受的范围内,所以选用 此方案。

由于磁场是矢量,为了接收更多方向的信息,我们选用了水平和向前的电 感作为一组电感用于计算位置,且向前电感对于弯道与十字弯较为敏感,对于 直道很不敏感,所以同时可用于路径识别。 25 第九届全国大学生智能汽车邀请赛技术报告 图 4.1.1 电感排布方式图示 用两边电感做差得出曲线如下图 4.1.2 所示,可以看出,近似接近线性:

图 4.1.2 4.2 起跑线识别程序设计 26 第四章 算法实现及软件设计 起跑线的识别决定着智能车能否正确停车。起跑线处埋有磁铁的产生静磁 场,检测时可直接使用干簧管。当干簧管在磁铁上方时,干簧管导通,从而产 生低电平,在本系统中,我们使用的是单片机查询方式,即每次大循环开头时 查询相应IO口是否为低电平,如果是低电平就停车。

此外,为了防止误判,起跑线识别并不是在单片机刚上电时就进行,而是 在发车后 10s 后才进行。 4.3 转向舵机控制程序设计 本智能车系统的舵机控制采用的是基于位置式 PID 的方向控制算法。通过 对模拟控制系统 PID 控制规律表达式的离散化,可得数字式 PID 表达式如下:

u (k ) = Kp * e(k ) + Ki * ∑ e(i ) + Kd * [e(k ) ? e(k ? 1)] i =0 k 对于本智能车系统,u(k)即为舵机转角,e(k)为车体相对于导线的偏移量。

本算法响应时间快,稳态误差低,由于舵机本身就是一个延时较大的环节,而 积分项会导致相应更加滞后, 所以为了使舵机的响应速度加快, 只使用 PD 算法。 4.4 电机控制程序设计 4.4.1 基于增量式 PID 的电机控制算法 本智能车系统的电机控制采用的是基于增量式 PID 的方向控制算法。通过 对模拟控制系统 PID 控制规律表达式的离散化,可得数字式 PID 表达式如下: Δu (k ) = Kp * [e(k ) ? e(k ? 1)] + Ki * e(k ) + Kd * [e(k ) ? 2e(k ? 1) + e(k ? 2)] 对于本智能车系统,u(k)即为输给电机的 PWM 占空比,e(k)即为目标速度 与实际速度之差。由于微分项会导致电机振荡,故只是用 PI 算法。 4.4.2 速度分配 赛道分为直道,弯道,十字弯,坡道部分,在直道部分需要加速,在入弯 之前需要提前减速,在十字弯和坡道处适当减速。由于侧滑现象和舵机反应速 27 第九届全国大学生智能汽车邀请赛技术报告 度的限制,弯道上存在所谓的极限速度,而转弯半径越小,此极限速度越小。

所以如果在弯道里全部采取匀速,那么这个速度因为受到最小转弯半径的约束 会比较小,非常不利于提升小车的速度。所以在弯道里,我们采取的策略是:

设置弯道最低与最高速度,再根据偏差大小的不同来设置速度,偏差最大时采 用弯道最小速度,偏差最小时采用弯道最大速度。 4.5 程序流程图 系统程序流程图如图 4.5 示。 开始 自检? Y 电源电压、舵 机、电机自检 N 赛道扫描得各电 感最大值 到终点没? Y 停车 各路AD通道采样 信号处理得到偏差 赛道识别 舵机控制 电机控制 图 4.5 28 第五章 智能车系统模块调试 第五章 智能车系统模块调试 5.1 路径探测模块调试 路径探测模块为电感探测模块 调试电感探测模块时,按如下步骤进行:

(1) 进行电感的标定工作。

(2) 依次将车体偏移导线一定距离,记录下这些位置的电感的感应电动势 值。

(3) 对所得数据进行归总,对两边电感做差,拟合直线,并替换不正常的 电感。 5.2 转向舵机调试 转向舵机的性能决定着智能车的转向性能,因此,转向舵机的调试是系统 设计的重要环节。

测试一:

舵机工作在5.8V,50HZ下,PWM输出脉宽对应转角与理论转角对比 舵机 1号 1号 1号 1号 1号 1号 1号 1号 1号 1号 1号 1号 频率 电压 (Hz) 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.8 50 50 50 50 50 50 50 50 50 50 50 50 负载情 况 空载 空载 空载 空载 空载 空载 空载 空载 空载 空载 空载 空载 占空 比寄 存器 280 270 260 250 240 230 220 210 200 190 180 170 对应脉宽 (ms) 1.493333333 1.44 1.386666667 1.333333333 1.28 1.226666667 1.173333333 1.12 1.066666667 1.013333333 0.96 0.906666667 转角 (度) 0 -4 -9.5 -14 -20 -24.5 -30 -35.5 -40 -44 -50 -56 理论转角 -0.6 -5.4 -10.2 -15 -19.8 -24.6 -29.4 -34.2 -39 -43.8 -48.6 -53.4 29 第九届全国大学生智能汽车邀请赛技术报告 测试二:

舵机工作在5.9V,50HZ下,舵机转过一定角度所对应的响应时间 舵机 1号 1号 1号 1号 电压 5.9 5.9 5.9 5.9 频率(Hz) 负载情况 50 50 50 50 空载 空载 负载 负载 转角(度) 时间(ms) 60 30 10 15 200 100 50 60 测试三:

舵机工作在5.8V,不同频率下,舵机转过一定角度所对应的响应时间 观测舵机在不同控制频率下转过相同的角度所花费的时间,100Hz和50Hz的 响应速度差不多。

通过对测试数据的分析,可获得如下结论:

1、舵机在给定一定脉宽以后转过的角度和理论上给出的角度(即 1.5ms 对 应 0 度等)差不多,且线形较好。

2、舵机工作在 5.9V,50HZ 下,空载时的响应速度大概为 200ms/60 度,在 负载时为 50ms/10 度,由于在真实比赛环境赛道摩擦力的不同,负载时的响应 速度可能有所不同。

3、舵机工作在 5.9V,负载时,50Hz 和 100Hz 的响应速度差不多。 5.3 系统调试 在各模块的基础测试均进行完毕后,便可进入系统级调试。

进行系统调试的条件是设计出具备大赛指定元素的跑道。调试前期,宜设 计较小较简单的跑道供智能车行驶。调试中后期,则应适当增加跑道的大小和 难度。 30 第五章 智能车系统模块调试 为保证智能车对各类跑道的适应性,应将智能车放到各类跑道上去调试, 综合各类跑道的特征和智能车自身性能,确定出恰当的控制算法,调试出最佳 的控制参数。

调试控制参数的典型方法是观察智能车过小 s 和大弯时的转向情况。当智 能车既能以较小的摆动量过小 s, 又能及时转弯时, 控制参数便选取得比较理想。 31 第九届全国大学生智能汽车邀请赛技术报告 第六章 智能车主要技术参数说明 项目 路径检测方法(竞赛组) 车模几何尺寸(长、宽、高) 车模平均电流(匀速行驶)(毫安) 电路电容总量(微法) 传感器种类及个数 参数 电磁组 750mm/250mm/120mm 2000 1328uF 电感 4 路,测速 1 路,干簧管 2 路 避障 2 路 新增加伺服电机个数 赛道信息检测空间精度(毫米) 赛道信息检测频率(次/秒) 主要集成电路种类/数量 车模重量(带有电池)(千克) 无 5 12 4/8 1.17 32 第六章 智能车主要技术参数说明 结论 电感传感器工作稳定可靠,抗干扰能力强,因此,基于电感路径探测传感器 的自主寻迹智能车有较强的抗干扰能力,能够很好的适应赛场环境。

系统执行一个周期所用的时间为 5ms 左右。

唯一的时间瓶颈是舵机的响应时 间。舵机作出响应需要十多毫秒的时间。因此,不断优化舵机控制策略是令智 能车平稳高速行驶的有效方法。

目前,智能车系统研究还存在如下问题:(1)智能车在过十字交叉时路径不 够平滑。(2)智能车在直线上加减速度不够迅速。(3)智能车以较高速运行时, 转向舵机不够灵敏,致使小车冲出赛道。

针对智能车过十字交叉路径不平滑的问题, 将主要从软件上优化路径识别算 法方面解决。

针对智能车加减速不够迅速的问题, 将主要从软件上优化电机控制算法的参 数方面解决。

针对智能车高速运行转向不灵敏的问题, 一方面可提高前瞻, 使小车能够更 早判断出赛道特征,另一方面可优化路径识别算法和转向舵机控制算法。

此外,参数的高效率选取需做到:在调试程序的过程中,建立相应的数学模 型,提高调试程序的目的性。 33 第九届全国大学生智能汽车邀请赛技术报告 [参考文献] [1] 卓晴,黄开胜,邵贝贝.《学做智能车——挑战“飞思卡尔”杯》[M].北京:北京航空 航天大学出版社,2007. [2] [3] [4] [5] [6] [7] 华成英,童诗白.《模拟电子技术基础》[M].北京:高等教育出版社,2006.6. 阎石.《数字电子技术基础》[M].北京:高等教育出版社,2006.5. 凌阳科技股份有限公司.《PID 调节控制做电机速度控制》,2006.6. 黄惟一,胡生清.《控制技术与系统》[M].北京:机械工业出版社, 2006.2. Brian W.Kermighan ,Dennis M.Ritchie.The C Programing Language ,Second Edition 邵贝贝. 《单片机嵌入式应用的在线开发方法》 [M].北京:

清华大学出版社, 2004.10. [8] 谭浩强.《C 程序设计》[M].北京:清华大学出版社,2005. [9] 黄开胜,金华民,蒋狄南.韩国智能模型车技术方案分析[J].电子产品世界, 2006,3:150~152. [10] Jinghua Zhong. PID Controller Tuning: A Short Tutorial. Mechanical Engineering, Purdue University, 2006. [11] Freescale Semiconductor. PK10N512VLL100 Reference Manual. http://freescale.com, 2011. 34 第九届全国大学生智能汽车邀请赛技术报告 附录 A 源程序代码 #include "common.h"

#include "include.h"

/**********宏定义*********************************************/ /*********变量声明******************************************/ /***********************传感器采集信息*********************/ float ad[6];

float ad_max;

uint8 MaxNum;

uint8 ErrorFlag;

uint8 ErrorFlag_search;

unsigned int AD_NORM[6];

uint8 turn_direction;

/**********************避障信息*****************************/ uint16 Infrared[2];

uint8 LeftAvoidFlag = 0;

uint8 RightAvoidFlag = 0;

float AvoidTimes;

int16 Avoidance;

/***********************路径偏差信息***********************/ float SensorShift[2];

float SensorY;

float SensorY_ahead_horizontal;

float ERROR0;

float float Y_reverse;

X_reverse; /**********************赛车状态信息************************/ uint8 stop_detect = 0;

uint8 stop_flag = 0;

uint16 stop_delay;

//停车 uint16 stop_times;

uint8 brake_delay; 46 附录 A 源程序代码 /* uint8 uint8 RAngleLeftFlag = 0;

RAngleRightFlag = 0; //直角弯 uint8 ReadyRampFlag = 0;

//中间电感的值非常大,探测杆已在坡道上方 uint8 RealRampFlag = 0;

//中间电感的值极小,说明车体已倾斜入坡,但 需要在 Ready 的状态下 uint8 Rampflag = 0;

//坡道标志 uint16 Rampcountflag = 0;

//坡道计数标志 float Rampratio;

//坡道上电感乘的系数 uint16 Ramptimes;

*/ /**********************舵机控制****************************/ uint16 ui_pwmdty67;

uint16 Angle_max;

uint16 Angle_min;

uint16 Angle_middle;

float direction_Kp;

float direction_Kd;

float ShiftToSteer[2];

float Kp_base;

float Kp_increase; /**********************速度控制***************************/ float v_target;

float speed_target_left;

float speed_target_right;

int16 g_uc_motorduty_left;

int16 g_uc_motorduty_right;

uint8 PulseCount_left;

//根据给定速度换算得来的编码器脉冲数 uint8 PulseCount_right;

uint8 uint16 uint16 int16 int16 encoder_flag;

encoder_value0;

encoder_value1;

error_left[3] = {0,0,0};

error_right[3] = {0,0,0}; 47 第九届全国大学生智能汽车邀请赛技术报告 int16 float float QUAD;//正交解码有可能出现负值 g_speedMin;

g_speedMax; /**********************路径识别信息***********************/ uint8 straightFlag = 1;

uint8 curveToStraight = 0;

uint8 straightToCurve = 0;

uint8 leftFlag = 0;

uint8 rightFlag = 0;

uint8 lose_flag = 0;

uint8 RightAngleFlag = 0;

float float float uint8 float float float float float float float float float float Pulse_sum = 0;

RoadShift3CM[20];

RoadShift[20];

ShiftCount_num = 0;

Shift_sum = 0;

Shift1 = 0;

Shift5 = 0;

Shift10 = 0;

Shift20 = 0;

ShiftD6 = 0;

ShiftD10 = 0;

ShiftD20 = 0;

ShiftDD10 = 0;

ShiftDD20 = 0; uint8 PulseLeft;

int8 PulseRight;

/*********************定时相关变量*********************/ uint8 PIT_num;

uint8 PIT_flag;

/********************宏定义***********************/ #define kp_left 11.9 //电机的 PID 参数 #define ki_left 0.8 48 附录 A 源程序代码 #define kd_left 0 #define kp_right 9.0 #define ki_right 0.7 #define kd_right 0 #define D 52 //后轮直径 #define ratio 0.64 //传动比 #define encoder_line_num 500 //编码器线数 #define Pulse3CM 60 //走过 3CM 是 140 个脉冲 #define Detect_Num 5 #define STOP_TIME 10000 #define SpeedDifRatio 0.005 #define AvoidFinish 3500 #define ROAD_SHIFT_MAX 300 /******************************************************************** **** 取绝对值函数 ********************************************************************* ***/ float Abs(float value) { float return_value;

if(value>=0) { return_value = value;

} else if(value<0) { return_value = value*(-1);

} return return_value;

} /******************************************************************** 两数比大小并输出较大的值 ********************************************************************* / float compare(float value1,float value2) { float value_max; 49 第九届全国大学生智能汽车邀请赛技术报告 if(value1>value2) { value_max = value1;

} else { value_max = value2;

} return value_max;

} /******************************************************************** * 警告!核心板上所有 LED 快速闪烁 5 次用于电感断线提示 ********************************************************************* / void Warning(void) { uint8 m;

for(m=0;m<5;m++) { led(LED0,LED_ON);

led(LED1,LED_ON);

led(LED2,LED_ON);

led(LED3,LED_ON);

dwt_delay_ms(200);

led(LED0,LED_OFF);

led(LED1,LED_OFF);

led(LED2,LED_OFF);

led(LED3,LED_OFF);

dwt_delay_ms(200);

} } 50 附录 A 源程序代码 void scan_deal(void) { uint8 m;

/////////////////////AD 采样与数据处理////////////////////////// ad[0] = adc_once(ADC0_SE16,ADC_12bit);//实际 ad5 左边电感 ad[1] = adc_once(ADC0_SE18,ADC_12bit);//实际 ad4 右边电感 ad[2] = 0;

ad[3] = adc_once(ADC0_SE17,ADC_12bit);//实际 ad3 ad[4] = adc_once(ADC0_SE10,ADC_12bit);//实际 ad2 ad[5] = 0;

////////////////////////归一化////////////////////////////// ad[0] = ad[0]*2372/AD_NORM[0];

ad[1] = ad[1]*2370/AD_NORM[1];

ad[3] = ad[3]*1871/AD_NORM[3];

ad[4] = ad[4]*2076/AD_NORM[4]; //////////////////////////避障数据采集/////////////////////// Infrared[0] = adc_once(ADC0_DM0,ADC_12bit);

Infrared[1] = adc_once(ADC1_SE16,ADC_12bit);

///////////////////////避障处理/////////////////////////////// if((Infrared[0]>1300&&Infrared[1]<500)||(Infrared[1]>1300&&Infrared[0]<500)) { //滤波 for(m=0;m<5;m++) { Infrared[0] = Infrared[0] + adc_once(ADC0_DM0,ADC_12bit);

Infrared[1] = Infrared[1] + adc_once(ADC1_SE16,ADC_12bit);

} Infrared[0] = Infrared[0]/6;

Infrared[1] = Infrared[1]/6;

if(Infrared[0]>1300&&Infrared[1]<500) { 51 第九届全国大学生智能汽车邀请赛技术报告 if(ad[0]>1600&&ad[0]<2700&&ad[1]>1600&&ad[1]<2700) { Avoidance = -100;

LeftAvoidFlag = 1;

led(LED0,LED_ON);

led(LED1,LED_ON);

led(LED2,LED_ON);

led(LED3,LED_ON);

} } if(Infrared[1]>1300&&Infrared[0]<500) { if(ad[0]>1600&&ad[0]<2700&&ad[1]>1600&&ad[1]<2700) { Avoidance = 100;

RightAvoidFlag = 1;

led(LED0,LED_ON);

led(LED1,LED_ON);

led(LED2,LED_ON);

led(LED3,LED_ON);

} } } /******************************************************************** * 舵机的 PD 控制 ********************************************************************* / void direction_PD() { ShiftToSteer[1] = ShiftToSteer[0];

ShiftToSteer[0] = SensorShift[0];

if(LeftAvoidFlag||RightAvoidFlag) 52 附录 A 源程序代码 { if(gpio_get(PTE6) == 0) { ShiftToSteer[0] = ShiftToSteer[0] + Avoidance;

} } direction_Kp =Kp_base+ShiftToSteer[0]*ShiftToSteer[0]/(Kp_increase*10000);

if(direction_Kp>5) { direction_Kp = 5;

} ui_pwmdty67 = (unsigned int)(Angle_middle + direction_Kp * ShiftToSteer[0] +direction_Kd*(ShiftToSteer[0]-ShiftToSteer[1])); if(ui_pwmdty67>Angle_max) { ui_pwmdty67 = Angle_max;

} if(ui_pwmdty67<Angle_min) { ui_pwmdty67 = Angle_min;

} FTM_PWM_Duty(FTM1,FTM_CH0,ui_pwmdty67); } /******************************************************************** * 测速与控制速度 53 第九届全国大学生智能汽车邀请赛技术报告 ********************************************************************* / void speedcount(void) { encoder_value0 = lptmr_pulse_get();

QUAD = FTM_QUAD_get(FTM2);

if(QUAD<0) { QUAD = -QUAD;

} encoder_value1 = QUAD;

//////////////////////////////////////////////////////////// //将设置的速度转换成了脉冲数,设置速度按照类似 1.8m/s 设置, //即赋 speed_target_xxxxx 为 1.8 ////////////////////////////////////////////////////////// speed_target_left = speed_target_left*5/(3.14*D);

speed_target_left = speed_target_left/ratio;

speed_target_left = speed_target_left*encoder_line_num;

PulseCount_left = (unsigned char)speed_target_left;

speed_target_right = speed_target_right*5/(3.14*D);

speed_target_right = speed_target_right/ratio;

speed_target_right = speed_target_right*encoder_line_num;

PulseCount_right = (unsigned char)speed_target_right;

motorcontrol(PulseCount_left,PulseCount_right); lptmr_pulse_clean();

FTM_QUAD_clean(FTM2);

} /************************************************ 停车 *************************************************/ void stop() { 54 附录 A 源程序代码 if(stop_flag) { stop_times++;

if(stop_times >= 100) { gpio_set(PTC0,0);

gpio_set(PTC6,0);

} } } /************************************************ 差速控制 *************************************************/ /************主函数***************/ void main() { /********变量声明******************************/ fb_clk_init();

trace_clk_init();

/********初始化******************************/ /////////////////电机使能端////////// gpio_init(PTC0,GPO,1);

gpio_init(PTC6,GPO,1);

/////////////////拨码开关初始化/////// port_init(PTE0,ALT1|PULLUP);

port_init(PTE1,ALT1|PULLUP);

port_init(PTE2,ALT1|PULLUP);

port_init(PTE3,ALT1|PULLUP);

port_init(PTE4,ALT1|PULLUP);

port_init(PTE5,ALT1|PULLUP);

port_init(PTE6,ALT1|PULLUP);

port_init(PTE7,ALT1|PULLUP);

gpio_init(PTE0,GPI,0);

gpio_init(PTE1,GPI,0);

gpio_init(PTE2,GPI,0); 55 //关电机 第九届全国大学生智能汽车邀请赛技术报告 gpio_init(PTE3,GPI,0);

gpio_init(PTE4,GPI,0);

gpio_init(PTE5,GPI,0);

gpio_init(PTE6,GPI,0);

gpio_init(PTE7,GPI,0);

////////////////起止线检测初始化/////////////////// gpio_init(PTA19,GPI,1);

gpio_init(PTA25,GPI,1);

port_init(PTA19,ALT1|IRQ_FALLING);

port_init(PTA25,ALT1|IRQ_FALLING);

set_vector_handler(PORTA_VECTORn,porta_handler);

enable_irq(PORTA_IRQn);

////////////////LED 初始化//////////////////// led_init(LED0);

//初始化 LED0 led_init(LED1);

//初始化 LED1 led_init(LED2);

//初始化 LED2 led_init(LED3);

//////////////前端探测初始化/////////////////////// adc_init(ADC0_SE10);

//实际 ad2 adc_init(ADC0_SE17);

//实际 ad3 adc_init(ADC0_SE18);

//实际 ad4 adc_init(ADC0_SE16);

//实际 ad5 adc_init(ADC0_DM0);

adc_init(ADC1_SE17);

adc_init(ADC0_SE11);

adc_init(ADC1_SE16);

/////////////开机电感检测//////////////////////////// SensorCheck();

////////////////液晶显示初始化///////////////////// human_machine_Init();

human_machine_communication();

////////////所有 LED 闪烁表明可以整定参数///////// led(LED0,LED_ON);

led(LED1,LED_ON); 56 附录 A 源程序代码 led(LED2,LED_ON);

led(LED3,LED_ON);

dwt_delay_ms(500);

led(LED0,LED_OFF);

led(LED1,LED_OFF);

led(LED2,LED_OFF);

led(LED3,LED_OFF);

dwt_delay_ms(500);

/////////////////所有 LED 间隔 1s 闪烁表明参数整定结束///////////// led(LED0,LED_ON);

led(LED1,LED_ON);

led(LED2,LED_ON);

led(LED3,LED_ON);

dwt_delay_ms(500);

led(LED0,LED_OFF);

led(LED1,LED_OFF);

led(LED2,LED_OFF);

led(LED3,LED_OFF);

/////////////////////电机舵机初始化/////////////////////////// FTM_PWM_init(FTM0,FTM_CH0,9977,0);

FTM_PWM_init(FTM0,FTM_CH1,9977,0);

FTM_PWM_init(FTM0,FTM_CH2,9977,0);

FTM_PWM_init(FTM0,FTM_CH3,9977,0);

FTM_PWM_init(FTM1,FTM_CH0,50,3180);//舵机是 FTM1 pit_init_ms(PIT0,1);

set_vector_handler(PIT0_VECTORn,PIT0_IRQHandler);

enable_irq(PIT0_IRQn);

encoder_flag = 0;

encoder_value0 = 0;

encoder_value1 = 0;

stop_detect = 0;

//测速标志位 //编码器读数值 57 第九届全国大学生智能汽车邀请赛技术报告 stop_times = 0;

Angle_max = 3465;

Angle_middle = 3180;

Angle_min = 2895;

//direction_Kd = 18;

//舵机的参数设置 FTM_QUAD_Init(FTM2);

lptmr_pulse_init(LPT0_ALT2,0xFFFF,LPT_Rising);

disable_irq(LPTMR_IRQn);

NVIC_SetPriorityGrouping(2);

NVIC_SetPriority(PORTA_IRQn,0);

NVIC_SetPriority(PIT0_IRQn,1);

EnableInterrupts;

if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==1)) //最高档速度 { g_speedMax = 4.0;

g_speedMin = 3.8;

Kp_base = 1.4;

Kp_increase = 5.5;

} if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==0)) { g_speedMax = 3.8;

g_speedMin = 3.6;

Kp_base = 1.3;

Kp_increase = 6;

} if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==1)) { g_speedMax = 3.6;

g_speedMin = 3.4; 58 附录 A 源程序代码 Kp_base = 1.2;

Kp_increase = 7;

} if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==0)) { g_speedMax = 3.4;

g_speedMin = 3.2;

Kp_base = 1.2;

Kp_increase = 7;

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==1)) { g_speedMax = 3.2;

g_speedMin = 3.0;

Kp_base = 1.2;

Kp_increase = 7;

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==0)) { g_speedMax = 3.0;

g_speedMin = 2.8;

Kp_base = 1.0;

Kp_increase = 7;

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==1)) { g_speedMax = 2.8;

g_speedMin = 2.6;

Kp_base = 1.0;

Kp_increase = 7;

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==0)) //保底速度 { g_speedMax = 2.6;

g_speedMin = 2.4;

Kp_base = 0.8;

Kp_increase = 7; 59 第九届全国大学生智能汽车邀请赛技术报告 } dwt_delay_ms(1000);

while(1) { if(PIT_flag == 1) { PIT_flag = 0;

//scan_deal();

speedcount();

//PathRecognition();

//direction_PD();

encoder_value0 = 0;

encoder_value1 = 0;

//stop();

} //end of if(PIT_flag == 1) }//end of while(1) } /******************************************************************** ******************* 函数:

PIT0_IRQHandler(void) 功能:

PIT0 中断服务程序 说明:

********************************************************************* ******************/ void PIT0_IRQHandler(void) { PIT_Flag_Clear(PIT0);

PIT_num++;

if(stop_delay<STOP_TIME) { stop_delay++;

} if(PIT_num == Detect_Num) { PIT_num = 0; 60 附录 A 源程序代码 PIT_flag = 1;

} if(stop_delay == STOP_TIME) { stop_delay = STOP_TIME;

stop_detect = 1;

} }//end of void PIT0_IRQHandler(void) /******************************************************************** ******************* 函数:

porta_handler(void) 功能:

PORTA 中断服务程序 说明:

中断检测起止线 ********************************************************************* ******************/ void porta_handler(void) { uint8 n = 0;

//引脚号 uint8 m = 0;

//引脚号 n = 19;

//PTA19 m = 25;

//PTA25 if(PORTA_ISFR &

(1 <<

n)) { PORTA_ISFR = (1 <<

n);

/* 以下为用户任务 */ if(stop_detect) { if(gpio_get(PTE5) == 0) { stop_flag = 1;

rightFlag = 0;

leftFlag = 0;

straightFlag = 0;

} 61 //PTA19 触发中断 //写 1 清中断标志位 第九届全国大学生智能汽车邀请赛技术报告 } /* } 以上为用户任务 */ if(PORTA_ISFR &

(1 <<

m)) { PORTA_ISFR = (1 <<

m);

/* 以下为用户任务 */ if(stop_detect) { if(gpio_get(PTE5) == 0) { stop_flag = 1;

rightFlag = 0;

leftFlag = 0;

straightFlag = 0;

} } /* 以上为用户任务 */ } // end of if(PORTA_ISFR &

(1 <<

m)) } //PTA25 触发中断 //写 1 清中断标志位 } /************************************************* 文件名称:check.c 功能描述: 小车自检子程序 作者:

2011 电磁组 编译环境:Freescale CodeWarrier V5.0 For S12 版本:

V1.0 62 附录 A 源程序代码 说明:

修改记录:

创建日期:2014-2-18 **************************************************/ //#include <hidef.h>

/* common defines and macros */ //#include "derivative.h"

/* derivative-specific definitions */ #include "check.h"

#include "LQ12864.h"

#include "string.h"

#include "stdio.h"

#include "include.h"

#include "common.h"

#include "MK60_port.h"

#include "MK60_gpio.h"

#include "MK60_gpio_cfg.h"

//#define byte uint8 //#define word int16 /* some deal about check */ /*************液晶显示变量声明**********************/ unsigned char U_5v_1[11];

//电源检测模块变量 unsigned char U_5v_2[11];

unsigned char U_6v[11];

unsigned char U_7v2[11];

float f_uc_power1;

float f_uc_power2;

float f_uc_power3;

float f_uc_power4;

块变量 unsigned char ad_check_display0[11];

unsigned char ad_check_display1[11];

unsigned char ad_check_display2[11];

unsigned char ad_check_display3[11]; 63 //电感 ad 自检采样值模 第九届全国大学生智能汽车邀请赛技术报告 unsigned char ad_check_display4[11];

unsigned char ad_check_display5[11];

unsigned char ad_check_display6[11];

unsigned char ad_check_display7[11];

unsigned char hongwai_right[11];

unsigned char hongwai_left[11];

unsigned char SensorY_display[11];

的偏移量 unsigned char Senshift_display[11];

SensorY 经过处理的偏移量 //SensorY 为公式直接算出来 //Senshift 为 Senshift[0],是 unsigned short int ad_check[6];

long int ad_check_average[8];

//unsigned short int SensorY_sent;

//unsigned short int Senshift_sent; unsigned char olcd_display_row;

unsigned char olcd_display_column;

unsigned char gn_screen_num;

unsigned char gn_set_flag;

//unsigned char SET;

unsigned char g_uc_exit_flag ;

//byte P1_ch[9] ={'P','1',':','0','0','.','0','0','\0'};

//byte P2_ch[9] ={'P','2',':','0','0','.','0','0','\0'};

byte D_ch[8] ={'D',':','1','8','.','0','0','\0'};

byte V_max[11] ={'V','1',':','3','.','7','0','m','/','s','\0'};

byte V_min[11] ={'V','2',':','3','.','4','0','m','/','s','\0'};

byte V_ch0[11] ={'E','N','T','R','A','N','C','E','S','B','\0'};

byte V_ch2[11] ={'D','I','A','O','B','O','L','I','N','!','\0'}; 64 附录 A 源程序代码 byte SPEED_1_MIN[11] = {'0','M','I','N','2','.','4','M','/','S','\0'};

//速度分档显示 byte SPEED_1_MAX[11] = {'0','M','A','X','2','.','6','M','/','S','\0'};

//保底速度 byte SPEED_2_MIN[11] = {'1','M','I','N','2','.','6','M','/','S','\0'};

byte SPEED_2_MAX[11] = {'1','M','A','X','2','.','8','M','/','S','\0'};

byte SPEED_3_MIN[11] = {'2','M','I','N','2','.','8','M','/','S','\0'};

byte SPEED_3_MAX[11] = {'2','M','A','X','3','.','0','M','/','S','\0'};

byte SPEED_4_MIN[11] = {'3','M','I','N','3','.','0','M','/','S','\0'};

byte SPEED_4_MAX[11] = {'3','M','A','X','3','.','2','M','/','S','\0'};

byte SPEED_5_MIN[11] = {'4','M','I','N','3','.','2','M','/','S','\0'};

byte SPEED_5_MAX[11] = {'4','M','A','X','3','.','4','M','/','S','\0'};

byte SPEED_6_MIN[11] = {'5','M','I','N','3','.','4','M','/','S','\0'};

byte SPEED_6_MAX[11] = {'5','M','A','X','3','.','6','M','/','S','\0'};

byte SPEED_7_MIN[11] = {'6','M','I','N','3','.','6','M','/','S','\0'};

byte SPEED_7_MAX[11] = {'6','M','A','X','3','.','8','M','/','S','\0'};

byte SPEED_8_MIN[11] = {'7','M','I','N','3','.','8','M','/','S','\0'};

byte SPEED_8_MAX[11] = {'7','M','A','X','4','.','0','M','/','S','\0'};

//最高速度 /******************************************************************** ****************** 函数:void welcome(void) 功能:开机显示 welcome 说明:

入口参数:

出口参数:无 ********************************************************************* *****************/ void welcome(void) { LCD_Fill(0x00); 65 第九届全国大学生智能汽车邀请赛技术报告 delay(500);

LCD_P8x16Str(40,4,0,"welcome") ;

delay(10000);

LCD_Fill(0x00); } /**************************************** 函数:power_check(void) 功能:电源自检 说明:检测两个 5V,一个 6V,一个 7.2V 电压值 ****************************************/ /*void power_check(void) { if(KEY_8_speed == 0x00) //已屏蔽 { ATD0CTL5 = 0x36;

//PORTB = 0xFF ;

//已屏蔽 while(!ATD0STAT2L_CCF0) { ;

} //等待转换完成 f_uc_power1 = ATD0DR0;

if(f_uc_power1 == 0) //已屏蔽 { uart_putchar(0x30);

} else { uart_putchar(0x31);

} while(!ATD0STAT2L_CCF1) { ; 66 附录 A 源程序代码 } //等待转换完成 f_uc_power3 = ATD0DR1; while(!ATD0STAT2L_CCF2) { ;

} f_uc_power2 = ATD0DR2;

待转换完成 //等 while(!ATD0STAT2L_CCF3) { ;

} //等待转换完成 f_uc_power4 = ATD0DR3; sprintf(U_5v_1,"1086:%.2f",f_uc_power1*10/4096);

采样结果通过 sprintf 函数送到待显示数组里 sprintf(U_5v_2,"2940:%.2f",f_uc_power2*10/4096);

sprintf(U_6v,"2941:%.2f",f_uc_power4*10/4096);

sprintf(U_7v2,"POWER:%.2f",f_uc_power3*10/4096);

LCD_Fill(0x00);delay(500);

LCD_P8x16Str(8,0,gn_screen_num,U_5v_1);

LCD_P8x16Str(8,2,gn_screen_num,U_5v_2);

LCD_P8x16Str(8,4,gn_screen_num,U_6v);

LCD_P8x16Str(8,6,gn_screen_num,U_7v2); //将 AD }//end of void power_check(void) */ 67 第九届全国大学生智能汽车邀请赛技术报告 /**************************************** 函数:AD_check(void) 功能:显示当前电感 AD 采样值 说明:检测 4 路电感 AD 值 ****************************************/ void AD_check(void) { uint8 m;

uint8 n; //float curve ; //用于弯道算偏移量过大的处理系数 /////////////////////AD 采样与数据处理////////////////////////// Infrared[0] = adc_once(ADC0_DM0,ADC_12bit);

Infrared[1] = adc_once(ADC1_SE16,ADC_12bit);

/* for(m=0;m<2;m++) { for(n=0;n<6;n++) { ad_check[2-m][n] = ad_check[2-m-1][n];

} }//end of for(m=0;m<2;m++) */ ad_check[0] = adc_once(ADC0_SE16,ADC_12bit);//实际 ad5 ad_check[1] = adc_once(ADC0_SE18,ADC_12bit);//实际 ad4 ad_check[2] = adc_once(ADC1_SE16,ADC_12bit);// ad_check[3] = adc_once(ADC0_SE17,ADC_12bit);//实际 ad3 ad_check[4] = adc_once(ADC0_SE10,ADC_12bit);//实际 ad2 ad_check[5] = adc_once(ADC0_DM0,ADC_12bit);

// /* for(m=0;m<6;m++) { 左边电感 右边电感 中间电感 //存储电感数据 //取均值 68 附录 A 源程序代码 ad_check_average[m] = (ad_check[0][m]+ad_check[1][m]+ad_check[2][m])/3;

}*/ ad_check[0] = ad_check[0]*2372/AD_NORM[0];

ad_check[1] = ad_check[1]*2370/AD_NORM[1];

ad_check[3] = ad_check[3]*1871/AD_NORM[3];

ad_check[4] = ad_check[4]*2076/AD_NORM[4]; sprintf(ad_check_display0,"ad0:%d",ad_check[0]);

//将 AD 采 样结果通过 sprintf 函数送到待显示数组里 sprintf(ad_check_display1,"ad1:%d",ad_check[1]);

sprintf(ad_check_display2,"ad2:%d",ad_check[2]);

sprintf(ad_check_display3,"ad3:%d",ad_check[3]);

sprintf(ad_check_display4,"ad4:%d",ad_check[4]);

sprintf(ad_check_display5,"ad5:%d",ad_check[5]);

sprintf(SensorY_display,"heng:%d",(long int)SensorY_ahead_horizontal);

//将偏移量显示在液晶上 sprintf(Senshift_display,"sift:%d",(long int)SensorShift[0]);

sprintf(hongwai_left,"zuo:%d",Infrared[0]);

sprintf(hongwai_right,"you:%d",Infrared[1]);

} /******************************************************************** ** 函数名称:

human_machine_Init() 函数功能:

人机交互初始化程序 调用函数:

入口参数:

出口参数:

无 返回值:

无 其他:

********************************************************************* *****/ void human_machine_Init(void) { 69 第九届全国大学生智能汽车邀请赛技术报告 gpio_init(PTD10,GPO,1);

gpio_init(PTD8,GPO,1);

gpio_init(PTD9,GPO,1);

gpio_init(PTD7,GPO,1);

gpio_init(PTD11,GPI,0);

gpio_init(PTD12,GPI,0);

gpio_init(PTD13,GPI,0);

方向寄存器定义,取低四位 gpio_init(PTD14,GPI,0);

//KEY_4_data24 = 1; //液晶显示切换开关控制位数据 //KEY_4_data1 = 0xF5;

//液晶显示切换开关 数据方向寄存器设置为输入 //KEY_4_data2 = 0xFA;

//方向寄存器赋值时要注意不要把其他地方的 I/O 口输入输出改变,有时需单个赋值 //UP = 0;

//LEFT = 0;

//OK = 0;

//SET = 0;

//PUPAE = 1;

//READ_8_key_data = 0x00;

定义 //KEY_8_speed = 0x00;

//拨码开关对应 A 口内部上拉 //拨码开关控制位数据方向寄存器 gn_set_flag = 0;

olcd_display_row = 0;

olcd_display_column = 8;

gn_screen_num = 0;

g_uc_exit_flag = 0;

LCD_Init();

welcome(); 70 附录 A 源程序代码 } /******************************************************************** ** 函数名称:

human_machine_Init() 函数功能:

人机交互程序 调用函数:

入口参数:

出口参数:

无 返回值:

无 其他:

********************************************************************* *****/ void human_machine_communication(void) { while(!g_uc_exit_flag) { key_process();

//判断按键 if(gn_set_flag == 0) { if(gn_screen_num == 0) //若屏幕序号为 0,则为自检页面 { AD_check();

LCD_Fill(0x00);delay(100);

LCD_P8x16Str(8,0,gn_screen_num,ad_check_display0);

LCD_P8x16Str(8,2,gn_screen_num,ad_check_display1);

LCD_P8x16Str(8,4,gn_screen_num,ad_check_display3);

LCD_P8x16Str(8,6,gn_screen_num,ad_check_display4);

} if(gn_screen_num == 1) 幕序号为 2,则为退出显示页面 { LCD_Fill(0x00);delay(100); 71 //若屏 第九届全国大学生智能汽车邀请赛技术报告 if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==1)) //最高档速度 { LCD_P8x16Str(8,0,gn_screen_num,SPEED_8_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_8_MIN);

} if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==0)) { LCD_P8x16Str(8,0,gn_screen_num,SPEED_7_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_7_MIN);

} if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==1)) { LCD_P8x16Str(8,0,gn_screen_num,SPEED_6_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_6_MIN);

} if((gpio_get(PTE0)==1)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==0)) { LCD_P8x16Str(8,0,gn_screen_num,SPEED_5_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_5_MIN);

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==1)) { LCD_P8x16Str(8,0,gn_screen_num,SPEED_4_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_4_MIN);

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==1)&&(gpio_get(PTE3)==0)) { LCD_P8x16Str(8,0,gn_screen_num,SPEED_3_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_3_MIN);

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==1)) 72 附录 A 源程序代码 { LCD_P8x16Str(8,0,gn_screen_num,SPEED_2_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_2_MIN);

} if((gpio_get(PTE0)==0)&&(gpio_get(PTE1)==0)&&(gpio_get(PTE3)==0)) //保底速度 { LCD_P8x16Str(8,0,gn_screen_num,SPEED_1_MAX);

LCD_P8x16Str(8,2,gn_screen_num,SPEED_1_MIN);

} //LCD_P8x16Str(8,0,gn_screen_num,V_max);

//LCD_P8x16Str(8,2,gn_screen_num,V_min);

LCD_P8x16Str(8,4,gn_screen_num,V_ch0);

LCD_P8x16Str(8,6,gn_screen_num,V_ch2);

if(!OK) 下 ok 键,则退出液晶显示页面 { delay(10);

g_uc_exit_flag = 1;

LCD_Fill(0x00);

} //按 } if(gn_screen_num == 2) 幕序号为 3,则为 PID 系数显示页面 { LCD_Fill(0x00);delay(100);

AD_check();

LCD_P8x16Str(8,0,gn_screen_num,hongwai_right);

LCD_P8x16Str(8,2,gn_screen_num,hongwai_left);

LCD_P8x16Str(8,4,gn_screen_num,D_ch); //若屏 } } 73 第九届全国大学生智能汽车邀请赛技术报告 if(gn_set_flag == 1) //如果按下 set 键,则进入设置界面,之后 OK 键如果没有按下,则一直刷新设置页面的显 示 { // LCD_P8x16Str1(olcd_display_column,olcd_display_row,8,0,V_max);

// LCD_P8x16Str1(olcd_display_column,olcd_display_row,8,2,V_min);

LCD_P8x16Str1(olcd_display_column,olcd_display_row,8,4,D_ch);

if(!OK) ok 键,则退回自检显示页面 { delay(100);

gn_set_flag = 0;

gn_screen_num = 0;

//Kp_base = (P1_ch[3]-48)*10+(P1_ch[4]-48)+(P1_ch[6]-48)*0.1+(P1_ch[7]-48)*0.01;

//Kp_increase = (P1_ch[3]-48)*10+(P1_ch[4]-48)+(P1_ch[6]-48)*0.1+(P1_ch[7]-48)*0.01;

g_speedMax = (V_max[3]-48)*1+(V_max[5]-48)*0.1+(V_max[6]-48)*0.01;

g_speedMin = (V_min[3]-48)*1+(V_min[5]-48)*0.1+(V_min[6]-48)*0.01;

direction_Kd = (D_ch[2]-48)*10+(D_ch[3]-48)+(D_ch[5]-48)*0.1+(D_ch[6]-48)*0.01;

} }//led(LED0,LED_OFF);

//按下 } 74 附录 A 源程序代码 } /******************************************************************** ** 函数名称:

human_machine_communication1() 函数功能:

人机交互程序 1 说明:

该程序与 human_machine_communication()几乎完全一样, 差别在于该程序是用于主程序运行中的调试显示程序 ,加了一个 拨码开关在里面控制液晶的进入和退出 入口参数:

出口参数:

无 返回值:

无 其他:

********************************************************************* *****/ void human_machine_communication1(void) { while(!g_uc_exit_flag) { key_process();

//判断按键 //if(gpio_get(PTE0)==1) //{ // g_uc_exit_flag = 1;

//} if(gn_set_flag == 0) { if(gn_screen_num == 0) 0,则为自检页面 { AD_check();

//若屏幕序号为 75 第九届全国大学生智能汽车邀请赛技术报告 LCD_Fill(0x00);delay(100);

LCD_P8x16Str(8,0,gn_screen_num,ad_check_display0);

LCD_P8x16Str(8,2,gn_screen_num,ad_check_display1);

LCD_P8x16Str(8,4,gn_screen_num,ad_check_display2);

LCD_P8x16Str(8,6,gn_screen_num,ad_check_display7); } if(gn_screen_num == 1) 1,则为 AD 采样值显示页面 { scan_deal();

AD_check();

//若屏幕序号为 LCD_Fill(0x00);delay(100);

LCD_P8x16Str(8,0,gn_screen_num,ad_check_display3);

LCD_P8x16Str(8,2,gn_screen_num,ad_check_display6);

if(gpio_get(PTE0)==0) //打开拨码开关,主程序运行过程中的液晶调试 { LCD_P8x16Str(8,4,gn_screen_num,SensorY_display);

LCD_P8x16Str(8,6,gn_screen_num,Senshift_display);

} } if(gn_screen_num == 2) 幕序号为 2,则为退出显示页面 { LCD_P8x16Str(8,0,gn_screen_num,V_max);

LCD_P8x16Str(8,2,gn_screen_num,V_min);

//LCD_P8x16Str(8,4,gn_screen_num,V_ch2);

//if(!OK) 按下 ok 键,则退出液晶显示页面 //{ //delay(10); 76 //若屏 // 附录 A 源程序代码 //g_uc_exit_flag = 1;

//LCD_Fill(0x00);

//} } if(gn_screen_num == 3) 幕序号为 3,则为 PID 系数显示页面 { LCD_P8x16Str(8,0,gn_screen_num,P_ch);

LCD_P8x16Str(8,2,gn_screen_num,I_ch);

LCD_P8x16Str(8,4,gn_screen_num,D_ch); //若屏 } } if(gn_set_flag == 1) //如果按 下 set 键,则进入设置界面,之后 OK 键如果没有按下,则一直刷新设置页面的 显示 { LCD_P8x16Str1(olcd_display_column,olcd_display_row,8,0,P_ch);

LCD_P8x16Str1(olcd_display_column,olcd_display_row,8,2,I_ch);

LCD_P8x16Str1(olcd_display_column,olcd_display_row,8,4,D_ch);

if(!OK) ok 键,则退回自检显示页面 { delay(100);

gn_set_flag = 0;

gn_screen_num = 0;

//direction_Kp = (P_ch[2]-48)*10+(P_ch[3]-48)+(P_ch[5]-48)*0.1+(P_ch[6]-48)*0.01;

} }//led(LED0,LED_OFF); 77 //按下 第九届全国大学生智能汽车邀请赛技术报告 if(gpio_get(PTE0)==1) { g_uc_exit_flag = 1;

LCD_Fill(0x00);

//在液晶的主程序调试程序 human_machine_communication1 中,废掉 OK 键的退出功能 } //退出取决于拨码开关 1(PTE0) } } /******************************************************************** ****************** 函数:void key_process(void) 功能:按键检测程序 说明:检测到相应按键按下后,进入对应子程序 入口参数:

出口参数:无 ********************************************************************* *****************/ void key_process(void) { // SET = gpio_get(PTC4);

if(!SeT) 真,即不是 0,就执行 if 后的语句 { delay(50);

key_set();

} if(!LEFT) { delay(50);

key_left();

} 78 //if(表达式)只要表达式的值是 附录 A 源程序代码 if(!UP) { delay(50);

key_up();

} } /******************************************************************** ****************** 函数:void key_left(void) 功能:左键函数 说明:按下左键后,会根据是否在设置页面下执行不同函数,设置页面下, 左移,非设置页面下,切换显示屏 入口参数:

出口参数:无 ********************************************************************* *****************/ void key_left(void) { if(gn_set_flag == 0) { LCD_Fill(0x00);

delay(200);

if(gn_screen_num <= 2) { if(gn_screen_num == 2) 下后会切换到第一个显示页面 { gn_screen_num = 0;

} else { gn_screen_num++; 79 //左键功能 //刷屏 //判断屏幕页面 //当前为最后一个显示页面,左键按 第九届全国大学生智能汽车邀请赛技术报告 } } } if(gn_set_flag == 1) { //设置页面下按下 left 键光标向 右移动 if(LEFT==0) { while(!LEFT);

olcd_display_column = olcd_display_column + 8;

if(olcd_display_column == 64) { olcd_display_column = 8;

} } } while(!LEFT);

} /******************************************************************** ****************** 函数:void key_up(void) 功能:数值加一 说明:在设置页面下,按下加键,数值会加一,其他页面下无反应 入口参数:

出口参数:无 ********************************************************************* *****************/ void key_up(void) { unsigned char x,y;

unsigned char olcd_display_data_first;

unsigned char olcd_display_data_second;

unsigned char olcd_display_data_third;

unsigned char olcd_display_data_forth; 80 附录 A 源程序代码 olcd_display_data_first = 0;

olcd_display_data_second = 0;

olcd_display_data_third = 0;

olcd_display_data_forth = 0;

y = olcd_display_row/2;

x = olcd_display_column/8-1;

while(!UP);

if(gn_set_flag == 1) { if((olcd_display_row==0)&&(x>=2)&&(x!=4)) 数值的增加,X=4 是小数点 { olcd_display_data_first = V_max[x];

olcd_display_data_first+=1;

if(olcd_display_data_first ==0x3A) 始重加 { olcd_display_data_first = 0x30;

} V_max[x] = olcd_display_data_first;

} //起始 x=0 //在设置页面下 //对 0 行 P 系数进行 //加到 10 时,从 0 开 if((olcd_display_row==2)&&(x>=2)&&(x<=6)&&(x!=4)) 数进行数值的增加,X=4 是小数点 { olcd_display_data_forth = V_min[x];

olcd_display_data_forth+=1;

if(olcd_display_data_forth==0x3A) 时,从 0 开始重加 { olcd_display_data_forth = 0x30;

} V_min[x] = olcd_display_data_forth;

} //对 6 行 V 系 //加到 10 81 第九届全国大学生智能汽车邀请赛技术报告 if((olcd_display_row==4)&&(x>=2)&&(x<=6)&&(x!=4)) 数进行数值的增加,X=4 是小数点 { olcd_display_data_forth = D_ch[x];

olcd_display_data_forth+=1;

if(olcd_display_data_forth==0x3A) 时,从 0 开始重加 { olcd_display_data_forth = 0x30;

} D_ch[x] = olcd_display_data_forth;

} } } //对 6 行 V 系 //加到 10 /******************************************************************** ****************** 函数:void key_set(void) 功能: 设置函数 说明:按下设置键前如果已经处于设置页面,那么再按下设置键有上下移 动的功能, 如果之前不是设置界面,则进入设置界面,并且通过其他按键进行左右移, 和参数的改变 入口参数:

出口参数:无 ********************************************************************* *****************/ void key_set(void) { if(gn_set_flag == 0) { LCD_Fill(0x00);

while(!SeT);

} 82 附录 A 源程序代码 gn_set_flag = 1;

置标志,进入设置界面 //led_KEY_4_data24 = 1;

if(gn_set_flag == 1) 因为 SET 键没有按下 { 移动光标 if(!SeT) { delay(20); //之前不是设置页面, 按下按键产生设 //之前的 gn_set_flag = 1 对此项不影响, //当在设置页面按下 set 键, 则向下 if(!SeT) { olcd_display_row = olcd_display_row + 2;

移动两行 if(olcd_display_row == 8) 回到 0 行 { olcd_display_row = 0;

} } while(!SeT);

} } } //行数加 2, 即向下 //移动到底,又 /************************************************ 函数名称:

void delay(unsigned int loop_times) 函数功能:

延时 调用函数:

无 入口参数:

unsigned int loop_times 出口参数:

无 返回值:

无 其他:

*************************************************/ void delay(unsigned int loop_times) { 83 第九届全国大学生智能汽车邀请赛技术报告 unsigned int loop_i,loop_j;

for (loop_i=0;

loop_i<

loop_times;

loop_i++) { for (loop_j=0;

loop_j<500;loop_j++) { ;

} } } 84

安徽赛区-摄像头组-合肥工业大学-斛兵一队技术报告 安徽赛区-摄像头组-合肥工业大学-斛兵一队技术报告 暂无评价 | 0人阅读 | 0次下载 | 举报文档 智?能?车?技?术?报?告 浏览...

1 第五届“飞思卡尔”杯全国大学生 智能汽车竞赛 基于电磁场检测的自主寻迹智能车设计技术报告 学 校 合肥工业大学 队伍名称 电磁队 参赛队员 褚向华 杨冰 刘丹 带队教师 张阳 ...

合肥工业大学电磁队—技术报告 第五届“飞思卡尔”杯全国大学生 智能汽车竞赛 基于电磁场检测的自主寻迹智能车设计技术报告 学校: 合肥工业大学 队伍名称: 电磁队 参赛队员...

安徽赛区-电磁组-合肥工业大学-斛兵7队技术报告,合肥工业大学斛滨礼堂,安徽合肥工业大学,合肥工大 斛兵塘》出自:QQ空间素材网
链接地址:http://www.qzoneai.com/sucai/s3xs7OdxMYhvBW4J.html

相关文章阅读

网站地图 | 关于我们 | 联系我们 | 广告服务 | 免责声明 | 在线留言 | 友情链接 | RSS 订阅 | 热门搜索
版权所有 QQ空间素材网 www.qzoneai.com

安徽赛区-电磁组-合肥工业大学-斛兵7队技术报告,合肥工业大学斛滨礼堂,安徽合肥工业大学,合肥工大 斛兵塘