




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
_ 智能车电磁组总结专 业: 信息安全(保密方向) 班 级: 09091401 姓 名: 李龙 学 号: 2014302479 暑期我在智能车基地进行了自己的暑期生产实习,和队友在之前搭建的智能车基础上进行完善和改进,参加了恩智浦杯智能汽车竞赛。我想本次的实习报告从智能车原理和算法设计上进行叙述。电磁类智能车概述智能车顾名思义便是可以按照预先设定的模式在特定的环境中自由的运动而不受人为的干预的小车,除了可以自动循迹(沿着特定的轨道跑),他还可以实时显示自己的各种运动状态,如:速度,里程,实时轮胎打角状况等。要实现它的自动化,小车便由三部分组成的传感器部分、控制部分和执行部分。首先传感器部分便是智能车的眼睛,它用来收集智能车所在环境中的有用信号,将收集到的模拟信号转化为数字信号以此为依据进行相应的控制,我们组所做的是电磁类的智能车,传感器便是电感,通过测量电感所产生的电压来判断小车在赛道的位置,由于电压大小与和导线的距离有关,所以这种方式可以实现位置检测。测量具体原理如下,有毕奥-萨伐尔定律可知,通有稳恒电流I、长度为L的直导线周围会产生磁场,距离导线距离为r处的磁感应强度为:B=u0I4r(cos2-cos1)对于无线长直导线先来说,上式中2等于,1等于0,u0为真空磁导率,则:B=u0I2r位于磁场中的电感线圈的感应电动势近似为:E=dtdt=dBSdt=SdBdt=Su02r2dIdt=Su02r2K Ex=KSu02hx2+h2其中Ex为水平方向上的感应电动势分量(我们将电感卧式放置),x为距离导线的水平距离,h为高,故感应电动势的大小正比于电流的变化率K,反比于距离r2,由于K是定值,故可通过测量E获得水平距离r值。接着是控制部分,这部分主要是接受传感器部分测量的信号进行计算分析,根据预先编进程序的策略传送出控制信号给各部分执行单位,控制部分主要是单片机,我们所用的是K60,他通过ADC模块接收传感器模块传进来的电压信号并进行模数转化,并经过一系列的数据处理得到电压值,通过电压的计算得出小车在赛道中的位置值,以此为依据进行相应的控制,当然还接受其他部分传进的信心以便更精细的控制,如编码器等。一是转向控制,当计算出的位置值比较大时,说明小车已经偏离赛道中央或者正在弯道中,这时小车应该向赛道中央拐,控制部分通过FTM定时模块输出PWM波到执行部分中的舵机中,使舵机进行相应方向的打角让小车回到赛道中央,为了在不同的车速下确保小车能够及时回到赛道中央,多级的转角大小应该对应小车位置的大小,PWM波的占空比决定舵机(步进电机)转动的角度,具体PWM波的计算在后面会给出。二是速度控制,对于竞速型的智能车,速度是小车的关键,小车要能够在保证不冲出赛道的情况下尽量提高速度,这就需要小车具有非常灵敏的加减速功能,除去小车轮胎摩擦力和倾角外等一些硬件方面的因素外,加减速功能主要是通过控制部分的相应功能实现,单片机可通过输出PWM波到驱动模块使电机转动,当然可以改变占空比来控制电机转动的快慢,从而控制速度的大小,加减速控制的时机和速度的大小可以通过相应的算法进行判断。最后是执行部分,一是舵机模块,这部分不需要驱动电路,只需将单片机的PWM波输入到舵机相应的引脚就可以,舵机内部有自己的基准波形,他和输入的PWM波的占空比等相比较从而决定正转还是反转以及转动的角度。电机模块有电机的驱动电路和电机本身,一般电机只要通电就可以转动起来,但要控制其转动的快慢就需要驱动电路实现电机转速的控制,同时驱动电路还可以提供相应的电压。程序设计一、位置获取方式由电感采集的感应电动势信号通过信号板输入单片机的ADC模数转换模块的各个端口,单片机将其转化为数字信号后,可将其作为此刻的电动势值,每个传感器每次采集100次数据,然后计算这100次采集的数据中最大值和最小值之差,作为电压值。由于各个电感固定的位置不同,所测量到的电压范围也会有所不同,这些数据便不能直接进行比较或计算,为了能够很好地处理数据,我们通过归一化将各个电感的数据统一到同一个范围之内,这样便可以进行比较计算了,同时归一化还可以消除因赛道电流变化产生的误差,实时地反映赛道的真实状况,因为归一化采用的是相对值,不易受绝对数据变动而产生的影响。归一化的公式为:最终值=当前值-最小值最大值-最小值*设定范围这部分的程序为:void signal_collecting(void) /传感器信号采集函数 uint8 i; for(i=0;i100;i+) /每个传感器采集100次数据 sensor0i = LPLD_ADC_Get(ADC1, AD10); sensor1i = LPLD_ADC_Get(ADC1, AD8); sensor2i = LPLD_ADC_Get(ADC1, AD9); sensor3i = LPLD_ADC_Get(ADC0, AD12);sensor4i = LPLD_ADC_Get(ADC0, AD13);sensor5i = LPLD_ADC_Get(ADC1, AD11); sensor6i = LPLD_ADC_Get(ADC1, AD12); sensor7i = LPLD_ADC_Get(ADC1, AD13); sensor8i = LPLD_ADC_Get(ADC0, AD14); sensor9i = LPLD_ADC_Get(ADC0, AD15); for(i=0;i10;i+) peaki = CalcMaxToMin(sensori); /传感器信号采集峰值计算 unityi = 300*peaki/maxi; /归一化公式 uint16 CalcMaxToMin(uint16 data100) /峰值计算函数 uint16 Max = 0; uint16 Min = 0; uint16 i = 0; Max = data0; Min = data0; for(i=0;i Max) Max = datai; /选取数组中最大值 if(datai 0) dis = sqrt(distance); else dis = 0; return dis;float32 Dis_Get1(void) /提线函数1 float32 dis_error; if(unity3unity1) /由13两个电感值的大小来判断小车的方向 dis_error=Distance2; /偏左,返回正值 else dis_error=(-1)*Distance2; /偏右,返回负值 return dis_error;二、舵机控制PD算法得到了位置信息之后,我们便可以通过它来进行舵机的控制,我们对于舵机的控制采取位置式PD算法,即:舵机PWM=中间值-P*位置矢量值-D*与前一次位置矢量值之差P为比例系数,它所起的作用便是以最快速度(一次性)减小与目标PWM占空比之间的差距,只要有偏差它便起作用,当偏差为0时它便失去作用,系统保持在平衡状态,但它很容易产生超调,调节得太过了,这样下一次又会往回调,来来回回就容易产生振荡,不易在短时间内达到目标值,此时就需要D来解决,D为微分系数,与他相乘的便是位置量变化的微分,微分反映位置变化的速率,所以D控制具有一定得预见性,使得在产生偏差之前就消除了偏差,从而一定程度上避免了系统产生超调,至于另外一个积分调节,他是用来消除静态误差的,但由于他积累了每次调节所产生的误差,使得系统变化比较大,不易使用。为了防止舵机打角超过一定范围会因为轮胎卡住而损坏舵机,我们应该限定舵机打角的范围,另外还有一种异常情况是当电感偏离赛道太远时,所收集到的电磁信号变得非常小,以至于判断方向的两个电感采集的值大小相等,从而舵机不打角甚至向相反的方向打角,使得小车乱跑,这是小车丢线了,为了防止丢线,我们应该在小车失去判别方向能力的前一时刻防止小车大范围打角,即保持之前的打角状况,我们来检测小车是否丢线的方法便是判断与前一次位置矢量之差是否大于一个阈值,或者直接判断位置矢量是否超过一个范围,若是则采取相应的防丢线措施。这部分的程序如下:void rudder_control(void)If(Dis_Error60|Dis_Error 5370 ) rp.rudder_PWM = 5370;if(rp.rudder_PWM 4570 ) rp.rudder_PWM = 4570;LPLD_FTM_PWM_ChangeDuty(FTM3, /使用FTM3 FTM_Ch1, /使用Ch1通道 rp.rudder_PWM); /舵机占空比赋值三、电机控制算法1、目标速度设定我们在这部分控制中进行速度的设定与控制,首先在速度的设定中我们以位置变化速率为依据,选一个速度设定依赖值trend(初始值为0),根据trend的值的范围选定不同的速度,当位置变化率比较小时,说明小车此时跑的赛道弯度不是很大或者在当前速度下小车跑的姿态很好,能跟得上轨迹的变化,此时小车可以尝试再加一点速度,则令trend+,而当位置变化率比较大并且超过了设置的阈值,说明小车此时遇到了大角度弯道或者小车自身速度太快了,已经不能随着轨迹的快速变化调整自己的位置,此时需要的是快速降速以便小车能够及时调整自己的位置,这时我们令trend=/2,这种增加降除的策略能够很好的适应加速平滑减速迅速的需要。最后实时目标速度的设定可以根据现有的trend值得范围来确定,trend越大,设置的目标速度就越高。接着我们还考虑到小车跑时的姿态问题,如果小车过弯时在弯道中间或靠近弯道外侧时,同样的速度下在同一时间内肯定没有切内弯跑得远,而且太靠近弯道外侧速度不容易提高,因为按照之前位置确定的计算方式下,当电感离中心线太远时,所采集到的电压值每变化12个单位,位置值则跳变1020,这样按照我们目标速度设定方法,目标速度就不易提高,但若小车是切内道跑的,可以避免这个问题并且明显减少跑完一圈所用的时间。要想切内道跑我们所采取的策略是在设置的目标速度上减去与小车位置有关的变量,小车离中心导线越远,在原来目标速度的基础上减的就越多,小车就能及时跟得上轨迹变化并且还能靠近弯的内道,当小车在弯内跑平稳了还可以加速。目标速度设定的程序如下:void targetspeed(void) /目标速度设置函数standderror = ABS(error9)-ABS(error7); /求位置变化率 if(standderror=0.8 & trend1) trend /= 2; if(trend55)mp.targetspeed =1800 - ABS(rp.rudder_PWM-RUDDER_MID)/40; else if(trend45)mp.targetspeed =1700 - ABS(rp.rudder_PWM-RUDDER_MID)/50; else if(trend30)mp.targetspeed =1600 - ABS(rp.rudder_PWM-RUDDER_MID)/60; else if(trend20)mp.targetspeed =1500 - ABS(rp.rudder_PWM-RUDDER_MID)/70; else if(trend10)mp.targetspeed =1400 - ABS(rp.rudder_PWM-RUDDER_MID)/80;else mp.targetspeed =1400 - ABS(rp.rudder_PWM-RUDDER_MID)/90;if(mp.targetspeed 1800) mp.targetspeed = 1800;if(mp.targetspeed 1300) mp.targetspeed = 1300;2、速度控制算法(增量式PD)目标速度设置好后,还需要速度控制策略保证小车按照目标速度跑,由于车模自身有重量(惯性大)再加上摩擦力的影响,让小车严格按照目标速度跑肯定是做不到的,我们只能尽量控制让小车接近目标速度跑,将偏差限定的可接受范围内,速度控制算法还是采用PID控制,和之前舵机控制不一样,要想对速度进行相对及时且精准的控制,我们还需要测量小车的实时速度,与目标速度进行比较利用差值进行控制,形成闭环反馈控制。这次我们采取增量式PD算法,增量式PD是由两个位置式PD相减的结果,它的结果只与上一次的结果有关,当小车速度有非正常跳变时,采用增量式可以降低这突变产生的影响。增量式PID的表达式为:ut=ut-ut-1=Kpet+Kiet+Kdet-e(t-1)由于小车要想跑得快且稳就需要有非常及时的加减速能力,要能在该减速的时候迅速降低速度,而且还不能减得太猛,使得小车有较大的停顿,减下来后要及时将速度加上去,因此应该有很好的加减速策略,在速度控制PD算法中已经拥有加减速的功能,但当反馈速度和目标速度相差太多时,减速不见得那么得心应手,总觉得减速的力度不够大,不能及时将速度减下来,为了克服这一弊端,我们在原来PD控制算法的基础上有添加了额外的控制算法,即bang-bang控制算法,我对bang-bang算法的理解是它是一个开关控制,每次走的都是两个极端,在速度偏差比较大时,我们输出更大的控制力度以求能够在短时间内达到目标速度,这种做法我的理解是虽然可能错失了最有效的控制时机,但通过大幅度的控制力度弥补了错过控制时机的缺陷,但是由于bang-bang算法控制粗糙,不容易实现较为精准的控制,在加上我们使用的B车模本身惯性比较大,若采用bang-bang算法虽然可以及时让小车减下速来,但是很容易让小车有停顿,最后我们果断放弃bang-bang控制算法,仍采用抓住控制时机的控制策略,增量式PD算法由于有微分控制,所以能够较为准确地抓住控制时机,缺点是控制力度不强,我们就在原来的表达式中加了一个权值,使其控制力度能够有效增加,最后我们有对这个权值进行变量化,让它和速度变化速率紧密相关,这样又进一步降低了小车停顿的可能性。小车速度控制程序如下:void PID(void)if(mp.spdfeedback5) mp.motorPWMlast = 700; mp.speed_error = mp.targetspeed - mp.spdfeedback; /当前的速度差值=目标速度-当/前速度返回值 mp.motorPWM=mp.motorPWMlast+motor_P * (mp.speed_error - mp.speed_eerror) + motor_I*mp.speed_error+motor_D*(mp.speed_error-2*mp.speed_eerror+ mp.speed_eeerror); if(mp.speed_error0 & mp.speed_eerror0 & trend1 =51) trend1+; else if(mp.speed_error-mp.speed_eerror)=50)slow = 0; else if(trend1=40)slow = 0.11; else if(trend1=30)slow = 0.13; else if(trend1=20)slow = 0.15; else if(trend1=10)slow = 0.17; else slow = 0.2; if(mp.motorPWM 10000) mp.motorPWM = 10000; if(mp.motorPWM 320 & unity2pre_unity2)nn = 1;slope=1; If(nn = 1 & unity2320 & unity2320 & unity2pre_unity2)nn = 3; if(nn = 3 & unity2320 & unity220 | Dis_Error30&unity030&unity4100&unity280&unity180&unity3170)&(unity1-unity3)-40) cj = 10; bj = 0 ; /初次检测到环岛等待确认if(cj=10&(flag=1|bn=1)&(unity2220&(unity1140|unity3140)|(unity6150&unity8150&unity7200&ABS(unity6-unity8)40) bj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农产品脱酶脱酶处理工艺流程考核试卷及答案
- 稻谷蛋白质含量测定工艺考核试卷及答案
- 马匹饲养记录管理工艺考核试卷及答案
- 中药合剂工协作考核试卷及答案
- 2025年6月浙江高考生物试卷真题及答案详解(精校打印版)
- 运球技术测试题及答案
- 银行资管考试题及答案
- 银行职工测试题及答案
- 电气专业试题及答案
- 农林专业试题及答案
- 宠物经济下的宠物食品包装创新研究报告:2025年市场潜力分析
- 2025年关于广告设计合同格式范本
- 临床基于MDT平台下的“5A”护理模式在改善脑卒中后顽固性呃逆患者中应用
- 蜂蛰伤的治疗指南讲课件
- 坏死性筋膜炎49390课件
- JT∕T 651-2022 牵引杆挂车转盘
- 某公司项目启动会(38张)课件
- 全国水土保持规划国家级水土流失重点预防区和重点治理区复核划分
- DB13(J)∕T 269-2018 电动汽车充电站及充电桩建设技术标准
- 机动车交通事故快速处理协议书
- 临床营养支持小组工作方案
评论
0/150
提交评论