搜索
bottom↓
回复: 47

从航模接收机中映出PPM信号,用单片机解码,用LCD1602显示各通道的脉宽(接收机是天地飞6A

  [复制链接]

出0入0汤圆

发表于 2012-2-15 17:04:06 | 显示全部楼层 |阅读模式
最近在做一个三轴的项目,想从接收机中引出PPM信号,用单片机解码,在论坛上看了好多帖子,终于成功了,现在和大家分享一下,第一做这个,欢迎各位高手拍砖!

单片机:stc12c5a56s2
接收机:天地飞6A
液晶屏:LCD1602

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-2-15 17:05:08 | 显示全部楼层
标题打错了,是“引出”。

出0入0汤圆

 楼主| 发表于 2012-2-15 17:26:07 | 显示全部楼层
首先是从接收机中引出 PPM信号。
之前有看“hn_ny_dxs 夏风”的帖子:天地飞6-C控+接收机 改造^_^
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=2218730&bbs_page_no=1&search_mode=3&search_text=hn_ny_dxs&bbs_id=9999
里面有说是从VHC164的1、2脚引出PPM信号,但是我试了一下,用示波器看的结果是积分信号,如图:

(原文件名:164 一二管脚的积分波形_副本.jpg)
这个积分信号刚好和PPM的脉宽相等,本来想用“hn_ny_dxs 夏风”帖中的方法引出,但是发现最小积分信号的峰值电压只有0.75v左右(占空比5%),除了同步信号积分峰值电压有2.45v,其它各通道的最大积分峰值电压只有1.3v(占空比10%);这个不符合单片TTL电路关于高电平的定义:输出高电平>2.4V,输出低电平<0.4V。所以就没用引出这个积分信号。(这里顺便说一句,夏风的焊接焊接不错哦,那么小的管脚都焊接得好!)

出0入0汤圆

 楼主| 发表于 2012-2-15 17:38:58 | 显示全部楼层
所以采用了“bitlyf”帖子:各位TX们,天地飞接收机FRP06-P怎么引出PPM信号?
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3551519&bbs_page_no=1&search_mode=3&search_text=bitlyf&bbs_id=9999
的方案,从LSM393的1管脚引出信号,波形图如下:

(原文件名:LSM393一管脚波形图.jpg)

这个是方波,高电平3.29v,满足TTL电路关于高电位的定义。

但是有一个问题又出来了:
这个波形和标准的PPM波形是相反的。


不过没有关系,两个相邻的下降沿之间的时间差刚好依次是:
同步波形、通道1、通道2、通道3、通道4、通道5、通道6

利用这个关系,刚好可以利用单片机INT0对下降沿进行检测,在中断服务程序中读取Timer0的数据就可以计算出脉宽


(要出去吃饭了,吃完饭在回来发代码)

出0入0汤圆

 楼主| 发表于 2012-2-15 17:56:41 | 显示全部楼层
代码的关键部分:

void main(void)
{         
    unsigned char *InitIform;
        unsigned int temp;
        InitIform="Init_is_OK";
        LCD_Init();
        DelayMs(10);
        LCD_Write_String(3,0,InitIform);


//初始化Timer0
        TMOD=0x01;//timer0 方式1
        ET0=1;//允许timer0中断

//初始化INT0
        IT0=1;//负跳变触发中断;
        EX0=1;

        EA=1;
       
        DelayMs(10000);
        while(1)
        {
            temp=filter(PPM_channel1);
                DepartNum(temp);
                LCD_Write_Char(0,0,'A');
                LCD_Write_Char(1,0,qian);
                LCD_Write_Char(2,0,bai);
                LCD_Write_Char(3,0,shi);
                LCD_Write_Char(4,0,ge);

            temp=filter(PPM_channel2);                
                DepartNum(temp);
                LCD_Write_Char(5,0,'B');
                LCD_Write_Char(6,0,qian);
                LCD_Write_Char(7,0,bai);
                LCD_Write_Char(8,0,shi);
                LCD_Write_Char(9,0,ge);

            temp=filter(PPM_channel3);
                DepartNum(temp);
                LCD_Write_Char(10,0,'C');
                LCD_Write_Char(11,0,qian);
                LCD_Write_Char(12,0,bai);
                LCD_Write_Char(13,0,shi);
                LCD_Write_Char(14,0,ge);

            temp=filter(PPM_channel4);
                DepartNum(temp);
                LCD_Write_Char(0,1,'D');
                LCD_Write_Char(1,1,qian);
                LCD_Write_Char(2,1,bai);
                LCD_Write_Char(3,1,shi);
                LCD_Write_Char(4,1,ge);
               
            temp=filter(PPM_channel5);
                DepartNum(temp);
                LCD_Write_Char(5,1,'E');
                LCD_Write_Char(6,1,qian);
                LCD_Write_Char(7,1,bai);
                LCD_Write_Char(8,1,shi);
                LCD_Write_Char(9,1,ge);

            temp=filter(PPM_channel6);
                DepartNum(temp);
                LCD_Write_Char(10,1,'F');
                LCD_Write_Char(11,1,qian);
                LCD_Write_Char(12,1,bai);
                LCD_Write_Char(13,1,shi);
                LCD_Write_Char(14,1,ge);

//                DelayMs(1000);
        }
                                          
}


void ISIR_INT0(void) interrupt 0
{
        unsigned int PPM_temp;
        if(TR0)
        {
                TR0=0;//停止计数;
                PPM_temp=TH0;
                PPM_temp=(PPM_temp<<8)|TL0;
                TH0=0;
                TL0=0;
                TR0=1;//给TH0和TL0赋初值后重新启动定时器
        }
        else
        {
                TH0=0;//如果是第一次启动中断,则启动timer0
                TL0=0;
                TR0=1;
        }
        if(PPM_temp>3000|| Timer0_OverFlowFlag)//判断引导区,如果脉宽大于3000us,则是引导区
        {
                channel=0;
                Timer0_OverFlowFlag=0;
                i++;
                if(i==10) i=0;
        }
        switch(channel)
        {
        case 1: PPM_channel1=PPM_temp; break;
        case 2: PPM_channel2=PPM_temp; break;
        case 3: PPM_channel3=PPM_temp; break;
        case 4: PPM_channel4=PPM_temp; break;
        case 5: PPM_channel5=PPM_temp; break;
        case 6: PPM_channel6=PPM_temp; break;
        case 7: break;
        case 8: break;
        default:break;
        }
        channel++;
}

void ISIR_Timer0(void) interrupt 1
{
        Timer0_OverFlowFlag=1;                 //timer0最大值是65536us,理论上不会溢出,如果溢出则出错,重新从通道1开始
}


PPM信号接INT0

出0入0汤圆

 楼主| 发表于 2012-2-15 18:01:41 | 显示全部楼层
完整代码:

点击此处下载 ourdev_719092QR7R2T.txt(文件大小:6K) (原文件名:PPM 解码.txt)

此代码有滤波的作用,实际测试效果不错。

出0入143汤圆

发表于 2012-2-15 23:21:52 | 显示全部楼层
谢谢,改天试试看

出0入0汤圆

发表于 2012-2-16 10:47:33 | 显示全部楼层
MARK,以前做过个有刷电调,跟楼主一样的滤波的方法。

出0入0汤圆

发表于 2012-2-16 12:46:07 | 显示全部楼层
PPM 解码

出0入0汤圆

发表于 2012-2-27 15:04:04 | 显示全部楼层
看看显示效果

出0入0汤圆

发表于 2012-2-27 15:20:59 | 显示全部楼层
Mark!

出0入0汤圆

发表于 2012-2-27 16:10:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-28 11:58:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-25 09:14:42 | 显示全部楼层
不错

出0入0汤圆

发表于 2012-3-25 21:50:28 | 显示全部楼层
LZ用的是什么平台

出0入0汤圆

发表于 2012-3-26 02:55:56 | 显示全部楼层
本帖最后由 huang137 于 2012-3-26 02:57 编辑

我觉得大家对PPM信号和PWM信号容易混淆,以20mS宽度每帧中间包含4mS同步头和1-8个2mS周期的PWM信号的信号叫做PPM信号,也可以把一个对多个固定周期的PWM信号的合集看作是PPM信号。接收机输出到舵机的信号是这个PPM信号里面分离出来的PWM信号

出0入0汤圆

发表于 2012-6-4 14:37:52 | 显示全部楼层
PPM了解中的飘过

出0入0汤圆

发表于 2012-7-7 20:11:03 | 显示全部楼层
这个程序 我看了一下有点问题啊。 unsigned int filter(unsigned int *s)这个方法是对得到的10组数据进行加权平均,那个为何还要先排序呢!还有51单片机是负跳变触发中断,实际的PPM波是高电平的宽度代表信号量的大小,这是怎么一回事?

出0入0汤圆

发表于 2012-8-2 15:28:28 | 显示全部楼层
谢谢分享!!!

出0入0汤圆

发表于 2012-9-5 21:05:48 | 显示全部楼层
很有用!!顶一个!

出0入0汤圆

发表于 2012-9-20 18:50:36 | 显示全部楼层
具体各种飞行模式下脉宽是多少?做个东西,需要这个信息,告诉我一下,谢谢。

出0入0汤圆

发表于 2012-9-21 21:36:40 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2012-10-3 20:17:51 | 显示全部楼层
我用楼主的方法试了一下,大致可以用,但是即使用了滤波得到的脉宽值还是偶尔会变大(不会变小),而且当某一个通道的脉宽变化时,下一个通道的脉宽值会跟着减小或增大。。。很疑惑啊,希望楼主能解答下,我用的是C8051的单片机。

出0入0汤圆

发表于 2012-11-9 09:57:30 | 显示全部楼层
ppm信号格式,怎么产生ppm信号,???

出0入0汤圆

发表于 2013-1-13 22:11:43 | 显示全部楼层
谢谢分享,谢谢

出0入0汤圆

发表于 2013-1-13 23:56:53 | 显示全部楼层
有用的资料PPM PWM

出0入0汤圆

发表于 2013-1-14 21:36:20 | 显示全部楼层
huang137 发表于 2012-3-26 02:55
我觉得大家对PPM信号和PWM信号容易混淆,以20mS宽度每帧中间包含4mS同步头和1-8个2mS周期的PWM信号的信号 ...

看了这个解释,突然好像理解了什么~

出0入0汤圆

发表于 2013-1-14 23:44:52 | 显示全部楼层
顶楼主,好资料。

出0入0汤圆

发表于 2013-2-3 09:42:43 | 显示全部楼层
楼主,你知道WFR06S怎么引出PPM么

出0入0汤圆

发表于 2013-3-4 16:21:52 | 显示全部楼层
楼主这ppm 高电平时间会变吗???

出0入0汤圆

发表于 2013-3-16 10:17:08 | 显示全部楼层
直接转换为PWM信号可以吗

出0入0汤圆

发表于 2013-9-1 22:28:14 | 显示全部楼层
请问一下你这个接收器输出给飞控板是不是特定的数目端口??也就是说PPM是特定的端口。

出0入0汤圆

发表于 2013-9-1 22:29:15 | 显示全部楼层
wujohn 发表于 2013-9-1 22:28
请问一下你这个接收器输出给飞控板是不是特定的数目端口??也就是说PPM是特定的端口。 ...

其实我就是不是很清楚我的遥控机的六个通道输给飞控板的到底是PWM,还是PPM??

出0入0汤圆

发表于 2013-9-1 22:42:20 | 显示全部楼层
学习了~

出0入0汤圆

发表于 2013-9-1 23:19:56 | 显示全部楼层
楼主的上位机能分享吗?

出0入0汤圆

发表于 2013-9-3 16:21:57 | 显示全部楼层
谢谢楼主提供的资料~~~~~`

出0入0汤圆

发表于 2013-11-19 22:32:02 | 显示全部楼层
PPM?

出0入0汤圆

发表于 2013-12-11 13:13:57 | 显示全部楼层
本帖最后由 0049 于 2013-12-11 13:17 编辑
huang137 发表于 2012-3-26 02:55
我觉得大家对PPM信号和PWM信号容易混淆,以20mS宽度每帧中间包含4mS同步头和1-8个2mS周期的PWM信号的信号 ...


那请问要捕捉这分离出来的1~8路PWM信号用20ms的周期分别捕捉就可以吗?

出0入0汤圆

发表于 2013-12-11 13:41:37 | 显示全部楼层
说白了,是一次给你一包糖,你自己分开了吃;还是一个糖一个糖的给你,你去吃。

出0入0汤圆

发表于 2014-1-5 17:38:18 | 显示全部楼层
很早就有人研究这个啦

出0入0汤圆

发表于 2014-2-22 09:49:46 | 显示全部楼层
都是高手啊

出0入0汤圆

发表于 2014-2-27 12:23:59 | 显示全部楼层
了解下!!

出0入0汤圆

发表于 2014-5-22 11:40:25 | 显示全部楼层
有用啊~

出0入0汤圆

发表于 2014-5-22 12:24:31 | 显示全部楼层
你说的单片机应该是stc12c5a60s2吧?

出0入0汤圆

发表于 2014-6-22 18:14:30 | 显示全部楼层
看看看看看看看看看看看看看看看看看看看看看看看看看看看看

出0入0汤圆

发表于 2014-8-7 21:49:18 | 显示全部楼层
MARK,正在想用从这个接收引出做个带开关的板子

出0入0汤圆

发表于 2014-8-28 20:47:43 | 显示全部楼层
huang137 发表于 2012-3-26 02:55
我觉得大家对PPM信号和PWM信号容易混淆,以20mS宽度每帧中间包含4mS同步头和1-8个2mS周期的PWM信号的信号 ...

我一直以为PPM和PWM是一样的,原来PPM是PWM的合集
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-4 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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