68336016 发表于 2019-10-13 22:25:49

433M解码,坛友们喜欢用中断还是主循环?没想到干扰真多

别人给了个板子,上面无线接收芯片是CMT2210A,单片机是STM8S103F3P6,已经将一个信噪比阈值的参数设置为75(出厂默认54),希望降低干扰,但是干扰信号还是非常多。

用中断方式写了下解码,连续2次接收到正确数据判断为接收成功,偶尔会失败,因为干扰太多了,头一次接收正确,第二次的数据被破坏了。

这逻辑分析仪的截图是没按遥控器时候抓取的,那么多干扰,stm8的定时器输入捕获模式频繁进中断了。

一心2013 发表于 2019-10-13 22:36:44

我是用中断的,主要是把中断里的处理量减少。

68336016 发表于 2019-10-13 22:41:04

一心2013 发表于 2019-10-13 22:36
我是用中断的,主要是把中断里的处理量减少。

我这有个500Hz的周期性干扰,搞不清楚哪里来的{:lol:}

zhw950 发表于 2019-10-13 22:46:59

CMT2210A设置休眠唤醒模式干扰会降低很多,只是需要发射持续一段时间。

68336016 发表于 2019-10-13 22:49:32

zhw950 发表于 2019-10-13 22:46
CMT2210A设置休眠唤醒模式干扰会降低很多,只是需要发射持续一段时间。

默认就是休眠几个ms的吧,这个我没有修改

sz-wtp 发表于 2019-10-13 23:04:35

定时器,50US中断一次,进行IO扫描计数非常好用.

miscell 发表于 2019-10-13 23:05:29

用定时查询吧

68336016 发表于 2019-10-13 23:07:49

sz-wtp 发表于 2019-10-13 23:04
定时器,50US中断一次,进行IO扫描计数非常好用.

你是定时器中断进去查询,20kHz,对stm8来说有点高了

sz-wtp 发表于 2019-10-13 23:13:00

68336016 发表于 2019-10-13 23:07
你是定时器中断进去查询,20kHz,对stm8来说有点高了

一点也不高,效果非常好.
这个是解码程序.你参考一下.每50uS中断扫一次IO.

    IoState =IR_RXD;
    if(IoState){
      if(TimeH<250)TimeH++;
    }
    else{
      if(TimeL<250)TimeL++;
    }

    if((!IoState)&&(UpState)){        //下降沿
      if(Task==0){            //收同步头
                        if((TimeL<=(228+50))&&(TimeL>=(228-50))){
                                if((TimeH<=(113+30))&&(TimeH>=(113-30))){
                      BitCount=0;
                      ByteCount=0;
                                        Task++;
                                }
                else if((TimeH<=(56+20))&&(TimeH>=(56-20))){
                                        if(IrTime !=0){
                                                IrTime=30;
                                               
                                                if(IrCode !=0xFF)IrOkFlag=1;
                                        }
                                }
            }
      }
      else if(Task==1){       //收数据
            if((TimeL<=(14+5))&&(TimeL>=(14-5))){
                if((TimeH<=(14+5))&&(TimeH>=(14-5)))      RxData &= ~(1<<BitCount);
                else if((TimeH<=(41+10))&&(TimeH>=(41-10))) RxData |= (1<<BitCount);
                else                                        Task=0;

                BitCount++;
                if(BitCount>=8){
                  BitCount=0;
                  ByteCount++;
                  if(ByteCount>=4){
                        ByteCount=0;
                                               
                                                if((((RxData==0x00) && (RxData==0xBF)) || (SET_IR==0)) && ((RxData^RxData) ==0xFF)){
                                                        IrCode=RxData;
                                                        IrLockCode=IrCode;
                                                        IrOkFlag=1;
                                                        IrTime=30;
                                                }
                                                Task=0;
                  }
                }
            }
            else{
                Task=0;
            }
      }
      else{
            Task=0;
      }

      TimeH=0;
      TimeL=0;
    }

    UpState=IoState;

一心2013 发表于 2019-10-14 08:30:52

68336016 发表于 2019-10-13 22:41
我这有个500Hz的周期性干扰,搞不清楚哪里来的

应该是环境杂波吧,以前用过315 433模块,这种模块似乎没有任何过滤,直接收到什么就送过来,然后也是一堆杂波,我当时是在中断里处理,接收一个马上记录然后退出

chen849928055 发表于 2019-10-14 09:15:08

定时器里面直接计数查询好的很

kap 发表于 2019-10-14 09:20:15

定时查询方式抗扰能力比较强

zzj2009a1 发表于 2019-10-14 09:42:49

学习一下{:lol:}

anjiyifan 发表于 2019-10-14 09:49:25

定时器中断方式比较可靠。外部边沿中断,或定时器捕获中断万一遇到客户那边有连续强干扰的情况,单片机就做不了别的事了。

kebaojun305 发表于 2019-10-14 14:28:23

我都是125us的基本定时器 进入后查询IO口状态 来解码的。

qtechzdh 发表于 2019-10-14 14:31:53

用定时器做,抗干扰比较强。
页: [1]
查看完整版本: 433M解码,坛友们喜欢用中断还是主循环?没想到干扰真多