the_exile 发表于 2010-12-7 19:02:40

关于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末尾的中断服务例程里。



回头一看,整理的还真是够粗略-_-# 就当抛砖引玉了,呵呵

the_exile 发表于 2010-12-7 19:10:12

占个沙发,希望这个贴能作为对http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3293478&bbs_page_no=1&bbs_id=1025 的回应。那个贴更多的还是在讨论飞控算法。

sz_works 发表于 2011-12-6 21:20:41

非常棒,近期想研究MK代码。给我发一份啊 谢谢了。sz_works@163.com./emotion/em001.gif

haolxy 发表于 2011-12-7 17:17:57

严重关注这个帖子
最好研究0.86d的程序,有很多改进的地方
点击此处下载 ourdev_702524TE9ZZZ.rar(文件大小:351K) (原文件名:V0.86d.rar)

dujun168 发表于 2011-12-7 22:51:25

顶起,期待更精彩的分析

dujun168 发表于 2011-12-7 23:44:03

mark

yue435 发表于 2012-2-14 14:38:04

顶起!!!

jojasd 发表于 2012-2-16 23:49:32

期待楼主下文

fkess1113 发表于 2012-2-21 22:24:17

mark

fkess1113 发表于 2012-2-21 22:25:35

俺还是从最简单的0.6开始看起吧

Jarmck 发表于 2012-2-22 16:25:20

我还是新手,之前学过控制课程,最近从软件先看起来,希望楼主这样的高手多多指导哈~

ryanpinwei 发表于 2012-3-6 16:12:48

谢谢了,又学习了。

Dionysus 发表于 2013-4-6 22:39:12

这个感觉也很难啊

WITSOFT 发表于 2013-4-6 22:47:57

顶起,期待更精彩的分析
页: [1]
查看完整版本: 关于MIKROKOPTER飞控的框架