TDOA 之 基站接收數據


基站主要 接收同步節點發來的同步信號,代碼里定義為S信息。 以及標簽節點發來的定位信號,代碼中定義為T信號。

代碼中使用中斷以及幀過濾功能,對模塊只接收自己關心設定好的信息,通過中斷告知上層,而不是長時間輪訓方式。

幀過濾參考博文:https://www.cnblogs.com/tuzhuke/p/10503052.html

如下為基站核心代碼:

1 使能接收中斷

dwt_setinterrupt(DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO /*| DWT_INT_RXPTO*/), 1);

2 接收信息並記錄自己的接收時間戳和 信息發送的時間戳

switch(msg_f->messageData[0])
{
    case 'S':
        //save seq
        //save rx timestamp
        last_rx_ts = get_rx_timestamp_u64();//獲取接收時間戳

        // last_rx_ts =0x123456789A;測試數字
        //對64位數據移位成兩個數字,用來液晶顯示
        l8_timestamp = last_rx_ts&0xFF;
        h32_timestamp= last_rx_ts>>8;

        sprintf(lcd_display_str, "%08X%02X",h32_timestamp,l8_timestamp);
        OLED_ShowString(0,4,(uint8_t *)lcd_display_str);

        //toggle LED 指示接收成功
        ledValue = ~ledValue;
        GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3, ledValue);

        //save delayed tx timestamp
        //獲取信息中Sync 節點的發送時間戳
        //信息起始位置位2,分別在2 3 4 5 6
        last_rx_ts=0;
        final_msg_get_ts(&msg_f->messageData[2],&last_rx_ts);
        //對64位數據移位成兩個數字,用來液晶顯示
        l8_timestamp = last_rx_ts&0xFF;
        h32_timestamp= last_rx_ts>>8;

        sprintf(lcd_display_str, "%08X%02X",h32_timestamp,l8_timestamp);
        OLED_ShowString(0,6,(uint8_t *)lcd_display_str);
        break;

上述代碼只是簡單接收了同步節點發送來的時間信號,通過液晶顯示出來,與同步節點顯示對比,實際需要做的工作還有很多,總結如下

3 基站接收邏輯功能

除了上面部分,需要實現的邏輯

A. 由原理部分得知,需要接收到連續兩個同步信號以及中間的標簽定位信號 才能算一個完整的接收序列。

對於接收同步節點信號S來說,需要記錄前后兩次同步信號的sequence號,兩者只能差1,如果出現丟包,需要做丟棄處理

B 對於定位信號,同樣由原理部分,定位信號應該夾在同步信號之內,而且需要記錄定位信號的sequence。

C 當收到一個同步信號S后,開始接受序列啟動,下一個應該接收的信號是定位信號T,如果有,再下一個是其它節點的定位信號T。最后是同步信號S, 標記一個完整的接收序列,通過串口或者網口送給定位引擎。 同時需要將最后一個同步信號用作下一個序列的開始。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM