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

标题: ppm信号解码pwm,用arduino实现八通道解码 [打印本页]

作者: w飞鹰j    时间: 2017-11-23 09:40
标题: ppm信号解码pwm,用arduino实现八通道解码
本帖最后由 w飞鹰j 于 2017-11-29 11:46 编辑

福斯i6遥控升级8通道,只有六通道接收机支持ppm输出,想用其余通道怎么办? 简单快捷方法——买一个十通道接收啊!!
进入主题!来另一种方法DIY,(在此感谢arduino项目开发者,arduino给我此作品带来极大便利)重新对ppm信号解码!(别人忙着复习期中考试,我却忙着做ppm解码器,,花了两个下午,程序写好!!)
什么是ppm信号?
PPM信号是将多个控制通道(理论可10个控制通道)集中放在一起调制的信号。
也就是一个PPM脉冲序列里面包含了多个通道的信息。如下图所示(此图是借用的)更多资料请自行查阅。
(, 下载次数: 80)
开始构思程序前,网上查阅了很久,都提到测量出图中t1、t2、……的时长,但是我在程序设计时发现记录下时间了,怎样把时间对应产各通道并产生pwm信号遇到问题(八路pwm)!
于是又换了另一种思路,不测量t1、t2、……具体时间,只要捕捉到起点和终点即可。
例如;解码出第一通道信号
(1)定义一个输出pwm引脚;
(2)当检测到t1时段起点时刻,输出高电平。
(3)检测到t1时段终点时刻,输出低电平。
提到捕捉起点终点位置,怎么捕捉呢?

328芯片有两个外部中断,
attachInterrupt(0, RC_in, RISING); //上升沿触发中断
,即是由低电平变为高电平时触发中断。利用外部中断捕捉到时间变化始末位置。
接下来还有一个重要步骤,(ppm信号是连续不断的从接收机输出)我们怎么知道捕捉到的是第几通道的始末点呢?
借用一张图,先谢谢原创者
(, 下载次数: 60)
图示,一帧数据中,绿色高电平时间最长,八通道时肯给定大于3毫秒的!我们只要捕捉到这一特殊时段,就知道接下来就是第一通道的信号了!!arduino中有一个函数很方便测量脉冲宽度,
pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以HIGH或LOW。如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止。返回脉冲持续的时间长短!这样我们就把信号同步问题解决了,到此结束!!大家有兴趣自己做了试试!转载请注明出处,谢谢!

(, 下载次数: 73)
(, 下载次数: 65)
(, 下载次数: 78)
(, 下载次数: 70) 代码

#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();

}





作者: yiyun    时间: 2017-11-23 16:03
楼主厉害!
arduino一直没学会编程惭愧,惭愧!

作者: w飞鹰j    时间: 2017-11-23 16:05
yiyun 发表于 2017-11-23 16:03
楼主厉害!
arduino一直没学会编程惭愧,惭愧!

只要C语言懂基础,arduino很好入门的

作者: yiyun    时间: 2017-11-23 16:15
w飞鹰j 发表于 2017-11-23 16:05
只要C语言懂基础,arduino很好入门的

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


作者: w飞鹰j    时间: 2017-11-23 16:22
yiyun 发表于 2017-11-23 16:15
几乎没有太多C基础,以后向您请教!

可以

作者: w飞鹰j    时间: 2017-11-23 16:22
yiyun 发表于 2017-11-23 16:15
几乎没有太多C基础,以后向您请教!

代码我贴到下边了 有兴趣可以做了试试

作者: 高鼻子    时间: 2017-11-23 17:38
软解太费劲,有串入并出芯片,老天6上有那个芯片,代用品也很多

作者: w飞鹰j    时间: 2017-11-23 19:12
高鼻子 发表于 2017-11-23 17:38
软解太费劲,有串入并出芯片,老天6上有那个芯片,代用品也很多

串入并出好像也不能直接解码ppm信号啊

作者: yanjian    时间: 2017-11-24 18:34
没发现你示波器给出来的信号和第一张图片不一样吗?
另外20ms帧周期,每通道最大2ms,起始脉冲0.4ms,
如果每帧最后高电平时间不能保证大于2ms,帧之间就没法区分了。
所以我咋算也只能输出8个通道,不知道10通道的理论是从哪来的,
而且一直以讹传讹!

作者: yanjian    时间: 2017-11-24 18:37
另外i6刷完后PPM也只有6通道输出,要通道多得用ibus,或更多通道的接收机

作者: w飞鹰j    时间: 2017-11-25 18:00
yanjian 发表于 2017-11-24 18:37
另外i6刷完后PPM也只有6通道输出,要通道多得用ibus,或更多通道的接收机

八个通道

作者: xiaobao147    时间: 2017-11-28 10:38


作者: w飞鹰j    时间: 2017-11-29 11:42
yanjian 发表于 2017-11-24 18:34
没发现你示波器给出来的信号和第一张图片不一样吗?
另外20ms帧周期,每通道最大2ms,起始脉冲0.4ms,
如 ...

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


作者: 小庸    时间: 2018-2-2 14:27
楼主单片机输出ppm信号应该怎么做啊

作者: 微巍信号    时间: 2018-5-8 14:39
想用PIC单片机试试,谢谢分享!

作者: 17620462    时间: 2018-5-15 23:05
ppm解码用两个io有点浪费了吧

作者: zxy882266    时间: 2018-7-5 20:30
如何改接收机啊?

作者: 风来西林88    时间: 2018-10-4 14:25
厉害哦,准备做亮小车,刚好用上了

作者: fengjlong    时间: 2018-12-7 17:40
谢谢分享,学习了!!支持楼主!!!
作者: kx0080    时间: 2019-3-22 00:33
本帖最后由 kx0080 于 2019-3-22 00:36 编辑

请问,用这种方法可以解码dsmx编码的ppm吗?




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