在使用LoRa模組的過(guò)程中,對(duì)于依賴電池供電的設(shè)備而言,載波活動(dòng)檢測(cè)(CAD)是極為重要的。然而,在實(shí)際應(yīng)用CAD檢測(cè)時(shí),用戶可能會(huì)遭遇若干典型的問(wèn)題。本文旨在對(duì)這些問(wèn)題進(jìn)行詳細(xì)解析,以期幫助模組用戶更加高效且準(zhǔn)確地運(yùn)用CAD檢測(cè)功能。
過(guò)程
01
喚醒包
喚醒包就是一個(gè)數(shù)據(jù)包,只是和普通的數(shù)據(jù)包有些差異。
如下是一個(gè)普通數(shù)據(jù)包的配置:
G_LoRaConfig.PreambleLength = 0x0008; //前導(dǎo)碼長(zhǎng)度
G_LoRaConfig.PayloadLength = 190; //數(shù)據(jù)包長(zhǎng)度
即該普通數(shù)據(jù)包的前導(dǎo)碼長(zhǎng)度為8,數(shù)包長(zhǎng)度為190。
把這個(gè)普通數(shù)據(jù)包的配置改一下,如下:
G_LoRaConfig.PreambleLength = 0x00FF; //前導(dǎo)碼長(zhǎng)度
G_LoRaConfig.PayloadLength = 4; //數(shù)據(jù)包長(zhǎng)度
即該普通數(shù)據(jù)包的前導(dǎo)碼長(zhǎng)度為255,數(shù)包長(zhǎng)度為4。這也是一個(gè)數(shù)據(jù)包,但是這個(gè)數(shù)據(jù)包就可以作為喚醒包了。
所以需要知道喚醒包就是一個(gè)數(shù)據(jù)包,只是和常規(guī)的數(shù)據(jù)包的差別是喚醒包的前導(dǎo)碼長(zhǎng)度很長(zhǎng)有效數(shù)據(jù)負(fù)載部分很短,而普通數(shù)據(jù)包的前導(dǎo)碼長(zhǎng)度很短有效數(shù)據(jù)負(fù)載部分可以長(zhǎng)些也可以短些。
02
接收端CAD檢測(cè)時(shí)檢測(cè)的不只是前導(dǎo)碼
接收端CAD檢測(cè)時(shí)檢測(cè)的是LoRa信號(hào),而不是只檢測(cè)前導(dǎo)碼。
先看發(fā)送端的數(shù)據(jù)包配置:
G_LoRaConfig.PreambleLength = 0x0008; //前導(dǎo)碼長(zhǎng)度
G_LoRaConfig.PayloadLength = 190; //數(shù)據(jù)包長(zhǎng)度
發(fā)送的是一個(gè)普通數(shù)據(jù)包。
前導(dǎo)碼長(zhǎng)度為8,數(shù)據(jù)負(fù)載長(zhǎng)度為190,每1.35秒發(fā)射一次(MX_TIM3_Init_Ms(1350);//定時(shí)器初始化)
電流波形如下:
可見(jiàn):數(shù)據(jù)包占用時(shí)長(zhǎng)約1300秒,中間空余時(shí)間約50ms。
然后再看在發(fā)送端沒(méi)有開(kāi)啟時(shí)接收端的CAD檢測(cè)的配置:每給檢測(cè)周期大概155ms,每個(gè)周期中睡眠時(shí)間大概100ms,檢測(cè)窗口大概35ms。
然后把發(fā)送端上電,在看接收端,給檢測(cè)周期大概155ms,每個(gè)周期中睡眠時(shí)間大概100ms,檢測(cè)窗口大概35ms,和沒(méi)啟動(dòng)發(fā)送端時(shí)基本相同。
按照如如上測(cè)試結(jié)果,如果接收端CAD檢測(cè)時(shí)只檢測(cè)的是前導(dǎo)碼,則CAD每次檢測(cè)中CADDONE和CADACTIVITY的比值將遠(yuǎn)遠(yuǎn)大于1(比如50:1),如果CAD檢測(cè)時(shí)檢測(cè)的是LoRa信號(hào),則CADDONE和CADACTIVITY的比值將非常接近大1(比如50:49),實(shí)測(cè)時(shí)如下圖(141:140),非常接近于1。所以這就可以回答使用者的一個(gè)疑問(wèn),就是CAD檢測(cè)時(shí)檢測(cè)的確實(shí)時(shí)LoRa信號(hào),而不是只檢測(cè)前導(dǎo)碼。
03
CADDONE和CADACTIVITY的觸發(fā)關(guān)系
每次啟動(dòng)CAD檢測(cè)后,CADDONE中斷一定會(huì)觸發(fā),該中斷表示CAD檢測(cè)完畢了,但是是否檢測(cè)到了LoRa信號(hào)無(wú)法確定。
是否檢測(cè)到了LoRa信號(hào)了還要看CADACTIVITY是否被觸發(fā)了,如果CADACTIVITY也被觸發(fā)了,才說(shuō)明確實(shí)檢測(cè)到了LoRa信號(hào)。
就是說(shuō)CADDONE中斷產(chǎn)生了CADACTIVITY中斷未必產(chǎn)生,但是我們的例程中如果CADACTIVITY中斷產(chǎn)生了則CADDONE中斷一定會(huì)產(chǎn)生。
這里只需要看下如下了一個(gè)有問(wèn)題大代碼,就清楚了,如下是應(yīng)用中的一個(gè)錯(cuò)誤。
如上這段代碼跑起來(lái)的話,會(huì)有一個(gè)現(xiàn)象:每次啟動(dòng)CAD檢測(cè)后,CADDONE中斷總能檢測(cè)到,但是CADACTIVITY中斷永遠(yuǎn)檢測(cè)不到。
這里錯(cuò)誤的原因是使用的是使用了如下邏輯:
if( xxxx)
{xxxx}
else if(判斷CADDONE)
{xxxx}
else if(判斷CADACTIVITY)
{xxxx}
如上邏輯錯(cuò)誤的地方就是沒(méi)有理解清楚如上說(shuō)的CADDONE和CADACTIVITY的觸發(fā)關(guān)系。
正確的邏輯應(yīng)該是:
if( xxxx)
{xxxx}
if(判斷CADDONE)
{
if(判斷CADACTIVITY)
{xxxx}
}
04
CADACTIVITY誤檢測(cè)
實(shí)際使用中,常常會(huì)發(fā)現(xiàn)主機(jī)端沒(méi)有上電或者沒(méi)有發(fā)送喚醒包,但是從機(jī)端依然會(huì)觸發(fā)CADACTIVITY標(biāo)志。
這種現(xiàn)象常常被稱作誤檢測(cè)。
例如用我司的實(shí)例代碼的配置直接測(cè)試如上代碼,并且關(guān)閉發(fā)送端,此時(shí)誤檢測(cè)率達(dá)到20%(如下圖41:202)
改善誤檢測(cè)的方法主要有如下:
(1)換個(gè)頻點(diǎn)
(2)改變參數(shù)配置中的極性參數(shù):
G_LoRaConfig.InvertIQ = LORA_IQ_NORMAL; //IQ信號(hào)格式,
LORA_IQ_NORMAL:標(biāo)準(zhǔn)模式,
LORA_IQ_INVERTED:反轉(zhuǎn)模式;
(3)改用等效波特率更高的參數(shù)配置
(4)最顯著的是改變CAD檢測(cè)的符號(hào)個(gè)數(shù)
比如如上測(cè)到的誤檢測(cè)率達(dá)到20%(如下圖41:202)就是在該值使用2時(shí)的結(jié)果,該值越大越不容易產(chǎn)生誤檢測(cè)。
如下把改制改成8。
再做如上測(cè)試的結(jié)果如下:
誤檢測(cè)率降低為0.43%(2:462)。需要說(shuō)明的是該值用的的比較小的話(比如使用1或者2等),想把誤檢測(cè)率降低到1%以下是不太現(xiàn)實(shí)的。
該值使用比較大的值的話可以降低誤檢測(cè)率,但是檢測(cè)窗口時(shí)間長(zhǎng)度就會(huì)加大。所以這里只能平衡的考慮選用那個(gè)值。
05
喚醒包和常規(guī)數(shù)據(jù)包的切換
結(jié)論
1、喚醒包就是比較特殊的數(shù)據(jù)包。
2、接收端CAD檢測(cè)時(shí)檢測(cè)的是LoRa信號(hào),而不是只檢測(cè)前導(dǎo)碼。
3、CADDONE中斷產(chǎn)生了CADACTIVITY中斷未必產(chǎn)生,但是我們的例程中如果CADACTIVITY中斷產(chǎn)生了則CADDONE中斷一定會(huì)產(chǎn)生。
4、處理CADDONE中斷和CADACTIVITY中斷的軟件邏輯注意不要錯(cuò)誤。
5、CADACTIVITY誤檢測(cè)要想明顯降低需要CAD檢測(cè)窗口時(shí)間長(zhǎng)度做一定的犧牲。
-
檢測(cè)
+關(guān)注
關(guān)注
5文章
4503瀏覽量
91590 -
CAD
+關(guān)注
關(guān)注
17文章
1093瀏覽量
72618 -
LoRa
+關(guān)注
關(guān)注
349文章
1695瀏覽量
232095
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論