第七届“飞思卡尔”杯全国大学生
智能汽车竞赛
技 术 报 告
学 校: 德州学院
队伍名称: 极速终结者
参赛队员: 卢瑞剑
高祥
朱振阳
带队教师:姚俊红
关于技术报告和研究论文授权的使用说明 本人完全了解第六届“飞思卡尔”杯全国大学生智能汽车竞赛关于保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名: 卢瑞剑
带队教师签名: 姚俊红
日 期: 2012.8.14
摘 要
本文为第七届飞思卡尔智能车电磁组直立车模的设计说明。本智能车采用大赛组委会统一提供的C 型车模,以Freescale 16位单片机MC9S12XS128 作为系统控制处理器,以CodeWarrior IDE 5.0为开发平台。
整个智能车系统的设计与实现包括车模的机械结构调整、传感器电路的设计及位置安装、控制算法和策略优化、系统调试等多个方面。通过对比不同方案的优缺点,并结仿真平台进行了大量底层和上层测试,最终确定了现有的系统结构和各项控制参数。系统硬件上包括核心控制模块,电源模块,传感器模块,电机驱动模块,软件设计方案为在深入分析研究大赛组委会给出的直立参考方案后,在一定程度上大胆创新,形成自己独特的方案,从而提高了车模的行驶速度和稳定性。在智能车调试过程中,使用上位机利用无线通信技术对智能车的状态进行实时监视,有效提高了调试的效率。
实验结果表明,我们的智能车系统设计方案稳定可行,机械结构与控制算法经过长时间的调试均达到优化的状态,本文将详细叙述本智能车控制系统的各个模块的设计原理,设计目标,设计方法与过程,以及其所发挥的作用。
关键字:MC9S12XS128,上位机,无线通信
目 录
摘 要 ........................................................... III
第一章 引 言 ...................................................... 1
1.1 研究背景 ................................... 错误!未定义书签。
1.2 智能汽车竞赛简介 ........................... 错误!未定义书签。
第二章 控制系统总体设计 ........................................... 2
2.1 系统硬件结构 ............................... 错误!未定义书签。
2.2 系统软件结构 ............................... 错误!未定义书签。
2.3 车模整体布局 ............................... 错误!未定义书签。
第三章 车模机械设计 ............................................... 2
3.1 车模基本参数 .............................. 错误!未定义书签。
3.2 系统电路板安装 ............................ 错误!未定义书签。
3.3 传感器安装 .................................................. 9
3.3 测速模块安装 ................................................ 9
第四章 系统硬件设计 .............................................. 10
4.1 核心控制模块 ............................................... 11
4.2 电源模块 ................................................... 12
4.3 陀螺仪、加速度模块 ......................................... 16
4.4 电机驱动模块 ............................................... 22
4.5 测速模块 ................................................... 25
4.6 电磁检测传感器模块 ......................................... 25
第五章 软件设计 .................................................. 26
5.1 车模角度和角速度计算 ....................................... 29
5.2滤波控制算法 ............................................... 26
5.3车模直立控制 ............................................... 27
5.4车模速度控制 ............................................... 28
5.5车模方向控制 ............................................... 28
第六章 系统调试 .................................................. 31
6.1 开发工具 ................................................... 31
6.2 硬件调试 ................................................... 33
第七章 期望与展望 ................................................ 37
参考文献 ......................................................... 19 附录一:控制系统核心代码 ......................... 错误!未定义书签。
第一章 引 言
1.1 研究背景
汽车作为一种最活跃、最革命的动力因素,不但发展着自己,而且改变着世界。汽车在人们的生产和生活中产生了重大影响,随着现代科技和交通事业的迅猛发展,汽车从最初的蒸汽机车逐步发展为今天集各个领域技术于一身的现代化高科技产品,汽车正在走向自动化和电子化。对智能汽车的研究,对于汽车行业的发展、交通事故的减少,以及道路交通的有效管理和一些未知领域的研究探索都具有非常重要的意义。智能汽车的出现,除了能降低高发的交通事故,方便道路交通的管理,也为人类研发探索未知世界的交通工具奠定了良好的基础。在科技日新月异的今天,人们不断探索新的代步工具,出现在外国的赛格威(Segway )思维车,曾作为一种全新的交通工具引发了人们对两轮平衡车的深入研究。
本届的飞思卡尔”杯智能汽车竞赛电磁组就是要求以C 车模的两后轮作为动力,实现车模直立行走,相对于传统的四轮行走的车模运行模式,车模直立行走在硬件设计、控制软件开发以及现场调试等方面提出了更高的要求。两轮自平衡智能小车已经在科研、工业、军事等领域有了广泛的发展,甚至已经生产出相应的代步产品。
1.2 智能汽车竞赛简介
教育部为了加强大学生实践、创新能力和团队精神的培养,在已举办全国大学生数学建模、电子设计、机械设计、结构设计等几大竞赛的基础上,研究决定,委托教育部高等学校自动化教学指导分委会主办每年一度的全国大学生智能汽车竞赛,并成立了由教育部、自动化分教指委、清华大学、飞思卡尔半导体公司等单位领导及专家组成的“第一届‘飞思卡尔’杯全国大学生智能汽车邀请赛”组委会。该竞赛是为了提高大学生的动手能力和创新能力而举办的,具有重大的现实意义。与其它大赛不同的是,这个大赛的综合性很强,是以迅
1
第七届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告
猛发展的汽车电子为背景,涵盖了控制、模式识别、传感、电子、电气、计算机和机械等多个学科交叉的科技创意性比赛,以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,对进一步深化高等工程教育改革,培养创新意识,培养本科生从事科学、技术研究能力,培养硕士生知识、技术创新能力具有重要的意义。智能车的开发与设计涉及到多个专业领域,对于大学生综合素质的培养,知识面的拓展和分析问题解决问题的能力的提高很有意义,并且有利于提高大学生的动手能力、激发创新能力。尤其是对大学生运用理论知识的能力以及实际操作动手实践能力的培养非常重要。
第二章 控制系统总体设计
智能车系统的制作要求是要求车模在设计的专门跑道上稳定而又快速的运行,本章将依据此要求简要介绍智能车控制系统的硬件结构设计和软件结构设计,后续章节中将对车模的机械设计、硬件设计、软件设计进行一一介绍。
2.1 系统硬件结构
车模的整体工作框图如图2.1所示:
图2.1:控制系统整体框图
由于本届电磁组车模要求直立行走,为此我们需要知道车模直立必须的条件——车体的倾斜角度和角速度,我们采用加速度获得车模的倾斜角度,采用陀螺仪获取车模的角速度,通过编码器检测车速,使用片外计数器进行脉冲计 算获得车模的速度,同时使用D 触发器获取方向。使用上位机实时监测车模的各项参数,便于对车模进行调整,提高了调试效率。
车模直立采用PD 控制,速度采用PID 控制,通过PWM 控制电机驱动电路改变电机转速,转向采用PD 控制,通过安装车模转向速度陀螺仪对方向进行微分控制,可消除车模转向控制中的过冲现象。
第七届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告
2.2 系统软件设计
系统基本的软件结构设计如图2.2所示:
图2.2 系统控制软件结构设计框图
程序上电运行后,便进行单片机的初始化。初始化的工作包括有两部分,一部分是对单片机各个应用到的模块进行初始化。第二部分是应用程序初始化,是对于车模控制程序中应用到的变量值进行初始化。
程序在主循环中不停发送监控数据,在通过串口发送到上位机进行监控。同时检查车模是否跌倒。跌倒判断可以通过车模倾角是否超过一定范围进行确定,或者通过安装在车模前后防撞支架上的微动开关来判断。一定车模跌倒,则停止车模运行。包括车模直立控制、速度控制以及方向控制。然后重新进入
3
第二章 控制系统整体设计
车模直立判断过程。
车模的直立控制、速度控制以及方向控制都是在中断程序中完成。通过全局标志变量确定是否进行这些闭环控制。
中断程序框图如图2.2:
图 2.2 中断服务程序
利用XS128的PIT 的中断模块产生1ms 的定时中断。中断服务程序的任务被均匀分配在0-4的中断片段中。因此每个中断片段中的任务执行的周期为5毫秒,频率为200HZ 。
将任务分配到不同的中断片段中,一方面防止这些任务累计执行时间超过1ms ,扰乱1ms 中断的时序,同时也考虑这些任务之间的时间先后顺序。
2.3 车模整体布局
经过我们不断的完善实践,车模改装的最终布局如图2.3所示:
1
图2.3 车模改装整体布局
2
第二章 控制系统整体设计
第三章 车模机械设计
车模的机械部分作为影响其行驶性能最直接的部分,其重要性不言而喻。一个不良的机械系统会增加控制的难度,会为车模的速度提升带来障碍。良好的机械设计与制作,对于车模稳定运行、安全调试都非常重要。
3.1 车模基本参数
赛车机械结构只使用竞赛提供车模的底盘部分及转向和电机部分。今年电磁组车模采用的是原来竞赛的C 车模,它是双后轮驱动,前轮舵机转向的运动模式,而竞赛规定C 型车模直立行走,因此车模改装是我们的第一步工作,在严格遵守比赛规则对车模要求的前提下,我们对车模进行了简化和改装。
改装后的模型车技术参数如表3.1所示:
表3.1 模型车技术参数统计:
3
3.2 系统电路板安装
由于今年要求C 车模直立行走,所以电路板的大小、重量将会对行驶的速度产生一定的影响。为此我们将电路板设计成和车模大致尺寸,将电源模块、传感器、液晶、按键等集成于一块板子上,减少了接线的繁琐,既美观又方便。同时将两个电机驱动电路集成于一个板子上。
电路主板布局如下图所示:
图3.2 系统电路主板
电机驱动电路板如下:
图3.2 电机驱动电路板
3.3 传感器安装
3.3.1 加速度、陀螺仪安装
我们采用加速度与陀螺仪的二合一模块,陀螺仪的安装将直接赛车的过弯能力。由于车模过弯时具有两种运动:平动和转动。其中转动会带动陀螺仪转动。如果陀螺仪安装不是绝对的水平,那么这个转动就会在陀螺仪的Z 轴方向存在一个分量。根据陀螺仪倾斜的方向不同,这个分量有可能是正,有可能是负。从而会使得车模控制“仿佛感觉到在上坡或者是在下坡”,引起车模的速度变慢或者变快。转向陀螺仪的安装与改陀螺仪垂直。
4
第二章 控制系统整体设计
图 3.3.1 加速度、陀螺仪二合一模块
图3.3.1转向陀螺仪
3.3.2 电感安装
由于电感不安装在同一水平线上,那么车模在过十字交叉的时候,水平方向电线中的磁场就会在电感线圈中产生额外的感应电动势。这些电动势会造成车模控制方向的不稳定性。为了避免车模在通过十字交叉线路口时受到的影响,在固定电感线圈的时候,我们将电感置于水平位置,而且在左右两侧各使用两个电感,分别读取这两个电感的AD 值,求其平均,作为最终采集的电磁信号。
图3.3.2电感线圈安装
5
3.4 测速模块安装
编码器采用能够输出A 、B 、Z 三相的256线编码器,它体积较小,重量较轻,精度高、抗扰能强。左右轮各采用一个编码器测速。
图3.4编码器的安装
6
第二章 控制系统整体设计
第四章 系统硬件设计
本系统硬件电路的设计目标为:可靠、高效、简洁。可靠性是系统设计的第一要求,做好各部分的接地、屏蔽、滤波等工作,使本系统工作的可靠性达到了设计要求。高效是指本系统的性能要足够强劲。简洁是指在满足了可靠、高效的要求后,为了尽量减轻整车重量,应使电路设计尽量简洁,尽量减少元器件使用数量,缩小电路板面积,使电路部分重量轻,易于安装。
4.1核心控制模块
单片机最小系统板使用MC9S12XS128单片机。该芯片采用5V 供电,功能强大,总线频率高达40MHz 。芯片含有丰富的片内设备,包括128K 的Flash 存储器,8K 的RAM ,8K 的EEPROM ,两路串行通信接口(SCI ),一路串行外围接口(SPI ),八路定时器通道,两个(80引脚为一个)八路可调转换精度的A/D口,八路PWM 输出,91(80引脚为59)个离散数字I/O口,一个MSCAN 模块。该单片机适合于在汽车电子中的应用,成为很多车载电子设备的控制芯片。其功能模块如图4.2所示。
图4.1 MC9S12XS128单片机功能模块示意图
MC9S12XS128单片机有112引脚和80引脚两种型号,前者比后者多出8位AD 口和其他的一些引脚资源。基于模块化设计的思想,这里专门设计了单片
1
机子板,以便维护和更新。同时,参考数据手册,对单片机的外围电路进行了详细的设计,高质量的实现了去耦、旁路与隔离等作用,保证了其稳定性能。在对小车各个模块进行逐一分析后,合理地确定了单片机的引脚分配。
4.2电源模块
各电源块的说明:
首先说明,电池电量对小车工作也有很大影响的,我们的电池在刚充满电的时候大概有8.2V 左右,但是7.9V 以上的电位很“虚”,撑不了多长时间,所以可能在那段时间里调好的车子可能没之前你们的已经有的效果。这点要特别注意。
7.2V 供电机驱动的直接从电池电压口引出;
5V 电源选取两种电源稳压芯片,一种要求纹波小,电流在1A 以下,工作稳定,给单片机等芯片供电;另一种要求电流在1A 座右,输出电流纹波没有太高要求,专门为人机接口板的数码管显示驱动和键盘扫描控制芯片供电。
由于整个系统中+5V电路功耗较小,为了降低电源纹波,我们首先使用串
2
第二章 控制系统整体设计 联型稳压电路,另外,后轮驱动电机工作时,电池电压压降较大,为提高系统工作稳定性,必须使用低压降电源稳压芯片。
为了提高电源的利用率,我们进一步选择DC/DC电源稳压电路。DC/DC是开关型稳压电路,它的优点是电路结构简单,对电源的高频干扰有较强的抑制作用、效率高,输入电压的范围宽,输出电压,电流的纹波值较小。
此外,本系统选用LM2940为人机接口板的5110液晶显示模块供电和键盘扫描上拉电源。LM2940也是常用的高性能线性稳压芯片之一,它的工作压差较小,只要输入电压达到6V 以上就可以稳定输出5V 电压,同时它的输出电流为
1.5A ,满足人机接口板的1A 要求。连接如图4.2所示:
;
图4.2 LM2940电路原理图
4.3 陀螺仪、加速度二合一模块
(1)加速度传感器
加速度传感器可以测量由地球引力作用或者物体运动所产生的加速度。竞赛规则规定如果车模使用加速度传感器必须使用飞思卡尔公司产生的加速度传感器。该系列的传感器采用了半导体表面微机械加工和集成电路技术,传感器体积小,重量轻。
3
图 4.3
通过微机械加工技术在硅片上加工形成了一个机械悬臂。它与相邻的电极形成了两个电容。由于加速度使得机械悬臂与两个电极之间的距离发生变化,从而改变了两个电容的参数。通过集成的开关电容放大电路量测电容参数的变化,形成了与加速度成正比的电压输出。MMA7260是一款三轴低g 半导体加速度计,可以同时输出三个方向上的加速度模拟信号。
加速度电路:
图4.3加速度电路图
通过设置可以使得MMA7260各轴信号最大输出灵敏度为800mV/g,这个信号无需要在进行放大,直接可以送到单片机进行AD 转换。实际上,飞思卡尔公司还有更多系列的低g 值的加速度传感器,特别是具有数字接口的传感器可以方便单片 机接口设计。
图4.3三轴加速度传感器
只需要测量其中一个方向上的加速度值,就可以计算出车模倾角,比如使用Z 轴方向上的加速度信号。车模直立时,固定加速度器在Z 轴水平方向,此时输出信号为零偏电压信号。当车模发生倾斜时,重力加速度g 便会在Z 轴方向形成加速度分 4
第二章 控制系统整体设计 量,从而引起该轴输出电压变化。变化的规律为
Δu =kg sinθ≈kg θ
式中,g 为重力加速度;θ为车模倾角;k 为加速度传感器灵敏度系数系数。当倾角θ比较小的时候,输出电压的变化可以近似与倾角成正比。
似乎只需要加速度就可以获得车模的倾角,再对此信号进行微分便可以获得倾角速度。但在实际车模运行过程中,由于车模本身的摆动所产生的加速度会产生很
大的干扰信号,它叠加在上述测量信号上使得输出信号无法准确反映车模的倾角。
图4.3 车模运动引起加速度Z 轴信号变化
车模运动产生的加速度使得输出电压在实际倾角电压附近波动。这些波动噪声可以通过数据平滑滤波将其滤除。但是平滑滤波一方面会使得信号无法实时反映车模倾角变化,从而减缓对于车模车轮控制。另一方面也会将车模角速度变化信息滤掉。上述两方面的滤波效果使得车模无法保持平衡。因此对于车模直立控制所需要的倾角信息需要通过另外一种器件获得,那就是角速度传感器-陀螺仪。
(2)陀螺仪
图4.3陀螺仪
5
陀螺仪可以用来测量物体的旋转角速度。竞赛允许选用村田公司出品的ENC-03系列的加速度传感器。它利用了旋转坐标系中的物体会受到科里奥利力的原理,在器件中利用压电陶瓷做成振动单元。当旋转器件时会改变振动频率从而反映出物体旋转的角速度。
陀螺仪放大电路图:
图4.3陀螺仪放大电路图
在车模上安装陀螺仪,可以测量车模倾斜角速度,将角速度信号进行积分便可以得到车模的倾角。
图4.3角速度积分得到角度
由于陀螺仪输出的是车模的角速度,不会受到车体运动的影响,因此该信号中噪声很小。车模的角度又是通过对角速度积分而得,这可进一步平滑信号,从而使得角度信号更加稳定。因此车模控制所需要的角度和角速度可以使用陀螺仪所得到的信号。
6
第二章 控制系统整体设计
由于从陀螺仪角速度获得角度信息,需要经过积分运算。如果角速度信号存在微小的偏差和漂移,经过积分运算之后,变化形成积累误差。这个误差会随着时间延长逐步增加,最终导致电路饱和,无法形成正确的角度信号。如下图所示:
图4.3角速度积分漂移现象
解决这个问题的办法是通过上面的加速度传感器获得的角度信息对此进行校正。通过对比积分所得到的角度与重力加速度所得到的角度,使用它们之间的偏差改变陀 螺仪的输出,从而积分的角度逐步跟踪到加速度传感器所得到的角度。
图4.3 通过重力加速度来矫正陀螺仪的角度漂移
在上述方案中,利用加速度计所获得的角度信息g θ与陀螺仪积分后的角度θ进行比较,将比较的误差信号经过比例1/g T 放大之后与陀螺仪输出的角速度信号叠加之后再进行积分。对于加速度计给定的角度g θ,经过比例、积分环节之后产生的角度θ必然最终等于g θ。
4.4电机驱动模块
目前大电流直流电机多采用达林顿管或MOS 管搭制H 桥PWM 脉宽调制,因此体积较大;另一方面,由于分立器件的特性不同,使得驱动器的特性具有一定的离散性,此外,由于功率管的开关电阻比较大,因此功耗也很大,需要功
7
率的散热片,这无疑进一步加大了驱动体的体积。且用四块MOS 管搭制的H 桥成本也比较高,效果且没有集成芯片搭制的H 桥好。
集成驱动芯片有飞思卡尔半导体公司推出的全桥驱动芯片MC33886或33887、意法半导体公司推出的去桥驱动芯片VNH3SP30、英飞凌公司推出的高电流PN 半桥驱动芯片BTS7960。
组成H 桥驱动电路有三种方案。通过这些方案的对比分析且考虑到C 车模双电机的特点,尽可能地使用电路简单且性能较好的驱动,我们最终先选择了BTS7960作为双电机的驱动,两片英飞凌公司的BTS7960芯片即可构成全桥。该芯片具有自我保护能力,抗电子干扰能力强,且对环境的适应能力较强。我们使用了四片BTS7960构成了两个H 桥控制电路。
如图所示,采用2个半桥智能功率驱动芯片BTS7960组合成一个全桥驱动器,驱动直流电机转动。BTS7960是电机驱动的大电流半桥集成芯片,他带有一个P 沟道的高边MOSFET 、一个N 沟道的低边MOSFET 和一个驱动IC 。P 沟道高边开关省去了电荷泵的需求,因而减少了电磁干扰。集成的驱动IC 具有逻辑电平输入、电流诊断、斜率调节、死区时间产生和超温、过压、欠压、过流及短路保护功能。BTS7960的通态电阻典型值为16m 欧姆,驱动电流可达43A ,调节SR 引脚外接电阻的大小可以调节MOS 管导通和关断时间,具有防电磁干扰功能。IN 引脚用于确定哪个MOSFET 导通。当IN=1且INH=1时,高边MOSFET 导通,输出高电平;当IN=0且INH=1时,低边MOSFET 导通,输出低电平。通过对下桥臂开关管进行频率为25kHZ 的脉宽调制(PWM )信号控制BTS7960的开关动作,实现对电机的正反向PWM 驱动、反接制动、能耗制动等控制状态。
这块芯片开关频率可以达到25kHZ ,可以很好地解决电机噪声大和发热的问题、同时驱动能力有了明显的提高,相应速度快。但是,电机变速时会使电源电压下降10%左右,控制器等其他电路容易产生掉电危险,从而使整个电路系统瘫痪。
8
第二章 控制系统整体设计
图4-6 BTS7960的内部连接图
图4-7为该芯片的封装图:
图4-7 BTS7960封装图
表4-1为BTS7960各管脚连接:
9
表4-1为BTS7960各管脚连接
图4.1电机驱动原理图 10
第二章 控制系统整体设计
4.5测速模块
由于今年电磁组使用的车模为去年的C 车模,后轮采用两个电机分别控制两个轮子,可以实现车子的主动差速,要想实时的反馈两路电机的速度,就必须使用两个编码器。为了节约单片机内部资源,我们采用外部计数芯片CD4520,通过实验,一片4520 里面有两路十六进制计数器,通过本图这样连接,最大计数脉冲为255. 电路图如下图所示:
图4.5 CD4520计数电路
同时我们使用D 触发器74ls74识别电机正反转,电路图如下所示:
图4.3 74LS74电路
5号管脚输出为高电平时为正转,输出为低电平时为反转。
11
4.6电磁检测传感器模块
电磁检测传感器电路我们采用集成运放LMV358组成的电路,LMV358属于满电压量程(Rail-to-Rail, 轨对轨)运算放大器,R-R 运放一般工作在单电源供电状态下,输出电压范围基本接近于电源电压和地。输入的共模电压范围宽。LMV358的主要性能如下表所示:
表4.6 LMV358主要性能
下图为基于R-R 运放LMV358的电磁放大检波电路
图4.6电磁检测电路
12
第二章 控制系统整体设计
第五章 软件设计
5.1 车模角度和角速度计算
分别读取加速度和陀螺仪的AD 值,可以计算车模的倾角。对于读取的陀螺仪和加速度计的数值需要减去零偏值。这个数值需要通过实验确定。在车模保持直立静止时,读出两个通道的数值,便是相应的零偏值。这个数值会带有一定的误差,往往会使得车模往一个方向加速行驶。这个误差可以通过后面的速度控制加以消除。
对于加速度计所得到的数值,通过一个比例系数将它归一化到-90至90之间。同样,后面的陀螺仪的读出的数据也需要通过一个比例系数进行归一化。这个数值也是通过实验确定的。
5.2 滤波控制算法
我们采用的是互补滤波,既调节陀螺仪的比例因子,使得陀螺仪的角度输出能够正确跟踪重力加速度Z 轴输出信号。滤波是实现直立的重要前提,。如果陀螺仪比例因子小了,则陀螺仪角度输出就会有一个缓慢跟踪过程。相反,如果陀螺仪比例因子大了,陀螺仪角度输出就会有一个过冲。经过几次反复调节,我们最终出来的滤波效果图如下所示,黄色为加速度归一化之后的值,蓝色为陀螺仪归一化之后的值,红色为融合之后的角度值。
图5.2 互补滤波效果图
13
5.3 车模直立控制
车模的直立控制既对车模的角度控制,角度控制参数包括比例和微分两个参数。比例参数相当于倒立摆的回复力。这个参数需要大于重力加速度所产生的效果才能够使得车模保持直立。随着这个参数逐步增大,车模开始能够保持直立。该参数进一步加大,车模开始出现来回的摆动现象。微分参数相当于倒立摆中的阻尼力,它可以有效的抑制车模的摆动。当该参数过大时,会引起车模本身的震动。这是由于车模本身不是一个刚体,车体具有一定的共振频率。微分参数过大时会使得车模在电机的驱动下产生车体的共振。
调节这两个参数可以遵循先比例后微分的过程。首先调整比例参数,使得车模能够保持直立并且开始来回摆动了。说明此事比例参数已经可以克服重力的影像。然后逐步增加微分参数,车模逐步保持直立稳定。增大微分参数直到车模开始共振,这样就可以确定微分参数的最大值了。然后适当减小微分参数,然后逐步增加比例参数,直到车模又开始震荡,这样便可以确定比例参数的最大值。然后适当减小比例参数。在在这些参数附近进行试验,直到寻找到一组车模直立的控制最优参数。
5.4 车模速度控制
在角度参数初步确定之后,便可以进行速度控制参数的整定。速度控制参数包括比例和微分两个控制参数,这里的比例和微分定义是指反馈速度而言。如果相对于车模的反馈位置(速度的积分量),这两个参数也可以分别对应称作积分和比例参数。
比例控制参数决定抑制速度误差的能力,但是只有比例控制,车模速度控制就会出现双积分负反馈控制。第一个积分是误差的积分,第二个积分是车模倾角所产生的加速度积分。因此车模速度就会出现震荡现象。通过微分控制可以消除这个震荡现象。在调整时,由于是进行静态调整,故此先将速度控制闭环的速度设定值置为0。然后开始后面的比例和微分参数的调整。具体的调试过程可以首先逐步比例参数,车模能够在一定平衡点附近来回运动。然后在逐步增加微分参数,车模就会很快停留在平衡点出。使用外力冲击车模,车模能够很快趋于静止。然后再逐步增加比例和微分控制参数,使得车模抵抗外部干扰冲击的能力逐步增强。当比例和微分参数达到一定的数值后,车模开始出现摆动现象。至此可以知道比例和微分的大体范围。在此范围内通过几次调整测试,可以初步确定速度控制参数的最佳组合。
5.5 车模方向控制
方向控制包括两个参数:比例控制参数和微分控制参数。在调整方向参数是,设置速度参数为0,打开桌面20kHz 的电磁电源。比例控制参数可以使得车模方向恢复正确位置。当该参数逐步增加时,车模方向回复速度逐步加快。当比例参数增加到一定数值之后,车模的方向回复由于过快,会出现方向过冲现象。此时通过增加微分控制参数可以抑制这种 14
第二章 控制系统整体设计 方向过冲的现象。通过几次组合测试,可以选择一组合适的比例控制和微分控制参数使得车模方向控制即迅速又不会出现过冲现象。
15
第六章 系统调试
6.1 开发工具
在对程序进行开发和软硬件联调的过程中需要一整套的软件开发与调试工具。程序的开发是在组委会提供的CodeWarrior IDE下进行的,包括源程序的编写、编译和链接,并最终生成可执行文件。CodeWarrior for S12 是面向以HC1和S12为CPU 的单片机嵌入式应用开发软件包。包括集成开发环境IDE 、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C 交叉编译器、汇编器、链接器以及调试器。使用BDM 来下载程序,把编译好的程序下载到单片机里运行。
赛车的硬件开发工具主要为Altium Designer,通过该软件来完成电路原理图的绘制以及PCB 板制作。
Code Warrior开发软件使用界面如图6.1所示。
图6.1 CodeWarrior 使用界面
16
第二章 控制系统整体设计
Code Warrior 是面向以HC12和S12为CPU 的单片机嵌入式应用开发的软件包,包括集成开发环境IDE 、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C 交叉编译器、汇编器、链接器以及调试器等。在CodeWarrior 软件中可以使用汇编语言或C 语言,以及两种语言的混合编程。
用户可在新建工程时将芯片的类库添加到集成环境开发环境中,工程文件一旦生成就是一个最小系统,用户无需再进行繁琐的初始化操作,就能直接在工程中添加所需的程序代码。
在原程序编译连接通过后,就可以进行程序的下载了。下载前先将单片机已存在的部分擦除,擦除界面如图6.2所示,擦除完了以后点击Load ,将bin 文件夹下生成的后缀为.abs 的文件打开,就可以完成下载。下载使用BDM 下载器进行上位机和下位机的互联,BDM 如图6.3所示。
图6.2 程序擦除烧写界面
17
6.2 硬件调试
BDM下载器。
第七章 总结与展望
本设计是在满足竞赛组委会有关要求的前提下,经过不断地对系统设计方案进行比较和优化完成的。赛车以Freescale 公司的16位单片机MC9S12XS128作为系统控制处理器,采用陀螺仪、加速度作为角度传感器,采用电感及组成的运放电路检测赛道的路径信号,整个系统采用闭环控制,并对车模的机械结构进行了适当的调整,使模型车能够稳定快速的运行。
通过对模型车的仿真和测试,系统的整个设计方案基本合理。根据大赛的要求,使用的电源必须是用7.2V 电池供电,为了提高电源的稳定性,我们选用了芯片LM2940-5.0为单片机系统、速度采集模块提供5伏电源;采用全桥模块稳定、有利地驱动直流电动机,可获得电机的最佳性能:高速、快速响应和高起动频率;这为智能车的稳定工作提供了可靠的保证。
要求车模直立行走是今年竞赛最大的一个变动,做车的初始,我们感到摆在我们面前的是一个巨大的难题,但是我们没有畏惧,整个队伍团结一心,坚定信心,突破一道又一道又一道的难关,最终我们走到了决赛的舞台上,感谢姚俊红、邓广福老师对我们的指导、启发,感谢德州学院——机械电子协会全体成员对我们的支持与指导,同时感谢大赛组委会及飞思卡尔半导体公司对我们的技术及芯片的大力支持!
18
第二章 控制系统整体设计 参考文献
[1] 卓晴, 黄开胜, 邵贝贝. 学做智能车—挑战飞思卡尔杯[M].北京:北京航空航天大学出版社, 2007:1-18
[2] Thomas D. Gillespie. 车辆动力学基础. 北京:清华大学出版社.2006年12月第1版
[3] 陈伯时. 电力拖动自动控制系统——运动控制系统[M]. 北京:机械工业出版社,2008.
[4]曾峰,巩海波,曾波. 印制电路板(PCB )设计与制作[M]. 北京:电子工业出版社,2005.
[5] 童诗白,华成英. 模拟电子技术基础[M]. 北京:高等教育出版社,2004.
[6]邵贝贝 单片机嵌入式应用的在线开发方法 北京清华大学出版社 2004
[7]彭康拥 陈来好等主编:自动控制原理 华南理工出版社 广州 2005
[8]直立参考方案2.0,智能车竞赛大赛组委会秘书处
[9]竞赛网站电磁车车模调试视频资料,智能车竞赛大赛组委会秘书处
19
附录
部分程序源代码:
/******************************主函数**********************/
void main(void)
{
int16u_t i;
int16u_t dealy1=0,delay2=0;
DisableInterrupts; //程序一开始需要关闭所有中断,防止单片机初始化过程中被某个中断打断
/* for(dealy1=0;dealy1
{
for(delay2=0;delay2
PORTE_PE2=1;
} */ /**/
for(i=0;i
{
20
第二章 控制系统整体设计 AD_Collect(); //顺序不能颠倒
AD_Enable(); //顺序不能颠倒 }
System_Init(); //调用系统初始化函数 DDRH_DDRH0=0;
/* PORTE_PE2=0;
Delay_ms(500) ;
PORTE_PE2=1;
Delay_ms(2000) ;
PORTE_PE2=0;
Delay_ms(500) ;
PORTE_PE2=1;
Delay_ms(2000) ;
for(i=0;i
{
AD_Collect(); //
AD_Enable(); //
}
*/
EnableInterrupts; //
CV_ACCE_Z_ZERO=CV_ACCE_Z_ZERO_Init;
21
顺序不能颠倒 顺序不能颠倒 允许中断
for(;;) {
LCD_Show_L(0,3,g_fLeftVoltageSigma);
LCD_Show_R(0,4,g_fRightVoltageSigma);
LCD_Show_g_fDirectionControlOut(0,5,g_fDirectionControlOut);
//***************************************/ 加速度值液晶显示
LCD_Show_CV_ACCE_Z_ZERO(0,0,CV_ACCE_Z_ZERO);
/***************************************/
LCD_Show_Speed(0,1,ObjectSpeed_flag);
//***************************************/ 按键1
if(PTT_PTT0==1)
Delay_us(400);
if(PTT_PTT0==1)
{
CV_ACCE_Z_ZERO++;
while(PTT_PTT0==1)
{
Delay_us(180);
}
}
/***************************************/
//***************************************/ 按键2
if(PTT_PTT1==1)
22
第二章 控制系统整体设计 Delay_us(400);
if(PTT_PTT1==1)
{
CV_ACCE_Z_ZERO--;
while(PTT_PTT1==1)
{
Delay_us(180);
}
}
/***************************************/
ObjectSpeed_flag=PTH*2;
//***************************************/ 按键3
if(PTT_PTT2==1)
{
Delay_us(400);
if(PTT_PTT2==1)
{
Speed_Flage=1;
while(PTT_PTT2==1)
{
Delay_us(180);
}
}
}
23
if(Speed_Flage==1)
{
LCD_write_english_string(30,2," GO! ");
}
else
LCD_write_english_string(30,2,"STOP!");
/* if(PTH_PTH0==1)
{
Speed_Flage=1;
}
**************************************/
}
}
/*********************************中断函数************************/ /*==============================RTI中断(定时1ms ,可用于测速和定时)===============================*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTI_int()
{
int16u_t spd_temp1,spd_temp2;
int8u_t time_out,flag=1;
24
第二章 控制系统整体设计
CRGFLG_RTIF=1;
g_nCarCount++;
g_fDirectionControlPeriod++;
////////////////////////////////////////////////////
//时间片轮转
if(g_nCarCount==1) //第1个1ms
{
////////////////////////////////////////////////
long sum0=0,sum1=0,sum2=0,sum3=0,sum5=0,sum6=0,sum7=0;
for(j=0;j
{
AD_Collect();
sum0=sum0+AD_Value[0];
sum1=sum1+AD_Value[1];
sum2=sum2+AD_Value[2];
sum3=sum3+AD_Value[3];
sum5=sum5+AD_Value[5];
sum6=sum6+AD_Value[6];
sum7=sum7+AD_Value[7];
AD_Enable();
}
sum0>>=2;
sum1>>=2;
sum2>>=2;
sum3>>=2;
sum5>>=2;
25
sum6>>=2;
sum7>>=2;
AD_Value[0]=(int)sum0;
AD_Value[1]=(int)sum1;
AD_Value[2]=(int)sum2;
AD_Value[3]=(int)sum3;
AD_Value[5]=(int)sum5;
AD_Value[6]=(int)sum6;
AD_Value[7]=(int)sum7;
CarVoltageGet(); //AD数值转换及卡尔曼滤波
////////////////////////////////////////////////
}
else if(g_nCarCount==2) //第2个1ms
{
if(Speed_Flage==1)
{
if(speed
{
speed+=1;
ObjectSpeed=speed;
}
else ObjectSpeed=ObjectSpeed_flag;
}
else ObjectSpeed=0;
26
第二章 控制系统整体设计
CarAngleControl(); //车模角度控制
}
else if(g_nCarCount==3) //第3个1ms
{
g_nCarMtionCount++;
if(g_nCarMtionCount>=CAR_MOTION_PERIOD)
{
g_nCarMtionCount = 0;
////////////////////////////////////////////////
NowSpeed_L = NowSpeed_L_temp;
NowSpeed_R = NowSpeed_R_temp;
NowSpeed_L_temp = 0;
NowSpeed_R_temp = 0;
NowSpeed_L_history1 = NowSpeed_L ;
NowSpeed_R_history1 = NowSpeed_R ;
////////////////////////////////////////////////
Speed_PI(); //速度PI 控制,周期100ms
}
Speed_PI_OUT(); //PWM输出控制,周期5ms
}
else if(g_nCarCount==4) //第4个1ms
{
g_nDirectionControlCount++;
DirectionVoltageSigma();
27
if( g_nDirectionControlCount>=DIRECTION_CONTROL_COUNT)
{
DirectionControl();
DirectionControlOutput();
g_nDirectionControlCount=0;
g_fDirectionControlPeriod=0;
}
// Spd_Decision();
}
else if(g_nCarCount>=CAR_PERIOD) //第5个1ms
{
g_nCarCount=0;
AD_Enable(); //AD使能
}
/////////////////////////////////////////////////////
//速度采样
spd_temp2 =PORTA; //右边计数
spd_temp1 =PORTB; //左边计数
PORTE_PE5=1; //将 PTT_PTT6
置 1,给计数器清零
if(Speed_Flage==1)
{
NowSpeed_L_temp += spd_temp1;
NowSpeed_R_temp += spd_temp2;
28
第二章 控制系统整体设计
}
if(Speed_Flage==0)
{
if(PORTE_PE7==1)
{
NowSpeed_L_temp += spd_temp1;
}
else //左侧轮反转
{
NowSpeed_L_temp -= spd_temp1;
}
if(PORTE_PE6==0)
{
NowSpeed_R_temp += spd_temp2;
}
else //右侧轮反转
{
NowSpeed_R_temp -= spd_temp2;
}
}
// PORTE_PE5=1;
spd_temp2 =PORTA; //再次读取PA 、PB
口,确保已经被清零
spd_temp1 =PORTB;
while(spd_temp1 && spd_temp2 && time_out
保清零
{
spd_temp2 = PORTA;
spd_temp1 = PORTB;
29
time_out++;
}
time_out=0;
PORTE_PE5=0; //将 PTT_PTT6
清 0, 开始计数
}
#pragma CODE_SEG DEFAULT
//==========================================
//函数名 CarVoltageGet()
//作用:角度、角速度测量及角度补偿
//==========================================
void CarVoltageGet(void)
{
///////////////////////////////////////////// //
互补滤波
lnDeltaValue
=
= lnDeltaValue - int32s_t lnDeltaValue; (int16s_t)CV_ACCE_VAL; (int16s_t)CV_ACCE_Z_ZERO; //读取加速度传感器AD 值 lnDeltaValue //减去零偏置值
//角度归一化
lnDeltaValue = g_nCarAcceVal = (int16s_t)(lnDeltaValue * CV_ACCE_RATIO_INT / 100); (int16s_t)CV_GYRO_VAL; 30
第二章 控制系统整体设计
//读取陀螺仪AD 值
lnDeltaValue = lnDeltaValue - //减去零偏置值 (int16s_t)CV_GYRO_ZERO; g_nCarGyroVal = (int16s_t)(lnDeltaValue * CAR_GYRO_RATIO_INT /
=
= (int16s_t)(g_lnCarAngleSigma g_nCarAcceVal- g_nCarAngle 100); //角速度归一化 g_nCarAngle //车体角度计算 lnDeltaValue
//角度校正
lnDeltaValue = (int32s_t)(lnDeltaValue * CAR_ACCE_RATIO_INT/100 );
//角度反馈
}
//==========================================
//函数名 CarAngleControl()
//作用:车体角度控制,内环
//==========================================
void CarAngleControl(void)
{
int16s_t nLeft, nRight;
int32s_t nSpeed; int32s_t nP, nD;
31
>>5); ; g_lnCarAngleSigma += (g_nCarGyroVal + lnDeltaValue); //角速度积分 // SEND();
nP = g_nCarAngle; //g_nCarAngle:-1000~1000
nP = (int16s_t)(nP * CAR_AA_P_INT); //角度P 控制
nD = g_nCarGyroVal;
nD = (int16s_t)(nD * CAR_AA_D_INT); //
nSpeed = (nP + nD) / 20;
if(nSpeed > MOTOR_SPEED_SET_MAX)
{
nSpeed = MOTOR_SPEED_SET_MAX;
}
else if(nSpeed
{
nSpeed = MOTOR_SPEED_SET_MIN;
}
if (g_fDirectionControlOut>0)
{
PTT_PTT7=1;
PTT_PTT6=0;
}
else {
PTT_PTT7=0;
PTT_PTT6=1;
}
nLeft = (int16s_t)nSpeed + PI_Out +
//*30 角度控制; /; ///
32 角度D 控制 g_fDirectionControlOut ;
第二章 控制系统整体设计
nRight = (int16s_t)nSpeed + PI_Out -g_fDirectionControlOut;//*30 角度控制 ; ; //
g_nLeftMotorOut = nLeft;
g_nRightMotorOut = nRight;
Motor_Control();
}
//====================================
//函数名 Speed_PI
//作用:速度全量式PI 控制,100ms 调用一次
//====================================
void Speed_PI(void)
{
int32s_t nP, nI,nD; int32s_t nSpeed; int32s_t nValue1, nValue2; nSpeed = (NowSpeed_R + NowSpeed_L) / 2; nValue1 = ObjectSpeed - nSpeed; nValue2 = ObjectSpeed - nSpeed;
if(nValue1 > 160) nValue1 = 160;
if(nValue1
if(nValue2 > 130) nValue2 = 130;
if(nValue2
nP = nValue1 * MOTOR_SPEED_P_INT; nI = nValue2 * MOTOR_SPEED_I_INT;
33
nD = -(nSpeed-PI_SpeedErr) * MOTOR_SPEED_D_INT;
PI_SpeedOld = PI_SpeedNew;
PI_SpeedKeep += nI;
PI_SpeedNew = (int16s_t)((nP + (PI_SpeedKeep / 8)+nD) / 100L);
if(PI_SpeedKeep > 8000) PI_SpeedKeep = 8000;
if(PI_SpeedKeep
PI_SpeedErr=nSpeed;
}
//====================================
//函数名 Speed_PI_OUT
//作用:计算速度PI 控制的输出,5ms 调用一次
//====================================
void Speed_PI_OUT(void)
{
int32s_t nValue;
nValue = PI_SpeedNew - PI_SpeedOld;
nValue = nValue * (g_nCarMtionCount+1) / (CAR_MOTION_PERIOD) PI_SpeedOld;
PI_Out = (int16s_t)nValue;
}
34 +
第七届“飞思卡尔”杯全国大学生
智能汽车竞赛
技 术 报 告
学 校: 德州学院
队伍名称: 极速终结者
参赛队员: 卢瑞剑
高祥
朱振阳
带队教师:姚俊红
关于技术报告和研究论文授权的使用说明 本人完全了解第六届“飞思卡尔”杯全国大学生智能汽车竞赛关于保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名: 卢瑞剑
带队教师签名: 姚俊红
日 期: 2012.8.14
摘 要
本文为第七届飞思卡尔智能车电磁组直立车模的设计说明。本智能车采用大赛组委会统一提供的C 型车模,以Freescale 16位单片机MC9S12XS128 作为系统控制处理器,以CodeWarrior IDE 5.0为开发平台。
整个智能车系统的设计与实现包括车模的机械结构调整、传感器电路的设计及位置安装、控制算法和策略优化、系统调试等多个方面。通过对比不同方案的优缺点,并结仿真平台进行了大量底层和上层测试,最终确定了现有的系统结构和各项控制参数。系统硬件上包括核心控制模块,电源模块,传感器模块,电机驱动模块,软件设计方案为在深入分析研究大赛组委会给出的直立参考方案后,在一定程度上大胆创新,形成自己独特的方案,从而提高了车模的行驶速度和稳定性。在智能车调试过程中,使用上位机利用无线通信技术对智能车的状态进行实时监视,有效提高了调试的效率。
实验结果表明,我们的智能车系统设计方案稳定可行,机械结构与控制算法经过长时间的调试均达到优化的状态,本文将详细叙述本智能车控制系统的各个模块的设计原理,设计目标,设计方法与过程,以及其所发挥的作用。
关键字:MC9S12XS128,上位机,无线通信
目 录
摘 要 ........................................................... III
第一章 引 言 ...................................................... 1
1.1 研究背景 ................................... 错误!未定义书签。
1.2 智能汽车竞赛简介 ........................... 错误!未定义书签。
第二章 控制系统总体设计 ........................................... 2
2.1 系统硬件结构 ............................... 错误!未定义书签。
2.2 系统软件结构 ............................... 错误!未定义书签。
2.3 车模整体布局 ............................... 错误!未定义书签。
第三章 车模机械设计 ............................................... 2
3.1 车模基本参数 .............................. 错误!未定义书签。
3.2 系统电路板安装 ............................ 错误!未定义书签。
3.3 传感器安装 .................................................. 9
3.3 测速模块安装 ................................................ 9
第四章 系统硬件设计 .............................................. 10
4.1 核心控制模块 ............................................... 11
4.2 电源模块 ................................................... 12
4.3 陀螺仪、加速度模块 ......................................... 16
4.4 电机驱动模块 ............................................... 22
4.5 测速模块 ................................................... 25
4.6 电磁检测传感器模块 ......................................... 25
第五章 软件设计 .................................................. 26
5.1 车模角度和角速度计算 ....................................... 29
5.2滤波控制算法 ............................................... 26
5.3车模直立控制 ............................................... 27
5.4车模速度控制 ............................................... 28
5.5车模方向控制 ............................................... 28
第六章 系统调试 .................................................. 31
6.1 开发工具 ................................................... 31
6.2 硬件调试 ................................................... 33
第七章 期望与展望 ................................................ 37
参考文献 ......................................................... 19 附录一:控制系统核心代码 ......................... 错误!未定义书签。
第一章 引 言
1.1 研究背景
汽车作为一种最活跃、最革命的动力因素,不但发展着自己,而且改变着世界。汽车在人们的生产和生活中产生了重大影响,随着现代科技和交通事业的迅猛发展,汽车从最初的蒸汽机车逐步发展为今天集各个领域技术于一身的现代化高科技产品,汽车正在走向自动化和电子化。对智能汽车的研究,对于汽车行业的发展、交通事故的减少,以及道路交通的有效管理和一些未知领域的研究探索都具有非常重要的意义。智能汽车的出现,除了能降低高发的交通事故,方便道路交通的管理,也为人类研发探索未知世界的交通工具奠定了良好的基础。在科技日新月异的今天,人们不断探索新的代步工具,出现在外国的赛格威(Segway )思维车,曾作为一种全新的交通工具引发了人们对两轮平衡车的深入研究。
本届的飞思卡尔”杯智能汽车竞赛电磁组就是要求以C 车模的两后轮作为动力,实现车模直立行走,相对于传统的四轮行走的车模运行模式,车模直立行走在硬件设计、控制软件开发以及现场调试等方面提出了更高的要求。两轮自平衡智能小车已经在科研、工业、军事等领域有了广泛的发展,甚至已经生产出相应的代步产品。
1.2 智能汽车竞赛简介
教育部为了加强大学生实践、创新能力和团队精神的培养,在已举办全国大学生数学建模、电子设计、机械设计、结构设计等几大竞赛的基础上,研究决定,委托教育部高等学校自动化教学指导分委会主办每年一度的全国大学生智能汽车竞赛,并成立了由教育部、自动化分教指委、清华大学、飞思卡尔半导体公司等单位领导及专家组成的“第一届‘飞思卡尔’杯全国大学生智能汽车邀请赛”组委会。该竞赛是为了提高大学生的动手能力和创新能力而举办的,具有重大的现实意义。与其它大赛不同的是,这个大赛的综合性很强,是以迅
1
第七届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告
猛发展的汽车电子为背景,涵盖了控制、模式识别、传感、电子、电气、计算机和机械等多个学科交叉的科技创意性比赛,以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,对进一步深化高等工程教育改革,培养创新意识,培养本科生从事科学、技术研究能力,培养硕士生知识、技术创新能力具有重要的意义。智能车的开发与设计涉及到多个专业领域,对于大学生综合素质的培养,知识面的拓展和分析问题解决问题的能力的提高很有意义,并且有利于提高大学生的动手能力、激发创新能力。尤其是对大学生运用理论知识的能力以及实际操作动手实践能力的培养非常重要。
第二章 控制系统总体设计
智能车系统的制作要求是要求车模在设计的专门跑道上稳定而又快速的运行,本章将依据此要求简要介绍智能车控制系统的硬件结构设计和软件结构设计,后续章节中将对车模的机械设计、硬件设计、软件设计进行一一介绍。
2.1 系统硬件结构
车模的整体工作框图如图2.1所示:
图2.1:控制系统整体框图
由于本届电磁组车模要求直立行走,为此我们需要知道车模直立必须的条件——车体的倾斜角度和角速度,我们采用加速度获得车模的倾斜角度,采用陀螺仪获取车模的角速度,通过编码器检测车速,使用片外计数器进行脉冲计 算获得车模的速度,同时使用D 触发器获取方向。使用上位机实时监测车模的各项参数,便于对车模进行调整,提高了调试效率。
车模直立采用PD 控制,速度采用PID 控制,通过PWM 控制电机驱动电路改变电机转速,转向采用PD 控制,通过安装车模转向速度陀螺仪对方向进行微分控制,可消除车模转向控制中的过冲现象。
第七届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告
2.2 系统软件设计
系统基本的软件结构设计如图2.2所示:
图2.2 系统控制软件结构设计框图
程序上电运行后,便进行单片机的初始化。初始化的工作包括有两部分,一部分是对单片机各个应用到的模块进行初始化。第二部分是应用程序初始化,是对于车模控制程序中应用到的变量值进行初始化。
程序在主循环中不停发送监控数据,在通过串口发送到上位机进行监控。同时检查车模是否跌倒。跌倒判断可以通过车模倾角是否超过一定范围进行确定,或者通过安装在车模前后防撞支架上的微动开关来判断。一定车模跌倒,则停止车模运行。包括车模直立控制、速度控制以及方向控制。然后重新进入
3
第二章 控制系统整体设计
车模直立判断过程。
车模的直立控制、速度控制以及方向控制都是在中断程序中完成。通过全局标志变量确定是否进行这些闭环控制。
中断程序框图如图2.2:
图 2.2 中断服务程序
利用XS128的PIT 的中断模块产生1ms 的定时中断。中断服务程序的任务被均匀分配在0-4的中断片段中。因此每个中断片段中的任务执行的周期为5毫秒,频率为200HZ 。
将任务分配到不同的中断片段中,一方面防止这些任务累计执行时间超过1ms ,扰乱1ms 中断的时序,同时也考虑这些任务之间的时间先后顺序。
2.3 车模整体布局
经过我们不断的完善实践,车模改装的最终布局如图2.3所示:
1
图2.3 车模改装整体布局
2
第二章 控制系统整体设计
第三章 车模机械设计
车模的机械部分作为影响其行驶性能最直接的部分,其重要性不言而喻。一个不良的机械系统会增加控制的难度,会为车模的速度提升带来障碍。良好的机械设计与制作,对于车模稳定运行、安全调试都非常重要。
3.1 车模基本参数
赛车机械结构只使用竞赛提供车模的底盘部分及转向和电机部分。今年电磁组车模采用的是原来竞赛的C 车模,它是双后轮驱动,前轮舵机转向的运动模式,而竞赛规定C 型车模直立行走,因此车模改装是我们的第一步工作,在严格遵守比赛规则对车模要求的前提下,我们对车模进行了简化和改装。
改装后的模型车技术参数如表3.1所示:
表3.1 模型车技术参数统计:
3
3.2 系统电路板安装
由于今年要求C 车模直立行走,所以电路板的大小、重量将会对行驶的速度产生一定的影响。为此我们将电路板设计成和车模大致尺寸,将电源模块、传感器、液晶、按键等集成于一块板子上,减少了接线的繁琐,既美观又方便。同时将两个电机驱动电路集成于一个板子上。
电路主板布局如下图所示:
图3.2 系统电路主板
电机驱动电路板如下:
图3.2 电机驱动电路板
3.3 传感器安装
3.3.1 加速度、陀螺仪安装
我们采用加速度与陀螺仪的二合一模块,陀螺仪的安装将直接赛车的过弯能力。由于车模过弯时具有两种运动:平动和转动。其中转动会带动陀螺仪转动。如果陀螺仪安装不是绝对的水平,那么这个转动就会在陀螺仪的Z 轴方向存在一个分量。根据陀螺仪倾斜的方向不同,这个分量有可能是正,有可能是负。从而会使得车模控制“仿佛感觉到在上坡或者是在下坡”,引起车模的速度变慢或者变快。转向陀螺仪的安装与改陀螺仪垂直。
4
第二章 控制系统整体设计
图 3.3.1 加速度、陀螺仪二合一模块
图3.3.1转向陀螺仪
3.3.2 电感安装
由于电感不安装在同一水平线上,那么车模在过十字交叉的时候,水平方向电线中的磁场就会在电感线圈中产生额外的感应电动势。这些电动势会造成车模控制方向的不稳定性。为了避免车模在通过十字交叉线路口时受到的影响,在固定电感线圈的时候,我们将电感置于水平位置,而且在左右两侧各使用两个电感,分别读取这两个电感的AD 值,求其平均,作为最终采集的电磁信号。
图3.3.2电感线圈安装
5
3.4 测速模块安装
编码器采用能够输出A 、B 、Z 三相的256线编码器,它体积较小,重量较轻,精度高、抗扰能强。左右轮各采用一个编码器测速。
图3.4编码器的安装
6
第二章 控制系统整体设计
第四章 系统硬件设计
本系统硬件电路的设计目标为:可靠、高效、简洁。可靠性是系统设计的第一要求,做好各部分的接地、屏蔽、滤波等工作,使本系统工作的可靠性达到了设计要求。高效是指本系统的性能要足够强劲。简洁是指在满足了可靠、高效的要求后,为了尽量减轻整车重量,应使电路设计尽量简洁,尽量减少元器件使用数量,缩小电路板面积,使电路部分重量轻,易于安装。
4.1核心控制模块
单片机最小系统板使用MC9S12XS128单片机。该芯片采用5V 供电,功能强大,总线频率高达40MHz 。芯片含有丰富的片内设备,包括128K 的Flash 存储器,8K 的RAM ,8K 的EEPROM ,两路串行通信接口(SCI ),一路串行外围接口(SPI ),八路定时器通道,两个(80引脚为一个)八路可调转换精度的A/D口,八路PWM 输出,91(80引脚为59)个离散数字I/O口,一个MSCAN 模块。该单片机适合于在汽车电子中的应用,成为很多车载电子设备的控制芯片。其功能模块如图4.2所示。
图4.1 MC9S12XS128单片机功能模块示意图
MC9S12XS128单片机有112引脚和80引脚两种型号,前者比后者多出8位AD 口和其他的一些引脚资源。基于模块化设计的思想,这里专门设计了单片
1
机子板,以便维护和更新。同时,参考数据手册,对单片机的外围电路进行了详细的设计,高质量的实现了去耦、旁路与隔离等作用,保证了其稳定性能。在对小车各个模块进行逐一分析后,合理地确定了单片机的引脚分配。
4.2电源模块
各电源块的说明:
首先说明,电池电量对小车工作也有很大影响的,我们的电池在刚充满电的时候大概有8.2V 左右,但是7.9V 以上的电位很“虚”,撑不了多长时间,所以可能在那段时间里调好的车子可能没之前你们的已经有的效果。这点要特别注意。
7.2V 供电机驱动的直接从电池电压口引出;
5V 电源选取两种电源稳压芯片,一种要求纹波小,电流在1A 以下,工作稳定,给单片机等芯片供电;另一种要求电流在1A 座右,输出电流纹波没有太高要求,专门为人机接口板的数码管显示驱动和键盘扫描控制芯片供电。
由于整个系统中+5V电路功耗较小,为了降低电源纹波,我们首先使用串
2
第二章 控制系统整体设计 联型稳压电路,另外,后轮驱动电机工作时,电池电压压降较大,为提高系统工作稳定性,必须使用低压降电源稳压芯片。
为了提高电源的利用率,我们进一步选择DC/DC电源稳压电路。DC/DC是开关型稳压电路,它的优点是电路结构简单,对电源的高频干扰有较强的抑制作用、效率高,输入电压的范围宽,输出电压,电流的纹波值较小。
此外,本系统选用LM2940为人机接口板的5110液晶显示模块供电和键盘扫描上拉电源。LM2940也是常用的高性能线性稳压芯片之一,它的工作压差较小,只要输入电压达到6V 以上就可以稳定输出5V 电压,同时它的输出电流为
1.5A ,满足人机接口板的1A 要求。连接如图4.2所示:
;
图4.2 LM2940电路原理图
4.3 陀螺仪、加速度二合一模块
(1)加速度传感器
加速度传感器可以测量由地球引力作用或者物体运动所产生的加速度。竞赛规则规定如果车模使用加速度传感器必须使用飞思卡尔公司产生的加速度传感器。该系列的传感器采用了半导体表面微机械加工和集成电路技术,传感器体积小,重量轻。
3
图 4.3
通过微机械加工技术在硅片上加工形成了一个机械悬臂。它与相邻的电极形成了两个电容。由于加速度使得机械悬臂与两个电极之间的距离发生变化,从而改变了两个电容的参数。通过集成的开关电容放大电路量测电容参数的变化,形成了与加速度成正比的电压输出。MMA7260是一款三轴低g 半导体加速度计,可以同时输出三个方向上的加速度模拟信号。
加速度电路:
图4.3加速度电路图
通过设置可以使得MMA7260各轴信号最大输出灵敏度为800mV/g,这个信号无需要在进行放大,直接可以送到单片机进行AD 转换。实际上,飞思卡尔公司还有更多系列的低g 值的加速度传感器,特别是具有数字接口的传感器可以方便单片 机接口设计。
图4.3三轴加速度传感器
只需要测量其中一个方向上的加速度值,就可以计算出车模倾角,比如使用Z 轴方向上的加速度信号。车模直立时,固定加速度器在Z 轴水平方向,此时输出信号为零偏电压信号。当车模发生倾斜时,重力加速度g 便会在Z 轴方向形成加速度分 4
第二章 控制系统整体设计 量,从而引起该轴输出电压变化。变化的规律为
Δu =kg sinθ≈kg θ
式中,g 为重力加速度;θ为车模倾角;k 为加速度传感器灵敏度系数系数。当倾角θ比较小的时候,输出电压的变化可以近似与倾角成正比。
似乎只需要加速度就可以获得车模的倾角,再对此信号进行微分便可以获得倾角速度。但在实际车模运行过程中,由于车模本身的摆动所产生的加速度会产生很
大的干扰信号,它叠加在上述测量信号上使得输出信号无法准确反映车模的倾角。
图4.3 车模运动引起加速度Z 轴信号变化
车模运动产生的加速度使得输出电压在实际倾角电压附近波动。这些波动噪声可以通过数据平滑滤波将其滤除。但是平滑滤波一方面会使得信号无法实时反映车模倾角变化,从而减缓对于车模车轮控制。另一方面也会将车模角速度变化信息滤掉。上述两方面的滤波效果使得车模无法保持平衡。因此对于车模直立控制所需要的倾角信息需要通过另外一种器件获得,那就是角速度传感器-陀螺仪。
(2)陀螺仪
图4.3陀螺仪
5
陀螺仪可以用来测量物体的旋转角速度。竞赛允许选用村田公司出品的ENC-03系列的加速度传感器。它利用了旋转坐标系中的物体会受到科里奥利力的原理,在器件中利用压电陶瓷做成振动单元。当旋转器件时会改变振动频率从而反映出物体旋转的角速度。
陀螺仪放大电路图:
图4.3陀螺仪放大电路图
在车模上安装陀螺仪,可以测量车模倾斜角速度,将角速度信号进行积分便可以得到车模的倾角。
图4.3角速度积分得到角度
由于陀螺仪输出的是车模的角速度,不会受到车体运动的影响,因此该信号中噪声很小。车模的角度又是通过对角速度积分而得,这可进一步平滑信号,从而使得角度信号更加稳定。因此车模控制所需要的角度和角速度可以使用陀螺仪所得到的信号。
6
第二章 控制系统整体设计
由于从陀螺仪角速度获得角度信息,需要经过积分运算。如果角速度信号存在微小的偏差和漂移,经过积分运算之后,变化形成积累误差。这个误差会随着时间延长逐步增加,最终导致电路饱和,无法形成正确的角度信号。如下图所示:
图4.3角速度积分漂移现象
解决这个问题的办法是通过上面的加速度传感器获得的角度信息对此进行校正。通过对比积分所得到的角度与重力加速度所得到的角度,使用它们之间的偏差改变陀 螺仪的输出,从而积分的角度逐步跟踪到加速度传感器所得到的角度。
图4.3 通过重力加速度来矫正陀螺仪的角度漂移
在上述方案中,利用加速度计所获得的角度信息g θ与陀螺仪积分后的角度θ进行比较,将比较的误差信号经过比例1/g T 放大之后与陀螺仪输出的角速度信号叠加之后再进行积分。对于加速度计给定的角度g θ,经过比例、积分环节之后产生的角度θ必然最终等于g θ。
4.4电机驱动模块
目前大电流直流电机多采用达林顿管或MOS 管搭制H 桥PWM 脉宽调制,因此体积较大;另一方面,由于分立器件的特性不同,使得驱动器的特性具有一定的离散性,此外,由于功率管的开关电阻比较大,因此功耗也很大,需要功
7
率的散热片,这无疑进一步加大了驱动体的体积。且用四块MOS 管搭制的H 桥成本也比较高,效果且没有集成芯片搭制的H 桥好。
集成驱动芯片有飞思卡尔半导体公司推出的全桥驱动芯片MC33886或33887、意法半导体公司推出的去桥驱动芯片VNH3SP30、英飞凌公司推出的高电流PN 半桥驱动芯片BTS7960。
组成H 桥驱动电路有三种方案。通过这些方案的对比分析且考虑到C 车模双电机的特点,尽可能地使用电路简单且性能较好的驱动,我们最终先选择了BTS7960作为双电机的驱动,两片英飞凌公司的BTS7960芯片即可构成全桥。该芯片具有自我保护能力,抗电子干扰能力强,且对环境的适应能力较强。我们使用了四片BTS7960构成了两个H 桥控制电路。
如图所示,采用2个半桥智能功率驱动芯片BTS7960组合成一个全桥驱动器,驱动直流电机转动。BTS7960是电机驱动的大电流半桥集成芯片,他带有一个P 沟道的高边MOSFET 、一个N 沟道的低边MOSFET 和一个驱动IC 。P 沟道高边开关省去了电荷泵的需求,因而减少了电磁干扰。集成的驱动IC 具有逻辑电平输入、电流诊断、斜率调节、死区时间产生和超温、过压、欠压、过流及短路保护功能。BTS7960的通态电阻典型值为16m 欧姆,驱动电流可达43A ,调节SR 引脚外接电阻的大小可以调节MOS 管导通和关断时间,具有防电磁干扰功能。IN 引脚用于确定哪个MOSFET 导通。当IN=1且INH=1时,高边MOSFET 导通,输出高电平;当IN=0且INH=1时,低边MOSFET 导通,输出低电平。通过对下桥臂开关管进行频率为25kHZ 的脉宽调制(PWM )信号控制BTS7960的开关动作,实现对电机的正反向PWM 驱动、反接制动、能耗制动等控制状态。
这块芯片开关频率可以达到25kHZ ,可以很好地解决电机噪声大和发热的问题、同时驱动能力有了明显的提高,相应速度快。但是,电机变速时会使电源电压下降10%左右,控制器等其他电路容易产生掉电危险,从而使整个电路系统瘫痪。
8
第二章 控制系统整体设计
图4-6 BTS7960的内部连接图
图4-7为该芯片的封装图:
图4-7 BTS7960封装图
表4-1为BTS7960各管脚连接:
9
表4-1为BTS7960各管脚连接
图4.1电机驱动原理图 10
第二章 控制系统整体设计
4.5测速模块
由于今年电磁组使用的车模为去年的C 车模,后轮采用两个电机分别控制两个轮子,可以实现车子的主动差速,要想实时的反馈两路电机的速度,就必须使用两个编码器。为了节约单片机内部资源,我们采用外部计数芯片CD4520,通过实验,一片4520 里面有两路十六进制计数器,通过本图这样连接,最大计数脉冲为255. 电路图如下图所示:
图4.5 CD4520计数电路
同时我们使用D 触发器74ls74识别电机正反转,电路图如下所示:
图4.3 74LS74电路
5号管脚输出为高电平时为正转,输出为低电平时为反转。
11
4.6电磁检测传感器模块
电磁检测传感器电路我们采用集成运放LMV358组成的电路,LMV358属于满电压量程(Rail-to-Rail, 轨对轨)运算放大器,R-R 运放一般工作在单电源供电状态下,输出电压范围基本接近于电源电压和地。输入的共模电压范围宽。LMV358的主要性能如下表所示:
表4.6 LMV358主要性能
下图为基于R-R 运放LMV358的电磁放大检波电路
图4.6电磁检测电路
12
第二章 控制系统整体设计
第五章 软件设计
5.1 车模角度和角速度计算
分别读取加速度和陀螺仪的AD 值,可以计算车模的倾角。对于读取的陀螺仪和加速度计的数值需要减去零偏值。这个数值需要通过实验确定。在车模保持直立静止时,读出两个通道的数值,便是相应的零偏值。这个数值会带有一定的误差,往往会使得车模往一个方向加速行驶。这个误差可以通过后面的速度控制加以消除。
对于加速度计所得到的数值,通过一个比例系数将它归一化到-90至90之间。同样,后面的陀螺仪的读出的数据也需要通过一个比例系数进行归一化。这个数值也是通过实验确定的。
5.2 滤波控制算法
我们采用的是互补滤波,既调节陀螺仪的比例因子,使得陀螺仪的角度输出能够正确跟踪重力加速度Z 轴输出信号。滤波是实现直立的重要前提,。如果陀螺仪比例因子小了,则陀螺仪角度输出就会有一个缓慢跟踪过程。相反,如果陀螺仪比例因子大了,陀螺仪角度输出就会有一个过冲。经过几次反复调节,我们最终出来的滤波效果图如下所示,黄色为加速度归一化之后的值,蓝色为陀螺仪归一化之后的值,红色为融合之后的角度值。
图5.2 互补滤波效果图
13
5.3 车模直立控制
车模的直立控制既对车模的角度控制,角度控制参数包括比例和微分两个参数。比例参数相当于倒立摆的回复力。这个参数需要大于重力加速度所产生的效果才能够使得车模保持直立。随着这个参数逐步增大,车模开始能够保持直立。该参数进一步加大,车模开始出现来回的摆动现象。微分参数相当于倒立摆中的阻尼力,它可以有效的抑制车模的摆动。当该参数过大时,会引起车模本身的震动。这是由于车模本身不是一个刚体,车体具有一定的共振频率。微分参数过大时会使得车模在电机的驱动下产生车体的共振。
调节这两个参数可以遵循先比例后微分的过程。首先调整比例参数,使得车模能够保持直立并且开始来回摆动了。说明此事比例参数已经可以克服重力的影像。然后逐步增加微分参数,车模逐步保持直立稳定。增大微分参数直到车模开始共振,这样就可以确定微分参数的最大值了。然后适当减小微分参数,然后逐步增加比例参数,直到车模又开始震荡,这样便可以确定比例参数的最大值。然后适当减小比例参数。在在这些参数附近进行试验,直到寻找到一组车模直立的控制最优参数。
5.4 车模速度控制
在角度参数初步确定之后,便可以进行速度控制参数的整定。速度控制参数包括比例和微分两个控制参数,这里的比例和微分定义是指反馈速度而言。如果相对于车模的反馈位置(速度的积分量),这两个参数也可以分别对应称作积分和比例参数。
比例控制参数决定抑制速度误差的能力,但是只有比例控制,车模速度控制就会出现双积分负反馈控制。第一个积分是误差的积分,第二个积分是车模倾角所产生的加速度积分。因此车模速度就会出现震荡现象。通过微分控制可以消除这个震荡现象。在调整时,由于是进行静态调整,故此先将速度控制闭环的速度设定值置为0。然后开始后面的比例和微分参数的调整。具体的调试过程可以首先逐步比例参数,车模能够在一定平衡点附近来回运动。然后在逐步增加微分参数,车模就会很快停留在平衡点出。使用外力冲击车模,车模能够很快趋于静止。然后再逐步增加比例和微分控制参数,使得车模抵抗外部干扰冲击的能力逐步增强。当比例和微分参数达到一定的数值后,车模开始出现摆动现象。至此可以知道比例和微分的大体范围。在此范围内通过几次调整测试,可以初步确定速度控制参数的最佳组合。
5.5 车模方向控制
方向控制包括两个参数:比例控制参数和微分控制参数。在调整方向参数是,设置速度参数为0,打开桌面20kHz 的电磁电源。比例控制参数可以使得车模方向恢复正确位置。当该参数逐步增加时,车模方向回复速度逐步加快。当比例参数增加到一定数值之后,车模的方向回复由于过快,会出现方向过冲现象。此时通过增加微分控制参数可以抑制这种 14
第二章 控制系统整体设计 方向过冲的现象。通过几次组合测试,可以选择一组合适的比例控制和微分控制参数使得车模方向控制即迅速又不会出现过冲现象。
15
第六章 系统调试
6.1 开发工具
在对程序进行开发和软硬件联调的过程中需要一整套的软件开发与调试工具。程序的开发是在组委会提供的CodeWarrior IDE下进行的,包括源程序的编写、编译和链接,并最终生成可执行文件。CodeWarrior for S12 是面向以HC1和S12为CPU 的单片机嵌入式应用开发软件包。包括集成开发环境IDE 、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C 交叉编译器、汇编器、链接器以及调试器。使用BDM 来下载程序,把编译好的程序下载到单片机里运行。
赛车的硬件开发工具主要为Altium Designer,通过该软件来完成电路原理图的绘制以及PCB 板制作。
Code Warrior开发软件使用界面如图6.1所示。
图6.1 CodeWarrior 使用界面
16
第二章 控制系统整体设计
Code Warrior 是面向以HC12和S12为CPU 的单片机嵌入式应用开发的软件包,包括集成开发环境IDE 、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C 交叉编译器、汇编器、链接器以及调试器等。在CodeWarrior 软件中可以使用汇编语言或C 语言,以及两种语言的混合编程。
用户可在新建工程时将芯片的类库添加到集成环境开发环境中,工程文件一旦生成就是一个最小系统,用户无需再进行繁琐的初始化操作,就能直接在工程中添加所需的程序代码。
在原程序编译连接通过后,就可以进行程序的下载了。下载前先将单片机已存在的部分擦除,擦除界面如图6.2所示,擦除完了以后点击Load ,将bin 文件夹下生成的后缀为.abs 的文件打开,就可以完成下载。下载使用BDM 下载器进行上位机和下位机的互联,BDM 如图6.3所示。
图6.2 程序擦除烧写界面
17
6.2 硬件调试
BDM下载器。
第七章 总结与展望
本设计是在满足竞赛组委会有关要求的前提下,经过不断地对系统设计方案进行比较和优化完成的。赛车以Freescale 公司的16位单片机MC9S12XS128作为系统控制处理器,采用陀螺仪、加速度作为角度传感器,采用电感及组成的运放电路检测赛道的路径信号,整个系统采用闭环控制,并对车模的机械结构进行了适当的调整,使模型车能够稳定快速的运行。
通过对模型车的仿真和测试,系统的整个设计方案基本合理。根据大赛的要求,使用的电源必须是用7.2V 电池供电,为了提高电源的稳定性,我们选用了芯片LM2940-5.0为单片机系统、速度采集模块提供5伏电源;采用全桥模块稳定、有利地驱动直流电动机,可获得电机的最佳性能:高速、快速响应和高起动频率;这为智能车的稳定工作提供了可靠的保证。
要求车模直立行走是今年竞赛最大的一个变动,做车的初始,我们感到摆在我们面前的是一个巨大的难题,但是我们没有畏惧,整个队伍团结一心,坚定信心,突破一道又一道又一道的难关,最终我们走到了决赛的舞台上,感谢姚俊红、邓广福老师对我们的指导、启发,感谢德州学院——机械电子协会全体成员对我们的支持与指导,同时感谢大赛组委会及飞思卡尔半导体公司对我们的技术及芯片的大力支持!
18
第二章 控制系统整体设计 参考文献
[1] 卓晴, 黄开胜, 邵贝贝. 学做智能车—挑战飞思卡尔杯[M].北京:北京航空航天大学出版社, 2007:1-18
[2] Thomas D. Gillespie. 车辆动力学基础. 北京:清华大学出版社.2006年12月第1版
[3] 陈伯时. 电力拖动自动控制系统——运动控制系统[M]. 北京:机械工业出版社,2008.
[4]曾峰,巩海波,曾波. 印制电路板(PCB )设计与制作[M]. 北京:电子工业出版社,2005.
[5] 童诗白,华成英. 模拟电子技术基础[M]. 北京:高等教育出版社,2004.
[6]邵贝贝 单片机嵌入式应用的在线开发方法 北京清华大学出版社 2004
[7]彭康拥 陈来好等主编:自动控制原理 华南理工出版社 广州 2005
[8]直立参考方案2.0,智能车竞赛大赛组委会秘书处
[9]竞赛网站电磁车车模调试视频资料,智能车竞赛大赛组委会秘书处
19
附录
部分程序源代码:
/******************************主函数**********************/
void main(void)
{
int16u_t i;
int16u_t dealy1=0,delay2=0;
DisableInterrupts; //程序一开始需要关闭所有中断,防止单片机初始化过程中被某个中断打断
/* for(dealy1=0;dealy1
{
for(delay2=0;delay2
PORTE_PE2=1;
} */ /**/
for(i=0;i
{
20
第二章 控制系统整体设计 AD_Collect(); //顺序不能颠倒
AD_Enable(); //顺序不能颠倒 }
System_Init(); //调用系统初始化函数 DDRH_DDRH0=0;
/* PORTE_PE2=0;
Delay_ms(500) ;
PORTE_PE2=1;
Delay_ms(2000) ;
PORTE_PE2=0;
Delay_ms(500) ;
PORTE_PE2=1;
Delay_ms(2000) ;
for(i=0;i
{
AD_Collect(); //
AD_Enable(); //
}
*/
EnableInterrupts; //
CV_ACCE_Z_ZERO=CV_ACCE_Z_ZERO_Init;
21
顺序不能颠倒 顺序不能颠倒 允许中断
for(;;) {
LCD_Show_L(0,3,g_fLeftVoltageSigma);
LCD_Show_R(0,4,g_fRightVoltageSigma);
LCD_Show_g_fDirectionControlOut(0,5,g_fDirectionControlOut);
//***************************************/ 加速度值液晶显示
LCD_Show_CV_ACCE_Z_ZERO(0,0,CV_ACCE_Z_ZERO);
/***************************************/
LCD_Show_Speed(0,1,ObjectSpeed_flag);
//***************************************/ 按键1
if(PTT_PTT0==1)
Delay_us(400);
if(PTT_PTT0==1)
{
CV_ACCE_Z_ZERO++;
while(PTT_PTT0==1)
{
Delay_us(180);
}
}
/***************************************/
//***************************************/ 按键2
if(PTT_PTT1==1)
22
第二章 控制系统整体设计 Delay_us(400);
if(PTT_PTT1==1)
{
CV_ACCE_Z_ZERO--;
while(PTT_PTT1==1)
{
Delay_us(180);
}
}
/***************************************/
ObjectSpeed_flag=PTH*2;
//***************************************/ 按键3
if(PTT_PTT2==1)
{
Delay_us(400);
if(PTT_PTT2==1)
{
Speed_Flage=1;
while(PTT_PTT2==1)
{
Delay_us(180);
}
}
}
23
if(Speed_Flage==1)
{
LCD_write_english_string(30,2," GO! ");
}
else
LCD_write_english_string(30,2,"STOP!");
/* if(PTH_PTH0==1)
{
Speed_Flage=1;
}
**************************************/
}
}
/*********************************中断函数************************/ /*==============================RTI中断(定时1ms ,可用于测速和定时)===============================*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTI_int()
{
int16u_t spd_temp1,spd_temp2;
int8u_t time_out,flag=1;
24
第二章 控制系统整体设计
CRGFLG_RTIF=1;
g_nCarCount++;
g_fDirectionControlPeriod++;
////////////////////////////////////////////////////
//时间片轮转
if(g_nCarCount==1) //第1个1ms
{
////////////////////////////////////////////////
long sum0=0,sum1=0,sum2=0,sum3=0,sum5=0,sum6=0,sum7=0;
for(j=0;j
{
AD_Collect();
sum0=sum0+AD_Value[0];
sum1=sum1+AD_Value[1];
sum2=sum2+AD_Value[2];
sum3=sum3+AD_Value[3];
sum5=sum5+AD_Value[5];
sum6=sum6+AD_Value[6];
sum7=sum7+AD_Value[7];
AD_Enable();
}
sum0>>=2;
sum1>>=2;
sum2>>=2;
sum3>>=2;
sum5>>=2;
25
sum6>>=2;
sum7>>=2;
AD_Value[0]=(int)sum0;
AD_Value[1]=(int)sum1;
AD_Value[2]=(int)sum2;
AD_Value[3]=(int)sum3;
AD_Value[5]=(int)sum5;
AD_Value[6]=(int)sum6;
AD_Value[7]=(int)sum7;
CarVoltageGet(); //AD数值转换及卡尔曼滤波
////////////////////////////////////////////////
}
else if(g_nCarCount==2) //第2个1ms
{
if(Speed_Flage==1)
{
if(speed
{
speed+=1;
ObjectSpeed=speed;
}
else ObjectSpeed=ObjectSpeed_flag;
}
else ObjectSpeed=0;
26
第二章 控制系统整体设计
CarAngleControl(); //车模角度控制
}
else if(g_nCarCount==3) //第3个1ms
{
g_nCarMtionCount++;
if(g_nCarMtionCount>=CAR_MOTION_PERIOD)
{
g_nCarMtionCount = 0;
////////////////////////////////////////////////
NowSpeed_L = NowSpeed_L_temp;
NowSpeed_R = NowSpeed_R_temp;
NowSpeed_L_temp = 0;
NowSpeed_R_temp = 0;
NowSpeed_L_history1 = NowSpeed_L ;
NowSpeed_R_history1 = NowSpeed_R ;
////////////////////////////////////////////////
Speed_PI(); //速度PI 控制,周期100ms
}
Speed_PI_OUT(); //PWM输出控制,周期5ms
}
else if(g_nCarCount==4) //第4个1ms
{
g_nDirectionControlCount++;
DirectionVoltageSigma();
27
if( g_nDirectionControlCount>=DIRECTION_CONTROL_COUNT)
{
DirectionControl();
DirectionControlOutput();
g_nDirectionControlCount=0;
g_fDirectionControlPeriod=0;
}
// Spd_Decision();
}
else if(g_nCarCount>=CAR_PERIOD) //第5个1ms
{
g_nCarCount=0;
AD_Enable(); //AD使能
}
/////////////////////////////////////////////////////
//速度采样
spd_temp2 =PORTA; //右边计数
spd_temp1 =PORTB; //左边计数
PORTE_PE5=1; //将 PTT_PTT6
置 1,给计数器清零
if(Speed_Flage==1)
{
NowSpeed_L_temp += spd_temp1;
NowSpeed_R_temp += spd_temp2;
28
第二章 控制系统整体设计
}
if(Speed_Flage==0)
{
if(PORTE_PE7==1)
{
NowSpeed_L_temp += spd_temp1;
}
else //左侧轮反转
{
NowSpeed_L_temp -= spd_temp1;
}
if(PORTE_PE6==0)
{
NowSpeed_R_temp += spd_temp2;
}
else //右侧轮反转
{
NowSpeed_R_temp -= spd_temp2;
}
}
// PORTE_PE5=1;
spd_temp2 =PORTA; //再次读取PA 、PB
口,确保已经被清零
spd_temp1 =PORTB;
while(spd_temp1 && spd_temp2 && time_out
保清零
{
spd_temp2 = PORTA;
spd_temp1 = PORTB;
29
time_out++;
}
time_out=0;
PORTE_PE5=0; //将 PTT_PTT6
清 0, 开始计数
}
#pragma CODE_SEG DEFAULT
//==========================================
//函数名 CarVoltageGet()
//作用:角度、角速度测量及角度补偿
//==========================================
void CarVoltageGet(void)
{
///////////////////////////////////////////// //
互补滤波
lnDeltaValue
=
= lnDeltaValue - int32s_t lnDeltaValue; (int16s_t)CV_ACCE_VAL; (int16s_t)CV_ACCE_Z_ZERO; //读取加速度传感器AD 值 lnDeltaValue //减去零偏置值
//角度归一化
lnDeltaValue = g_nCarAcceVal = (int16s_t)(lnDeltaValue * CV_ACCE_RATIO_INT / 100); (int16s_t)CV_GYRO_VAL; 30
第二章 控制系统整体设计
//读取陀螺仪AD 值
lnDeltaValue = lnDeltaValue - //减去零偏置值 (int16s_t)CV_GYRO_ZERO; g_nCarGyroVal = (int16s_t)(lnDeltaValue * CAR_GYRO_RATIO_INT /
=
= (int16s_t)(g_lnCarAngleSigma g_nCarAcceVal- g_nCarAngle 100); //角速度归一化 g_nCarAngle //车体角度计算 lnDeltaValue
//角度校正
lnDeltaValue = (int32s_t)(lnDeltaValue * CAR_ACCE_RATIO_INT/100 );
//角度反馈
}
//==========================================
//函数名 CarAngleControl()
//作用:车体角度控制,内环
//==========================================
void CarAngleControl(void)
{
int16s_t nLeft, nRight;
int32s_t nSpeed; int32s_t nP, nD;
31
>>5); ; g_lnCarAngleSigma += (g_nCarGyroVal + lnDeltaValue); //角速度积分 // SEND();
nP = g_nCarAngle; //g_nCarAngle:-1000~1000
nP = (int16s_t)(nP * CAR_AA_P_INT); //角度P 控制
nD = g_nCarGyroVal;
nD = (int16s_t)(nD * CAR_AA_D_INT); //
nSpeed = (nP + nD) / 20;
if(nSpeed > MOTOR_SPEED_SET_MAX)
{
nSpeed = MOTOR_SPEED_SET_MAX;
}
else if(nSpeed
{
nSpeed = MOTOR_SPEED_SET_MIN;
}
if (g_fDirectionControlOut>0)
{
PTT_PTT7=1;
PTT_PTT6=0;
}
else {
PTT_PTT7=0;
PTT_PTT6=1;
}
nLeft = (int16s_t)nSpeed + PI_Out +
//*30 角度控制; /; ///
32 角度D 控制 g_fDirectionControlOut ;
第二章 控制系统整体设计
nRight = (int16s_t)nSpeed + PI_Out -g_fDirectionControlOut;//*30 角度控制 ; ; //
g_nLeftMotorOut = nLeft;
g_nRightMotorOut = nRight;
Motor_Control();
}
//====================================
//函数名 Speed_PI
//作用:速度全量式PI 控制,100ms 调用一次
//====================================
void Speed_PI(void)
{
int32s_t nP, nI,nD; int32s_t nSpeed; int32s_t nValue1, nValue2; nSpeed = (NowSpeed_R + NowSpeed_L) / 2; nValue1 = ObjectSpeed - nSpeed; nValue2 = ObjectSpeed - nSpeed;
if(nValue1 > 160) nValue1 = 160;
if(nValue1
if(nValue2 > 130) nValue2 = 130;
if(nValue2
nP = nValue1 * MOTOR_SPEED_P_INT; nI = nValue2 * MOTOR_SPEED_I_INT;
33
nD = -(nSpeed-PI_SpeedErr) * MOTOR_SPEED_D_INT;
PI_SpeedOld = PI_SpeedNew;
PI_SpeedKeep += nI;
PI_SpeedNew = (int16s_t)((nP + (PI_SpeedKeep / 8)+nD) / 100L);
if(PI_SpeedKeep > 8000) PI_SpeedKeep = 8000;
if(PI_SpeedKeep
PI_SpeedErr=nSpeed;
}
//====================================
//函数名 Speed_PI_OUT
//作用:计算速度PI 控制的输出,5ms 调用一次
//====================================
void Speed_PI_OUT(void)
{
int32s_t nValue;
nValue = PI_SpeedNew - PI_SpeedOld;
nValue = nValue * (g_nCarMtionCount+1) / (CAR_MOTION_PERIOD) PI_SpeedOld;
PI_Out = (int16s_t)nValue;
}
34 +