[其他] MM32射频解码

[复制链接]
882|11
 楼主| 4c1l 发表于 2022-11-18 18:36 | 显示全部楼层 |阅读模式
MM32射频解码(产品检验,可靠稳定)MM32射频解码

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

 楼主| 4c1l 发表于 2022-11-18 18:37 | 显示全部楼层
 下表为定义的产品遥控码格式。产品具备冷暖灯及调光功能,风扇的正反转,以及APP的Wifi控制。
8488763776044c76af.png
 楼主| 4c1l 发表于 2022-11-18 18:39 | 显示全部楼层
 射频解码程序如下,经过检验,稳定可靠,完成产品级别的交付。
  1. // MM32射频解码
  2. uint8_t RF;
  3. uint8_t HW,LW;                                                                     //高低电平宽度
  4. uint8_t Code_x;                                                            //接受到第几位编码
  5. uint8_t FRemote1,FRemote2,FRemote3,FRemote4;                 //第一次接收到遥控编码,这四个依次从高到低存放遥控码的32位
  6. uint8_t Encode1,Encode2,Encode3,Encode4;                        //解码寄存器
  7. uint8_t SRemote1,SRemote2,SRemote3,SRemote4;                 //第二次接收到遥控编码
  8. uint8_t rf_ok1,rf_ok2,rf_ok;                                    //解码过程中的临时接收成功标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了
  9. uint8_t old_level;                                                            //保存上一次查询到的电平状态
  10. uint8_t Syn;                                                                      //接收到同步码时置1
  11. uint8_t Decode_ok;                                                      //判断按键结束,规定时间内未接收到同步码时置1
  12. uint16_t s;                                                                                        //二次接收的规定时间
  13. uint16_t time;                                                                                                                                       
  14. uint8_t rf_data[4];                                                                  //接受码存放
  15. uint8_t Code_check=1;                                                                //对码标志
  16. uint8_t num_y=0;                                                                        //长按YELLOW计数
  17. uint8_t num_w=0;                                                                        //长按WHITE计数
  18. uint8_t num_o=0;                                                                        //长按OFF计数

  19. void TIM2_IRQHandler(void)
  20. {
  21.        
  22.     if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  23.     {
  24.                        
  25.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

  26.         RF = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
  27.         if (!RF)
  28.         {
  29.             LW++;   
  30.                      
  31.             old_level=0;
  32.         }               
  33.          else         
  34.          {
  35.             HW++;
  36.             if (!old_level)                  //检测电平从低到高的跳变,已检测到一个(高-低)完整电平周期
  37.                            
  38.             {   
  39.                 if (((HW>=3)&&(HW<=5))&&((LW>=120)&&(LW<=130)))         //同步码
  40.                 {
  41.                                                                                
  42.                     Syn = 1 ;
  43.                                         time=640;
  44.                                         Decode_ok=0;
  45.                     Code_x = 0;
  46.                     FRemote1=0; FRemote2=0; FRemote3=0; FRemote4=0;   
  47.                 }
  48.                 else if((Syn)&&((LW>=10)&&(LW<=14)))                                //判0
  49.                 {   
  50.                     Code_x++;
  51.                     if(Code_x>31)
  52.                     {
  53.                         if(!rf_ok1)                                                         //rf_ok1临时接收成功
  54.                         {                                                                           //将接收到的编码复制到解码寄存器中
  55.                             Encode1=FRemote1;
  56.                             Encode2=FRemote2;
  57.                             Encode3=FRemote3;
  58.                             Encode4=FRemote4;
  59.                                                                            
  60.                             rf_ok1=1;                                            //通知解码子程序可以解码      
  61.                             Syn=0;
  62.                             s=1000;   
  63.                                                                                                                
  64.                             }
  65.                             else
  66.                             {                                                                        //将接收到的编码复制到解码寄存器中
  67.                                 SRemote1=FRemote1;
  68.                                 SRemote2=FRemote2;
  69.                                 SRemote3=FRemote3;
  70.                                 SRemote4=FRemote4;  
  71.                                                             
  72.                                 rf_ok2=1;                                      //通知解码子程序可以解码      
  73.                                 Syn=0;                                                                        
  74.                             }
  75.                         }
  76.                      }  
  77.                      else if ((Syn)&&((LW>=2)&&(LW<=6)))                   //判1
  78.                      {
  79.                          switch (Code_x)
  80.                          {
  81.                          case 0 : { FRemote1=FRemote1 | 0x80; break; }   
  82.                          case 1 : { FRemote1=FRemote1 | 0x40; break; }
  83.                          case 2 : { FRemote1=FRemote1 | 0x20; break; }
  84.                          case 3 : { FRemote1=FRemote1 | 0x10; break; }
  85.                          case 4 : { FRemote1=FRemote1 | 0x08; break; }
  86.                          case 5 : { FRemote1=FRemote1 | 0x04; break; }
  87.                          case 6 : { FRemote1=FRemote1 | 0x02; break; }
  88.                          case 7 : { FRemote1=FRemote1 | 0x01; break; }
  89.                          case 8 : { FRemote2=FRemote2 | 0x80; break; }
  90.                          case 9 : { FRemote2=FRemote2 | 0x40; break; }
  91.                          case 10: { FRemote2=FRemote2 | 0x20; break; }
  92.                          case 11: { FRemote2=FRemote2 | 0x10; break; }
  93.                          case 12: { FRemote2=FRemote2 | 0x08; break; }
  94.                          case 13: { FRemote2=FRemote2 | 0x04; break; }
  95.                          case 14: { FRemote2=FRemote2 | 0x02; break; }
  96.                          case 15: { FRemote2=FRemote2 | 0x01; break; }
  97.                          case 16: { FRemote3=FRemote3 | 0x80; break; }
  98.                          case 17: { FRemote3=FRemote3 | 0x40; break; }
  99.                          case 18: { FRemote3=FRemote3 | 0x20; break; }
  100.                          case 19: { FRemote3=FRemote3 | 0x10; break; }
  101.                          case 20: { FRemote3=FRemote3 | 0x08; break; }
  102.                          case 21: { FRemote3=FRemote3 | 0x04; break; }
  103.                          case 22: { FRemote3=FRemote3 | 0x02; break; }
  104.                          case 23: { FRemote3=FRemote3 | 0x01; break; }      
  105.                          case 24: { FRemote4=FRemote4 | 0x80; break; }
  106.                          case 25: { FRemote4=FRemote4 | 0x40; break; }
  107.                          case 26: { FRemote4=FRemote4 | 0x20; break; }
  108.                          case 27: { FRemote4=FRemote4 | 0x10; break; }
  109.                          case 28: { FRemote4=FRemote4 | 0x08; break; }
  110.                          case 29: { FRemote4=FRemote4 | 0x04; break; }
  111.                          case 30: { FRemote4=FRemote4 | 0x02; break; }
  112.                          case 31: { FRemote4=FRemote4 | 0x01;                                                                                                  
  113.                                   if(!rf_ok1)
  114.                                   {
  115.                                                                         Encode1=FRemote1;
  116.                                                                         Encode2=FRemote2;
  117.                                                                         Encode3=FRemote3;
  118.                                                                         Encode4=FRemote4;
  119.                                                                                                                                                
  120.                                      rf_ok1=1;         
  121.                                      Syn=0;
  122.                                      break;                                 
  123.                                   }
  124.                                   else
  125.                                   {
  126.                                                                         SRemote1=FRemote1;
  127.                                                                         SRemote2=FRemote2;
  128.                                                                         SRemote3=FRemote3;
  129.                                                                         SRemote4=FRemote4;
  130.                                                                                                                                                
  131.                                     rf_ok2=1;                                      
  132.                                     Syn=0;
  133.                                     break;                                                                          
  134.                                  }                                    
  135.                          }
  136.                     }
  137.                     Code_x++;
  138.                  }
  139.                  else
  140.                  {
  141.                                                                                
  142.                                 Code_x=0; Syn=0;FRemote1=0;FRemote2=0;
  143.                                 FRemote3=0; HW=1;LW=0;Decode_ok=1;
  144.                                                                                
  145.                                                                  }                                    
  146.                  LW=0;HW=1;
  147.              }         
  148.              old_level=1;      
  149.        }
  150.                                  
  151.                         if(Decode_ok)
  152.                         {
  153.                                
  154.                                          if(rf_ok1)                                                  //规定时间内接收到两帧相同的数据才有效
  155.                                                 {
  156.                                                                 s--;
  157.                                                                
  158.                                                                 if(!s) rf_ok1=0;

  159.                                                                
  160.                                                                 if(rf_ok2)
  161.                                                                 {
  162.                                                                 if((Encode1==SRemote1)&&(Encode2==SRemote2)&&(Encode3==SRemote3))
  163.                                                                 {
  164.                                                                                 rf_ok=1;
  165.                                                                                 rf_ok1=0;
  166.                                                                                 rf_ok2=0;
  167.                                                                                 time=200;                                                       
  168.                                                                 }
  169.                                                                 else
  170.                                                                 {
  171.                                                                                 rf_ok=0;
  172.                                                                                 rf_ok1=0;
  173.                                                                                 rf_ok2=0;

  174.                                                                  }         
  175.                                                         }                  
  176.                                                 }
  177.                
  178.                         if(rf_ok)                                                      //判断是否接收成功
  179.                         {
  180.                                        
  181.                                         TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
  182.                                         rf_ok=0;
  183.                                         rf_data[0]=Encode1;
  184.                                         rf_data[1]=Encode2;
  185.                                         rf_data[2]=Encode3;
  186.                                         rf_data[3]=Encode4;
  187.                                        
  188.                                         /*YELLOW 接收*/
  189.                                         if((rf_data[2]&0x05)==0x05)
  190.                                                
  191.                                         {num_y++;num_w=0;num_o=0;}
  192.                                        
  193.                                         /*OFF 接收*/
  194.                                         else if((rf_data[2]&0x01)==0x01)
  195.                                                
  196.                                         {num_o++;num_y=0;num_w=0;}
  197.                                        
  198.                                         /*WHITE 接收*/
  199.                                         else if((rf_data[2]&0x06)==0x06)
  200.                                                
  201.                                         {num_w++;num_o=0;num_y=0;}
  202.                                        
  203.                                         /*其余键接收*/
  204.                                         else
  205.                                                
  206.                                         {num_y=0;num_w=0;num_o=0;}
  207.                                        
  208.                                         /*产测*/
  209.                                         if(((rf_data[2]&0x01)==0x01)&&(num_o>=20)&&(Code_check==0))                                                                                                                
  210.                                         {
  211.                                                 mcu_start_wifitest();
  212.                                         }

  213.                                         /*配网*/
  214.                                         if(((rf_data[2]&0x06)==0x06)&&(num_w>=20)&&(Code_check==0))                                                                                                                
  215.                                         {
  216.                                                 //mcu_set_wifi_mode(SMART_CONFIG);
  217.                                                 mcu_reset_wifi();
  218.                                         }
  219.                                        
  220.                                         /*对码*/
  221.                                         if(((rf_data[2]&0x05)==0x05)&&(num_y>=5)&&(Code_check==1))                
  222.                                         {
  223.                                                 REMOTE_ID1 = rf_data[0];
  224.                                                 REMOTE_ID2 = rf_data[1];
  225.                                                 REMOTE_ID3 = rf_data[2]&0xf0;
  226.                                                
  227.                                                 Code_check = 0;
  228.                                                
  229.                                                 Buzz_Ring(500);
  230.                                                
  231.                                         }               
  232.                                        
  233.                                         else                                                                        //正常遥控过程
  234.                                         {       
  235.                                                 Remote_Scan();                                                //接收码校验
  236.                                                        
  237.                                                 OperationCode_Send();
  238.                                                
  239.                                         }

  240.                                         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  241.                         }
  242.    }
  243.   }
  244. }

tpgf 发表于 2022-12-6 15:42 | 显示全部楼层
如何确定我已经检测到一个(高-低)完整电平周期呢
qcliu 发表于 2022-12-6 15:58 | 显示全部楼层
我们常用的专用的解码寄存器是多大的呢
drer 发表于 2022-12-6 16:16 | 显示全部楼层
case语句里边的分支选项可以通过算法进行精简吗
coshi 发表于 2022-12-6 16:37 | 显示全部楼层
做射频解码需要专用的电缆 在做pcb的时候布线有要求吗
kxsi 发表于 2022-12-6 16:52 | 显示全部楼层
我们可以采取哪些措施保证射频解码的稳定性呢
wiba 发表于 2022-12-6 17:00 | 显示全部楼层
对射频解码存在不同的方式或者说算法吗
小小蚂蚁举千斤 发表于 2022-12-20 18:30 | 显示全部楼层
楼主,您好!关于射频信号的稳定性PCB板层面有哪些注意事项?
szt1993 发表于 2022-12-21 20:53 | 显示全部楼层
tpgf 发表于 2022-12-6 15:42
如何确定我已经检测到一个(高-低)完整电平周期呢

我也没看明白一个周期是如何检测的,用的时实系统嘛
星辰大海不退缩 发表于 2022-12-22 16:11 | 显示全部楼层
楼主这个周期是如何控制的?依靠什么程序手段或是算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

703

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部