基于电磁传感器的智能车路径识别控制系统 哈尔滨工程大学技术报告.docx
《基于电磁传感器的智能车路径识别控制系统 哈尔滨工程大学技术报告.docx》由会员分享,可在线阅读,更多相关《基于电磁传感器的智能车路径识别控制系统 哈尔滨工程大学技术报告.docx(53页珍藏版)》请在冰豆网上搜索。
![基于电磁传感器的智能车路径识别控制系统 哈尔滨工程大学技术报告.docx](https://file1.bdocx.com/fileroot1/2023-2/22/599148de-f16e-4e1b-a5e0-fe152e29c03e/599148de-f16e-4e1b-a5e0-fe152e29c03e1.gif)
基于电磁传感器的智能车路径识别控制系统哈尔滨工程大学技术报告
第一章引言2
1.1概述2
1.2技术报告结构2
第二章设计方案概述说明3
2.1设计思路及方案的总体说明3
2.2系统各模块实现简介4
第三章机械及硬件电路设计5
3.1机械设计5
3.1.1电磁传感器的安装5
3.1.2PCB主板的固定5
3.1.3测速电路模块的安装6
3.1.4差速的调节7
3.1.5舵机的安装7
3.2硬件电路设计8
3.2.1电磁传感器的设计8
3.2.2PCB主板的设计12
3.2.3电源管理模块13
3.2.4电机驱动13
3.2.5恒流源的设计14
第四章软件设计15
4.1传感器的测量算法16
4.2舵机的PD控制17
4.3增量式编码器的控制17
4.4速度PID控制算法及其改进形式18
第五章开发调试过程及主要参数20
5.1开发工具20
5.2制作调试过程说明20
5.3智能车主要技术参数22
5.4存在问题及改进方法23
5.5未来寄语24
参考文献25
参考程序26
第一章引言
1.1概述
在本届智能模型车竞赛中,根据组委会要求的具体要求,本队采用了标准的汽车模型、直流电机和可充放电电池制作出了一个能够自主识别电流为20KHz,50—150mA导线线路的智能车,能够在比赛跑道上自主识别道路方向,能够稳定行驶、保持较高的速度。
在为比赛准备的很长的一段时间里,我们深入学习、应用了嵌入式软件开发工具软件codewarrior和在线开发手段,自行设计了智能汽车自动识别路径的方案,制作了电机的驱动电路、模型车的电磁传感电路,编写了基于微控制器MC9S12XS128的智能车的控制程序。
在智能车的设计过程中,我们利用了如下知识:
传感器原理、自动控制、汽车电子、机械设计等。
在对这些知识的综合运用过程中,我们对这些知识有了更深入的认识和理解,并能将所学的知识运用于实践中。
在设计的过程中,我们参考了很多文献资料。
在组装车模和电路设计等过程中,我们的实践动手能力得到了极大的培养和提高。
在设计智能车控制算法过程中,我们设计使用了多种控制算法,如舵机的PD算法和电机的PI算法。
期间进行了无数次的实践和尝试,形成了最后的比赛方案。
在思考控制算法的过程中,我们一直在追求稳、快的目标,在这个过程中我们的创造能力和实践能力得到了很大的提高。
1.2技术报告结构
本技术报告的正文分为四个部分。
第一部分是对整个系统实现方法的概要说明;第二部分是对机械结构的说明和对硬件电路的说明;第三部分是对系统软件设计部分的说明;第四部分是对开发工具、制作、安装、调试过程等所做的一些说明,以及模型车一些主要技术参数的说明。
关键字:
路径识别,智能车,PID,电磁传感器
第二章设计方案概述说明
由于本电磁智能车模型采用A型车模,通过电磁传感器阵列来采集电流约为20KHz、100mA的导线的电磁场强度来检测和识别路径,通过MC9S12XS128的AD口进行采集、处理,进而控制电机和舵机,进行模型车的智能控制。
2.1设计思路及方案的总体说明
根据电磁车循迹的要求,电磁车设计包括赛车的设计和恒流源的设计。
根据电磁传感器方案设计,赛车共包括五大模块:
电磁传感器模块、速度传感器、MC9S12XS128模块,电机驱动模块、电源管管理模块。
光电编码器
MC9S12XS128
电磁传感器
直流电机
PWM驱动
可充放电源
电源管理模块
伺服舵机
图2.1系统结构框图
恒流源的设计应包括:
方波信号的产生,恒流电路的设计,功率放大的设计,系统框图如下:
100mA、20KHz电流
功率电路
方波电路
恒流控制
电源
2.2系统各模块实现简介
1.电磁传感器模块
检测导线电流约为100mA,频率20KHz的磁场的大小,进行路径识别,并输出电压给MC9S12XS128采集。
2.速度传感器
利用增量式光电编码器进行速度的测量,反馈给单片机,构成速度的闭环。
光电编码器线数越多,同等速度下单位时间内所能检测到脉冲数也越多,因而速度检测的分辨率也更高。
另一方面,线数增多后,相邻脉冲间的持续时间会变短,脉冲检测的可靠性会因相邻脉冲的干扰而受到影响。
3.MC9S12XS129模块
构成系统的控制器
4.电机驱动模块
通过MC9S12XS128单片机输出的PWM控制,功率放大用来驱动电机,要求驱动电流足够大,要考虑到大电流对整个系统的影响。
5.电源管理模块
制作相应的电源电路,针对个模块的输入信号要求。
利用稳压芯片将电源稳成5V,供单片机和速度传感器供电,舵机利用二极管降压供电,而电机则利用电源直接供电。
6.恒流源模块
由单片机产生频率20KHz的的方波信号,驱动三极管构成的电流源,然后经H桥进行功率放大,产生恒流功率信号。
第三章机械及硬件电路设计
3.1机械设计
电磁A型车模的机械设计部分包括电磁传感器电路的安装,PCB主板的固定和连接,测速电路模块的安装,差速的调节,舵机的安装等,在机械设计过程中遵循以下原则:
转向灵活,加速性能良好,车本身摩擦小,车与地面摩擦大。
3.1.1电磁传感器的安装
电磁传感器电路,设计成一块24cmX2.5cmd的长条行PCB板。
综合考虑电磁传感器的探测距离、为了使模型车的行驶速度能更好的配合软件的控制算法,电磁传感器安装在车的正前方,前11.5cm,高6.5cm,电磁传感器电路板平行于赛道,利用长条形铝板固定,保证传感器在运动中的稳定性。
3.1.2PCB主板的固定
考虑到模型车的重心的高度和位置,主板放在模型的的前半部分,主板重心
离车前11.5cm,距离赛道高3.5cm,PCB主板长13cm,宽5cm,这样讲重心固定在车的重心偏前,对于车的摩擦和加速性能有很好的效果。
如下图所示:
3.1.3测速电路模块的安装
测速模块才用增量式编码器,增量式编码器的安装于车的最后部分,考虑到齿轮的间隙,编码器的中心安装距赛道2.5cm,编码器的中心距后轮中心为2.4cm。
如下图所示:
3.1.4差速的调节
差距决定了转弯时的性能,差速调节时应该不能太松和太紧,而且要避免和电机齿轮的间隙。
3.1.5舵机的安装
舵机可以对称安装和不对称安装,考虑到舵机的力矩大小和其响应时间的大小,我们采用对称安装的方法,并将其控制半径加大,这样在损失了部分力矩大小的情况下加快了响应时间。
如下图所示:
3.2硬件电路设计
3.2.1电磁传感器的设计
考虑到电流的大小,方向和频率,依据经可靠、稳定、经济的要求,我们选择33mH的电感,然后进行滤波、放大、检波;其电路图如下:
33mH
R1
1MΩ
在三极管交流放大之后加入倍压检波电路,可以得到与交流的峰峰值成正比的直流信号,调整R1的阻值,可使三极管集电极的电压约为2.5V,此时的三极管处于较好的放大状态,用示波器测量,可得到集电极和检波输出波形如下图所示:
集电极输出波形检波输出波形
根据电磁传感器中电感的方向与磁场的关系,采用垂直方向放置时,其测量的磁场大小为Bx,且根据比奥沙法尔定义可知:
其特性如下图所示:
图3.2.1垂直方向传感器测量理论图
垂直方向传感器测量出的电压大小为:
根据实验测定的数据,利用MATLAB可得下图:
可得出以下结论:
实验数据与理论基本相同。
采用水平方向放置时,其测量的磁场大小为By,且根据比奥沙法尔定义可知:
水平方向电磁传感器测出的电压大小为:
其特性如下图所示:
图3.2.2水平方向传感器测量理论图
根据车与导线的位置关系如图:
其中:
AE=lA;
h为传感器距赛道的高度;
根据实验测得的数据,我们采用了垂直位置的传感器,根据电磁传感器采集出的电压的大小,两相邻的传感器的距离去3~5cm左右,我们采用相邻的两传感器间距为4cm。
3.2.2PCB主板的设计
要求主板的面积小,质量轻,其PCB如图所示:
3.2.3电源管理模块
把电压为7.2V的电池经LM2940稳压后,其电路图如下:
稳压后可以完成如下功能:
经过稳压芯片LM2940稳压后,输出5V电压以驱动单片机工作;
经过稳压芯片LM2940稳压后,输出5V电压以对传感器供电;
经过稳压芯片LM2940稳压后,输出5V电压对光码盘供电;
3.2.4电机驱动
利用MOS管构成双极性H桥,使电流更大,驱动能力更强,再结合逻辑电路,使其使用更安全,更稳定,如下图所示:
操作时序如下:
输入A
输入B
电机转向
0
1
正转
1
0
反转
0
0
停车
1
1
停车
3.2.5恒流源的设计
恒流源的大小为50—100mA,频率为18KHz—20KHz,导线直径为0.1—0.3mm,根据模拟电子知识,恒流源应该有以下部分组成:
震荡电路有STC89C51通过定时器来输出频率为20KHz的方波信号,通过7805把12V稳成5V给单片机供电,横流控制时通过控制三极管be之间的恒定电压来控制集电极的电流的,是集电极的电流恒定,功率输出由H桥电路L298及其外围电路构成。
第四章软件设计
为了体现程序的模块性和可移植性,我们把程序分成各个模块进行分别处理,而各模块也有相应的形参做为接口,可以做到可移植性,通用性。
下面就这些模块的设计与实现分别进行详细阐述。
程序中用到的硬件资源有PWM模块、AD模块、脉冲累加器、普通I/O口,主程序流程图如下:
4.1传感器的测量算法
采用了垂直放置的传感器,根据采集到的数据,用MATLAB绘制出图形,并用直线拟合,
采集到的电压如下、MATLAB代码如下:
A=[8610814118422926728326322718514410883]/283;
B=-6:
1:
6;
plot(B,A);
gridminor;
C=[108141184229267]/283;
D=-5:
1:
-1;
y1=polyfit(D,C,1);
x=-6:
0.1:
0;
y=40.6/283*x+307.6/283;
holdon;
plot(x,y);
如图的直线与原曲线在2—5cm处拟合很好,故用此段的线性来计算偏移量,用来控制电机和舵机。
4.2舵机的PD控制
根据电磁传感器采集到的偏移量,利用前后几次偏移量之差进行PD控制。
舵机转角为:
其中Kp为比例系数;
b为相对于中心的偏移量;
Kd为积分系数;
Diff为位置微分量
4.3增量式编码器的控制
增量式编码器的输出经PAC采集,采集上升沿的个数,用来测定当前速度,其程序流程图如下:
4.4速度PID控制算法及其改进形式
PID控制是工业过程控制中历史最悠久,生命力最强的控制方式。
这主要是因为这种控制方式具有直观、实现简单和鲁棒性能好等一系列的优点。
位置式PID算式连续控制系统中的PID控制规律是
4.1
其中
是偏差信号为零时的控制作用,是控制量的基准;
利用外接矩形法进行数值积分,一阶后向差分进行数值微分,当选定采样周期为T时,式4.1可离散为下面的差分方程
4.2
增量式PID算式。
根据式4.2得出
4.3
于是
4.4
式4.3的计算结果,反映了第k和第k-1次输出之间的增量,所以称为增量算式。
这个算式的结果是可正可负的。
利用增量算式控制执行机构,执行机构每次只增加一个增量,因此执行机构起了一个累加的作用。
对于整个系统来说,位置和增量式两种算式并无本质区别,只是将原来全部由计算机完成的工作,分出一部分由其他元件去完成。
然而,虽然增量式算式只是算法上的一点改进,却带来了不少优点:
算式只与最近几次采样值有关,不需要进行累加,不易引起误差累积,因此容易获得较好的控制效果。
计算机只输出增量,误动作时影响小,必要时可加逻辑保护,限制或禁止故障时的输出。
手动于自动切换时,由于步进电机具有保持作用,所以容易实现无扰动切换,机器故障时,也可以把信号保持在原位。
由于增量算式有上述优点,在实际控制中,应用得比位置式更为广泛。
第五章开发调试过程及主要参数
经过我们组队员的共同开发,设计,验证,我们依据所学的知识从入门到提高,经历的了开发工具的应用、方案的设计、调试过程如下。
5.1开发工具
采用了USB接口的HCS12BDM下载工具,是支持FreescaleMC9S12系列16位单片机的BDM调试工具。
软件上采用的是CodeWarriorforHCS12,经过源程序的编写,连接,通过BDM下载至MC9S12XS128,完成单片机的开发过程。
CodeWarrior是Metrowerks公司专门面向Motorola(Freescale)设计的嵌入式应用开发的软件工具,包括集成开发环境IDE,处理器专家库,全芯片仿真,可视化参数显示工具,项目管理器,C交叉编译器,汇编器,链接器以及调试器,支持在线编程和调试,给我们的开发,设计工作带来了很大的方便。
5.2制作调试过程说明
本系统采用MC9S12XS128作为主控制器,结合20KHz,100mA的恒流源,构成了智能路径识别系统。
各硬件部分我们通过制作PCB电路板安装在智能车的相关部位。
在车头我们制作了寻迹用的电磁传感器电路板,只要输入激励电源后,即可获取磁场强度。
通过杜邦线,连接到安装在车身中央的MC9S12XS128上。
主控电路板包括了电源管理电路、单片机接口电路,终点识别部分,留有电磁传感器信号输入接口、速度传感器信号输入接口、电源输入接口、舵机控制接口、电机接口等输入输出端口。
开始时的电流源让我们很头疼,在参考了网上的很多方案和设计之后,最终形成了方案,按照频率和电流大小的要求,先产生频率,后放大成功率信号,在队员们的共同努力和指导老师的指导下,终于完成了恒流源的制作。
车的重心问题一直是困扰我们的地方,车的重心前后方向调整,对智能车行驶性能有很大影响。
按照车辆运动学理论,车身重心前移,会增加转向,但会降低转向的灵敏度,同时降低后轮的抓地力;重心后移,会减少转向,但会增大转向灵敏度,后轮抓地力也会增加。
因而调整合适的车体重心,让智能车更加适应跑道是很关键的。
根据实际调试经验,鉴于当前舵机响应较迟缓,因此,需要将车的重心前移,增加转向性能。
电机驱动是最脆弱的地方,有时会出现短路或起火的现象,由于我们的驱动加入了逻辑控制单元,操作的失误不会引起这种想象,我们经过试验和判断分析,原因可能是由于先给了驱动PWM信号,这时如果给驱动加上电压,由于这时加上了一个阶跃信号,导致上下桥臂的MOS管导通了,由于MOS管的电阻很小,经过的电流很大而导致MOS管烧毁。
经过我们组成员的共同努力,我们达到了:
在直道上,模型车的行驶的速度可达3m/s,直道入弯道时,根据弯道曲率半径的不同,模型车会相应的减速,同时伺服舵机转过一低的角度,平均速度达到了2.2m/s,且稳定性和快速性良好。
基本实现了预期目标。
5.3智能车主要技术参数
模型车的外形如下图所示:
主要技术参数如下:
项目
参数
车模几何尺寸(长、宽、高)(毫米)
395×241×78
电路电容总量(微法)
约1100uF
传感器种类及个数
电磁传感器×9;光电码盘×1,
干簧管×3
主要芯片
LM2940×2;MC9S12XS128×1
车模重量
1.3Kg
赛道检测精度
3mm
电机个数
舵机×1;电机×1
赛道检测频率(AD检测频率)
160KHz
功率(各部件都工作时)
15W
5.4存在问题及改进方法
虽然经过这么长时间的调试,毕竟这是第一届电磁组的比赛,存在的问题还很多,下面我们想说说存在的问题及改进方向。
首先,电磁传感器的方案中,输出电压与输入的磁场强度不成正比,这导致了测量时存在误差,可以采用补偿的方法加以消除,可以进行硬件和软件的补偿,还有一点就是前瞻问题,由于是刚开始接触电磁,我们组根据测得的数据和推测,电磁的前瞻应该能有约10—15cm的前瞻,可从不同方向的放置电磁传感器,如水平方向、Y轴方向上的,亦可成45°放置,这样可以大概检测出弯道的曲率半径,从而更好的控制转向和速度。
然后,由电磁传感器测得的电压来计算相对偏移量的算法中,可以大幅改进,根据理论推导和实验测得数据,开发更稳定、更精确地算法,如拟合直线,二次曲线等方法,更精确的得出相对位置的大小。
使控制更快、稳、准。
最后,电机驱动的改进很有发展,目前电机驱动由于电流的限制,使加减速不是很明显,严重影响了快速性和灵活性,可以采用电流更大的电力电子装置来加大电流,是加减速性能得到提高。
5.5未来寄语
由于电磁前瞻问题的难度很高,开发设计的困难和算法设计的复杂很大,不过前瞻的设计还是以后电磁发展的一个方向,但我们觉得记忆赛道的算法更有前途,但同时也存在很大的风险,面临的挑战如下:
A)记忆赛道是的数据量太大,单片机难以满足要求;
B)如何区别赛道,如大S、小S,知道,圆弧曲率半径的区分;
C)由于记忆赛道中第一圈和第二圈的赛道长度不同,如何根据第二圈赛道的形状来对记忆赛道的误差修正;
D)根据不同的赛道来采用不同的设计方案。
参考文献
[1]宋文绪,杨帆.传感器与检测技术[M].第1版,北京:
高等教育出版社,2004.1。
[2]贾伯年,俞朴.传感器技术[M].第2版,南京:
东南大学出版社,2000.8。
[3]卓晴.黄开胜.邵贝贝.学做智能车――挑战“飞思卡尔”杯.北京:
北京航空航天大学出版社,2007.3.
[4]邵贝贝.单片机嵌入式应用的在线开发方法.北京:
清华大学出版社,2004.
[5]李仕伯.马旭.卓晴.《基于磁场检测的寻线小车传感器布局研究》,清华大学,2009.12
[6]李发海,王岩智.电机与拖动基础[M].第1版,北京:
清华大学出版社,2005.8。
[7]竞赛组秘书处.《路径检测设计参考方案》.2010.1。
[8]竞赛组秘书处技术组.《20KHz电源参考设计方案》。
参考程序:
主程序参考:
#include"includes.h"
#include
#defineKp_p0.43
#defineKd_p0.9//1.2时无任何抖动,而此时在中间时有些许抖动,但跑得效果不错
#defineVmax32
#defineVmin15
#defineVmid310
#defineFVmid-310
voidVa1(byte);
voidVa2(byte);
voidVa3(int);
voidVd1(byte);
voidVd2(byte);
voidVd3(int);
voidVd4(byte);
voidsysInit(void);
voidSpeedSetting(ucharM);
voidfun1(void);
voidfun2(void);
voidfun3(void);
voidfun4(void);
voidfun5(void);
voidfun6(void);
voidfun7(void);
voidfun10(void);
voiddead_zone(void);
voidcounttime(int,uchar);
voidSpeed_init(uchar);
intabss(int);
intdeadzone=90;
//unsignedchartable[10]={};
//欲拟合二次曲线,使速度是位置微分量DIFF的二次函数
intspeed_high=80,speed_min=70,speed0=0;//speed=a0*x^2+c;105,9976
intDiff_c=90,Diff_edge=450;
intconstspeed=50;
intc;
floata0;
intspeed_min0=0;
intspeed_high0=0;
intconstspeed0=0;
//*************************
intie;//距导线的距离乘以100
intDiff=0;
intPos=0;
intSpeed=0;
floatSpeed_down=0,Kd_p0=0;
floatExc1,Exc2;
ucharT;
floatV;
intinitialization_flag=0;//初始化完成标志位
ucharselect_speedflag=1;
intset_time=0;
intdetect_num=0;//起始线捕获中断计数用以判断停车
intlostroad=4;
intlostnum=0;
intdelaynum=0;
ucharMARK=0x00;//bit0表示ATD0转换完成一次;
//bit1表示ATD1转换完成一次;
ucharSensornum[50];
intDis[100];
charDiff_v[50];
charSensorminnum,FSensorminnum1,FSensorminnum2,K;
intADval[16];//AD采集的值
charKK[12];
intADvalmax[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
intADvalmin[16]={1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024};
intADvaldev[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//uintPWMarray[6]={0,0,0,0,0,0};
intProption[16]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
charsum=0;
intflag1=0;
intj=0,i=0;
//intdistance;//导线到中心距离的100倍
intPe,Pe1,Pe2;//导线到中心距
//intEx[7]={-1150,-780,-430,0,430,780,1150};//传感器与车中心的偏差
intEx[7]={-1124,-768,-412,0,412,768,1124};//传感器与车中心的偏差
unsignedcharshuma[11]={0x02,0x9e,0x24,0x0c,0x9