5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 4326|回复: 25
打印 上一主题 下一主题

MWC 原代码学习笔记(一) 遥控信号

[复制链接]
跳转到指定楼层
楼主
发表于 2015-2-23 20:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的中断


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





(待更新)




欢迎继续阅读楼主其他信息

沙发
 楼主| 发表于 2015-2-23 20:16 | 只看该作者
占个楼待更新
3
发表于 2015-2-23 20:51 | 只看该作者



很难见到 这么专业的 技术帖     当年大学 学习的  编程语言  我都 就饭吃掉了    现在都看不懂了    不过还是顶你   
4
发表于 2015-2-23 22:14 | 只看该作者
看不懂的帮顶
来自苹果客户端来自苹果客户端
5
发表于 2015-2-25 09:23 | 只看该作者
其实mwc的核心就是中断获取遥控器信号..然后读取mpu数据做pid...这个读取遥控器信号的确实对于没有硬件知识的人有点难度...主要就在于中断函数上..当初我也是找了好久资料才知道到底是怎么回事的
6
发表于 2015-2-25 09:50 | 只看该作者
7
 楼主| 发表于 2015-2-25 10:01 | 只看该作者
爵爷 发表于 2015-2-25 09:23
其实mwc的核心就是中断获取遥控器信号..然后读取mpu数据做pid...这个读取遥控器信号的确实对于没有硬件知识 ...

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

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

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

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

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

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

9
发表于 2015-2-25 20:04 | 只看该作者
  1. #include<stdio.h>

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


高亮test
10
发表于 2015-2-25 20:05 | 只看该作者
lz可以在编辑器上面的选框里选择代码。。就可以有格式了
11
 楼主| 发表于 2015-2-25 21:29 | 只看该作者
1263436446 发表于 2015-2-25 20:05
lz可以在编辑器上面的选框里选择代码。。就可以有格式了

谢谢!

12
发表于 2015-2-25 23:40 | 只看该作者
楼主,意思是你搞懂后能自己修改MWC的功能是吗?

MWC2.2,2.3,2.4版本中BI模式不太正常,经测试,仅有的两个舵机有一个没输出,能看下代码吗?
13
发表于 2015-2-26 04:04 | 只看该作者
只是为了拿分,因为真心不懂
来自苹果客户端来自苹果客户端
14
 楼主| 发表于 2015-2-26 09:33 | 只看该作者
imzhoujian 发表于 2015-2-25 23:40
楼主,意思是你搞懂后能自己修改MWC的功能是吗?

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

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

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

好的,你还可以看下玉兔,貌似玉兔和mwc关系密切
来自苹果客户端来自苹果客户端
16
发表于 2015-2-26 18:58 | 只看该作者
这个得学习一下。
17
发表于 2015-2-28 02:25 | 只看该作者
好牛逼的赶脚!!!!!!
18
发表于 2015-2-28 02:27 ——“来自手机” | 只看该作者
太高大上
19
发表于 2015-2-28 02:28 ——“来自手机” | 只看该作者
太高大上
20
发表于 2015-3-1 09:44 | 只看该作者
主控是arduino....代码不是标准的C语言....超难看懂
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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