ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:42.39KB ,
资源ID:8303356      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8303356.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(四轴飞行器姿态控制算法注释.docx)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

四轴飞行器姿态控制算法注释.docx

1、从开始做四轴到现在,已经累计使用了三个月的时间,从开始的尝试用四元数法进行姿态检测,到接着使用的卡尔曼滤波算法,我们走过了很多弯路,我在从上周开始了对德国人四轴代码的研究和移植,发现德国人的代码的确有他的独到之处,改变了很多我对模型的想法,因为本人是第一次尝试着制作模型,因此感觉很多想法还是比较简单。经过了一周的时间,我将德国人的代码翻译并移植到了我目前的四轴上,并进行了调试,今天,专门请到了一个飞直升机的教练,对我们的四轴进行试飞,并与一个华科尔的四轴进行了现场比较,现在我们四轴的稳定性已经达到了商品四轴的程度。下面是我这一周时间内对德国人代码的一些理解: 德国人代码中的姿态检测算法:

2、首先,将陀螺仪和加速度及的测量值减常值误差,得到角速度和加速度,并对角速度进行积分,然后对陀螺仪积分和加速度计的数值进行融合。融合分为两部分,实时融合和长期融合,实时融合每一次算法周期都要执行,而长期融合没256个检测周期执行一次,(注意检测周期小于控制周期的2ms) 实时融合: 1.将陀螺仪积分和加表滤波后的值做差; 2.按照情况对差值进行衰减,并作限幅处理; 3.将衰减值加入到角度中。 长期融合: 长期融合主要包括两个部分,一是对角速度的漂移进行估计(估计值是要在每一个控制周期都耦合到角度中的),二是对陀螺仪的常值误差(也就是陀螺仪中立点)进行实时的修正。 1.将陀螺仪积分的

3、积分和加速度积分做差(PS:为什么这里要使用加表积分和陀螺仪积分的积分,因为在256个检测周期内,有一些加速度计的值含有有害的加速度分量,如果只使用一个时刻的加表值对陀螺仪漂移进行估计,显然估计值不会准确,使用多个周期的值进行叠加后做座平均处理,可以减小随机的有害加速度对估计陀螺仪漂移过程中所锁产生的影响) 2.将上面两个值进行衰减,得到估计的陀螺仪漂移 3.对使考虑了陀螺仪漂移和不考虑陀螺仪漂移得到的角度做差,如果这两个值较大,说明陀螺仪在前段时间内测到的角速率不够准确,需要对差值误差(也就是陀螺仪中立点)进行修正,修正幅度和差值有关 长期融合十分关键,如果不能对陀螺仪漂移做修正,则系

4、统运行一段时间后,速率环的稳定性会降低。 下面比较一下德国四轴中姿态检测部分和卡尔曼滤波之间的关系: 卡尔曼滤波是一种线性系统的最优估计滤波方法。对于本系统而言,使用卡尔曼滤波的作用是通过对系统状态量的估计,和通过加速度计测量值对系统状态进行验证,从而得到该系统的最优状态量,并实时更新系统的各参数(矩阵),而最重要的一点,改滤波器能够对陀螺仪的常值漂移进行估计,从而保证速率环的正常运行,并在加速度计敏感到各种有害加速度的时候,使姿态检测更加准确。但是卡尔曼滤波器能否工作在最优状态很大程度上取决于系统模型的准确性,模型参数的标定和系统参数的选取。然而,仅仅通过上位机观测而得到最优工作参数是不

5、显示的,因为参数的修改会导致整个系统中很多地方发生改变,很难保证几个值都恰好为最优解,这需要扎实的理论知识,大量的测量数据和系统的仿真,通过我对卡尔曼滤波器的使用,发现要想兼顾锁有的问题,还是有一定难度的。 而德国人的姿态检测部分是在尝试使用一种简单方法去解决复杂问题,他既没有使用传统的四元数法进行姿态检测,也么有使用卡尔曼滤波。他的计算量不比最简单的卡尔曼滤程序波程序的计算量小,但与卡尔曼滤波相比,更加直观,易于理解,参数调节也更加方便。我个人理解,这个方法是在尝试着对卡尔曼滤波这一复杂相互耦合的多状态变量的线性系统状态估计过程进行了简单的解耦,从而将姿态的最优估计和陀螺仪漂移的最优估计分

6、隔开,这样,就可以通过比较直观的观测手段对两个部分的参数进行调整,但是,这种方法的理论性肯定不如使用四元数法和卡尔曼滤波,在一些特殊的情况下还可能出现问题,但是,由于卡尔曼滤波器设计的难度,使用这种方法还是比较现实的。 控制算法: 德国人的控制算法的核心是对角速度做PI计算,P的作用是使四轴能够产生对于外界干扰的抵抗力矩,I的作用是让四轴产生一个与角度成正比的抵抗力。 如果只有P的作用,将四轴拿在手上就会发现,四轴能够抵抗外界的干扰力矩的作用,而且这个抵抗力非常快速,只要手妄图改变四轴的转速,四轴就会产生一个抵抗力矩,但是,如果用手将四轴扳过一个角度,则四轴无法自己回到水平的角度位置,这

7、就需要I的调节作用。 对角速度做I(积分)预算实际得到的就是角度,德国人四轴里面用的也是角度值,如果四轴有一个倾斜角度,那么四轴就会自己进行调整,直到四轴的倾角为零,它所产生的抵抗力是与角度成正比的,但是,如果只有I的作用,会使四轴迅速产生振荡,因此,必须将P和I结合起来一起使用,这时候基本上就会得到德国四轴的效果了。 在对角速度进行了PI调节之后,德国人将操纵杆的值融合到结果中去,并对得到的新的值有进行了一次PI计算,这个积分参数很小,使用这个积分的作用因为,四轴在有一个非常小的倾角的情况下产生的抵抗力矩很小,无法使四轴回到水平位置,这就会导致无论怎么手动调节微调,四轴都很难做到悬停,会

8、不停得做水平漂移运动,这就必须不停的进行调整。 下面是我给德国四轴中飞控程序的一些注释: void Piep(unsigned char Anzahl) { while(Anzahl--) { if(MotorenEin) return; //auf keinen Fall im Flug! beeptime = 100; Delay_ms(250); } } //函数:SetNeutral设定传感器发出参数的中立数值,因为有漂移所以要使其每次工作都要测量出来。 //####################################################

9、 // Nullwerte ermitteln /*设置中立点*/ void SetNeutral(void) //############################################################################ { /*加速度计中立点*/ NeutralAccX = 0; NeutralAccY = 0; NeutralAccZ = 0; /*陀螺仪中立点*/ AdNeutralNick = 0; AdNeutralRoll = 0; AdNeutralGier

10、 0; Parameter_AchsKopplung1 = 0; Parameter_AchsGegenKopplung1 = 0;。。。 /*这个地方我还没有弄得太明白,检测中立点的函数被调用了两次,但是第一次的数据好像没有保存,只用到了 第二次的数据*/ /*记录中立点*/ CalibrierMittelwert(); Delay_ms_Mess(100); /*记录中立点*/ CalibrierMittelwert(); /*既然只使用了后一次的数据,为什么要进行两次记录中立点的函数*/ if((EE_Parameter.GlobalConfig & CFG_HO

11、EHENREGELUNG)) { if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset();//如果气压表输出在 950外750内,则设定气压初始的偏差。 } /*将量测值作为陀螺仪的中立点*/ AdNeutralNick= AdWertNick; AdNeutralRoll= AdWertRoll; AdNeutralGier= AdWertGier; /*这两个参数在飞控程序中没有用到*/ StartNeutralRoll = AdNeutralRoll; StartNeutral

12、Nick = AdNeutralNick; if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) // { /*由于在函数CalibrierMittelwert()中加速度计的输出乘以了ACC_AMPLIFY,所以这里必须处以ACC_AMPLIFY, 在这段程序中,所有的对加速度计和陀螺仪的数值的衰减或者放大都是为了让 陀螺仪积分和加速度计数值在同样的角度偏差的情况下能基本匹配,如果不匹配,那么就谈不上用加速度计来补 偿陀螺仪积分了*/ NeutralAccY = abs(Mittelwert_AccRoll) /

13、 ACC_AMPLIFY; NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; NeutralAccZ = Aktuell_az; } else { /*如果发现变化不大,则仍然储存上一次的*/ NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); NeutralAccY = (int)eeprom_

14、read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); } /*将所有数据清零,这里带2的变量都是加入了陀螺仪漂移补偿值之后得到的角度*/ Mess

15、IntegralNick = 0; Mess_IntegralNick2 = 0; Mess_IntegralRoll = 0; Mess_IntegralRoll2 = 0; Mess_Integral_Gier = 0; MesswertNick = 0; MesswertRoll = 0; MesswertGier = 0; StartLuftdruck = Luftdruck; HoeheD = 0; Mess_Integral_Hoch = 0; KompassStartwert = KompassValue; GPS_Neutral(); beeptim

16、e = 50; // /*从EEPROM中读取陀螺仪积分到达90°时候的值,并储存,当得到的姿态角度大于这个范围时,说明超过了90° ,就要进行相应的处理*/ Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; ExternHoehenValue = 0; } /////////////////////////////// //函数描述 :求参数的平均数值 /////

17、///////////////////////// //############################################################################ // Bearbeitet die Messwerte void Mittelwert(void) // 根据测量值 计算陀螺仪和加速度计数据 //############################################################################ { static signed long tmpl,tmpl2; /*将

18、陀螺仪数据减去常值误差,得到实际的叫速率的倍数*/ MesswertGier = (signed int) AdNeutralGier - AdWertGier; MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; MesswertNick = (signed int) AdWertNick - AdNeutralNick; //DebugOut.Analog[26] = MesswertNick; DebugOut.Analog[28] = MesswertRoll; //加速度传感器输出 /*加速度计数据滤波,ACC

19、AMPLIFY=12 得到的Mittelwert_AccNick是加速度计数值的12倍*/ /*AdWertAccNick为测量值*/ // Beschleuni×gssensor ++++++++++++++++++++++++++++++++++++++++++++++++ Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L;//具有滤波功能的方法,用当前加速度和上次的加速度平均 Mittelwert_AccRoll = ((long)M

20、ittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; /*计算加速度计的积分,加速度计对运动十分敏感,采用加速度计积分,可以减少瞬间的运动加速度的影响*/ IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll

21、 IntegralAccZ += Aktuell_az - NeutralAccZ; // Gier ++++++++++++++++++++++++++++++++++++++++++++++++ /*偏航方向无法进行滤波,因此直接进行积分得到偏航角度*/ Mess_Integral_Gier += MesswertGier; Mess_Integral_Gier2 += MesswertGier; /*耦合项应该是另外两个陀螺仪对这个轴上陀螺仪的影响,当四轴在稳定姿态不为水平的时候,进行偏航运动时 候所进行的补偿*/ /*假设目前的俯仰角是30°,而横滚角是0°,这时候如

22、保持俯仰和横滚轴没有任何运动,而将偏航轴转动90° ,那么实际的俯仰角就会变为0°,横滚角就会变为30° 但是,按照目前的算法,由于俯仰和横滚方向没有运动,因此就不会有陀螺仪的积分,俯仰和横滚角是不变的 ,这就是采用陀螺仪直接积分测角度的不完善性,这时候 使用加速度计对姿态进行修正能够起到作用,但是需要一段时间,使用下面的这段话,就是将偏航轴的运动耦 合在另外两个轴上,使姿态角度能够迅速收敛到真实值上*/ /*注:使用四元数法进行姿态结算可以避免出现这种问题,但这种方法需要有准确的陀螺仪和加表的数学模型,四元数法还需要进行大量的矩阵计算, 而且对四元数姿态进行加速度计的融合不太方

23、便*/ if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV))//不在俯仰滚转控制循环中 { tmpl = Mess_IntegralNick / 4096L; tmpl *= MesswertGier; tmpl *= Parameter_AchsKopplung1; //125 tmpl /= 2048L; tmpl2 = Mess_IntegralRoll / 4096L; tmpl2 *= MesswertGier; tmpl2 *= P

24、arameter_AchsKopplung1; tmpl2 /= 2048L; } else tmpl = tmpl2 = 0; // Roll ++++++++++++++++++++++++++++++++++++++++++++++++ MesswertRoll += tmpl; MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; Mess_IntegralRoll2 += MesswertRoll; Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll

25、 /*积分超过半圈的情况*/ if(Mess_IntegralRoll > Umschlag180Roll) { Mess_IntegralRoll = -(Umschlag180Roll - 10000L); Mess_IntegralRoll2 = Mess_IntegralRoll; } if(Mess_IntegralRoll <-Umschlag180Roll)//一样 { Mess_IntegralRoll = (Umschlag180Roll - 10000L); Mess_IntegralRoll2 = Mess_IntegralRoll; } if(

26、AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } else { if(AdWertRoll > 2020) MesswertRoll = +1000; if(AdWertRoll > 2034) MesswertRoll = +200

27、0; } // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ MesswertNick -= tmpl2; MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; Mess_IntegralNick2 += MesswertNick; /*LageKorrekturNick是通过加速度计积分和角速率积分的积分进行做差比较得到 的,*/ Mess_IntegralNick += MesswertNick - LageKorrekturNick; if(Mes

28、s_IntegralNick > Umschlag180Nick) { Mess_IntegralNick = -(Umschlag180Nick - 10000L); Mess_IntegralNick2 = Mess_IntegralNick; } if(Mess_IntegralNick <-Umschlag180Nick) { Mess_IntegralNick = (Umschlag180Nick - 10000L); Mess_IntegralNick2 = Mess_IntegralNick; } if(AdWertNick < 15) MesswertNic

29、k = -1000; if(AdWertNick < 7) MesswertNick = -2000; if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } else { if(AdWertNick > 2020) MesswertNick = +1000; if(AdWertNick > 2034) MesswertNick = +2000; } //+++++++++++++++++++

30、 // ADC einschalten ANALOG_ON; //重新开始模拟量的采集 //++++++++++++++++++++++++++++++++++++++++++++++++ /*上一步计算完了积分之后,现在将积分赋值,因此后面使用的就将是IntegralNick,IntegralNick2等数据了 */ Integral_Gier = Mess_Integral_Gier; IntegralNick = Mess_IntegralNick; IntegralRoll = Mess_IntegralRoll

31、 IntegralNick2 = Mess_IntegralNick2; IntegralRoll2 = Mess_IntegralRoll2; /*这部分代码不执行,因为在EEPROM中CFG_DREHRATEN_BEGRENZER这一位为0*/ if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) { if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); else if(Me

32、sswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); } if(Poti1 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_P

33、arameter.Kanalbele×g[K_POTI1]] + 110 && Poti1) Poti1--; if(Poti2 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in [EE_Parameter.Kanalbele×g[K_POTI2]] + 110 && Poti2) Poti2--; if(Poti3 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM

34、in [EE_Parameter.Kanalbele×g[K_POTI3]] + 110 && Poti3) Poti3--; if(Poti4 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in [EE_Parameter.Kanalbele×g[K_POTI4]] + 110 && Poti4) Poti4--; if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; if(Poti2 < 0) Poti

35、2 = 0; else if(Poti2 > 255) Poti2 = 255; if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; } //函数:校正平均值 //############################################################################ // Messwerte beim Ermitteln der Nullage /*

36、确定零位*/ /*记录中立点*/ void CalibrierMittelwert(void) //############################################################################ { // ADC auschalten, damit die Werte sich nicht w鋒rend der Berechnung 鋘dern ANALOG_OFF; MesswertNick = AdWertNick; MesswertRoll = AdWertRoll; MesswertGier = AdWertG

37、ier; /*要乘以 ACC_AMPLIFY 是为了进行数值的匹配*/ Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; Mittelwert_AccHoch = (long)AdWertAccHoch; // ADC einschalten ANALOG_ON; //开模拟量 if(Poti1 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI1]] + 110) Poti1+

38、 else if(Poti1 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI1]] + 110 && Poti1) Poti1--; if(Poti2 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI2]] + 110 && Poti2) Poti2--; if(Poti3 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI3]] + 110

39、) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI3]] + 110 && Poti3) Poti3--; if(Poti4 < PPM_in[EE_Parameter.Kanalbele×g[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbele×g[K_POTI4]] + 110 && Poti4) Poti4--; if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Pot

40、i1 = 255; if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; /*这两个数据是在对陀螺仪积分区域进行的限制,如果超过这个范围,说明就超出了+-90°的范围,则需要相应 的改变*/ Umschlag180Nick = (long) EE_Parameter.WinkelU

41、mschlagNick * 2500L; Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagNick * 2500L; } //发送电机数据 //############################################################################ // Senden der Motorwerte per I2C-Bus void SendMotorData(void) //####################################################

42、 { if(MOTOR_OFF || !MotorenEin)//关机或未工作 { Motor_Hinten = 0; Motor_Vorne = 0; Motor_Rechts = 0; Motor_Links = 0;//都置零 if(MotorTest[0]) Motor_Vorne = MotorTest[0]; if(MotorTest[1]) Motor_Hinten = MotorTest[1]; if(MotorTest[2]) Motor_Links = MotorTest[2]; if(MotorTest

43、[3]) Motor_Rechts = MotorTest[3];//如果是试验就干。 } DebugOut.Analog[12] = Motor_Vorne; DebugOut.Analog[13] = Motor_Hinten; DebugOut.Analog[14] = Motor_Links; DebugOut.Analog[15] = Motor_Rechts; //Start I2C Interrupt Mode twi_state = 0; motor = 0; i2c_start(); } //函数:参数分配 //####################

44、 // Tr鋑t ggf. das Poti als Parameter ein void ParameterZuordnung(void) //############################################################################ { // /*这个宏定义的作用是:将a中的值赋给b,并将b限制在max和min之间*/ #define CHK_POTI(b,a,min,max) { if(a > 250)

45、 { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100

46、); CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); CHK_POTI(Parameter_Gyro_I,EE_Parame

47、ter.Gyro_I,0,255); CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); CHK_POTI(Parameter_UserParam4,EE

48、Parameter.UserParam4,0,255); CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); CHK_POTI(Paramete

49、r_ServoNickControl,EE_Parameter.ServoNickControl,0,255); CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); CHK_POTI(Parameter_Dynamic

50、Stability,EE_Parameter.DynamicStability,0,255); Ki = (float) Parameter_I_Faktor * 0.0001; MAX_GAS = EE_Parameter.Gas_Max; MIN_GAS = EE_Parameter.Gas_Min; } /*飞控核心*/ //############################################################################ // void MotorRegler(void) //###################

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服