不論是在TWR 還是TDOA定位算法中,delayed tx 都會用到,這篇博文主要解析delayed tx 實現。
何為delayed tx? delayed tx 是延時發送,為何要延時?因為這個延時可以控制,設定好延時后,可以把延時信息放到數據包中,接收者收到信息后,除了知道接收時間還能知道發送時間。具體作用參考TWR或者TDOA算法代碼。
首先說幾個dwm1000中用到的time
1 最重要的是dwm1000 內部時鍾

從上面描述中可以得知時鍾頻率為63.8976GHz,這個Counter 每增加一個step,對應的時間是1/63.8976G=15.56ps ,這個時間再乘以光速,大概距離是0.0047m.
但是根據標黃的地方知道,低9bit 一直是0.
2 delayed counter

與系統時間counter對應,低9bit 也是0.
Delayed Tx 代碼分析
final_tx_time = dwt_readsystimestamphi32() +0x100000; dwt_setdelayedtrxtime(final_tx_time);
1 首先使用dwt_readsystimestamphi32() 讀取系統時間counter的高32位(最低位是0,另外8bit 也是0,沒有去讀),然后再這個基礎上加了0x100000
2 使用API 設定delayed tx時間dwt_setdelayedtrxtime(txdelay),同樣,這里設置的是高32位,而不是全部40bit。
整個delay時間為0x100000 00 *15.5ps = 4160749568 ps =0.416s
這個計算方法是錯的,因為用dwt_readsystimestamphi32() 讀取的是高32位,低8bit雖然為0,但是實際時間可能不為0,雖然看不到,但實際存在。
例如連續兩次dwt_readsystimestamphi32(),可能返回一樣的值,但是低9bit 0是有差異的。所以不能用上述公式計算delay,哪如何算? 沒法算,其實也沒有太大用,或者實際上沒用!
如何理解?
我們設定了delaytx 時間,高32bit,低8bit是0后,系統counter 增加,等到某一個時間系統counter與 delaytx counter 相等,這個時候低9bit 的0 是真實的0!
理解了上面部分再往下看代碼
final_tx_ts = (((uint64)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY; final_msg_set_ts(&msg_f_send.messageData[FIRST_TX], final_tx_ts);
這個代碼final_tx_time & 0xFFFFFFFE,是因為高32bit 的counter其實最低一位也是0,把它清楚掉。
然后右移8位,完整的時間,產生40bit 時間,后面加上tx 天線延時,就是發送端真實的發送時間。
那tx_ant_dly 低8位可以是非零嗎? 可以! 因為rx tx timestamp 40bit 都是有效的,沒有說低9bit為0.
當接收端接收到信息,解析messageData 就可以知道這個信息准確的發送時間。
更多內容參考藍點無限論壇bphero.com.cn

