433M解码,坛友们喜欢用中断还是主循环?没想到干扰真多
别人给了个板子,上面无线接收芯片是CMT2210A,单片机是STM8S103F3P6,已经将一个信噪比阈值的参数设置为75(出厂默认54),希望降低干扰,但是干扰信号还是非常多。用中断方式写了下解码,连续2次接收到正确数据判断为接收成功,偶尔会失败,因为干扰太多了,头一次接收正确,第二次的数据被破坏了。
这逻辑分析仪的截图是没按遥控器时候抓取的,那么多干扰,stm8的定时器输入捕获模式频繁进中断了。
我是用中断的,主要是把中断里的处理量减少。 一心2013 发表于 2019-10-13 22:36
我是用中断的,主要是把中断里的处理量减少。
我这有个500Hz的周期性干扰,搞不清楚哪里来的{:lol:}
CMT2210A设置休眠唤醒模式干扰会降低很多,只是需要发射持续一段时间。 zhw950 发表于 2019-10-13 22:46
CMT2210A设置休眠唤醒模式干扰会降低很多,只是需要发射持续一段时间。
默认就是休眠几个ms的吧,这个我没有修改 定时器,50US中断一次,进行IO扫描计数非常好用. 用定时查询吧 sz-wtp 发表于 2019-10-13 23:04
定时器,50US中断一次,进行IO扫描计数非常好用.
你是定时器中断进去查询,20kHz,对stm8来说有点高了 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; 68336016 发表于 2019-10-13 22:41
我这有个500Hz的周期性干扰,搞不清楚哪里来的
应该是环境杂波吧,以前用过315 433模块,这种模块似乎没有任何过滤,直接收到什么就送过来,然后也是一堆杂波,我当时是在中断里处理,接收一个马上记录然后退出 定时器里面直接计数查询好的很 定时查询方式抗扰能力比较强 学习一下{:lol:} 定时器中断方式比较可靠。外部边沿中断,或定时器捕获中断万一遇到客户那边有连续强干扰的情况,单片机就做不了别的事了。 我都是125us的基本定时器 进入后查询IO口状态 来解码的。 用定时器做,抗干扰比较强。
页:
[1]