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

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

ppm信号解码pwm,用arduino实现八通道解码

[复制链接]
跳转到指定楼层
楼主
发表于 2017-11-23 09:40 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 w飞鹰j 于 2017-11-29 11:46 编辑

福斯i6遥控升级8通道,只有六通道接收机支持ppm输出,想用其余通道怎么办? 简单快捷方法——买一个十通道接收啊!!
进入主题!来另一种方法DIY,(在此感谢arduino项目开发者,arduino给我此作品带来极大便利)重新对ppm信号解码!(别人忙着复习期中考试,我却忙着做ppm解码器,,花了两个下午,程序写好!!)
什么是ppm信号?
PPM信号是将多个控制通道(理论可10个控制通道)集中放在一起调制的信号。
也就是一个PPM脉冲序列里面包含了多个通道的信息。如下图所示(此图是借用的)更多资料请自行查阅。

开始构思程序前,网上查阅了很久,都提到测量出图中t1、t2、……的时长,但是我在程序设计时发现记录下时间了,怎样把时间对应产各通道并产生pwm信号遇到问题(八路pwm)!
于是又换了另一种思路,不测量t1、t2、……具体时间,只要捕捉到起点和终点即可。
例如;解码出第一通道信号
(1)定义一个输出pwm引脚;
(2)当检测到t1时段起点时刻,输出高电平。
(3)检测到t1时段终点时刻,输出低电平。
提到捕捉起点终点位置,怎么捕捉呢?

328芯片有两个外部中断,
attachInterrupt(0, RC_in, RISING); //上升沿触发中断
,即是由低电平变为高电平时触发中断。利用外部中断捕捉到时间变化始末位置。
接下来还有一个重要步骤,(ppm信号是连续不断的从接收机输出)我们怎么知道捕捉到的是第几通道的始末点呢?
借用一张图,先谢谢原创者

图示,一帧数据中,绿色高电平时间最长,八通道时肯给定大于3毫秒的!我们只要捕捉到这一特殊时段,就知道接下来就是第一通道的信号了!!arduino中有一个函数很方便测量脉冲宽度,
pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以HIGH或LOW。如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止。返回脉冲持续的时间长短!这样我们就把信号同步问题解决了,到此结束!!大家有兴趣自己做了试试!转载请注明出处,谢谢!




代码

#define ppm_in_pin   2
#define ppm_pulseIn  4
unsigned  int RC_count = 0;
unsigned  int PPM_HIGH = 0;
void RC_in() {
  RC_count++;
}
void setup()
{

  DDRB = DDRB | 0X1F ;
  DDRD = DDRD | 0XE0 ;
  Serial.begin(57600);
  pinMode(ppm_in_pin, INPUT_PULLUP);
  pinMode(ppm_pulseIn, INPUT);
  attachInterrupt(0, RC_in, RISING); //上升沿触发中断
}
void  RC_valout() {
  switch ( RC_count ) {
    //第一通道
    case 0:  {
        PORTD = PORTD & 0X1F; //PD后三位清零
        PORTD = PORTD | 0X20;//PD5输出高电平
        PORTB = PORTB & 0XE0; //PB前五位清零
      }; break;
    //第二通道PD6
    case 1: {
        PORTD = PORTD & 0X1F; //PD后三位清零
        PORTD = PORTD | 0X40; //PD6输出高电平
        PORTB = PORTB & 0XE0; //PB前五位清零
      }; break;
    //第三通道PD7
    case 2: {
        PORTD = PORTD & 0X1F; //PD后三位清零
        PORTD = PORTD | 0X80; //PD7输出高电平
        PORTB = PORTB & 0XE0; //PB前五位清零
      }; break;
    //第四通道PB0
    case 3:  {
        PORTD = PORTD & 0X1F; //PD后三位清零
        PORTB = PORTB & 0XE0; //PB前五位清零
        PORTB = PORTB | 0X01; //PB0输出高电平
      }; break;
    //第五通道PB1
    case 4:  {
        PORTB = PORTB & 0XE0; //PB前五位清零
        PORTB = PORTB | 0X02; //PB1输出高电平
      }; break;
    //第六通道PB2
    case 5: {
        PORTB = PORTB & 0XE0; //PB前五位清零
        PORTB = PORTB | 0X04; //PB2输出高电平
      }; break;
    //第七通道PB3
    case 6: {
        PORTB = PORTB & 0XE0; //PB前五位清零
        PORTB = PORTB | 0X08; //PB3输出高电平
      }; break;
    //第八通道PB4
    case 7:  {
        PORTB = PORTB & 0XE0; //PB前五位清零
        PORTB = PORTB | 0X10; //PB4输出高电平
      }; break;
    case 8:  {
        PORTB = PORTB & 0XE0; //PB前五位清零
         PORTD = PORTD & 0X1F; //PD后三位清零
      }; break;
  }
}
void loop()
{
  PPM_HIGH = pulseIn(ppm_pulseIn, HIGH);
  if (PPM_HIGH > 3000) {
    RC_count = 0;
  }
  RC_valout();

}




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

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
来自安卓客户端来自安卓客户端
20
发表于 2019-3-22 00:33 | 只看该作者
本帖最后由 kx0080 于 2019-3-22 00:36 编辑

请问,用这种方法可以解码dsmx编码的ppm吗?
19
发表于 2018-12-7 17:40 | 只看该作者
谢谢分享,学习了!!支持楼主!!!
18
发表于 2018-10-4 14:25 | 只看该作者
厉害哦,准备做亮小车,刚好用上了
来自苹果客户端来自苹果客户端
17
发表于 2018-7-5 20:30 | 只看该作者
如何改接收机啊?
16
发表于 2018-5-15 23:05 | 只看该作者
ppm解码用两个io有点浪费了吧
来自安卓客户端来自安卓客户端
15
发表于 2018-5-8 14:39 | 只看该作者
想用PIC单片机试试,谢谢分享!
14
发表于 2018-2-2 14:27 | 只看该作者
楼主单片机输出ppm信号应该怎么做啊
来自安卓客户端来自安卓客户端
13
 楼主| 发表于 2017-11-29 11:42 | 只看该作者
yanjian 发表于 2017-11-24 18:34
没发现你示波器给出来的信号和第一张图片不一样吗?
另外20ms帧周期,每通道最大2ms,起始脉冲0.4ms,
如 ...

没有输出10通道ppm理论可以输出10但是需要同步时间,只输出8个通道的信号

来自安卓客户端来自安卓客户端
12
发表于 2017-11-28 10:38 | 只看该作者

11
 楼主| 发表于 2017-11-25 18:00 | 只看该作者
yanjian 发表于 2017-11-24 18:37
另外i6刷完后PPM也只有6通道输出,要通道多得用ibus,或更多通道的接收机

八个通道
来自安卓客户端来自安卓客户端
10
发表于 2017-11-24 18:37 | 只看该作者
另外i6刷完后PPM也只有6通道输出,要通道多得用ibus,或更多通道的接收机
9
发表于 2017-11-24 18:34 | 只看该作者
没发现你示波器给出来的信号和第一张图片不一样吗?
另外20ms帧周期,每通道最大2ms,起始脉冲0.4ms,
如果每帧最后高电平时间不能保证大于2ms,帧之间就没法区分了。
所以我咋算也只能输出8个通道,不知道10通道的理论是从哪来的,
而且一直以讹传讹!
8
 楼主| 发表于 2017-11-23 19:12 | 只看该作者
高鼻子 发表于 2017-11-23 17:38
软解太费劲,有串入并出芯片,老天6上有那个芯片,代用品也很多

串入并出好像也不能直接解码ppm信号啊
来自安卓客户端来自安卓客户端
7
发表于 2017-11-23 17:38 | 只看该作者
软解太费劲,有串入并出芯片,老天6上有那个芯片,代用品也很多
来自安卓客户端来自安卓客户端
6
 楼主| 发表于 2017-11-23 16:22 | 只看该作者
yiyun 发表于 2017-11-23 16:15
几乎没有太多C基础,以后向您请教!

代码我贴到下边了 有兴趣可以做了试试
来自安卓客户端来自安卓客户端
5
 楼主| 发表于 2017-11-23 16:22 | 只看该作者
yiyun 发表于 2017-11-23 16:15
几乎没有太多C基础,以后向您请教!

可以
来自安卓客户端来自安卓客户端
4
发表于 2017-11-23 16:15 | 只看该作者
w飞鹰j 发表于 2017-11-23 16:05
只要C语言懂基础,arduino很好入门的

几乎没有太多C基础,以后向您请教!

3
 楼主| 发表于 2017-11-23 16:05 | 只看该作者
yiyun 发表于 2017-11-23 16:03
楼主厉害!
arduino一直没学会编程惭愧,惭愧!

只要C语言懂基础,arduino很好入门的
来自安卓客户端来自安卓客户端
沙发
发表于 2017-11-23 16:03 | 只看该作者
楼主厉害!
arduino一直没学会编程惭愧,惭愧!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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