在之前的分析過一種快速測距方法原理:https://www.cnblogs.com/tuzhuke/p/12359038.html
這里做代碼實現。 測距分為設備A 和 設備B,與原理部分NodeA NodeB對應。
代碼中,設備B,也就是NodeB,啟動發送。
NodeB:將之前的兩個時間戳加載到數據包中,開始上電的時候,這個時間戳信息可能是無效的。
NodeA 接收到NodeB,根據原理部分,需要處理自己的時間戳,同時通過數據包的信息,獲取NodeB 時間戳信息,然后變可以計算距離信息
NodeA,收到NodeB后,同時要回復一條信息
case 'D'://distance msg_f_send.messageData[0]='d'; msg_f_send.messageData[1]=msg_f->messageData[1]; dwt_writetxdata(psduLength, (uint8 *)&msg_f_send, 0) ; // write the frame data dwt_writetxfctrl(psduLength, 0); /* Start transmission. */ dwt_starttx(DWT_START_TX_IMMEDIATE); //MUST WAIT!!!!! while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_TXFRS))) { }; dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS|SYS_STATUS_RXFCG); Handle_TimeStamp();
以上就是NodeA處理的所有主要事件。NodeA發送給NodeB,Node B更新事件戳,並准備下次發送給NodeA,依次往復不停測距。
NodeB發送時定時發送的,可以改成收到NodeA信息后,立馬發送,測距頻率會大幅提高!
case 'd'://distance BroadCastComplete =1; tx_node[msg_f_recv->messageData[1]].tx_ts[0] = get_tx_timestamp_u64(); tx_node[msg_f_recv->messageData[1]].rx_ts[0] = get_rx_timestamp_u64(); break;
代碼下載:51uwb.cn
更多信息請關注51uwb.cn