第八届
菏泽学院电磁组技术报告
第八
菏泽
学院
电磁
技术
报告
II
第八届“飞思卡尔”杯全国大学生
智能汽车竞赛
技 术 报 告
学 校:菏泽学院
队伍名称:疯狂的蜗牛
参赛队员: 秦鲁
肖君武
姬生强
带队教师:任国军
- 58 -
第八届全国大学生智能汽车竞赛技术报告
关于技术报告和研究论文使用授权的说明
本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日 期:
目录
第一章 引言 - 2 -
1.1 大赛介绍 - 2 -
1.2系统设计框架介绍 - 3 -
第二章 智能车机械结构与校调 - 4 -
2.1 智能车参数要求 - 4 -
2.2 智能车整体参数调校 - 4 -
2.3 舵机安装 - 4 -
2.4 编码器安装 - 5 -
2.5 起跑线检测传感器安装 - 6 -
2.6 智能车前轮定位 - 6 -
2.6.1 主销后倾角 - 6 -
2.6.2 主销内倾角 - 7 -
2.6.3 前轮外倾角 - 8 -
2.6.4 前轮前束 - 8 -
2.7底盘高度 - 9 -
2.8传感器支架 - 9 -
第三章 硬件电路设计说明 - 11 -
3.1 电源模块 - 11 -
3.2 单片机最小系统模块 - 12 -
3.3 传感器模块 - 13 -
3.4 舵机模块 - 14 -
3.5电机模块 - 15 -
3.6跑道电源模块 - 17 -
3.7电池充放电模块 - 17 -
3.8系统主板设计 - 19 -
第四章 智能车软件系统设计 - 20 -
4.1程序结构流程图 - 20 -
4.2提线算法 - 20 -
4.3控制算法 - 23 -
4.3.1 方向控制算法 - 23 -
4.3.2 速度控制算法 - 24 -
第五章 系统开发及调试工具 - 25 -
5.1开发工具 - 25 -
5.2人机交换模块 - 25 -
第六章 车辆主要参数 - 27 -
第七章 总结 - 28 -
致谢 - 29 -
参考文献 - 30 -
附录:部分程序源代码 - 31 -
第一章 引言
1.1 大赛介绍
为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革,受教育部高等教育司委托,由教育部高等学校自动化专业教学指导分委员会主办全国大学生智能汽车竞赛。该竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。
全国大学生“飞思卡尔”杯智能汽车竞赛由竞赛秘书处设计、规范标准硬软件技术平台,竞赛过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,力求向健康、普及、持续的方向发展。
全国大学生智能汽车竞赛原则上由全国有自动化专业的高等学校(包括港、澳地区的高校)参赛。竞赛首先在各个分赛区进行报名、预赛,各分赛区的优胜队将参加全国总决赛。每届比赛根据参赛队伍和队员情况,分别设立光电组、摄像头组、电磁组、创意组等多个赛题组别。每个学校可以根据竞赛规则选报不同组别的参赛队伍。全国大学生智能汽车竞赛组织运行模式贯彻“政府倡导、专家主办、学生主体、社会参与”的16字方针,充分调动各方面参与的积极性。
1.2系统设计框架介绍
系统是以检测20KHZ100ma的交流电产生的磁场信号为基础,通过单片机处理信号实现对车体控制,实现车体能够准确沿着预设路径寻迹。系统电路部分需要包括单片机控制单元、电机驱动电路、电磁传感器电路等部分,除此之外系统还需要一些外部设备,例如编码器测速、伺服器控制转向、直流电机驱动车体。综上所述,本智能车系统包含了以下几个模块:
1.电源模块
2.单片机最小系统模块
3.传感器模块
4.电机模块
5.舵机模块
6.测速模块
7.起跑线检测模块
8.人机交互模块
系统的整体模块如图1.2所示:
图1.2 系统框架图
第二章 智能车机械结构与校调
2.1 智能车参数要求
1.车模尺寸要求:车模尺寸宽度不超过250mm,长度没有限制,比赛过程中长度不得发生改变。
2.传感器数量要求:传感器数量不超过16个:磁场传感器在同一位置可以有不同方向传感器,计为一个传感器。
3.伺服电机型号:S3010模拟伺服机,伺服电机数量不超过3个。
4.电机型号:RS380
5.全部电容容量和不得超过 2000 微法;电容最高充电电压不得超过25 伏。
2.2 智能车整体参数调校
智能车的整体参数,包括车体重心、舵机电机放置位置、高度,传感器排布方式等,都对整个智能车系统的稳定运行起着至关重要的作用。因此,对智能车机械系统的调节,有助于小车更快更稳定的运行。
小车的布局以精简、可靠、稳定为前提,通过对小车的布局,尽量保证小车左右平衡,以及寻找一个合适的重心,保证小车既能够可靠地抓牢地面,又能够对前轮舵机,后轮电机有较快的响应。电磁组车模如图2.2所示
图2.2 车模示意图
2.3 舵机安装
舵机安装直接关系到是否能快速灵敏地转向的问题。如果舵机调整不到位,将很大程度上限制转向角度和转向响应速度。
在各个强队劲旅历年的技术报告中都对舵机安装做了详细的说明在此不再赘述,舵机安装如图2.3所示。
图2.3 舵机安装示意图
2.4 编码器安装
选用100线的COPAL光电编码器进行速度的测量。由于此编码器自带支架安装方便。编码器安装示意图如图2.4所示:
图2.4 编码器安装示意图
2.5 起跑线检测传感器安装
本小车采用的起跑线检测传感器为干簧管。磁铁附近存在的强磁场引发干簧管闭合,我们将单片机的一个I/O口设置为上拉输入来检测干簧管是否闭合进而判断起跑线的所在。如图2.5所示。
图2.5 起跑线检测模块安装示意图
2.6 智能车前轮定位
为保证智能小车直线行驶稳定,转向轻便灵活并尽可能的减少轮胎磨损, 需要对小车的前轮参数进行调整。前轮定位内容主要有:主销后倾角,主销内倾角,前轮外倾角,前轮前束。
2.6.1 主销后倾角
主销:转向轮围绕主销进行旋转,前轴的轴荷通过主销传给转向车轮,具备这两点的就叫做主销。
主销后倾角:主销的轴线相对于车轮的中心线向后倾斜的角度。
前轮重心在主销的轴线上由于主销向后倾斜使前轮的重心不在车轮与地面的接触点上,于是产生了离心力,主销后倾而形成的离心力,可以保证汽车直线行驶的稳定性还可以帮助车轮自动回正。主销后倾角延长线离地面实际接触越远,车速越高,离心力就越大。在高速行驶中保持汽车直线行驶的稳定性,适当的加大主销后倾角可以帮助转向轮自动回正,可有效扼制转向器的摆振,可使转向便轻,单独适量调一侧的主销后倾角可修理行驶跑偏。主销后倾角靠离心力保证汽车直线行驶和车轮自动回正。高速行驶时跑偏可通过主销后倾角调节。但主销后倾角过大会造成高速时转向发飘。调整主销后倾角为1°~3°,可通过增减黄色垫片数量来改变。如图2.6.1所示:
图2.6.1主销后倾角
2.6.2 主销内倾角
主销内倾角:在小车前后方向上,主销向内倾斜一个角度,主销轴线与
垂线间的夹角称为主销内倾角。
由于主销轴线向内倾斜,所以使前轴荷更接近前轮中心线(前轴重心越接近前轮中心线转向越轻)麦弗逊式悬架分为零主销偏移和负主销偏移两种。当转向轮在外力作用下发生偏转时,由于主销内倾的原因,车轮连同整个汽车的前部将被抬起一定高度;当外力消失后,车轮就会在重力作用下恢复到原来的中间位置。故主销内倾角可保证汽车直线行驶的稳定性,还可帮助车轮自动回正,主销内倾轴线延长线在没超过前轮中心线的前提下,离前轮中心线越近,转向角越大,转向轮抬起的越高,车轮的回正力矩就越大。从而使转向操纵轻便,同时也减小了由于路面不平而从转向轮输出的力反馈。主销内倾角靠前轴轴荷保证汽车直线行驶和车轮自动回正。但主销内倾角不宜过大,否则在转向时车轮主销偏转的过程中,轮胎与路面将产生较大的滑动,从而增加轮胎与路面间的摩擦阻力,不仅会使转向变得沉重,还将加速轮胎的磨损。通常调节主销内倾角不大于8度。如图2.6.2所示:
图2.6.2 主销内倾角
2.6.3 前轮外倾角
前轮外倾角:在汽车的横向平面内,前轮中心平面向外倾斜一个角度,称为前轮外倾角。
前轮外倾角一方面可以使车轮接近垂直路面滚动而滑动减小转向阻力,使小车转向轻便;另一方面减少了轴承及其锁紧螺母的载荷,增加了使用寿命,提高了安全性。一般前轮外倾角为1°左右,但对于有高速、急转向要求的车辆,前轮外倾角可减小甚至为负值。如图2.6.3所示:
图2.6.3 前轮外倾角
2.6.4 前轮前束
前轮前束:俯视车轮,汽车的两个前轮的旋转平面并不完全平行,而是稍微带一些角度,这种现象称为前轮前束。车轮前束的作用是减轻或消除因前轮外倾角所造成的不良后果,二者相互协调,使前轮在汽车行驶中滚动而无滑动。
图2.6.4 前轮前束
我们将主销后倾设为最大来获得足够的稳定性,适当的主销内倾,前轮外倾保持0度和微前束。
2.7底盘高度
通过前几届的经验教训来看,底盘的高度对于赛车在赛道上的行驶的稳定性和转弯性能上有着很重要的影响,在不破坏跑道的基础上底盘应该越低越好。但是在今年的比赛中加入了0.5cm厚的障碍底盘高度受到了制约,在分赛区比赛中个别队伍的底盘过低导致撞上了障碍影响了比赛成绩。
2.8传感器支架
对于电磁车来说获得较大的前瞻要么是通过长长的支架来获得足够的物理前瞻,要么是通过电感的布局方式来获得“软”前瞻,由于赛道电磁信号复杂多变依靠“软”前瞻是远远不够的,安装长长的传感器支架不可避免。今年的电磁使用的是A车比起第六届的B车车身小重量轻,支架太重会对整车的重心带来很大的影响。为了解决这个问题我们采用单主桅搭配三脚架加固的方法,做好的支架既轻又牢固。
图2.8 传感器支架
第三章 硬件电路设计说明
本智能车硬件系统以稳定为设计的原则,在有限的条件下做到最好。单片机采用MK60DN512ZVLQ10,TPS7350串联TPS79333产生的3.3伏电压单独为单片机供电,使用一片LM2940-5为光电编码器供电,在LM2940上串接RT9161输出3.3V为按键液晶模块、无线模块和SD卡模块供电,电机驱动使用独立的MOSFET搭建H桥,舵机由电池直接供电。使用液晶键盘和无线传输模块使得调试轻松简单。
3.1 电源模块
对于单片机而言功耗比较小但是电源质量要求高,因此我们采用TPS7350串联TPS79333来为单片机供电。对于其他元件我们采用带负载能力强的LM2940和RT9161来供电。MC34063输出的12V为半桥驱动芯片供电。
图3.1.1 TPS7350原理图
图3.1.2 TPS79333原理图
图3.1.3 LM2940和RT9161原理图
图3.1.4 mc34063原理图
3.2 单片机最小系统模块
以MK60DN512ZVLQ10为核心的单片机最小系统是本智能车的核心。
图3.2.1最小系统板电路
图3.2.2 最小系统板PCB
3.3 传感器模块
电磁信号的检测是通过电感电容组成的LC谐振电路并将其输出信号经过检波放大后送给单片机AD转换并处理来达到路径识别的目的。由于我们常用的电感电容的精度并不高因此电感电容之间的搭配显得尤为重要。检波运放模块我们采用第七届组委会给出的方案,该方案电路简洁性能稳定可靠。运放芯片我们采用性能更加优越的OPA2350,OPA2350是TI BB公司生产的高速、单电源、轨至轨运放。OPA2350的增益带宽积达到38MHz,在20KHz频率下开环增益为1900倍,并且是至轨输入/输出,性能非常的出色。在实际的测试中最大可输出2.5V左右的电压,放大倍数可达500倍足以满足比赛需要。
图3.3.1检测放大电路
图3.3.2检测放大PCB
3.4 舵机模块
舵机初期使用LM2941进行6V供电取得不错的效果,后期为了提高舵机的响应速度和适应舵机大电流的特性改为电池直接供电。
图3.4.1 LM2941电路图
3.5电机模块
在第七届中我们采用BTS7960作为电机驱动,BTS7960电路简单内置保护电路可靠性高非常适合作为A车和C车的电机驱动芯片。但是由于BTS7960的停产和其替代品高昂的价格,另一方面为了锻炼我们自身的能力便采用了使用独立的MOSFET搭建H桥的方案。
使用两片IR2104型半桥驱动芯片组成完整的直流电机H桥式驱动电路作为MOSFET驱动芯片。选用IRLR7843作为驱动电机的MOSFET。
图3.5.1 电机驱动电路图
图3.5.2 电机驱动实物图
3.6跑道电源模块
在电磁组中需要一个20KHZ的信号发生器,我们根据第五届组委会给出的方案略加修改作出了我们自己的跑道电源。
图3.6.1 跑道电源原理图
图3.6.2 跑道电源PCB图
3.7电池充放电模块
在比赛中使用的镍氢电池具有一定的记忆效应,为了合理使用电池延长其寿命,我们通过查阅各方面资料获得一个很巧妙的充放一体电路,在此我们向电路的原作者表示感谢。通过简单修改制作了一个电池充放一体小模块。
图3.7.1 电池充放一体模块电路图
图3.7.2 电池充放一体模块、跑道电源和计时模块
3.8系统主板设计
为了方便更换和减小整体体积我们的硬件电路是分模块设计的,需要将各个模块插接在主板上才能工作。我们的系统主板上主要有电源模块、单片机最小系统接口、放大检波接口、液晶接口、TF卡接口、键盘模块、无线模块接口、舵机接口。
图3.8.1 主板电路PCB图
图3.8.2 主板电路实物图
第四章 智能车软件系统设计
4.1程序结构流程图
程序主要采用顺序结构,参考第七届直立车的1ms中断的处理方法在一个控制周期里只处理某几个任务,减小任务之间的相互影响提高软件的稳定性和执行效率。
图 4.1 程序结构流程图
4.2提线算法
提线算法是智能车至关重要的一个步骤,车之所以能沿着赛道快速奔跑首先要提取出车子与赛道的偏移量得到一个误差,然后将这个误差送给控制器处理,最后控制器输出信号控制舵机和电机来纠正车子的姿态和控制车子的速度。如果连控制器的输入误差都给不对怎么能让控制器给出正确的输出呢!因此提线环节要做好否则控制器再牛也白搭。
电磁组巡线依靠跑道中通有频率为20KHZ电流为100MA的交变电流产生的磁场,检测磁场的传感器目前基本都是10mH的工字电感和6.8nf电容构成的谐振电路。电感的不同布局对赛道信息的采集有着很大的影响,电感的排布方式主要有以下几种。
(1)横向水平放置。横向水平放置的电感只能检测到垂直于导线方向分量的磁能密度,因此具有很好的左右对称性能检测到车子相对赛道的位置但不具有前瞻性。
(2)纵向水平放置。纵向水平电感可以检测到前方的弯道(对于前方弯道纵向电感的输出就相当于直道上横向电感的输出),随着入弯程度的变化左右纵向电感的输出差值会有明显的变化,因此纵向电感有着良好的前瞻性能。但是纵向电感在直道上输出不稳定,处理纵向电感的数据比较麻烦。
(3)八字形排布。八字形的电感综合了横向和纵向的特点,在比赛中被广泛的应用。
(4)多电感水平排成一排或多排,模仿之前的光电二值化循迹方法或者通过多电感精确计算导线位置。这种方法在第五届比较流行,但是缺点之一是前瞻支架不易过长,最佳工作状态时导线不能脱离传感器的覆盖范围。
目前用的最多的就是前三种排布方式以及他们的组合。电磁不同于摄像头的主要方面是数据量小,处理也简单对于MCU性能的依赖性小。但是它的优点也是它的缺点,数据量小可发挥的空间不足如何利用有限的数据来准确获取赛道信息就成了制胜的关键。数据处理最简单的莫过于作差法,其图像如图4.2.1所示。
图 4.2.1感应电动势差值Ed与距离X的函数图像
作差法的不足从图4.2可以明显看出当距离X超过一定值时Ed的大小不再增加反而减小,这种情况就造成了我们所说的丟线。对于大前瞻来说作差法极易导致丟线的情况发生,面对丟线我们就要做丟线处理而丟线处理往往又导致转向不平滑赛道适应能力和稳定性又差,因此采用作差法或差比和法都是不可取的。
为了解决赛道信息提取问题,我们将车放置在标有刻度的赛道上左右移动小车每隔一段距离就记录一下采集回来的电压值,然后将数据通过matlab拟合得到一个公式。这样就使得电压值与偏移赛道中心的距离一一对应,计算出的偏移距离和真实距离呈现线性关系。此算法的不足之处在于电感距离导线的垂直距离不能有太大变化否则会引起误判,对于放大器的放大倍数也有较高的依赖性。
图 4.2.2 拟合曲线
在实际应用中我们采用两个水平电感作为循迹主电感两个八字电感作为辅助取得了不错的效果。后来发现仅使用两个水平电感稳定性和抗干扰能力更好,虽然前瞻性能受到影响但是利大于弊。后期如何正确有效的使用斜置电感获取赛道信息是小车提速的一个重要的关键所在。
当然,小车的自我保护也是必不可少的,自我保护可以避免赛车冲出跑道后造成损坏和损坏其他设备带来的不必要的麻烦。我们在前轮附近安装了两个水平电感,当两个电感检测到的信号强度都低于某个阈值时就认为冲出跑道了然后停车。
4.3控制算法
在智能车中所用到的算法主要有PID算法、棒—棒算法以及模糊控制算法等。
4.3.1 方向控制算法
在方向控制中我们采用不完全微分PID,即在PID控制器之后或者在微分环节上加入一个一阶惯性环节。原因是PID控制中,微分作用的引入可以改善系统的动态特性但也易引进高频干扰,加入一阶惯性环节后可使系统性能得到改善。
图 4.3.1 不完全微分算法结构图
对于PID的参数的整定遵循“误差小控制弱,误差大控制强”的原则。这样做的目的是使小车在直道上保持稳定,在弯道上又可以灵敏过弯,一般的做法是将Kp值分段,我们处理方法模仿北科的Kp值与偏差呈现二次函数增大的方法。当然还可以使用模糊自整定。
4.3.2 速度控制算法
速度控制我们模仿北科使用增量式PID控制,将误差的大小与速度的设定值构成二次函数关系。在比赛前可以手动修改速度最大值和最小值来适应不同的赛道。
算法的选择要与硬件相结合,今年我们使用的独立的MOSFET搭建H桥作为电机驱动,驱动能力强对于A车电机来说已经绰绰有余了。如果采用驱动能力稍差的元件可以采用棒棒控制和PID相结合的方法来获得理想的加减速性能。
第五章 系统开发及调试工具
5.1开发工具
本智能车在开发和调试中所使用开发环境为IAR Embedded Workbench IDE,使用jlink和bootloader为单片机烧写程序。IAR Systems是全球领先的嵌入式系统开发工具和服务的供应商。公司成立于1983年,提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括:带有C/C++编译器和调试器的集成开发环境(IDE)、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。
图 5.1 IAR Embedded Workbench IDE
5.2人机交换模块
为了方便调试,我们特意给我们的小车装了一块nokia5110液晶和4个按键组成的键盘。在液晶上可以显示一些重要的数据比如AD转换的电压值、小车转速等等,在小车的静态环境下对于调试十分有帮助;按键可以输入一些参数,配合液晶我们就可以现场调节任何一个参数然后将修改后的参数值写入TF卡或者片内flash储存,而不必因为修改一个参数需要下载一遍程序。这个模块相较于拨码开关灵活性强,可修改的参数多范围也更大,相较于矩阵键盘体积小硬件电路的设计也更简单。
第六章 车辆主要参数
车模主要参数名称
参数
车模重量
1.3kg
车模长度
75cm
车模宽度
25cm
车模高度
20cm
传感器种类及数量
电感*6、干簧管*2、编码器*1
电路电容总量
1392uf
赛道信息检测频率
1000次/秒
赛道信息检测精度
5mm
电路总功耗
10w
第七章 总结
从3月份正式准备智能车比赛以来我们遇到了重重困难,对于我们的能力和心理都有很大的考验。我们团队顶住了压力一步一个脚印地前进,经过我们不断的努力与坚持终于使我们的小车驶向了全国总局赛的赛场。这次比赛能够取得今天的成绩,很大程度上是因为我们掌握住了正确的方向和把握好了前进的节奏有条不紊的处理各个问题。
在寒假之前我们收集各个模块的电路,经过对比与测试我们确立了我们的硬件电路原理图并制作了测试电路板。在寒假里我们对各个模块进行测试,确定其稳定之后便开始绘制PCB。最终这套电路板伴随我们进入国赛,期间没有出现过任何问题。三月份我们正式准备比赛,对于算法方面一无所有的我们开始了艰苦的征程。我们不断尝试与放弃各种算法,努力调动所学过的理论知识,从双杆到单杆从4个电感到两个电感,最终确立了我们现在的算法。
通过飞思卡尔智能汽车比赛,我们认识到了硬件电路的重要性,算法是小车的灵魂,机械决定着小车的高度。在此次比赛中我们有做的比较好的地方是我们的人机接口,这个小模块不光可以调节小车速度还可以调节其他的任意一个参数,正是这一点在比赛中把我们的小车从死亡的边缘拽了回来。当然我们还有很多做的不到位的地方,首先我们小车的四轮定位做的不好小车在行驶中尤其在高速行驶中不够稳定还伴随左右不对称的情况,其次我们的控制算法做的不够细致不能充分发挥出小车的潜力,最后我们的提线还有很大的提升空间目前只用了两个电感如果能够找到一个更好的算法我相信我们的小车会有一个飞跃的。
智能车不光提升了我们的技术和动手能力更教会了我们一个真理,蜗牛虽慢但只要不放弃依然可以获得成功,更何况我们是一只疯狂的蜗牛!
致谢
首先我们要感谢飞思卡尔智能汽车比赛的组委会为我们提供了一个锻炼自身能力展示自身风采的平台,是我们的大学生活更加的丰富多彩留下了更多的值得回忆的经历。然后我们要感谢我们的学校的领导,感谢我们的学校允许我们参加此次比赛并给予必要的支持,正是我们的学校教会了我们做预算节约设计成本为以后的工作打下了基础。最后要感谢我们的指导老师的精心指导和我们团队的精诚合作。
参考文献
[1] 卓晴,黄开胜,邵贝贝.学做智能车:挑战“飞思卡尔”杯[M].北京:北京航空航天大出版社,2007.3.
[2] 谭浩强C 语言程序设计[M],北京:清华大学出版社. 2005 年7 月第三版
[3] 郭天祥.51单片机C语言教程—入门、提高、开发、拓展全攻略.电子工业出版社2009
[4] 孙同景,陈贵友著.Freescale 9S12 十六位单片机原理及嵌入式开发技术.机械工业出版社2008
[5] 童诗白,华成英.模拟电子技术基础[M].北京. 高等教育出版社.2000
[6] 谢凯 赵健编著.MSP430系列单片机系统工程设计与实践.机械工业出版社.2010
[7] 邵贝贝.单片机嵌入式应用的在线开发方法 [M].北京.清华大学出版社.2004.
[8] 刘金琨.先进PID控制MATLAB仿真(第3版) [M].北京.电子工业出版社.2011
附录:部分程序源代码
#include "common.h"
#include "include.h"
#include "display.h"
#include "adc.h"
#define thetrue 2
#define delay_time 50
#define BUFF_SIZE 24
extern s16 speed_set_max;//速度设定最大值
extern s16 speed_set_min;//速度设定最小值
extern s16 dir_KD;//
extern s16 dir_KP_min,dir_KP_max;
extern s16 limit;
extern s16 speed_P,speed_i;
extern s32 out1,out2,out3,out4,out5,out6;
//extern s16 zuida;
s16 u1,u2,u3,u4;
unsigned char keyout;
unsigned char ge,shi,bai,qian,wan;
uint32 size, sizetmp;
int res;
s16 buff[BUFF_SIZE];
FIL fdst; //文件
FATFS fs; //文件系统
UINT br,bw; // File Write count
void welcom(void)
{
display_hanzi(0,0,0);
display_hanzi(1,1,0);
display_hanzi(2,2,0);
display_hanzi(3,3,0);
display_hanzi(4,4,0);
}
///////////////////////////////////////////////////////////
void voltagewarn(void)
{
u16 ADresult;
ADresult = ad_ave(ADC1, SE15, ADC_16bit, 10); //读取 ADC1_SE15 ,16位精度
if(ADresult<46338)
{
LCD_clear(); // 清屏
display_hanzi(14,0,0);
display_hanzi(15,1,0);
display_hanzi(16,2,0);
display_hanzi(17,3,0);
display_hanzi(18,4,0);
display_hanzi(19,5,0);
while(1);
}
}
///////////////////////////////////////////////////////////
void voltageprint(void)
{
u16 ADresult; //保存ADC转换结果
unsigned char g,s;
ADresult = ad_ave(ADC1, SE15, ADC_16bit, 255); //读取 ADC1_SE15 ,16位精度
ADresult=(u16)(ADresult*0.00152)-3;
s=ADresult/10;
g=ADresult%10;
display_shuzi(s,8,5);
display_shuzi(11,9,5);
display_shuzi(g,10,5);
display_zimu(21,11,5);
}
void getdata(void)
{
f_mount(0,&fs); // 注册文件系统工作区for logical drive 0
PTD15_OUT = 0;
f_open(&fdst, "0:/data.txt", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
PTD13_OUT = 0;
size = f_size(&fdst); //获取文件的大小
if(size > BUFF_SIZE)size = BUFF_SIZE; //防止溢出
f_lseek(&fdst, 0); //把指针指向文件顶部
f_read (&fdst, buff, size, (UINT *)&sizetmp); //读取
speed_set_max=buff[0] ;
speed_set_min=buff[1] ;
dir_KD=buff[2] ;
limit =buff[3] ;
dir_KP_max=buff[4] ;
dir_KP_min=buff[5] ;
speed_P=buff[6];
speed_i=buff[7];
u1=buff[8];
u2=buff[9];
u3=buff[10];
u4=buff[11];
f_close(&fdst); //关闭文件
}
void senddata(void)
{
buff[0]=speed_set_max;
buff[1]=speed_set_min;
buff[2]=dir_KD;
buff[3]=limit;
buff[4]=dir_KP_max;
buff[5]=dir_KP_min;
buff[6]=speed_P;
buff[7]=speed_i;
buff[8]=u1;
buff[9]=u2;
buff[10]=u3;
buff[11]=u4;
PTD15_OUT = 1;
f_open(&fdst, "0:/data.txt", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
PTD13_OUT = 1;
f_write(&fdst,buff,BUFF_SIZE, &bw); //将文件缓冲区里的数据写入data.txt
f_close(&fdst); //关闭文件
LCD_clear(); // 清屏
display_hanzi(5,0,0);
display_hanzi(6,1,0);
display_hanzi(7,2,0);
display_hanzi(8,3,0);
display_hanzi(9,0,2);
display_hanzi(10,1,2);
display_hanzi(11,2,2);
display_hanzi(12,3,2);
display_hanzi(13,4,2);
delayms(500);
LCD_clear(); // 清屏
}
//////////////////////////////////////////////////////////////
void shuzifenjie(unsigned char number)
{
bai=number/100;
shi=number/10%10;
ge=number%10;
}
void num_print_us(s16 number,u8 X,u8 Y)
{
s16 xifu;
xifu=number;
qian=xifu/1000;
bai=xifu/100%10;
shi=xifu/10%10;
ge=xifu%10;
display_shuzi(qian,7*X+3,Y);
display_shuzi(bai,7*X+4,Y);
display_shuzi(shi,7*X+5,Y);
display_shuzi(ge,7*X+6,Y);
}
void num_print(s16 number,u8 X,u8 Y)
{ s16 xifu;
if(number<0)
{
xifu=-number;
display_zimu(28,4*X,Y);
}
else
{
xifu=number;
display_zimu(27,4*X,Y);
}
shuzifenjie(xifu);
display_shuzi(bai,4*X+1,Y);
display_shuzi(shi,2+4*X,Y);
display_shuzi(ge,3+4*X,Y);
}
void num_print_XP(s32 number,u8 X,u8 Y)
{ s32 xifu;
if(number<0)
{
xifu=-number;
display_zimu(28,6*X,Y);
}
else
{
xifu=number;
display_zimu(27,6*X,Y);
}
wan=xifu/10000;
qian=xifu/1000%10;
bai=xifu/100%10;
shi=xifu/10%10;
ge=xifu%10;
display_shuzi(wan,6*X+1,Y);
display_shuzi(qian,6*X+2,Y);
display_shuzi(bai,6*X+3,Y);
display_shuzi(shi,6*X+4,Y);
display_shuzi(ge,6*X+5,Y);
}
void keypro(void)
{
if(PTD14_IN == 0)
{
delayms(20);
if(PTD14_IN == 0)
keyout=2;
}
else if(PTD12_IN == 0)
{
delayms(20);
if(PTD12_IN == 0)
keyout=