5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: MWC 原代码学习笔记(一) 遥控信号 [打印本页]

作者: do335maomao    时间: 2015-2-23 20:14
标题: MWC 原代码学习笔记(一) 遥控信号
本帖最后由 do335maomao 于 2015-2-23 20:18 编辑

之前研究了MultiWii PID部分的代码(http://bbs.5imx.com/bbs/forum.ph ... &page=1#pid15434975
计算PID需要两方面的信息,一是传感器的信息,二是遥控接收机的信息
今天就来看看遥控接收方面的源代码,依然是2.2版本的源代码

原始的代码很长,有800多行,但是包括了PPM,SBUS,还有一些开源遥控信号
但是这次我们只看最传统的也是目前被广泛使用的PWM遥控信号,只有大概200行代码(就是一个通道要接一根线那种,对,天地飞就是)

虽然我没有看过APM的代码,但是APM与MWC用的都是AVR单片机,APM用的是mega2560,mwc也可以用在2560上,所以相信对以后学习APM也会是有帮助的

好,下面开始分析代码

volatile uint16_t rcValue[RC_CHANS] = {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502}
static uint8_t rcChannel[RC_CHANS]  = {ROLLPIN, PITCHPIN, YAWPIN, THROTTLEPIN, AUX1PIN,AUX2PIN,AUX3PIN,AUX4PIN};
static uint8_t PCInt_RX_Pins[PCINT_PIN_COUNT] = {PCINT_RX_BITS};
#define FAILSAFE_DETECT_TRESHOLD  985
最开始定义了一些要用到的变量,都可以顾名思义
我们知道,遥控信号是从1000 到 2000,中位是1502
第二行定义了八个通道分别是什么
第三行一会儿要用到
这个FAILSAFE_DETECT_TRESHOLD的意思是,若遥控信号低于这个值,就判定失控,因为遥控信号正常的时候,最低值基本在1000左右

/***********设置接收遥控信号的引脚***********/

void configureReceiver()
{
    for(uint8_t i = 0; i < PCINT_PIN_COUNT; i++)
    {
      PCINT_RX_PORT |= PCInt_RX_Pins;
     
PCINT_RX_MASK |= PCInt_RX_Pins;
    }
    PCICR = PCIR_PORT_BIT;

     #if defined(RCAUXPIN)
        PCICR  |= (1 << 0) ;
        #if defined(RCAUXPIN8)
          PCMSK0 = (1 << 0);
        #endif
        #if defined(RCAUXPIN12)
          PCMSK0 = (1 << 4);
        #endif
     #endif
}

这个函数的工作是:设置Arduino上的2,4,5,6,7号口 接收前五个通道的信号
以中断的方式读取遥控信号,初始化核心工作是要设置中断 (此处以Atmega328p为例,其他芯片类似)



for循环逐一设置引,这里PCINT_RX_PORT 即 Arduino Nano上的PORTD,即数字0-7引脚
PCInt_RX_Pins = {(1<<2),(1<<4),(1<<5),(1<<6),(1<<7)}
因此i=0时, PCINT_RX_PORT |= PCInt_RX_Pins 即为 PORTD |= 0000 0100 (设置2号引脚为高)依次类推


PCINT_RX_MASK 在此处为 PCMSK2 ,即为PORTD的 Pin Change Mask Register 2
设置这个寄存器的某一位为高,即为设置相对应的引脚的中断
因此i=0时,PCINT_RX_MASK |= PCInt_RX_Pins 即为 PCMSK2 |= 0000 0100 (设置2号引脚中断)依次类推


PCICR = PCIR_PORT_BIT;
最后,设置PCICR寄存器,此处PCIR_PORT_BIT 为 (1<<2) 即允许整个PORTD的中断
(, 下载次数: 106)

循环的后半部分为设置第六个通道,在8号口,或者,12号口上方法与前面的雷同,就不赘述了





(待更新)





作者: do335maomao    时间: 2015-2-23 20:16
占个楼待更新

作者: 青岛同兴    时间: 2015-2-23 20:51



很难见到 这么专业的 技术帖     当年大学 学习的  编程语言  我都 就饭吃掉了    现在都看不懂了    不过还是顶你   

作者: wcj3445    时间: 2015-2-23 22:14
看不懂的帮顶

作者: 爵爷    时间: 2015-2-25 09:23
其实mwc的核心就是中断获取遥控器信号..然后读取mpu数据做pid...这个读取遥控器信号的确实对于没有硬件知识的人有点难度...主要就在于中断函数上..当初我也是找了好久资料才知道到底是怎么回事的

作者: persever    时间: 2015-2-25 09:50
顶强人

作者: do335maomao    时间: 2015-2-25 10:01
爵爷 发表于 2015-2-25 09:23
其实mwc的核心就是中断获取遥控器信号..然后读取mpu数据做pid...这个读取遥控器信号的确实对于没有硬件知识 ...

嗯,我也是去翻了328p那厚的要死的数据手册才搞懂的

另,论坛排版太困难了,不知怎么文字编程斜体还改不回来,还不让贴外链,不想在坛子里更新了……


作者: 爵爷    时间: 2015-2-25 10:06
do335maomao 发表于 2015-2-25 10:01
嗯,我也是去翻了328p那厚的要死的数据手册才搞懂的

另,论坛排版太困难了,不知怎么文字编程斜体还改 ...

这个是他这个编辑器有问题..乱七八糟的...

其实我对硬件真是什么都不懂...中断的那个也是照猫画虎..大概知道是中断的意思..但是具体怎么个原理还是不理解..太多专业术语了..看不明白


作者: 1263436446    时间: 2015-2-25 20:04
  1. #include<stdio.h>

  2. int main()
  3. {
  4.   int a,b;
  5.   return 0;
  6. }
复制代码


高亮test

作者: 1263436446    时间: 2015-2-25 20:05
lz可以在编辑器上面的选框里选择代码。。就可以有格式了

作者: do335maomao    时间: 2015-2-25 21:29
1263436446 发表于 2015-2-25 20:05
lz可以在编辑器上面的选框里选择代码。。就可以有格式了

谢谢!


作者: imzhoujian    时间: 2015-2-25 23:40
楼主,意思是你搞懂后能自己修改MWC的功能是吗?

MWC2.2,2.3,2.4版本中BI模式不太正常,经测试,仅有的两个舵机有一个没输出,能看下代码吗?

作者: 上大夫    时间: 2015-2-26 04:04
只是为了拿分,因为真心不懂

作者: do335maomao    时间: 2015-2-26 09:33
imzhoujian 发表于 2015-2-25 23:40
楼主,意思是你搞懂后能自己修改MWC的功能是吗?

MWC2.2,2.3,2.4版本中BI模式不太正常,经测试,仅有 ...

啊,不好意思,这个估计要有一阵子了,目前正在大幅简化MWC,从14000行删到4000行,只支持无舵机的机型


作者: imzhoujian    时间: 2015-2-26 18:47
do335maomao 发表于 2015-2-26 09:33
啊,不好意思,这个估计要有一阵子了,目前正在大幅简化MWC,从14000行删到4000行,只支持无舵机的机型
...

好的,你还可以看下玉兔,貌似玉兔和mwc关系密切

作者: zwinbor    时间: 2015-2-26 18:58
这个得学习一下。

作者: ilikepanda007    时间: 2015-2-28 02:25
好牛逼的赶脚!!!!!!

作者: 武杰杰    时间: 2015-2-28 02:27
太高大上

作者: 武杰杰    时间: 2015-2-28 02:28
太高大上

作者: jxs_31    时间: 2015-3-1 09:44
主控是arduino....代码不是标准的C语言....超难看懂

作者: do335maomao    时间: 2015-3-1 11:53
jxs_31 发表于 2015-3-1 09:44
主控是arduino....代码不是标准的C语言....超难看懂

是标准的C语言和C++的混合,相比APM算是非常易懂了



作者: imzhoujian    时间: 2015-3-30 14:07
do335maomao 发表于 2015-3-1 11:53
是标准的C语言和C++的混合,相比APM算是非常易懂了

楼主会电子么,搞懂mwc,apm,pix之类的算法后,不如自己尝试开发飞控,对自己是一种挑战也是一种提高。

最关键在未来几年无人自控化飞行器爆发的时候能先人一步,或许有很多机会。

比纯粹玩和研究好多了

作者: 56010595    时间: 2015-3-31 22:04
顶,正在学习中!

作者: xzzd1000    时间: 2015-4-12 15:06
更新哪里去了???楼主,等你的更新啊

作者: dkm382638608    时间: 2015-5-17 10:40
请自制mega mwc怎么改代码接GPS 我改了搜不到星


作者: maxmusic    时间: 2015-5-17 12:31
技术帖,占位留名,方便查阅





欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://5imx.com/) Powered by Discuz! X3.3