4. CAD(信道活动检测)与RSSI在同步中的作用
好,咱们进入第四讲。这一章我打算聊聊CAD和RSSI——这两个东西在LoRa同步里扮演的角色,说实话,比很多人想象的要重要得多。
我刚开始做LoRa项目时,觉得同步嘛,无非就是发个前导码,收端检测到就完事了。后来被现实狠狠教育了一顿——尤其是在低功耗场景下,你不可能让接收机一直开着。这时候,CAD就成了救命稻草。
4.1 CAD模式原理:到底在检测什么?
CAD,全称Channel Activity Detection,信道活动检测。说白了,就是让芯片以极低的功耗去“偷听”一下信道里有没有LoRa信号。
它的工作方式很有意思。芯片会打开接收链路,但只开很短的时间——大概相当于几个symbol的长度。在这段时间里,它会采样I/Q数据,然后跟已知的LoRa前导码特征做匹配。
匹配上了,就产生一个CAD中断,告诉你“嘿,有人在发数据”。没匹配上,芯片就继续睡大觉。
关键点:CAD检测的不是数据内容,而是前导码的“存在性”。它只关心有没有LoRa信号,不关心信号里是什么。
我习惯把CAD比作门卫。门卫不需要知道来访者是谁、来干嘛,只需要判断“有没有人来了”。这个判断过程要快、要省电。
具体到寄存器层面,CAD模式通过设置RegOpMode的Mode字段为0b1000来进入。芯片会自动完成采样、匹配、判决,然后退出。
// 进入CAD模式的典型配置
void enterCADMode() {
// 设置模式为CAD
writeRegister(RegOpMode, 0x8B); // CAD模式 + LoRa + 低频
// 等待CAD完成
while((readRegister(RegIrqFlags) & 0x01) == 0);
// 读取CAD检测结果
uint8_t cadDetected = readRegister(RegIrqFlags) & 0x02;
if(cadDetected) {
// 检测到前导码,准备接收
setMode(RX_CONTINUOUS);
} else {
// 没检测到,继续休眠
setMode(SLEEP);
}
}
嗯,这里要注意一点:CAD完成后,芯片会自动回到待机模式。你需要手动切换到接收模式才能收数据。这个细节我当年就踩过坑——检测到了,但忘了切模式,结果数据全丢了。
4.2 RSSI阈值设定:不是越大越好
RSSI,Received Signal Strength Indicator,接收信号强度指示。在CAD里,RSSI的作用是辅助判决——光有前导码特征匹配还不够,信号强度也得够。
为什么?因为噪声里也可能出现类似前导码的波形。尤其是在信噪比很低的时候,误检率会飙升。加一个RSSI阈值,相当于加了一道保险。
阈值设多少合适?我个人的经验是:
- 对于室内环境: -100dBm 到 -110dBm 之间。室内干扰少,可以设低一点。
- 对于室外环境: -115dBm 到 -120dBm。室外信号衰减大,阈值设高了会漏检。
- 对于工业环境: -95dBm 到 -105dBm。工业干扰多,阈值设高一点减少误触发。
| 应用场景 | 推荐RSSI阈值 | 说明 |
|---|---|---|
| 室内/家庭 | -105 dBm | 干扰少,可接受较低信噪比 |
| 室外/城市 | -115 dBm | 信号衰减大,需降低阈值 |
| 工业/工厂 | -100 dBm | 电磁干扰多,提高阈值防误检 |
| 地下/隧道 | -120 dBm | 信号极弱,阈值必须放低 |
你可能会问:阈值设低了,误检怎么办?设高了,漏检怎么办?
这个问题没有标准答案。我一般会在产品里留一个配置接口,让现场工程师根据实际环境调。你想想看,一个抄表系统装在小区里,跟装在化工厂里,环境能一样吗?
小技巧:可以在产品启动时做一次RSSI扫描,统计背景噪声的平均值,然后动态设定阈值。比如:阈值 = 背景噪声 + 6dB。这样能自适应不同环境。
4.3 实际应用中的坑:我踩过的那些雷
这部分我得多说几句。CAD和RSSI看起来简单,实际用起来坑不少。我一个个说。
坑一:CAD检测到信号,但接收不到数据
我曾经在一个项目中遇到这个问题。CAD中断来了,我切到接收模式,结果等了半天没收到数据。查了半天,发现是前导码长度太短。
LoRa的前导码默认是12个symbol。CAD检测需要至少4-6个symbol来完成匹配。如果你把前导码设成8个symbol,CAD可能刚检测到,前导码就结束了,来不及切到接收模式。
解决办法:前导码长度不要低于10个symbol。我习惯用12个,稳妥。
坑二:RSSI阈值导致漏检
有一次在郊区做测试,设备老是丢包。我检查了所有配置,都没问题。后来用频谱仪一看,发现信号强度在-118dBm左右,而我的阈值设的是-110dBm。
说白了,阈值设得太高了,信号被“拒之门外”了。
解决办法:把阈值降到-120dBm,问题解决。但代价是误检率稍微上升了一点——不过在这个场景下可以接受。
坑三:CAD频繁误触发,功耗飙升
这个坑发生在工业现场。设备周围有大功率电机,启动时会产生强烈的电磁干扰。CAD被频繁触发,芯片不断从休眠切到接收模式,功耗直接翻了好几倍。
我当时的做法是:在CAD检测到信号后,不立即切到接收模式,而是再做一次RSSI确认。如果RSSI在短时间内跳变超过10dB,就认为是干扰,忽略这次CAD中断。
// 抗干扰的CAD处理流程
void onCADInterrupt() {
if(cadDetected) {
// 读取当前RSSI
int16_t rssi1 = readRSSI();
delay(1); // 等1ms
int16_t rssi2 = readRSSI();
// 如果RSSI变化太大,认为是干扰
if(abs(rssi2 - rssi1) > 10) {
// 干扰,忽略
setMode(SLEEP);
return;
}
// 正常信号,准备接收
setMode(RX_CONTINUOUS);
}
}
警告:不要在生产环境中直接使用上述代码中的delay()。实际项目中应该用定时器或状态机来实现延时,避免阻塞主循环。
坑四:不同SF下CAD表现差异巨大
这个很多人不知道。SF7和SF12下,CAD的检测灵敏度是不一样的。SF12的symbol时间长,CAD有更多时间做匹配,所以灵敏度更高。SF7的symbol时间短,CAD容易漏检。
我做过实测:在相同RSSI下,SF12的CAD检测成功率比SF7高出约15%。
建议:如果你的系统使用自适应速率(ADR),在切换到低SF时,适当提高RSSI阈值,或者增加前导码长度来补偿。
4.4 总结一下
CAD和RSSI是LoRa同步中的两个重要工具。CAD负责“有没有信号”,RSSI负责“信号够不够强”。两者配合好了,能大幅降低功耗、提高可靠性。
但要注意:
- 前导码长度别太短,至少10个symbol
- RSSI阈值要根据环境动态调整
- 工业现场要做好抗干扰处理
- 不同SF下CAD表现不同,需要区别对待
下一章我会讲同步字(Sync Word)的配置和常见问题。那个坑也不少,尤其是多设备共存的时候。咱们下回见。