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

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: 普加乔夫
打印 上一主题 下一主题

ppm信号怎么输入单片机啊 我都要哭了4

[复制链接]
21
发表于 2013-9-7 10:02 | 只看该作者
普加乔夫 发表于 2013-9-6 23:04
我加了个74ch04

脉冲来就开始计数,下次脉冲再来,看一下时间,时间在1-2ms之内就是脉冲宽,18-19ms就是低电平时间;

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

主题

  • 没有相关信息
  • 没有相关信息
  • 没有相关信息
22
 楼主| 发表于 2013-9-7 12:42 | 只看该作者
bugsplus 发表于 2013-9-7 10:02
脉冲来就开始计数,下次脉冲再来,看一下时间,时间在1-2ms之内就是脉冲宽,18-19ms就是低电平时间;

加了74ch04 1-2ms就是低电平了

23
发表于 2013-9-7 12:56 | 只看该作者
普加乔夫 发表于 2013-9-7 12:42
加了74ch04 1-2ms就是低电平了

en,那你打开timer测脉冲宽度就可以了
24
 楼主| 发表于 2013-9-7 13:24 | 只看该作者
bugsplus 发表于 2013-9-7 12:56
en,那你打开timer测脉冲宽度就可以了

写点程序看看行不
25
 楼主| 发表于 2013-9-7 13:26 | 只看该作者
普加乔夫 发表于 2013-9-7 13:24
写点程序看看行不

#include<reg52.h>
sbit in=P3^2;
sbit LED=P0^0;

void main(void)
{        unsigned int temp;
                        LED=0;
                TMOD=0x90;
                TH1=0;
                TL1=0;       
                while(P3^2);
                TR1=1;
                while(!P3^2);
                while(P3^2);
                TR1=0;
                temp=TH1;
                temp=(temp<<8)|TL1;
                if(temp>100)
                        LED=1;
        while(1);
}
这是没加74ch04写的 但没用 从接收机引出发的ppm信号输入p32脚 led没反应


26
发表于 2013-9-7 14:20 | 只看该作者
确定硬件电路没问题?
你最好把uart打开,不然很难查问题;
网上搜搜,串口打印函数;
27
发表于 2013-9-7 14:40 | 只看该作者
那个temp>100
这个条件你实际算过吗?20ms时间
说不定每次都溢出了,所以你判断不到
28
发表于 2013-9-7 18:39 | 只看该作者
昨晚把输入检测写好了,现在手机上网,明天贴上来。

可以贴上了:

//ICC-AVR application builder : 2012/7/27 17:49:05
// Target : M16
// Crystal: 16.000Mhz

#include <iom16v.h>
#include <macros.h>


int out_f = 100,
//设置输出频率,单位Hz

ch_in_01,
   
//存储ch1的输入值

ch_in_02,
//存储ch2的输入值

ch_out_01,
//存储ch1的输出值

ch_out_02,
//存储ch2的输出值

int0_rising,

int0_falling,

int1_rising,

int1_falling;


char int0_ovf_count,

int1_ovf_count;
  //这里记录上升沿后timer1的溢出次数


void port_init(void)
{
PORTA = 0x0F;
DDRA  = 0xF0;
//PORTA最高4位为输出端口
PORTB = 0xFF;
DDRB  = 0x00;
PORTC = 0xFF;
DDRC  = 0x00;
PORTD = 0xFF;
DDRD  = 0x30;
}

//TIMER1 initialize - prescale:8
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 10000uSec
// actual value: 10000.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00;
  //stop
TCNT1H = 0x00;
  //setup
TCNT1L = 0x00;
  OCR1A = ch_out_01;
  OCR1B = ch_out_02;
  ICR1  = out_f*100*2;
   

//16M晶振;8分频;实际TOP数值为20000;TOP值可以用“out_f”进行修改;
TCCR1A|= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
//OC1A/B 比较匹配时输出低电平;WGM13:WGM10配置TC1为快速PWM、TOP值=ICR1;
TCCR1B|= (1<<WGM13)|(1<<WGM12)|(1<<CS11);
//时钟8分频,每2个时钟=1uS;
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x00 /*INVALID SETTING*/; //reload counter high value
TCNT1L = 0x00 /*INVALID SETTING*/; //reload counter low value
int0_ovf_count++;
int1_ovf_count++;

ch_out_01 = (unsigned long)ch_in_01/100*75+(ch_in_02>>1);
//更新ch1的输出值

ch_out_02 = (unsigned long)ch_in_01/100*75-(ch_in_02>>1);
//更新ch2的输出值
}

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{//external interupt on INT0  PD2

if(PIND & 0x04)//如果PD2为高电平,证明是上升沿触发

{

int0_rising = TCNT1;

int0_ovf_count = 0;

}

else

{

int0_falling = TCNT1;
//读取当前寄存器数值

ch_in_01 =(unsigned long)int0_ovf_count*ICR1+(unsigned long)int0_falling-(unsigned long)int0_rising;

}
}

#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{//external interupt on INT1 PD3

if(PIND & 0x08)//如果PD3为高电平,证明是上升沿触发

{

int1_rising = TCNT1;

int1_ovf_count = 0;

}

else

{

int1_falling = TCNT1;
//读取当前寄存器数值

ch_in_02 =(unsigned long)int1_ovf_count*ICR1+(unsigned long)int1_falling-(unsigned long)int1_rising;

}
}


//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
TIMSK |= 1<<TOIE1;   
  
//开timer1溢出中断

  GICR |= (1<<INT1)|(1<<INT0);
//开启外部中断int1,int0
MCUCR |= (1<<ISC10)|(1<<ISC00);
  
//设置int1,int0电平变化触发中断
SEI(); //re-enable interrupts
//all peripherals are now initialized
}








void main(void)
{
init_devices();
while(1)
{
;
}

}

[ 本帖最后由 n44303 于 2012-8-1 23:43 编辑 ]


29
 楼主| 发表于 2013-9-7 19:50 | 只看该作者
bugsplus 发表于 2013-9-7 14:20
确定硬件电路没问题?
你最好把uart打开,不然很难查问题;
网上搜搜,串口打印函数;

硬件没问题

30
 楼主| 发表于 2013-9-7 19:52 | 只看该作者
n44303 发表于 2013-9-7 18:39
昨晚把输入检测写好了,现在手机上网,明天贴上来。

可以贴上了:

哥哥 你这是啥芯片啊

31
发表于 2013-9-9 15:28 | 只看该作者
兄弟,你还是老老实实自己写代码吧,用别人的更麻烦;、
先把uart打开,能打印调试信息;
32
发表于 2013-9-9 15:34 | 只看该作者
#include < reg52.h >
#include < intrins.h >
#include < stdio.h >

#define uchar unsigned char
#define uint  unsigned int

/**********************************************************
*                                                         *
*  延时函数                                               *
*                                                         *
**********************************************************/
void delay(int ms)
{
    uchar i;
    while(ms--)
{
   for(i=0;i<250;i++)  
    {
     _nop_();      
  _nop_();
  _nop_();
  _nop_();
    }
}
}

/**********************************************************
*                                                         *
* 主程序                                                  *
*                                                         *
**********************************************************/
main()
{  
   SCON=0x50;      //串口模式1,允许接收
   TMOD=0x20;      //定时器1为模式2,8-bit 自动装载方式
   PCON=0x00;      //波特率不倍增

   TL1=0xfd;
   TH1=0xfd;      //波特率9600
   TI=1;          //TI 置1,以发送第一个字节
   TR1=1;         //启动定时器 T1

   while(1)
   {
      printf (" 5imx 航模朋友大家好\n"); //向PC机发送数据
      delay(500);
      printf (" welcome to \n");           //向PC机发送数据
   delay(500);
      printf (" test  \n");                  //向PC机发送数据
   delay(500);
   printf (" \n");                                    //向PC端发送数据
   delay(500);
   }
}

/*********************************************************
33
发表于 2013-9-11 16:00 | 只看该作者
兄弟,加油啊;这个代码不难,你先把单片机跑起来,打开串口,打印出调试信息,写程序就很快了。
你先把我上面代码复制一下,用串口精灵接串口打印到pc上看一下;
34
 楼主| 发表于 2013-9-14 13:02 | 只看该作者
bugsplus 发表于 2013-9-11 16:00
兄弟,加油啊;这个代码不难,你先把单片机跑起来,打开串口,打印出调试信息,写程序就很快了。
你先把我 ...

无尽感激  能加我qq吗 934415937

35
发表于 2013-9-14 21:56 | 只看该作者
51用了还是不准确 AVR或其他有输入捕捉的要好用的多 而且好像不能捕捉下降沿
36
 楼主| 发表于 2013-9-15 09:30 | 只看该作者
我买了一款ppm解码板 试试看看能不能弄好 要能弄好 就开始用stm32

37
发表于 2013-9-15 10:46 | 只看该作者
楼主,我觉得你先把51单片机玩转,写这个代码很简单的;
比你开发其他方案简单得多;
1:51调试串口搞出来;
2:外部中断搞起来;
3:timer搞起来;
代码就没几行了。。。。
38
 楼主| 发表于 2013-9-15 19:06 | 只看该作者
bugsplus 发表于 2013-9-15 10:46
楼主,我觉得你先把51单片机玩转,写这个代码很简单的;
比你开发其他方案简单得多;
1:51调试串口搞出来 ...

好吧


39
发表于 2013-9-15 22:54 | 只看该作者
呵呵我也是正在学这个呢
有性趣联系吧
QQ:546861544
40
发表于 2013-9-15 22:57 | 只看该作者
我是天地飞7的
测试了一下,输出频率40Hz,控制脉宽为5ms,其中2.5ms为固有,2.5ms为调节,油门时2.5ms为零,5ms时为100%
其他控制为3.75为中立点.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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