DAHAIGE-355079 发表于 2015-11-24 14:27:31

【NUCLEO-L476RG开发】EV1527解码

本帖最后由 DAHAIGE-355079 于 2015-11-24 14:27 编辑

现在低功耗,无线发射接收应用很普遍,本文就电动车遥控器常用的发射IC:EV1527解码做介绍。EV1527发射出来的波是进行调制过后的,借条电路有很多种,有专用的IC解调,有用分立元件搭的超再生解调电路,本文不做电路讲解;
需要知道的就是一条,经过解调出来的波形就是一串高低电平。
本测试EV1527的参数是:
工作电压:DC6V
OSC电阻:360K。
具体见EV1527的数据手册。
//************************************************************************************************************
unsigned char hh_w,ll_w;         //高,低电平宽度
unsigned char ma_x;                //接收到第几位编码了
unsigned char mma1,mma2,mma3,mma4; //用于解码过程
unsigned char old_rc5;             //保存上一次查询到的电平状态
unsigned char tb_ok;               //接收到同步的马时置1

unsigned char rf_ok;               //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
unsigned char bma1,bma2,bma3,bma4; //用于接收过程存放遥控编码

// 4t = 1.81ms
//time 180us调用
void DecodingEv1527(void)
{
unsigned char RC5;

//GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);    //连接逻辑分析仪,查看T0中断时间间隔

RC5 = GPIO_ReadInputPin(Ev1527_GPIO_PORT, Ev1527_GPIO_PINS);
if(!RC5)// 检测到低电平 低电平时间加1,记录本次电平状态
{
    ll_w++;
    old_rc5=0;
}         
else                                    // 检测到高电平
{
    hh_w++;
    if (!old_rc5)                        // 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
    {
      if (((hh_w>=2)&&(hh_w<=3))&&((ll_w>=60)&&(ll_w<=93)))          //判同步码
      {
      ma_x=0; tb_ok=1; bma1=0; bma2=0; bma3=0; bma4=0;
      }
      else if ((tb_ok)&&((ll_w>=6)&&(ll_w<=9))) //已经接收到同步码,判0
      {
      ma_x++;
      }   
      else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=3)))
      {
      switch (ma_x)
         {
         case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第1位
         case 1 : { bma1=bma1 | 0x40; break; }
         case 2 : { bma1=bma1 | 0x20; break; }
         case 3 : { bma1=bma1 | 0x10; break; }
         case 4 : { bma1=bma1 | 0x08; break; }
         case 5 : { bma1=bma1 | 0x04; break; }
         case 6 : { bma1=bma1 | 0x02; break; }
         case 7 : { bma1=bma1 | 0x01; break; }
         case 8 : { bma2=bma2 | 0x80; break; }
         case 9 : { bma2=bma2 | 0x40; break; }
         case 10: { bma2=bma2 | 0x20; break; }
         case 11: { bma2=bma2 | 0x10; break; }
         case 12: { bma2=bma2 | 0x08; break; }
         case 13: { bma2=bma2 | 0x04; break; }
         case 14: { bma2=bma2 | 0x02; break; }
         case 15: { bma2=bma2 | 0x01; break; }
         case 16: { bma3=bma3 | 0x80; break; }
         case 17: { bma3=bma3 | 0x40; break; }
         case 18: { bma3=bma3 | 0x20; break; }
         case 19: { bma3=bma3 | 0x10; break; }
         case 20: { bma4=bma4 | 0x80; break; }//按键状态第1位
         case 21: { bma4=bma4 | 0x40; break; }
         case 22: { bma4=bma4 | 0x20; break; }
         case 23: { bma4=bma4 | 0x10;
             //         mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中
                                                            //在下一行设一个断点,用ICD2调试                                 
             //         rf_ok=1;                              // 通知解码子程序可以解码了
                      break;
                  }
         default:break;
         }
      ma_x++;
    }
    else //接收到不符合的高-低电平序列
    {
      ma_x=0; tb_ok=0; bma1=0; bma2=0; bma3=0; bma4=0;
    }
    if(ma_x == 23)
    {
      mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中
                                              //在下一行设一个断点,用ICD2调试                                 
      rf_ok=1;
   }
    ll_w=0;hh_w=1;
   }         
   old_rc5=1;      // 记录本次电平状态
}




}



DAHAIGE-355079 发表于 2015-11-24 14:30:40

@沐紫,不好意思这些天太忙了

沐紫 发表于 2015-11-24 14:47:32

DAHAIGE-355079 发表于 2015-11-24 14:30
@沐紫,不好意思这些天太忙了

谢谢你的分享~

dsjsjf 发表于 2015-11-24 21:07:40

谢谢分享

1107869545 发表于 2016-9-2 10:55:37

请问下:
// 4t = 1.81ms
//time 180us调用
怎么算的?:)

kernel_sa 发表于 2016-9-20 00:55:09

下载来看看啊,。。
页: [1]
查看完整版本: 【NUCLEO-L476RG开发】EV1527解码