UWB DWM1000 開源項目框架


UWB 目前比較火熱,不論國內還是國外目前都掀起一股熱潮。 但是實際工程代碼很少,開源代碼更少。

目前代碼主要有

1 DecaWave Release的定位源碼,代碼基於TWR,一個非常大的狀態機。 之前在博客進行過分析,對於初學者來說門檻太高。

2 淘寶商家Release的定位源碼,大多基於官方基本例程去修改,實現測距,進而實現定位,這樣的代碼通常涉及的東西dwm1000 功能較少,在實際工程中應用比較困。

這里開源一個uwb 框架,姑且命名為51uwb_base,介於二者之間,作為一個工程的base code,希望uwb 工程開發者少走一些彎路。base code 並非實際工程完整代碼,只是進行模塊化,功能化的一個框架,可以實現UWB無線收發。 開發者可以基於此代碼進行測距,傳輸甚至實現TDOA定位。base code 為項目工程提供,不適合初學者以及學生。base code 本身是從完整工程中提取,去掉了項目細節。

51uwb_base 特點:

A . 代碼模塊化

  將代碼根據功能不同,進行模塊化區分,不同模塊盡量放置不同文件或函數(項目代碼基本要求)

B 幀過濾功能

  多節點工程必然給每個模塊分配地址,基於dwm1000 實現配置幀過濾功能

C dwm1000 硬件中斷

  使用dwm1000 中斷信號,可以提供更高的實時性。同時后期可以根據空閑狀態情況進入低功耗休眠

D 移植目前我已知最為牛X的串口代碼。

部分代碼:

int main(void)
{
    peripherals_init();
    BPhero_UWB_Message_Init();
    BPhero_UWB_Init();	
    tx_main();
  //rx_main();
}
void BPhero_UWB_Message_Init(void)
{
    //set frame type (0-2), SEC (3), Pending (4), ACK (5), PanIDcomp(6)
    msg_f_send.frameCtrl[0] = 0x1 /*frame type 0x1 == data*/ | 0x40 /*PID comp*/|0x20/* ACK request*/;
    //source/dest addressing modes and frame version
    //msg_f.frameCtrl[0] = 0x41;
    msg_f_send.frameCtrl[1] = 0x8 /*dest extended address (16bits)*/ | 0x80 /*src extended address (16bits)*/;
    msg_f_send.panID[0] = 0xF0;
    msg_f_send.panID[1] = 0xF0;

    msg_f_send.seqNum = 0;
    msg_f_send.messageData[POLL_RNUM] = 3; //copy new range number
    msg_f_send.messageData[FCODE] = RTLS_DEMO_MSG_ANCH_POLL; //message function code (specifies if message is a poll, response or other...)
    psduLength = (TAG_POLL_MSG_LEN + FRAME_CRTL_AND_ADDRESS_S + FRAME_CRC);

    msg_f_send.seqNum = 0; //copy sequence number and then increment
    msg_f_send.sourceAddr[0] = SHORT_ADDR & 0xFF; //copy the address
    msg_f_send.sourceAddr[1] =(SHORT_ADDR>>8)& 0xFF; //copy the address

    msg_f_send.destAddr[0] = 0x01;  //set the destination address (broadcast == 0xffff)
    msg_f_send.destAddr[1] = 0x01;  //set the destination address (broadcast == 0xffff)
}

  

51uwb_base code使用說明:

1 框架完成數據收發,有TX 節點和 RX節點,通過main函數選擇,如下代碼為TX節點,反之為RX節點。

int main(void)
{
    peripherals_init();
    BPhero_UWB_Message_Init();
    BPhero_UWB_Init();	
    tx_main();
	 //rx_main();
}

2 每個節點需要配置不同短地址,在bphero_uwb.h中指定

#ifndef SHORT_ADDR
#define SHORT_ADDR 0x0032
#endif

配置以上兩步編譯下載即可。  

注意:

1由於嵌入式代碼與硬件有着天然緊密聯系,我的代碼基於藍點無限開發板,如果使用其它開發板,需要進行底層匹配,主要代碼在port.c中,主要修改dwm1000 與主控的連線引腳配置以及主控的串口配置。

2代碼中目前TX發送信息,對應接收信息RX節點地址為TX節點地址+1,故設置RX節點時需要考慮這個不然無法實現測試功能。

void BPhero_Distance_Measure_Specail_TAG(void)
{
    // dest address  = SHORT_ADDR+1,only for test!!
    msg_f_send.destAddr[0] =(SHORT_ADDR+1) &0xFF;
    msg_f_send.destAddr[1] =  ((SHORT_ADDR+1)>>8) &0xFF;

  

 項目開源位置:www.51uwb.cn


免責聲明!

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



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