查看: 798|回复: 0
打印 上一主题 下一主题

用STC的51单片机做的四轴,附飞行视频原理讲解以及一个问题

[复制链接]
跳转到指定楼层
沙发
发表于 2016-3-25 14:38:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
视频:
http://www.56.com/u38/v_MTMzNjI5MTcx.html
[url=http://www.56.com/u38/v_MTMzNjI5MTcx.html]http://www.56.com/u38/v_MTMzNjI5MTcx.html[/url]
抱歉,我不知道该怎样往阿莫里插视频播放窗口,好像没看见添加flash的选项,只能这样了。
顺便吐槽一下,阿莫同志,你的入门费太贵了,我这都是借别人的号发的帖,要不是某某让我转发一下,我还真不想花几个小时求爷爷拜奶奶地去借个号。如果你大发慈悲,麻烦送个邀请码行么。。。我的邮箱1203933924@QQ.COM
用51单片机做的四轴?以前别人这样说我们只能呵呵一笑说声逗比,但是现在的51早已不是当年的51,6路15位硬件PWM+2路CCP的16位硬件PWM,相当于是8路15位硬件PWM,mega328都可以直接秒掉,而mega328却正是市售MWC飞控的主控,mega328速度16MHZ,等效16MIPS,IAP15W4K61S4@28MHZ,差不多有25MIPS,运算速度也秒了mega328,也就是说,用51单片机做四轴绝对不成问题。
这里补充修改一下,那片子跑28MHZ不确定是不是20+MIPS,视情况而定,STC官网上说是10MIPS(1秒可执行1000万条指令,好高端哦!)实际的话nop指令是可以做到28MIPS,这是没有一点水分大家公认的,但是代码混合起来就讲不好了。
好了,屁话不多说,直接上图
正面


近照,可以看到,我对用料是十分在意的,松下高分子钽电容,三洋高分子钽电容,ESR 9毫欧,都可以秒固态了,下载口还用了一个TVS进行静电保护(Rclamp0524P)

背面的一颗STC的单片机 IAP15W4K61S4 LQFP64S

PCB空板

本人目前大二,做得不尽人意之处欢迎指教,不过麻烦说得别太专业化,我连模拟电路都还没学过,自动控制原理都还只自己看了一些些,太高深的懂不起,但是卡尔曼滤波,PID参数整定还是会的。
相关设计参数:
供电:1S锂电 350mah(600mah的在路上)
电机:720空心杯+59mm桨
MCU:IAP15W4K61S4@28MHZ
陀螺仪加速度计:MPU-6050
磁场传感计:HMC5883L
无线芯片:NRF24L01+
电机驱动MOS管:AO3400
MOS管保护用肖特基:BAT54ST
下载口防静电TVS:Rclamp0524P
机架:94*94mm
PCB厚度:1.2mm FR-4
软件相关参数:
姿态解算&电机控制频率:125HZ(8ms)
PWM频率:28KHZ 1000精度
滤波算法:卡尔曼滤波器
PID控制:PID=P*e(n)+I*[(e(n)+e(n-1)+...+e(0)]+D*[e(n)-e(n-1)]

我从大一开始做四轴,当时还是一个纯真的梦想吧,幻想用89C52做四轴,所以这弄出来的板子我也是画面太美不敢看。

之后采用了带4路硬件PWM的STC12C5628AD做主控,不过PWM分辨率太低,效果不是太好。

接下来几版都是STC15W4K系列的板子了,当初就想快点让STC发布这单片机,6路15位的PWM是我非常期待的。只可惜天天去看官网,发售时间从8月份弄到9月份再到10月份正式上市,我也是呵呵了,当时可以申请样片了后我就马上去申请了样片,坑爹的STC客服问我要3片还是5片,我说给多点吧,结果就给了我3片,还发顺丰,邮费我也是醉了,听学长说去德州仪器申请单片机人家都是免费顺丰包邮,除了你需求的单片机,还会多给你其他的样品,反观STC,呵呵。。。现在这单片机上市了,为了报复STC,我去淘宝网上买了30片这单片机,叫你当初给得那么少。



以前试图用STC的15F2K系列做过,发现定时器产生的PWM确实不行,做不出四轴,不过话也不是这么绝对,理论上用RTX51 Tiny/Full操作系统应该还是弄得出的,需要极强的软件功底,暂时没这技术哈。

由于是从其他地方移植,不想重写了,文章顺序有点乱,见谅!
浅谈我对PID整定和姿态解算的一丢丢看法,不对之处烦请各位大神指正。
PID的整定是个让很多人都感到头痛的问题,在此,我想强调一句,PID整定必须建立在良好的姿态解算的基础上才能进行,否则根本没法弄出一个很好的效果。举个例子,我的这个四轴,用互补滤波进行姿态处理,P最多调到3。再调大由于姿态解算不过关,P越大输出的姿态震动越大,即使D调大系统也没法收敛,也就是说这个系统发散了。而用卡尔曼滤波我可以把P调到4.5而且回复也有力,飞起来也稳。
在姿态解算中,有很多种方法,我这采用的就是普通的姿态角,其他的解算方法还有四元素,欧拉角,等等,其实四元数还是要转化为欧拉角才能用于PID,不过四元数没有欧拉角中万向节死锁的问题。具体请百度:四元数,欧拉角,万向节死锁。在此不一一赘述。
我这的姿态解算原理比较简单,就是对三轴加速度的值进行三角函数运算即可。
举个例子,首先我从加速度计中获取数据。
    Accel_y= GetData(ACCEL_YOUT_H);   
    Accel_x= GetData(ACCEL_XOUT_H);           
    Accel_z= GetData(ACCEL_ZOUT_H);                                            
再进行转化,转化公式在MPU6050数据手册里有
    Angle_ax=(Accel_x)/8192;  
    Angle_az=(Accel_z)/8192;
    Angle_ay=(Accel_y)/8192;   
好了,这里得到的就是我们需要的加速度的值,取值范围0-1,也就是多少个g,g是重力加速度这个就不用说了吧。
之后用反三角函数进行运算:
AngleAx=atan(Angle_ax/sqrt(Angle_ay*Angle_ay+Angle_az*Angle_az))*180/3.141592657;
公式:X轴角度=arctan(Angle_ax/开根号(Angle_ay^2+Angle_az^2))
好了,这里得到的是弧度制的角度,再乘180除以π即可得到所需的角度值。
但是这种姿态解算方式不好,超过90度就会出错,因为超过90度后加速度角度呈减小态势,而陀螺仪给的数据却是角度在增加,故滤波那里会出问题,因此别人才会用四元数来进行姿态解算,不过我最近在研究另外一种姿态解算的方法,比四元数简单得多,有成果后再弄上来,在这里姑且先用这种简单的方式来处理一下。
之后要对得到的值进行滤波,为什么要滤波呢,因为加速度计对震动特别敏感,一点震动就大姨妈,得到的角度值是不怎么准确的,不过大致在实际角度的上下。
而陀螺仪对震动不敏感,随便怎么震动都不会高潮。陀螺仪输出的数据是多少度一秒,据此进行积分,可以得到短时间内系统的姿态。不过陀螺仪有温飘,温度偏移一点他的误差就会大一点,故要用加速度计的值来对陀螺仪的值进行校准。修正他的温飘误差以及积分误差。这就是互补滤波的原理,短时间内以陀螺仪的值为准,长时间内以加速度计的值来对陀螺仪校准,二者优势互补,去掉不好的一面,这样得到的值就比较理想了。
互补滤波公式举例:Angle=0.95*(Angle-Angle_gy*dt)+0.05*AngleAx;
前面的0.95和0.05是对陀螺仪角度和角速度角度的权值,意思就是你相信哪个的程度更大一点,因为震动是双向的,故对加速度计进行低通滤波会使加速度计输出的值接近实际值,什么是低通滤波呢,打个比方,当前角度=0.95乘上次的角度+0.05乘测量的角度,低频信号才能通过这个滤波器,高频信号就被排除了,这就是对测量值进行低通滤波,dt是积分时间,就是定时器定时的时间,我这取8ms,即dt=0.08。
至于卡尔曼滤波,就是那5个基本公式,一个一个照着写就行了,网上卡尔曼的程序一抓一大把,在此也不作赘述了,卡尔曼比互补难写得多,今天不想写了,过年晚上还是不想太累。


再谈PID,得到了实时姿态,就知道了误差,知道了误差就要对电机进行控制,在PID中,P指比例,I指积分,D指微分,换种说法,P指回复力,P的输出值=P*误差;P越大偏差所引起的回复力越大。是系统能够回到0点的主要力。D是系统运动的阻力,D的输出值=D*(当前角度-前一次角度),D的存在能阻止系统运动。I是系统静差的消除力,比如你四轴的重心偏了,四轴会朝一边偏,对误差进行积分再乘以I即可消除这种机械结构引起的偏移。I的输出值=I*误差积分之和。
光有P存在的情况,系统一有偏差,就会立马回复,不过到0点时由于惯性,会继续运动,故光有P的话系统会震荡,根本停不下来。
故需要D,这个系统运动的克制力来对P进行压制,当PD呈一定比例时,系统就会稳定在一定的值,不过有可能会有点误差,这时就得靠I来修正。
I的原理决定了误差存在的时间约久,回复力越大,I可以理解是变相的回复力,专门用来修正PD没法消除的静差。
PID整定的方法:
I和D置0,从小往大调P,调整至用手造成一个误差,感觉回复有力即可。网上所说的调整至等幅震荡不适合小四轴,你根本就不可能把这玩意弄到等幅震荡的状态。总得来说,P调至你觉得回复起来有点力度就行了,不要太过于纠结。
之后从小往大加大D,在D加大的过程中,会出现震荡减小,震荡最小,震荡增大的过程。震荡最小的那一点即very good。
调好PD之后如果系统有静差,适当加上I即可,I不能加大,加大了会导致系统震荡,适当为宜。
这个过程一定要会区分震荡的来源,到底是P引起的还是D引起的。这个口述讲不清,只有靠自己慢慢调积累经验来体会。
调整好XY轴的PID后就该解决四轴自旋的问题了,一般来说XY轴的PID参数是一样的,调好一边,另一边直接复制过去就行。
自旋控制方法有2种,一种是对HMC5883的值进行PD控制,不过需要注意对电机的干扰进行排除,HMC5883输出值=地磁场+干扰值,干扰值是恒定的,因此你旋转360度,最小的那一个值+180就是干扰值,因为正常情况下他的输出值是-180-+180,这个干扰值减去就是,在这个过程中记得调大5883的测量范围,否则读出来的数据就是4096,这是超量程了。此外,还要记得用姿态解算出来的角度对磁场计进行角度修正。还有一种是对Z轴陀螺仪旋转速度进行PD控制,四轴自旋时Z轴陀螺仪会有反应,根据这个值进行PD控制就行了,实际应用来说后面那种就够了,只不过需要飞前对陀螺仪偏差进行校准。这个PD参数不要太纠结,Z轴稍微给点控制就稳了,毕竟XY轴才是四轴飞起来的关键。
此外,PID的要求是系统的输出量要和被调量成正比,故大四轴比小四轴好调得多,因为大四轴有电调,电调调整的不是电机供电电压,而是力矩,也就是说大四轴输出信号和升力是成正比的,而小四轴不是,但是我们只需要他大概是正比关系就行了,也能好好滴做朋友的。推荐碳刷电机PWM频率为500HZ,空心杯最好是20KHZ以上。
调PID中各种问题及解决方法汇总:
四轴偏离一定角度即使加I也纠正不过来,也就是说四轴明明知道他自己偏了,就是纠正不过来,解决方法:加大P。
D无论怎么调四轴就是要震荡,根本停不下来,解决方法,减小P
系统有细微偏差:加点点I
发现无论怎么调PID根本就不能让四轴取得一个很好的效果:换滤波方案吧,什么梯度下降法,卡尔曼滤波算法都是很好的。
震动越大角度值和实际值偏离越大:陀螺仪装错位置了,在MPU6050模块下面弄点泡沫双面胶可以很好解决,原则上来讲MPU6050是不能太靠近轴的。


飞四轴用的遥控器也发上来大家呵呵一下吧,做得比较丑


无线模块:NRF24L01+PA+LNA
摇杆:淘宝1块5一个买的,好用,金属杆http://item.taobao.com/item.htm?spm=a1z09.2.9.94.OjI08Z&id=41552368193&_u=tb2scoj4acf
MCU:STC15F2K60S2 DIP-40@35MHZ
无线频率:有拨码开关控制,具体看程序
通道:理论上来说是无限制的,想用就加

程序:http://pan.baidu.com/s/1i3IeiGH






做四轴过程中用到的相关参考资料:http://pan.baidu.com/s/1gdjCvcv

原程序我想就暂时不公开了,姿态解算那里有些bug,等我弄完美了再发上来,现在发上来也是让大家笑话的,对于阿莫上做四轴的大神来讲我这就是个小菜鸟,普通的卡尔曼,普通的PID而已,原理对于各位来说再简单不过了,还没用串级PID,下一步打算解决姿态解算中的问题以及PID算法更新,普通PID在大幅度打舵的情况下还是不怎么理想,容易抖。
程序的架构无非就是原始数据读取,姿态处理,滤波,PID,PWM输出
不过对于新手来说原始数据读取那里要注意一下,网上MPU-6050的程序加速度计是5HZ输出,陀螺仪125HZ输出,尼玛,加速度计的值5HZ的更新速度不是脑壳进屎了啊,一定要记得改。我附的资料里面有中文数据手册。
最后,秀一下我调四轴用的无线上位机,用串口发姿态数据太恼火了,还要插线,我这直接用2401发到屏幕上去看,显示效果还是不错的,这显示屏用IAP15L2K61S2(OC36MHZ)驱动,自己重写底层驱动代码后刷屏是1秒5屏,800*480分辨率,卖家提供的程序太坑爹了,执行效率太低了。
不要问我为何啥都是用51的片子,才大二上期,不会STM32,计划下个学期学,坐等大神带我飞。




最后依据我发帖的惯例,求砸各种币,阿莫这边不知道是什么币,有就砸吧,虽然不是我的号。
楼主帮弟弟上分,求砸各种币,谢谢各位大神了!

最后,再友情提示一句,卡尔曼滤波中所有的变量都最好定义到idata里面去,xdata实测会卡出翔,没法跑125HZ的解算频率。

今天在看程序的时候发现了点问题,再补充一些东西供大家探讨。   论STC的单片机做商业级四轴的局限性。
首先,给大家普及一点51相关的知识:
51单片机编程时内存可分为data ,idata,pdata,xdata。
data指51单片机片内内存的前128个字节,用ACC读写,速度最快。
idata指片内最前面256个字节的内存,用类似于指针的方式读写,适合用于指针操作。
pdata指扩展内存前256个字节的内存。
xdata指片外扩展内存,用DPTR访问

在51单片机进行运算的过程中,存在片内RAM的数据运算速度是最快的,存在xdata内的数据运算是最慢的,故对于四轴这种追求运算速度的东西来说,关键变量比如卡尔曼滤波的变量必须放在idata内。idata和xdata是什么概念?一个是DDR4-3200,一个是DDR2-800。
现在我的四轴用的是普通的三角函数解算角度值,没法做3D动作,今天在加四元数的过程中发现了个严重的问题,目前我光把卡尔曼的变量整到idata里就已经占了176.4字节的idata,四元数的相关参数根本放不下。
Program Size: data=176.4 xdata=339 code=10170
也就是说用51来跑四元数有点不现实。
我现在的四轴姿态解算频率是125HZ,实测跑两次卡尔曼加数据读取一共花了6.8毫秒,而且我这已经把MPU-6050的I^C总线的延时弄到芯片能够承受的最小极限了,如果我把卡尔曼的相关变量整到xdada里去,实测最多只能跑50HZ,
50HZ所引起的积分误差太大了,做出来的四轴很难飞稳。
好了,那么问题来了。假设我把四元数加进去,定义为float型,显然剩下的几十字节的空间是不够用的,如果多余的变量定义到pdata里,那么问题又来了,这意味着我必须降低我的姿态解算的频率,降低频率意味着积分误差加大,效果会适当下降。在此我不得不感叹51单片机的浮点运算能力有点低下啊,姚工为什么不整个FPU进去?或者像C8051F那样整个锁相环把频率提到100MHZ去。。。。
如今商业级飞控动辄几百HZ的姿态解算频率,还有各种外设,如果51用商品级飞控的思路来做的话姿态解算频率根本就上不去,最多100HZ,还是在没有GPS导航,没有气压计定高,没有磁场计的情况下。
加GPS导航等外设的话就得上操作系统,不过用51来跑RTX51 Tiny操作系统的话速度我想也就是奔3的电脑装了个win8吧,当然,不知道别人移植到51上的uCOS2效果怎么样。
虽然STC的网站上说商品级四轴可以用一片STC15W4K32S4系列+什么15w408做出来,但是效果肯定是达不到商业级的要求的,当然,某某硬是要和KK飞控去比我也是没话说。
不过我想如果硬是要赶鸭子上架的话有一种蠢办法,那就是加几个协处理器,主处理器专门负责四轴的平衡问题协处理器专门负责外设,不过这样成本就高了,飞控面积也大了。
因此,我觉得用51虽然能做出四轴来,但是运算速度决定了这玩意不能把四轴做好,不知各位有何高见?







资料转载于他站,仅供同学学习使用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表