关于MIKROKOPTER飞控的框架
潜水N久,学了不少东西。虽然才疏学浅,还是希望尽量回报一下。MK的代码包括许多东西,大部分代码是在对付底层、通信、初始化等"家务",虽然对系统正常运转是必须的,但对刚开始看代码的朋友来说估计造成了不少干扰,毕竟我们看代码时更多的不是关注某个寄存器怎么设置,而是传感器数据处理与飞控算法的实现。因此我粗略整理了一下大家可能比较关注的那些部分的框架,希望能为初学者们省点时间;至于高手,则希望能指出错误、补充一些不完善的地方。
代码是Killarg的0.76版。
一、飞控
MK飞控核心部分集中在fc.c的MotorControl函数里。这个函数由Timer0的ISR控制启动。Timer0的ISR以9.765 kHz的频率执行,每运行20次就将updateMotor标志置为1;负责任务调度的主函数循环检查该标志,若为1则调用MotorControl函数。显然,飞控部分执行频率大约为500HZ。
MotorControl函数依次做下面几件事:
1、调用Mean函数进行传感器数据处理。这个函数对现有的测量值计做一些简单处理比如限制下范围什么的,再启动ADC的ISR例程为下一次循环做准备;这个ISR到底干什么,在后面说。
2、读接收机信号。先判断下信号质量如何,没问题就处理PPM信号。MK的各种遥控器命令也是在这里判断的。
3、串口控制
4、翻筋斗的处理
5、紧急降落的处理
6、陀螺仪/加速度计测量值融合
7、读罗盘、GPS等的值
8、根据各种传感器及控制输入的值计算各个电动机的控制量,也就是说控制算法的实际实现。
MotorControl返回以后主函数循环调用SendMotorData把这些控制量发送到BLDC。
二、传感器数据采集
MK在ADC采样的中断里使用状态机采集各个ADC通道的测量值。源代码中定义了0~17总共18个状态,每个状态中采集一个通道的数据,每次MotorControl启动测量都把全部状态走一遍。
大多数传感器的ADC通道仅对应一个状态,但是陀螺仪与加速度计的部分通道对应多个状态,也就是说采集的更为频繁一些;同时,这些采集比较频繁的通道还进行了简单的平滑处理。
这部分代码在analog.c末尾的中断服务例程里。
回头一看,整理的还真是够粗略-_-# 就当抛砖引玉了,呵呵 占个沙发,希望这个贴能作为对http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3293478&bbs_page_no=1&bbs_id=1025 的回应。那个贴更多的还是在讨论飞控算法。 非常棒,近期想研究MK代码。给我发一份啊 谢谢了。sz_works@163.com./emotion/em001.gif 严重关注这个帖子
最好研究0.86d的程序,有很多改进的地方
点击此处下载 ourdev_702524TE9ZZZ.rar(文件大小:351K) (原文件名:V0.86d.rar) 顶起,期待更精彩的分析 mark 顶起!!! 期待楼主下文 mark 俺还是从最简单的0.6开始看起吧 我还是新手,之前学过控制课程,最近从软件先看起来,希望楼主这样的高手多多指导哈~ 谢谢了,又学习了。 这个感觉也很难啊 顶起,期待更精彩的分析
页:
[1]