在使用LoRa模组的过程中,对于依赖电池供电的设备而言,载波活动检测(CAD)是极为重要的。然而,在实际应用CAD检测时,用户可能会遭遇若干典型的问题。本文旨在对这些问题进行详细解析,以期帮助模组用户更加高效且准确地运用CAD检测功能。
过程
01
唤醒包
唤醒包就是一个数据包,只是和普通的数据包有些差异。
如下是一个普通数据包的配置:
G_LoRaConfig.PreambleLength = 0x0008; //前导码长度
G_LoRaConfig.PayloadLength = 190; //数据包长度
即该普通数据包的前导码长度为8,数包长度为190。
把这个普通数据包的配置改一下,如下:
G_LoRaConfig.PreambleLength = 0x00FF; //前导码长度
G_LoRaConfig.PayloadLength = 4; //数据包长度
即该普通数据包的前导码长度为255,数包长度为4。这也是一个数据包,但是这个数据包就可以作为唤醒包了。
所以需要知道唤醒包就是一个数据包,只是和常规的数据包的差别是唤醒包的前导码长度很长有效数据负载部分很短,而普通数据包的前导码长度很短有效数据负载部分可以长些也可以短些。
02
接收端CAD检测时检测的不只是前导码
接收端CAD检测时检测的是LoRa信号,而不是只检测前导码。
先看发送端的数据包配置:
G_LoRaConfig.PreambleLength = 0x0008; //前导码长度
G_LoRaConfig.PayloadLength = 190; //数据包长度
发送的是一个普通数据包。
前导码长度为8,数据负载长度为190,每1.35秒发射一次(MX_TIM3_Init_Ms(1350);//定时器初始化)
电流波形如下:
可见:数据包占用时长约1300秒,中间空余时间约50ms。
然后再看在发送端没有开启时接收端的CAD检测的配置:每给检测周期大概155ms,每个周期中睡眠时间大概100ms,检测窗口大概35ms。
然后把发送端上电,在看接收端,给检测周期大概155ms,每个周期中睡眠时间大概100ms,检测窗口大概35ms,和没启动发送端时基本相同。
按照如如上测试结果,如果接收端CAD检测时只检测的是前导码,则CAD每次检测中CADDONE和CADACTIVITY的比值将远远大于1(比如50:1),如果CAD检测时检测的是LoRa信号,则CADDONE和CADACTIVITY的比值将非常接近大1(比如50:49),实测时如下图(141:140),非常接近于1。所以这就可以回答使用者的一个疑问,就是CAD检测时检测的确实时LoRa信号,而不是只检测前导码。
03
CADDONE和CADACTIVITY的触发关系
每次启动CAD检测后,CADDONE中断一定会触发,该中断表示CAD检测完毕了,但是是否检测到了LoRa信号无法确定。
是否检测到了LoRa信号了还要看CADACTIVITY是否被触发了,如果CADACTIVITY也被触发了,才说明确实检测到了LoRa信号。
就是说CADDONE中断产生了CADACTIVITY中断未必产生,但是我们的例程中如果CADACTIVITY中断产生了则CADDONE中断一定会产生。
这里只需要看下如下了一个有问题大代码,就清楚了,如下是应用中的一个错误。
如上这段代码跑起来的话,会有一个现象:每次启动CAD检测后,CADDONE中断总能检测到,但是CADACTIVITY中断永远检测不到。
这里错误的原因是使用的是使用了如下逻辑:
if( xxxx)
{xxxx}
else if(判断CADDONE)
{ xxxx }
else if(判断CADACTIVITY)
{xxxx}
如上逻辑错误的地方就是没有理解清楚如上说的CADDONE和CADACTIVITY的触发关系。
正确的逻辑应该是:
if( xxxx)
{xxxx}
if(判断CADDONE)
{
if(判断CADACTIVITY)
{xxxx}
}
04
CADACTIVITY误检测
实际使用中,常常会发现主机端没有上电或者没有发送唤醒包,但是从机端依然会触发CADACTIVITY标志。
这种现象常常被称作误检测。
例如用我司的实例代码的配置直接测试如上代码,并且关闭发送端,此时误检测率达到20%(如下图41:202)
改善误检测的方法主要有如下:
(1)换个频点
(2)改变参数配置中的极性参数:
G_LoRaConfig.InvertIQ = LORA_IQ_NORMAL; //IQ信号格式,
LORA_IQ_NORMAL:标准模式,
LORA_IQ_INVERTED:反转模式;
(3)改用等效波特率更高的参数配置
(4)最显著的是改变CAD检测的符号个数
比如如上测到的误检测率达到20%(如下图41:202)就是在该值使用2时的结果,该值越大越不容易产生误检测。
如下把改制改成8。
再做如上测试的结果如下:
误检测率降低为0.43%(2:462)。需要说明的是该值用的的比较小的话(比如使用1或者2等),想把误检测率降低到1%以下是不太现实的。
该值使用比较大的值的话可以降低误检测率,但是检测窗口时间长度就会加大。所以这里只能平衡的考虑选用那个值。
05
唤醒包和常规数据包的切换
结论
1、唤醒包就是比较特殊的数据包。
2、接收端CAD检测时检测的是LoRa信号,而不是只检测前导码。
3、CADDONE中断产生了CADACTIVITY中断未必产生,但是我们的例程中如果CADACTIVITY中断产生了则CADDONE中断一定会产生。
4、处理CADDONE中断和CADACTIVITY中断的软件逻辑注意不要错误。
5、CADACTIVITY误检测要想明显降低需要CAD检测窗口时间长度做一定的牺牲。
全部0条评论
快来发表一下你的评论吧 !