打印
[其他]

MM32射频解码

[复制链接]
564|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4c1l|  楼主 | 2022-11-18 18:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
MM32射频解码(产品检验,可靠稳定)MM32射频解码

  本人曾负责开发风扇灯产品,故将射频解码的算法和程序进行总结,以便日后学习完善,也与大家分享。射频模块与MM32的通信协议为类似于EV1527的协议,每帧发送32位数据,前20位为地址码,接着4位为相应的操作码,最后一个字节的高4位为动作码,协议最后1位为同步位,为0。下图为1527协议的编码方式。


使用特权

评论回复
沙发
4c1l|  楼主 | 2022-11-18 18:37 | 只看该作者
 下表为定义的产品遥控码格式。产品具备冷暖灯及调光功能,风扇的正反转,以及APP的Wifi控制。

使用特权

评论回复
板凳
4c1l|  楼主 | 2022-11-18 18:39 | 只看该作者
 射频解码程序如下,经过检验,稳定可靠,完成产品级别的交付。
// MM32射频解码
uint8_t RF;
uint8_t HW,LW;                                                                     //高低电平宽度
uint8_t Code_x;                                                            //接受到第几位编码
uint8_t FRemote1,FRemote2,FRemote3,FRemote4;                 //第一次接收到遥控编码,这四个依次从高到低存放遥控码的32位
uint8_t Encode1,Encode2,Encode3,Encode4;                        //解码寄存器
uint8_t SRemote1,SRemote2,SRemote3,SRemote4;                 //第二次接收到遥控编码
uint8_t rf_ok1,rf_ok2,rf_ok;                                    //解码过程中的临时接收成功标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了
uint8_t old_level;                                                            //保存上一次查询到的电平状态
uint8_t Syn;                                                                      //接收到同步码时置1
uint8_t Decode_ok;                                                      //判断按键结束,规定时间内未接收到同步码时置1
uint16_t s;                                                                                        //二次接收的规定时间
uint16_t time;                                                                                                                                       
uint8_t rf_data[4];                                                                  //接受码存放
uint8_t Code_check=1;                                                                //对码标志
uint8_t num_y=0;                                                                        //长按YELLOW计数
uint8_t num_w=0;                                                                        //长按WHITE计数
uint8_t num_o=0;                                                                        //长按OFF计数

void TIM2_IRQHandler(void)
{
       
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
                       
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

        RF = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
        if (!RF)
        {
            LW++;   
                     
            old_level=0;
        }               
         else         
         {
            HW++;
            if (!old_level)                  //检测电平从低到高的跳变,已检测到一个(高-低)完整电平周期
                           
            {   
                if (((HW>=3)&&(HW<=5))&&((LW>=120)&&(LW<=130)))         //同步码
                {
                                                                               
                    Syn = 1 ;
                                        time=640;
                                        Decode_ok=0;
                    Code_x = 0;
                    FRemote1=0; FRemote2=0; FRemote3=0; FRemote4=0;   
                }
                else if((Syn)&&((LW>=10)&&(LW<=14)))                                //判0
                {   
                    Code_x++;
                    if(Code_x>31)
                    {
                        if(!rf_ok1)                                                         //rf_ok1临时接收成功
                        {                                                                           //将接收到的编码复制到解码寄存器中
                            Encode1=FRemote1;
                            Encode2=FRemote2;
                            Encode3=FRemote3;
                            Encode4=FRemote4;
                                                                           
                            rf_ok1=1;                                            //通知解码子程序可以解码      
                            Syn=0;
                            s=1000;   
                                                                                                               
                            }
                            else
                            {                                                                        //将接收到的编码复制到解码寄存器中
                                SRemote1=FRemote1;
                                SRemote2=FRemote2;
                                SRemote3=FRemote3;
                                SRemote4=FRemote4;  
                                                            
                                rf_ok2=1;                                      //通知解码子程序可以解码      
                                Syn=0;                                                                        
                            }
                        }
                     }  
                     else if ((Syn)&&((LW>=2)&&(LW<=6)))                   //判1
                     {
                         switch (Code_x)
                         {
                         case 0 : { FRemote1=FRemote1 | 0x80; break; }   
                         case 1 : { FRemote1=FRemote1 | 0x40; break; }
                         case 2 : { FRemote1=FRemote1 | 0x20; break; }
                         case 3 : { FRemote1=FRemote1 | 0x10; break; }
                         case 4 : { FRemote1=FRemote1 | 0x08; break; }
                         case 5 : { FRemote1=FRemote1 | 0x04; break; }
                         case 6 : { FRemote1=FRemote1 | 0x02; break; }
                         case 7 : { FRemote1=FRemote1 | 0x01; break; }
                         case 8 : { FRemote2=FRemote2 | 0x80; break; }
                         case 9 : { FRemote2=FRemote2 | 0x40; break; }
                         case 10: { FRemote2=FRemote2 | 0x20; break; }
                         case 11: { FRemote2=FRemote2 | 0x10; break; }
                         case 12: { FRemote2=FRemote2 | 0x08; break; }
                         case 13: { FRemote2=FRemote2 | 0x04; break; }
                         case 14: { FRemote2=FRemote2 | 0x02; break; }
                         case 15: { FRemote2=FRemote2 | 0x01; break; }
                         case 16: { FRemote3=FRemote3 | 0x80; break; }
                         case 17: { FRemote3=FRemote3 | 0x40; break; }
                         case 18: { FRemote3=FRemote3 | 0x20; break; }
                         case 19: { FRemote3=FRemote3 | 0x10; break; }
                         case 20: { FRemote3=FRemote3 | 0x08; break; }
                         case 21: { FRemote3=FRemote3 | 0x04; break; }
                         case 22: { FRemote3=FRemote3 | 0x02; break; }
                         case 23: { FRemote3=FRemote3 | 0x01; break; }      
                         case 24: { FRemote4=FRemote4 | 0x80; break; }
                         case 25: { FRemote4=FRemote4 | 0x40; break; }
                         case 26: { FRemote4=FRemote4 | 0x20; break; }
                         case 27: { FRemote4=FRemote4 | 0x10; break; }
                         case 28: { FRemote4=FRemote4 | 0x08; break; }
                         case 29: { FRemote4=FRemote4 | 0x04; break; }
                         case 30: { FRemote4=FRemote4 | 0x02; break; }
                         case 31: { FRemote4=FRemote4 | 0x01;                                                                                                  
                                  if(!rf_ok1)
                                  {
                                                                        Encode1=FRemote1;
                                                                        Encode2=FRemote2;
                                                                        Encode3=FRemote3;
                                                                        Encode4=FRemote4;
                                                                                                                                               
                                     rf_ok1=1;         
                                     Syn=0;
                                     break;                                 
                                  }
                                  else
                                  {
                                                                        SRemote1=FRemote1;
                                                                        SRemote2=FRemote2;
                                                                        SRemote3=FRemote3;
                                                                        SRemote4=FRemote4;
                                                                                                                                               
                                    rf_ok2=1;                                      
                                    Syn=0;
                                    break;                                                                          
                                 }                                    
                         }
                    }
                    Code_x++;
                 }
                 else
                 {
                                                                               
                                Code_x=0; Syn=0;FRemote1=0;FRemote2=0;
                                FRemote3=0; HW=1;LW=0;Decode_ok=1;
                                                                               
                                                                 }                                    
                 LW=0;HW=1;
             }         
             old_level=1;      
       }
                                 
                        if(Decode_ok)
                        {
                               
                                         if(rf_ok1)                                                  //规定时间内接收到两帧相同的数据才有效
                                                {
                                                                s--;
                                                               
                                                                if(!s) rf_ok1=0;

                                                               
                                                                if(rf_ok2)
                                                                {
                                                                if((Encode1==SRemote1)&&(Encode2==SRemote2)&&(Encode3==SRemote3))
                                                                {
                                                                                rf_ok=1;
                                                                                rf_ok1=0;
                                                                                rf_ok2=0;
                                                                                time=200;                                                       
                                                                }
                                                                else
                                                                {
                                                                                rf_ok=0;
                                                                                rf_ok1=0;
                                                                                rf_ok2=0;

                                                                 }         
                                                        }                  
                                                }
               
                        if(rf_ok)                                                      //判断是否接收成功
                        {
                                       
                                        TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
                                        rf_ok=0;
                                        rf_data[0]=Encode1;
                                        rf_data[1]=Encode2;
                                        rf_data[2]=Encode3;
                                        rf_data[3]=Encode4;
                                       
                                        /*YELLOW 接收*/
                                        if((rf_data[2]&0x05)==0x05)
                                               
                                        {num_y++;num_w=0;num_o=0;}
                                       
                                        /*OFF 接收*/
                                        else if((rf_data[2]&0x01)==0x01)
                                               
                                        {num_o++;num_y=0;num_w=0;}
                                       
                                        /*WHITE 接收*/
                                        else if((rf_data[2]&0x06)==0x06)
                                               
                                        {num_w++;num_o=0;num_y=0;}
                                       
                                        /*其余键接收*/
                                        else
                                               
                                        {num_y=0;num_w=0;num_o=0;}
                                       
                                        /*产测*/
                                        if(((rf_data[2]&0x01)==0x01)&&(num_o>=20)&&(Code_check==0))                                                                                                                
                                        {
                                                mcu_start_wifitest();
                                        }

                                        /*配网*/
                                        if(((rf_data[2]&0x06)==0x06)&&(num_w>=20)&&(Code_check==0))                                                                                                                
                                        {
                                                //mcu_set_wifi_mode(SMART_CONFIG);
                                                mcu_reset_wifi();
                                        }
                                       
                                        /*对码*/
                                        if(((rf_data[2]&0x05)==0x05)&&(num_y>=5)&&(Code_check==1))                
                                        {
                                                REMOTE_ID1 = rf_data[0];
                                                REMOTE_ID2 = rf_data[1];
                                                REMOTE_ID3 = rf_data[2]&0xf0;
                                               
                                                Code_check = 0;
                                               
                                                Buzz_Ring(500);
                                               
                                        }               
                                       
                                        else                                                                        //正常遥控过程
                                        {       
                                                Remote_Scan();                                                //接收码校验
                                                       
                                                OperationCode_Send();
                                               
                                        }

                                        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
                        }
   }
  }
}

使用特权

评论回复
地板
tpgf| | 2022-12-6 15:42 | 只看该作者
如何确定我已经检测到一个(高-低)完整电平周期呢

使用特权

评论回复
5
qcliu| | 2022-12-6 15:58 | 只看该作者
我们常用的专用的解码寄存器是多大的呢

使用特权

评论回复
6
drer| | 2022-12-6 16:16 | 只看该作者
case语句里边的分支选项可以通过算法进行精简吗

使用特权

评论回复
7
coshi| | 2022-12-6 16:37 | 只看该作者
做射频解码需要专用的电缆 在做pcb的时候布线有要求吗

使用特权

评论回复
8
kxsi| | 2022-12-6 16:52 | 只看该作者
我们可以采取哪些措施保证射频解码的稳定性呢

使用特权

评论回复
9
wiba| | 2022-12-6 17:00 | 只看该作者
对射频解码存在不同的方式或者说算法吗

使用特权

评论回复
10
小小蚂蚁举千斤| | 2022-12-20 18:30 | 只看该作者
楼主,您好!关于射频信号的稳定性PCB板层面有哪些注意事项?

使用特权

评论回复
11
szt1993| | 2022-12-21 20:53 | 只看该作者
tpgf 发表于 2022-12-6 15:42
如何确定我已经检测到一个(高-低)完整电平周期呢

我也没看明白一个周期是如何检测的,用的时实系统嘛

使用特权

评论回复
12
星辰大海不退缩| | 2022-12-22 16:11 | 只看该作者
楼主这个周期是如何控制的?依靠什么程序手段或是算法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

566

帖子

2

粉丝