搜索
bottom↓
回复: 42

PPM 信号采集的想法

[复制链接]

出0入0汤圆

发表于 2011-7-21 14:31:57 | 显示全部楼层 |阅读模式
PPM信号采集

1、C8051F330 上升沿触发中外断 赋初值启动定时器Tn(n=定时器序号),while(INT0==1);只要不是低电平就一直计时,到低电平在停止定时器下面那段程序

是一段采集单舵机信号的中断服务程序,我想在此基础上加个计数器,判断输入脉宽是同步头还是通道值检测到同步头计数器加一将此脉宽乘以时间系数+0.3毫秒低电平赋给PPM数组各通道。     “时间系数=定时/计数器记一次数的时间,如果用的51单片机12MHz的晶振 那就是1us”  

缺点:只能测出正脉宽数值,已知负脉宽是相等的似乎是0.3ms 所以测得的值需要+0.3ms=实际各通道的高电平时间

void EX0_ISR () interrupt 0                                        //外部中断0 中断服务程序,上升沿中断
{       
        TL0 = TH0 = 0x00;                                        //赋初值                               
        TR0       = 1;                                        //外中断一到来,即启动T0计时
        while(INT0==1);                                        //高电平时,等待T0计时,判断外部中断口状态
        PWM_in = (TH0*256)+TL0;                                   //将测量值赋给PWM_in
        TR0=0;                                                  //关闭T0
}



(原文件名:FUTABA 6EXHP PPM.jpg)

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-7-22 01:04:27 | 显示全部楼层
呃LZ你是不是从PC软件编程刚刚才来学单片机编程的?
不能再中断里用while这种形式的东西,总之中断里面代码执行得越快越好,不应该有while for之类的大循环

按你这样写,估计这个单片机只能处理PPM信号了。而且你犯了一个大错,就是C8051F的循环计数是不准确的,因为她的内核是流水线的。还有就是,这个单片机是最快可以1个周期处理一条指令的,就是1T的单片机,不是普通的12T的单片机,不能按12MHZ算!


看看我的吧,是用C8051F410的,注释都写得很清楚了,我自己的飞控上用的。工作得很好,6个通道采集,能自动同步信号。
外部中断1接PPM,用定时器3来做计时

//----------------------------------
//解码函数
void PPM_Interrupt() interrupt 2
{
        static xdata uint16 PPM_Temp = 0;                          //定时器的值
        static xdata uint8  PPM_Channel = 0;
        static xdata uint8  Temp = 0;
//        if(TMR3CN & Bin10000000 == 1);                                   //如果溢出了,则错误了
        PPM_Temp = TMR3H * 256 + TMR3L;
        TMR3H = 0;                                                                           //重置定时器
        TMR3L = 0;         
       
        if(PPM_Port == 1)                                                           //判断PPM电平
        {                                                                                           //PPM有效结束,结束计时               
               
                Temp = IT01CF;                                                           //位运算对于我来说就是个渣  这里应该用&还是异或运算?懒得改了
                Temp = ~Temp;
                Temp |= Bin10000000;
                Temp = ~Temp;
                IT01CF = Temp;                                                           //作用是把IT01CF第一位清零,目的是转换为低电平触发               
       
                if(PPM_Temp > PPM_Head_Time || Timer3_OverFlow == 1)                           //判断为引导区
                {
                        PPM_Channel = 0;
                        Timer3_OverFlow = 0;
                }
                switch(PPM_Channel)
                {
                        case 1 :PPM16_1 = PPM_Temp; break;
                        case 2 :PPM16_2 = PPM_Temp; break;
                        case 3 :PPM16_3 = PPM_Temp; break;
                        case 4 :PPM16_4 = PPM_Temp; break;
                        case 5 :PPM16_5 = PPM_Temp; break;
                        case 6 :PPM16_6 = PPM_Temp; break;
                        case 7 : break;
                        case 8 : break;       
                        default: break;
                }
                PPM_Channel ++;                       
        }
        else                                                                                   //PPM有效,开始计时
        {       
                IT01CF |= Bin10000000;                                            //转为高电平触发                  
        }
}

//定时器3中断,引导区可能会超量程
void Timer3() interrupt 14
{
        Timer3_OverFlow = 1;                                //超量程标志
        TMR3CN &= ~0x80;                    // Clear Timer3 interrupt-pending flag
}

出0入0汤圆

 楼主| 发表于 2011-7-22 02:22:26 | 显示全部楼层
回复【1楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

你的回复对我很有帮助,非常感谢!
题外话:我不懂pc编程,自学单片机几年了但一直没什么进展周围只认识北航的一个博士但我这低级的问题又不好老去麻烦人家所以就自己闷头学
这应该是我第一次主动开话题,使我深切意识到交流的重要性 受益匪浅啊!再次表示感谢!

出0入0汤圆

发表于 2011-7-22 08:55:31 | 显示全部楼层
从描述看好像错了,PPM一个通道信息是两个边沿之间的时间

出0入0汤圆

发表于 2011-7-22 10:20:32 | 显示全部楼层
解析PPM信号应该能自适应通道数,那才有实际意义,

出0入0汤圆

发表于 2011-7-22 10:27:11 | 显示全部楼层
回复【4楼】radiofcx  
解析ppm信号应该能自适应通道数,那才有实际意义,
-----------------------------------------------------------------------

这个很简单,PPM起始的时候,都是有一段超过2.5ms的引导波形,在这里即可同步信号。依次计数直到下一个引导波形,就可以得出通道数啦。
PPM不压缩的话最多只能得到8个通道,我的程序也只写了8个,我的遥控是6个通道的,所以就没写下去,在switch那里加两个变量即可,其他不用改。或者把PPM_Channel的最大值返回,即可得到通道数,这个应该没问题吧

出0入0汤圆

发表于 2011-7-22 10:40:43 | 显示全部楼层
PPM的同步波形有十几个ms,可以用来识别通道数,这是我以前写的,MCU是AVR32

//接收机通道指针【0-7】
unsigned short gs_ppm_pointer = 0;

/*! \brief TC0 interrupt.
*/
#if __GNUC__
__attribute__((__interrupt__))
#elif __ICCAVR32__
#pragma handler = AVR32_TC_IRQ_GROUP, 1
__interrupt
#endif

static void tc0_irq(void)
{
        volatile int li_temp_a, li_status;
        li_status = tc_read_sr(&AVR32_TC, TC_CHANNEL0);

        if (li_status & SR_ET_TRIG_MASK) {
                //EXTERNAL TRIGGER INTERRUPT
        } else if (li_status & SR_RA_LOAD_MASK) {
                //RA LOAD INTERRUPT
                li_temp_a = tc_read_ra(&AVR32_TC, TC_CHANNEL0);
                tc_write_ra(&AVR32_TC, TC_CHANNEL0, 0);
               
                gs_ppm_value[gs_ppm_pointer] = li_temp_a;
               
                if ((li_temp_a>PPM_SYNC_TIME)||(gs_ppm_pointer>=PPM_CHANNEL_COUNT)) {
                        gs_ppm_pointer = 0;
                } else {
                        gs_ppm_pointer ++;
                }
        } else {
                //OVERRUN INTERRUPT
                gs_ppm_pointer = 0;
        }
}


另外中断程序要精简是对的,尽量不要有大循环,特别循环体内涉及全局变量

出0入0汤圆

发表于 2011-7-22 10:41:44 | 显示全部楼层
缩进怎么都没了

出0入0汤圆

 楼主| 发表于 2011-7-22 11:17:35 | 显示全部楼层
其实那段程序是我摘抄于51例程中,开始用if(INT == 0){;} 结果一闪而过后来只好用它原文中的while(INT == 1);

这段程序也有问题,当没有PPM输入时单片机就死机了停在while(INT == 1);这

由majianjia  阿嘉^_^ 的提示 将这条语句改为下降沿触发就ok了!


//51测量负脉宽
#include<reg51.h>                                           //包含51单片机寄存器定义的头文件

sbit RC = P3^2;                                                    //将u位定义为P3.2


/*******************************************
函数功能:主函数
******************************************       

void main(void)
{
        TMOD         = 0x02;                                          //TMOD=0000 0010B,使用定时器T0的模式2
        EA                = 1;                                                   //开放总中断
        EX0                = 1;                                                  //允许使用外中断
        IT0                = 1;                                                  //选择负跳变来触发外中断
        ET0                = 1;                                                  //允许定时器T0中断
        TH0                = 0;                                                  //定时器T0赋初值0
        TL0                = 0;                                                   //定时器T0赋初值0
        TR0                = 0;                                                   //先关闭T0
        while(1)  ;                                                 //无限循环, 不停检测输入负脉冲宽度

}


**************************************************************
函数功能:外中断0的中断服务程序
**************************************************************
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
        TR0         = 1;                             //外中断一到来,即启动T0计时
    TL0         = 0;                            //从0开始计时
    while(RC == 0);                              //高电平时,等待T0计时
    P1          = TL0;                              //将结果送P1口显示
    TR0         = 0;                             //关闭T0
}

出0入0汤圆

 楼主| 发表于 2011-7-22 20:34:25 | 显示全部楼层
/********************************************************************/
/*         Every time a positive edge is detected at PD6 每隔一段时间就会在PD6脚上检测到正沿*/
/********************************************************************/
/*                               RC_PPM波形示意图
       <----------------------------------------------------------------------->
         ____   ______   _____   ________                ______    sync gap      ____
        |    | |      | |     | |        |              |      |                |
        |    | |      | |     | |        |              |      |                |
     ___|    |_|      |_|     |_|        |_.............|      |________________|
        <-----><-------><------><-------->              <------>                <---
          t0       t1      t2       t4                     tn                     t0

The PPM-Frame length is 22.5 ms.
Channel high pulse width range is 0.7 ms to 1.7 ms completed by an 0.3 ms low pulse.
The mininimum time delay of two events coding a channel is ( 0.7 + 0.3) ms = 1 ms.
The maximum time delay of two events coding a chanel is ( 1.7 + 0.3) ms = 2 ms.
The minimum duration of all channels at minimum value is  8 * 1 ms = 8 ms.
The maximum duration of all channels at maximum value is  8 * 2 ms = 16 ms.
The remaining time of (22.5 - 8 ms) ms = 14.5 ms  to (22.5 - 16 ms) ms = 6.5 ms is
the syncronization gap.

这个PPM波形 长度为22.5ms,各通道的高电平宽度为0.7ms~1.7ms,低电平宽度为固定的0.3ms。
经解码后各通道的最小脉宽为0.7+0.3=1ms,最大脉宽为1.7+0.3=2ms。
所有通道的最小脉宽加在一起是:8 * 1 ms = 8 ms.
所有通道的最大脉宽加在一起是:8 * 2 ms = 16 ms.
所以剩下的时间(同步时间)是:(22.5 - 8 ms) ms = 14.5 ms  ~ (22.5 - 16 ms) ms = 6.5 ms
*/

出0入0汤圆

发表于 2011-7-31 00:51:29 | 显示全部楼层
好想法

出0入0汤圆

发表于 2011-10-28 08:43:43 | 显示全部楼层
好帖啊,很有帮助的

出0入0汤圆

发表于 2011-10-28 10:11:22 | 显示全部楼层
强,留名

出0入0汤圆

发表于 2011-10-28 10:27:17 | 显示全部楼层
好贴。

出0入0汤圆

发表于 2011-11-12 21:04:00 | 显示全部楼层
GOOD!!

出0入0汤圆

发表于 2011-11-19 20:00:20 | 显示全部楼层
mark
头像被屏蔽

出0入0汤圆

发表于 2012-2-3 14:25:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-2-14 15:19:12 | 显示全部楼层
回复【1楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------
楼主您好,请问PPM的信号时怎样从接收机上面引出来的

出0入0汤圆

发表于 2012-2-23 12:31:12 | 显示全部楼层
学习中,一直不理解从遥控器到接收机再到MCU怎么工作的

出0入0汤圆

发表于 2012-2-27 11:12:12 | 显示全部楼层
学习了!!!

出0入0汤圆

发表于 2012-2-27 11:21:27 | 显示全部楼层
也附上一个我以前编的解码PPM信号的代码,用AVR M8实现的。


中断.h
----------------
/************************************************************************
文件名称:TimeCount.H
修改日期:2011/02/11
创建人:admvip

定时器0,定时器1的初始化和中断处理函数
************************************************************************/

#ifndef          __TIMECOUNT_H__
#define          __TIMECOUNT_H__

#include <iom8v.h>
#include <AVRdef.h> //7.22新版macros.h替换文件

/*常数宏定义*/
#ifndef TRUE
#define TRUE         1
#endif

#ifndef FALSE
#define FALSE         0
#endif

#ifndef NULL
#define NULL        0
#endif

/*定义舵机信号输出端口*/
#define PWMOUTPORT         PORTD
#define CH1         PD2
#define CH2         PD3
#define CH3         PD4
#define CH4         PD5
#define CH5         PD6
#define CH6         PD7


/*定义_解码通道数量*/
#define CHANNELCOUNT        5

/*0.5ms前导脉冲宽度常量*/
/*8M主频64分频计数器一个SETP是8uS,0.5ms大致是62.5个SETP*/
#define PULSEMinWIDTH         2
#define PULSEMaxWIDTH         325


/*模块变量外部引用声明*/
extern volatile unsigned char         g_ChannelData[];           //通道数据存储数组
extern volatile unsigned char          g_bReceiveStart;           //通道数据接收开始标志
extern volatile unsigned char        g_bInAllComplete;             //输入波形采集完成标志
extern volatile unsigned char        g_nInIndex;           //当前输入通道号
extern volatile unsigned char        g_nOutIndex;           //当前输出通道号
extern volatile unsigned int           g_nPwmWidth;           //被检测脉冲宽度


/*模块函数外部引用声明*/
extern void TimeCount_init(void);
extern void PWM_OUT(void);

#endif

出0入0汤圆

发表于 2012-2-27 11:22:34 | 显示全部楼层
定时器.c
-----------
/************************************************************************
文件名称:TimeCount.C
修改日期:2011/02/11
创建人:admvip

定时器0,定时器1的初始化和中断处理函数
************************************************************************/

#include <iom8v.h>
#include <AVRdef.h>
#include "TimeCount.h"


/*变量定义区*/
volatile unsigned char  g_ChannelData[CHANNELCOUNT];        //通道数据存储数组
volatile unsigned char  g_bInAllComplete  = FALSE;         //输入波形采集完成标志
volatile unsigned char  g_bOutAllComplete = TRUE;         //输出波形发送完成标志
volatile unsigned char  g_nInIndex  = 0;         //当前输入通道号
volatile unsigned char  g_nOutIndex = 0;         //当前输出通道号
volatile unsigned int   g_nPwmWidth = 0;         //被检测脉冲宽度
volatile unsigned char  g_bReceiveStart   = FALSE;         //通道数据接收开始标志
volatile unsigned int   s_nTC0_Count;
/********************************************/
//TIMER0 initialize - prescale:64
// desired value: 8uSec
// actual value:  8.000uSec (0.0%)
static void timer0_init(void)
{
TCCR0 = 0x00;        //stop
TCNT0 = 0xFF;        //set count
//TCCR0 = 0x03; //start timer
}

//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// Setp value:  8.000uSec (0.0%)
static void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00; //setup
TCNT1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x01;
OCR1BH = 0x00;
OCR1BL = 0x01;
ICR1H  = 0x00;
ICR1L  = 0x01;
TCCR1A = 0x00;
//TCCR1B bit6:1上升沿捕获  bit6:0下降沿捕获
//TCCR1B |= BIT(6);上升沿捕获   TCCR1B &= ~BIT(6);下降沿捕获
//根据需要可在捕获中断内变换
TCCR1B = 0x43; //start Timer
}

void TimeCount_init(void)
{
timer0_init();
timer1_init();
//TIMSK bit5:1使能TC1外部电平捕获  bit5:0禁止TC1外部电平捕获
TIMSK = 0x21;        //timer interrupt sources
DDRD |= 0xFC;        // 设置PD2-PD7为舵机信号输出端口
}

/***********************************************/

/***********************************************  
TC0溢出中断负责各通道PWM波形输出,每8us刷新一
次,中断内检测各通道数据,到达脉宽设定的通道结
束PWM输出。全部通道发送完毕后所有端口置低电平,
同时关闭TC0溢出中断,等待下一次数据输出。
***********************************************/
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{

TCNT0 = 0xFF;        //reload counter value
s_nTC0_Count++;

}



/***********************************************  
TC1输入捕获中断负责接收RC送来的PWM连续脉冲,
通过检测各通道的脉冲宽度来确定各通道的PWM数据,
有效通道脉冲全部接收完毕后打开TC0溢出中断实现
各通道的PWM波形分离输出。
***********************************************/
#pragma interrupt_handler timer1_capt_isr:iv_TIM1_CAPT
void timer1_capt_isr(void)
{
//timer 1 input capture event, read (int)value in ICR1 using;
// value=ICR1L;            //Read low byte first (important)
// value|=(int)ICR1H << 8; //Read high byte and shift into top byte
if (TCCR1B & BIT(6))        // 是否为上升沿触发?
{
TCNT1   = 0;          //  TC1计数器归零
TCCR1B &= ~BIT(6); //  修改为下降沿触发

} else
{
g_nPwmWidth = ICR1;         // 下降沿触发后保存有效的脉宽数据
TCCR1B |= BIT(6);         // 修改为上升沿触发,为下一次脉冲做准备

if (g_nPwmWidth > 625)        // 判断是否为超过5ms的脉冲,确定通道数据是否开始接收
{
g_bReceiveStart = TRUE;        // 接收开始标志置位
g_nInIndex = 0;         // 输入索引归零
} else
{
if (g_bReceiveStart)        // 判断接收开始标志置位,开始接受有效通道数据
{
g_ChannelData[g_nInIndex++] = (unsigned char) g_nPwmWidth;
if (g_nInIndex >= CHANNELCOUNT)        // 检测有效通道接收是否完成
{
g_bReceiveStart  = FALSE;          // 接收开始标志清零
g_bInAllComplete = TRUE;         // 接收完成标志置位
TCCR0 = 0x03;          // 启动TC0,准备信号输出
}
}
}//if (g_nPwmWidth > 625) End

}//if (TCCR1B & BIT(6)) End

}

void PWM_OUT(void)
{
s_nTC0_Count = 0;          //TC0计数器变量归零
while (g_bInAllComplete)
{
if (s_nTC0_Count < PULSEMaxWIDTH)
{
for (g_nOutIndex = 0; g_nOutIndex < CHANNELCOUNT; g_nOutIndex++)
{
if (g_ChannelData[g_nOutIndex] > s_nTC0_Count)
{
//按脉宽数据设置输出高电平,+2是为了调整端口索引和实际端口的差别,改变硬件连接时需要调整
PWMOUTPORT |= BIT(g_nOutIndex+2);
} else
{
//达到脉宽的通道电平置低
PWMOUTPORT &= ~BIT(g_nOutIndex+2);
}//if (g_ChannelData[g_nOutIndex] > s_nTC0_Count) End
}
} else
{
// 2.5ms时间到,所有舵机输出置低电平,结束一帧通道波形输出
PWMOUTPORT &= ~(BIT(CH1) | BIT(CH2) | BIT(CH3) | BIT(CH4) | BIT(CH5) | BIT(CH6));
if (s_nTC0_Count > 375)
{
//TCCR1B = 0x43; //start Timer
s_nTC0_Count = 0;        //TC0计数器变量归零
g_bInAllComplete = FALSE;
TCCR0 = 0x00;        //关闭TC0定时器,等待下一次输出
}
}//if (s_nTC0_Count < PULSEMaxWIDTH) End
}
}

出0入0汤圆

发表于 2012-2-27 11:23:21 | 显示全部楼层
主程序.c
---------------------
/****************************************************
       RC 4VF模型遥控器PWM单片机解码与控制
-----------------------------------------------------  
  MCU    :AVR M8
主    频 :8M  
编制日期 :20110211  
最后修订 :20110215  
程序版本 :Ver1.1  
-----------------------------------------------------  
程序概述:  
        使用M8的TC1的外部触发分别测量RC PWM信号的各个脉冲
宽度,用测量得到的数据按通道分别输出相应控制舵机能够  
是别的脉冲信号,实现对RC PWM的信号解调。
    RC PWM参数请在TimeCount.h文件里配置。  
    程序借鉴了部分徐江的控制代码,特此声明。  
-----------------------------------------------------  
程序功能模块:  
主程序模块  
定时中断处理模块  
串口调试模块  
-----------------------------------------------------  
RC PWM解码器硬件连接  
AVR M8 MCU  
-----------  
PB0    #14      ICP输入 <-------- 4VF PWM 输出信号
PD0    #2       RXD输入 <-------- 串口数据输入
PD1    #3       TXD输出 --------> 串口数据输出
PD2    #4               --------> CH1舵机控制输出
PD3           #5         --------> CH2舵机控制输出
PD4           #6         --------> CH3舵机控制输出
PD5           #11         --------> CH4舵机控制输出
PD6           #12         --------> CH5舵机控制输出
PD7           #13         --------> CH6舵机控制输出
-----------------------------------------------------
程序修订记录:
2011.02.12
修改了中断捕获部分的代码,增加了几个标志变量,便于程
序进程控制。将PWM的配置数据和中断使用的全局变量移至
TimeCount.c文件中,在TimeCount.h中做了引用声明。
经过上机调试,发现捕获中断不能被关闭,否则会漏抓一帧  
数据,导致输出不连续,分管输出信号的TC0可以在不使用  
的时候关闭掉,减轻CPU的运算负担。  
  
2011.02.15  
将中断处理PWM输出改为函数处理PWM输出,在主程序中循环  
调用PWM_OUT()函数即可实现连续PWM控制波形输出。  
****************************************************/

#include "config.h"


void port_init(void)
{
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}



//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
Uart_Init();
TimeCount_init();


MCUCR = 0x00;
GICR  = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main (void)
{
  init_devices();

  while (1)
  {
    PWM_OUT();
  }
}

出0入0汤圆

发表于 2012-3-25 21:07:14 | 显示全部楼层
支持,正在学习中。

出0入0汤圆

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

中断也好,定时器也,楼主的写法使用的单片机硬件是对的,但是处理方法不行,PPM信号的特点就是无止境的需要读取,20mS一个周期,每秒50HZ刷新率,建议做一个1uS定时器函数,用一个32位变量计数1uS值,上电就开始,中断采用电平变化中断,中断里面就很简单了,判断中断电平,读当前计数器值,等下次中断在读一次计数器值减去上一次读的,那么这样高低变化都可以读出来,保存到一个结构体里面,当然这里还需要判断4mS同步头后在写入结构体,1-8通道值。
这样做的好处,PPM信号有高电平和低电平变化之分,有的PPM信号是高电平变化,有的是低电平变化。这样做就不需要进行电平转换或者知道来的PPM信号是属于那种。第二整个采集进度是1uS,一般的PPM信号变化是0.5mS也就是500uS左右变化,精度非常高。第三中断里面语句不多,也不占用时间,不影响你的其他工作。
值得注意就是大概每隔1.19小时变量会溢出重新计数,这里要做一下处理,对于50Hz的PPM信号在这里丢掉一帧信号里面的一个通道信号是无所谓的,也就是会出现第一次计数值大于第二次的现象。思路就讲到这里,自己去思考

出0入0汤圆

发表于 2012-3-26 21:21:16 | 显示全部楼层
谁有STM32解码PPM的例子啊,分享下

出0入0汤圆

发表于 2012-6-3 22:54:54 | 显示全部楼层
很好 顶!

出0入0汤圆

发表于 2012-9-6 22:13:17 | 显示全部楼层
这么高手贴出自己编的程序,学习中

出0入0汤圆

发表于 2012-9-7 12:44:33 | 显示全部楼层
还是有点不明白,遥控器接收机出来有7个通道,一个外部中断怎么测这7个通道的信号?

出0入0汤圆

发表于 2012-9-9 11:09:35 | 显示全部楼层
同问,高手能出来解释一下吗?

出0入0汤圆

发表于 2013-2-5 22:06:32 | 显示全部楼层
很好的帖子,学习了

出0入0汤圆

发表于 2013-7-1 10:13:43 | 显示全部楼层
同求,有stm32做的吗

出0入0汤圆

发表于 2013-7-1 13:16:06 | 显示全部楼层
mark PPM 信号采集的想法

出0入0汤圆

发表于 2013-11-30 09:38:52 | 显示全部楼层
PPM编解码还好理解, 我想问下, RC遥控和接收机的对码工作在程序上是如何完成的呢? 如何保证一个接收机仅和对上码的发射机通讯?  要是有多个发射机,都是PPM信号,接收机是如何选择性地仅接收对应发射机信号而忽略其它发射机的?   

出0入0汤圆

发表于 2013-12-8 23:43:13 | 显示全部楼层
huang137 发表于 2012-3-26 02:50
中断也好,定时器也,楼主的写法使用的单片机硬件是对的,但是处理方法不行,PPM信号的特点就是无止境的需 ...

楼主好想法

出0入0汤圆

发表于 2013-12-11 00:06:36 | 显示全部楼层
怎么都是C编的程序啊,有没有用汇编编的,表示感谢!

出0入0汤圆

发表于 2014-1-5 22:37:53 | 显示全部楼层
想法不错,记号

出0入0汤圆

发表于 2014-1-6 19:47:51 | 显示全部楼层
  谢谢大家分享!

出0入0汤圆

发表于 2014-5-20 17:23:42 | 显示全部楼层
遥控器是ppm信号?我2.4G的飞控板可以跟遥控器通信吗?

出0入0汤圆

发表于 2014-8-8 14:10:47 | 显示全部楼层
majianjia 发表于 2011-7-22 01:04
呃LZ你是不是从PC软件编程刚刚才来学单片机编程的?
不能再中断里用while这种形式的东西,总之中断里面代码 ...

你好,能帮我设计个东西吗? 我是主要玩模型车的,也是想接收机上取信号 做一个小板子可以做联动同步实现转向灯,倒车灯等 还有第三通道控制大灯 (不想用舵机改造)

出0入0汤圆

发表于 2014-10-16 15:13:01 | 显示全部楼层
好贴啊。顶上了哦!

出0入0汤圆

发表于 2015-10-6 14:48:53 | 显示全部楼层
好贴,感谢楼主的分享

出0入0汤圆

发表于 2017-1-4 16:52:49 | 显示全部楼层
liguole 发表于 2011-7-22 20:34
/********************************************************************/
/*         Every time a posit ...

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

本版积分规则

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

GMT+8, 2024-4-25 10:10

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

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