在对一款433MHz遥控器协议进行单片机软件解码时,一位实习生很快完成了代码编写与初步调试,并报告短距离测试效果良好。
然而,当进行整机室外拉距测试时,问题出现了:通信距离超过十几米后,信号接收就变得很不稳定,灵敏度大幅下降。硬件平台本身是经过验证的,之前的解码方案可以实现100米以上的稳定通信,因此问题很可能出在软件解码逻辑上。
该433MHz协议的基本波形规则如下:用600微秒的高电平加300微秒的低电平代表逻辑“1”,用300微秒的高电平加600微秒的低电平代表逻辑“0”(此处暂不讨论引导码等复杂部分)。

实习生的解码思路是采用定时器的输入捕获功能。她通过捕获每个上升沿与下降沿,来精确测量每一个高电平和低电平的持续时间,再根据时间长度(允许一定误差)来判断是“1”还是“0”。
这种方法在信号干净、距离近时确实可行。但在复杂的户外环境中,无线通信信号会混入大量的随机干扰杂波,如下图所示:

可以看到,一个本应持续600微秒的纯净高电平,可能会被一个持续时间极短(例如仅5微秒)的低电平脉冲干扰所打断。如果使用输入捕获方式,这个突如其来的下降沿会被误判为信号跳变,从而打断正常的电平计时,导致解码失败。
优化方案:定时采样与软件滤波
针对脉冲干扰的问题,优化的核心思路是将边沿捕获改为周期定时采样。
具体方法是:配置一个定时器,每隔一个固定的短周期(例如50微秒)对信号引脚的电平状态进行一次采样。对于一个600微秒的高电平,在理想情况下会连续采样到12次高电平。通过统计连续采样的次数,就可以判断当前处于有效的高电平还是低电平阶段。
这种方法的优势在于,由于采样点是固定的,短暂的脉冲干扰(其宽度远小于采样周期)有很大的概率被“忽略”掉——它可能恰好落在两次采样之间,或者仅影响一次采样结果,而不会像边沿捕获那样直接打断计时逻辑。
此外,可以在单片机软件中增加滤波机制来进一步提升鲁棒性。例如,规定必须连续采样到两次或以上相同的电平,才认为电平发生了有效变化,这可以进一步滤除单次采样的偶然错误。
这种方案不仅抗干扰能力强,而且对MCU的计算资源消耗较小,程序结构也更简单清晰。
按照这个思路修改代码后,重新进行户外测试,通信距离稳定地达到了100米以上,成功解决了长距离通信不稳定的问题。

关于433MHz等无线协议的软件解码,你是否还有其他高效的抗干扰方法或实战经验?欢迎在评论区分享交流。
|