OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 25090|回复: 8

红外输入捕获解码

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2011-4-13
在线时间
0 小时
发表于 2011-4-28 11:20:07 | 显示全部楼层 |阅读模式

原子大哥,我又来了。。。还是那个红外解码的问题,我尝试了用TIM2的CH2来做红外的输入捕获,然后解码。编了个程序,但是实现不了,由于刚上手,参考其他人的程序,再到例程里修改的,麻烦你帮我看看是中断没设置好,还是其他什么问题,拜托了。(还是对开发板附带的遥控解码)

#include <stm32f10x_lib.h>
#include "stm32f10x_tim.h"
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "led.h"
#include "exti.h"
#include "timer.h"
#include "lcd.h"   
//#include "24cxx.h"
//#include "flash.h"
//#include "24l01.h"
//#include "mmc_sd.h"
#include "remote.h"
//Mini STM32开发板范例代码21
//红外遥控 实验
//正点原子@ALIENTEK
//2010.6.17 

extern vu8 startflag;
vu16 ccd [80] = {0}  ;       
int main(void)

 int i;
 u8 k1;
 u8 k2;
// u8 k3;
// u8 k4;
// u8 k5;
// u8 k6;            
   Stm32_Clock_Init(9);//系统时钟设置
 RCC->APB2ENR|=0X0000483D;  //使能IOA,B,C,D,AFIO,USART1,TIM1,2,3,4
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化    
 LCD_Init();   //初始化液晶 
 LED_Init();         //LED初始化 
 
 

 
       
  OINT_COLOR=RED;//设置字体为红色   
 LCD_ShowString(60,50,"Mini STM32"); 
 LCD_ShowString(60,70,"REMOTE TEST"); 
 LCD_ShowString(60,90,"ATOM@ALIENTEK");
 LCD_ShowString(60,110,"2010/6/17");
 LCD_ShowString(30,130, "KEY1:");
// LCD_ShowString(30,150, "KEY2:");  
// LCD_ShowString(30,170, "KEY3:");

   
 Remote_Init();     //初始化红外接收
 Timerx_Init(65535,29);
    
// LCD_ShowString(30,130, "KEYVAL:");
// LCD_ShowString(130,130,"KEYCNT:");  
// LCD_ShowString(30,150, "SYMBOL:");
 while (1)
  {
  
   delay_ms(10);

   if(startflag==1) //接收到遥控码
   {
     startflag=0;
  k1 = 0 ;
     for(i= 0 ;i< 8 ; i++ )
     {
         k1 |= ccd[16+i]<<i ;  //第三字节
     }

     k2 = 0 ;
     for(i= 0 ;i< 8 ; i++ )
     {
         k2 |= ccd[24+i]<<i ; //第四字节
     }

     if(k1 + k2 == 255)
     {
         USART1->DR=k1;
   LCD_ShowNum(40,130,k1,3,16);//显示设备码
   printf("get key intput %2X  \r\n" , k1 ) ;
     }
 }
  }
}

#include "remote.h"
#include "delay.h"
//Mini STM32开发板
//红外遥控接收 驱动函数
//正点原子@ALIENTEK
//2010/6/17      
 
//初始化红外接收引脚的设置 
void Remote_Init(void)
{       
 RCC->APB2ENR|=1<<2;       //PA时钟使能   
 GPIOA->CRL&=0XFFFFFF0F;
 GPIOA->CRL|=0X00000080; //PA1输入 
 GPIOA->ODR|=1<<1;  //PA.1上拉     
 Ex_NVIC_Config(GPIO_A,1,FTIR);//将line1映射到PA.1,下降沿触发.
}

#include <stm32f10x_lib.h>
#include "stm32f10x_tim.h"
#include "timer.h"
#include "led.h"
//Mini STM32开发板
//通用定时器 驱动代码   
//正点原子@ALIENTEK
//2010/6/1

vu8 irtime,irCode;            //红外用全局变量
vu8 irpro_ok,irok;           //完成标志位
vu8 IRcord[4],irdata[33];
vu8 beginIRrcv=0;//开始接收到遥控的标志
vu8 irNum;
vu8 startflag;
//定时器2中断服务程序
//
void TIM2_IRQHandler(void)
{                 
 //if(TIM3->SR&0X0001)//溢出中断
 //{
 // LED1=!LED1;                             
 //}      
 //TIM3->SR&=~(1<<0);//清除中断标志位
    extern vu8 startflag;
 extern vu16 ccd [80] ;
 static int id = 0 ;
 
 static vu16  cur = 0 ;
 static vu16  last  = 0 ;
 
 u16 step ;
 int   fh;
 
 if(TIM_GetITStatus( TIM2,  TIM_IT_CC2 ))
 {
 TIM_ClearITPendingBit(TIM2,  TIM_IT_CC2);
 
 //ccd[id ++ ] = TIM_GetCapture2(TIM3) ;
          
 cur = TIM_GetCapture2(TIM2) ;
 
 #if 1
 if(cur > last )
 {
     step = cur - last ;
 }
 else
 {
     step = 65535 - last + cur ;
 }
 //step 为两次捕获的计数值的差,为了避免浮点数运算,此处,把浮点数放大十倍,转换成整数计算。
 fh = step *10 / (2400) ;
 
   
        
 if( (fh > 130) && (fh <140) )    //同步开始头,13.5ms
 {
     id = 0 ;
 }
   
    else if( (fh > 9 ) && (fh <13 ))  // 1.125ms
    {
        ccd[id ++ ] = 0 ;
    }
 
    else if( (fh > 20 ) && (fh <24 ))   // 2.245ms
    {
        ccd[id ++ ] = 1 ;
    }

//    else if( (fh > 40 ) && (fh <60 ))   // 5ms,后置单脉冲
//    {
//         id = 0 ;
//      startflag=1;;
//    }
   
    #endif
 if(id >=32)
 {
   id = 0 ;
  startflag=1;
 //TIM_Cmd(TIM3, DISABLE );
            // cur =
 //TIM_ITConfig( TIM3,  TIM_IT_CC2 , DISABLE) ;
 }       
 }
 
 last = cur ;
}




红外解码.rar

2.13 MB, 下载次数: 1995

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-4-28 11:47:19 | 显示全部楼层
输入捕获这功能我还没用过呢,等我用了之后给你个demo参考参考.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-4-28 11:48:55 | 显示全部楼层
输入捕获这功能我还没用过呢,等我用了之后给你个demo参考参考.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2011-4-13
在线时间
0 小时
 楼主| 发表于 2011-4-28 12:09:50 | 显示全部楼层
嗯,好滴,可是能不能尽快啊?我赶着交任务。。。
回复 支持 反对

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2011-4-13
在线时间
0 小时
 楼主| 发表于 2011-4-28 12:14:34 | 显示全部楼层
回复【3楼】正点原子:
-------------------------------
要不你就用这个红外做吧,嘿嘿~~~
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2011-5-1
在线时间
0 小时
发表于 2011-5-5 21:08:47 | 显示全部楼层

我最近用外部中断和定时器实现了红外解码,让某个定时器不停地计数,在外部信号的上下沿中断里记录定时器的时间,后一个时间减去前一个就能测量出高低电平的宽度,然后判断就ok了;
void EXTI1_IRQHandler(void)
{      
 u32 interval=0;
 if( EXTI->R&(1<<1) )
 {
  switch(remote_sta)  
  {
   case REMOTE_IDLE:
   {
     EXTI->FTSR&=~(1<<1);
       EXTI->RTSR|=1<<1   ;
    remote_sta = REMOTE_9MS;
    pre_tim2_cnt_h=tim2_cnt_h;
    pre_tim2_cnt_l=TIM2->CNT;
     break;
   }
   case REMOTE_9MS:
   { 
        EXTI->FTSR|=1<<1;
        EXTI->RTSR&=~(1<<1);
     if(tim2_cnt_h==pre_tim2_cnt_h)
     {
      interval=TIM2->CNT - pre_tim2_cnt_l;
     }
     else if(tim2_cnt_h==pre_tim2_cnt_h+1)
     {
      interval=TIM2->CNT-pre_tim2_cnt_l+60000;
     }
     else
     {
      interval=60000;
     }
    
     if(interval>=170 && interval<=190)    //  9ms/0.05ms=180
     {
      remote_sta = REMOTE_4_5MS; 
     }
     else
     {
      remote_sta = REMOTE_IDLE;
     }
     //printf("pre_tim2_cnt_h=%d tim2_cnt_h=%d pre_tim2_cnt_l=%d TIM2->CNT=%d", \
     //         pre_tim2_cnt_h,tim2_cnt_h,pre_tim2_cnt_l,TIM2->CNT);
     pre_tim2_cnt_h=tim2_cnt_h;
     pre_tim2_cnt_l=TIM2->CNT;

     break;
   }    
   case REMOTE_4_5MS:
   {

      if(tim2_cnt_h==pre_tim2_cnt_h)
     {
      interval=TIM2->CNT - pre_tim2_cnt_l;
     }
     else if(tim2_cnt_h==pre_tim2_cnt_h+1)
     {
      interval=TIM2->CNT-pre_tim2_cnt_l+60000;
     }
     else
     {
      interval=60000;
     }
    
     if(interval>=80 && interval<=100)    //  4.5ms/0.05ms=90
     {
      remote_sta = REMOTE_DATA; 
     }
     else
     {
      remote_sta = REMOTE_IDLE;
     }

   //  printf("pre_tim2_cnt_h=%d tim2_cnt_h=%d pre_tim2_cnt_l=%d TIM2->CNT=%d\r\n", \
   //        pre_tim2_cnt_h,tim2_cnt_h,pre_tim2_cnt_l,TIM2->CNT);
     pre_tim2_cnt_h=tim2_cnt_h;
     pre_tim2_cnt_l=TIM2->CNT;
    break;
   }
   case REMOTE_DATA:
   {
    if(tim2_cnt_h==pre_tim2_cnt_h)
     {
      interval=TIM2->CNT - pre_tim2_cnt_l;
     }
     else if(tim2_cnt_h==pre_tim2_cnt_h+1)
     {
      interval=TIM2->CNT-pre_tim2_cnt_l+60000;
     }
     else
     {
      interval=60000;
     }
    pre_tim2_cnt_h=tim2_cnt_h;
    pre_tim2_cnt_l=TIM2->CNT;
    remote_data_cnt++;
   // if(55==remote_data_cnt)
   //    { printf("pre_tim2_cnt_h=%d tim2_cnt_h=%d pre_tim2_cnt_l=%d TIM2->CNT=%d", \
   //          pre_tim2_cnt_h,tim2_cnt_h,pre_tim2_cnt_l,TIM2->CNT);
   // }
    remote_data<<=1;
    if(interval>=39 && interval<=50)      //  (0.56ms+1.68)ms/0.05ms=44.8   高电平
     {
      remote_data|=1; 
     }
    else if(interval>=17 && interval<=28 )   //  (0.56ms+0.56)ms/0.05ms=22.4   低电平
     {
      remote_data|=0;
     }
    else
    {
    }

    if(32==remote_data_cnt)
    {
     remote_data_rdy=TRUE;
     remote_sta = REMOTE_IDLE;
     remote_data_cnt=0;
    // printf("data=%x\r\n",remote_data);
    }
     break;
   }
   default:
   {
        remote_sta = REMOTE_IDLE;
      EXTI->FTSR|=1<<1 ;
      EXTI->RTSR&=~(1<<1) ;
         break;
   }       
  }
 }    
 EXTI->R|=1<<1;      //清除中断标志位   

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-5-5 22:47:25 | 显示全部楼层
回复【6楼】wlp1981:
-------------------------------
这也是个方法.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-11-19
在线时间
0 小时
发表于 2012-11-19 17:10:18 | 显示全部楼层
回复【6楼】wlp1981:
---------------------------------
亲,我想看看你红外解码的全部程序,行不
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-3-3 00:12:27 | 显示全部楼层
我其他都没看,但是我感觉终端里面尽量少做处理,我最近在搞一个万能遥控器,主要针对38K载波的,因为接收头的限制,暂时只做这个频率的。我请教一下原子哥,为什么对于一样的脉冲数据差好多,比如都是560US的脉冲,我是用1US的精度去捕获的,为什么两个数据差的情况下会有30多
参加过电子设计大赛,玩过单片机,搞过DSP,fpga也接触过,可惜学的不精,在此就是来好好研究的,请多多关照
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 06:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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