以下作品由安信可社區用戶
putin制作
目錄
一、UWB模組之BU03
1.1簡介
1.2技術亮點
1.3安信可官方資料及工具
二、功耗測試
2.1基站
2.2標簽
2.3測距配置
2.4校準
三、UWB模組使用SDK按鍵喚醒
3.1SDK下載
3.2激活例程
3.3修改例程
3.4實驗現象
UWB模組之BU03
1.1簡介
BU03模組是一款基于Decawave DW3000系列芯片設計的超寬帶(UWB)定位模組。作為一款高性能無線通信模塊,BU03憑借其10厘米級定位精度和6.8Mbps高速數據傳輸能力,成為物聯網(IoT)、智能家居、工業自動化等領域的理想選擇。其核心優勢在于低功耗設計、抗干擾性強,以及支持多種定位算法,可靈活適配復雜環境下的精準定位需求。
1.2技術亮點
●板載陶瓷天線與射頻電路:BU03采用全向陶瓷天線設計,無需額外RF設計即可實現信號穩定收發,且天線布局經過優化,確保定位精度不受環境干擾。
●DW3000芯片方案:基于Decawave DW3000的射頻前端芯片,支持雙向測距(TWR)、TDOA和到達相位差(PDOA)算法。
●低功耗與寬電壓支持:供電范圍2.5V-3.6V,睡眠模式下功耗低于1μA,適用于紐扣電池供電的便攜設備。
定位精度與算法實現
●厘米級定位:通過TDOA或PDOA算法,BU03可在室內復雜環境中實現10厘米級定位精度。例如,在倉儲物流中,標簽與基站間的實時距離測算誤差可控制在±10cm以內。
●動態校準功能:用戶可通過線性擬合校準參數(如指令AT+SETDEV),進一步提升實際場景中的測距準確性。測試數據顯示,校準后誤差可降低至毫米級。
1.3安信可官方資料及工具
●規格書與原理圖下載:安信可UWB專題文檔
●測試教程與SDK:飛書知識庫
●開箱即用的開發套件:BU03-Kit開發板集成STM32F103主控,提供LCD屏幕實時顯示測距數據,并支持通過USB/TTL接口進行AT指令配置。用戶可通過指令(如AT+SETCFG)快速切換基站與標簽模式,搭建多節點定位系統。
●上位機支持與資源開放:配套上位機軟件支持基站坐標編輯與標簽軌跡可視化,開發資料包涵蓋原理圖、PCB封裝、SDK及校準模板,大幅縮短開發周期。
功耗測試
在進行測試之前,先配置兩個開發板進入出廠的模式,一個進入標簽,一個進入基站。教程參考:教程
由于需要測量功耗,所以要使用外部供電,條件有限,這邊只有一個四位半的萬用表,因此供電選擇使用串口。
供電電源選擇的是串口,選擇電壓輸入的為5V,因為LDO也是有一點功耗的,這里測量的是開發板的整體功耗。(單獨買來模組也不會單獨的部署,所以測量整個開發板的功耗還是具有代表性)
基站


電壓為5.01V,開機后工作電流為81.55mA,整體功耗為:408.5655 mW,差不多就是0.4W(整個開發板的功耗,包括LED)。
標簽


電壓為5.019V,開機后工作電流為54.03mA,整體功耗為:271.17657 mW,差不多就是0.27W(整個開發板的功耗,包括LED)。
由上可知BU03-Kit開發板的功耗其實是很低。
如果沒有LED功耗,應該可以控制在0.2瓦以下,同時標簽的功耗可以達到基站的一半。
測距配置
一個為基站,先發送AT+SETCFG=0,1,1,1 然后再發送AT+SAVE
一個為標簽,先發送AT+SETCFG=0,0,1,1 然后再發送AT+SAVE
成功后基站將會顯示其到標簽的距離:

校準

校準方式采用的是線性擬合,相應的文件可以前往安信可文檔下載中心進行下載鏈接如下:
UWB系列模組專題 | 安信可科技

方法也很簡單,先準備一把尺子,將顯示屏上顯示的距離和尺子上面的距離填到表格中對應的位置即可。數據多測量幾次,測量數據越多,屏幕上面顯示的實際距離將會越精確。

類似于下圖,由于這里沒有米尺,這里就用直尺了,后面測試是利用瓷磚的距離,每測一次加一塊瓷磚測量。


上面就是實際測得的數據a=0.9138,b=-244.61
通過下面的指令可以填入校正參數:
AT+SETDEV=X1,X2,X3,X4,X5,X6,X7,X8,X9
其中各個參數指代的含義如下:
X1: 標簽容量 (標簽刷新速率)
X2: 天線延遲參數
X3: 是否卡爾曼濾波使能位
X4: 卡爾曼濾波參數 Q
X5: 卡爾曼濾波參數 R
X6: 校正參數 a
X7: 校正參數 b
X8: 是否定位使能位
X9: 定位維度設置
這里只需發送
AT+SETDEV=5,16336,1, 0.018,0.642,0.9198,-244.61,0,0

復測20厘米實際測量值為256毫米,相較于沒有標定之前的數據來說,精度得到了大大的提高。
使用SDK按鍵喚醒模組
通知公告SDK下載
下載方法可以看下面的鏈接:鏈接
由于之前有Ai-M61系列模組和Ai-WB2系列模組搭建環境的經驗,想必已經有很多人在電腦上面裝了git了吧,只需要在一個空的文件夾里面點擊右鍵后點擊下圖位置:

輸入這個:git clone
https://gitee.com/Ai-Thinker-Open/STM32F103-BU0x_SDK.git 回車即可。

等待大概10秒鐘左右即可。
建議下載完之后復制一個,因為這次測試中一個要接收,一個要發送。
激活例程
建議觀看這個教程:教程,教程建議直接觀看tx_simple_sleep和simple_rx。
修改例程
對tx_simple_sleep程序修改。

函數路徑如上圖,在這里直接翻到最下面上面的全是初始化函數,無需修改。
/* Loop forever sending frames periodically. */ while(1) { /* 寫入待發送數據到DW3000準備發送. (Write frame data to DW IC and prepare transmission. See NOTE 3 below.) */ dwt_writetxdata(FRAME_LENGTH-FCS_LEN, tx_msg, 0); /* Zero offset in TX buffer. */ /* 設置發送數據長度 (In this example since the length of the transmitted frame does not change, * nor the other parameters of the dwt_writetxfctrl function, the * dwt_writetxfctrl call could be outside the main while(1) loop.) */ dwt_writetxfctrl(FRAME_LENGTH, 0, 0); /* Zero offset in TX buffer, no ranging. */ /* 立即發送. (Start transmission.) */ dwt_starttx(DWT_START_TX_IMMEDIATE); /* 查詢DW3000是否發送成功. (Poll DW IC until TX frame sent event set. See NOTE 4 below. * STATUS register is 4 bytes long but, as the event we are looking at is in the first byte of the register, we can use this simplest API * function to access it.) */ while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS_BIT_MASK)) { }; /* 清除發送事件. (Clear TX frame sent event.) */ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS_BIT_MASK); _dbg_printf((unsigned char *)"發送成功n"); /* 休眠TX_DELAY_MS. (Execute a delay between transmissions.) */ Sleep(TX_DELAY_MS); /* 標志位Seq++處理. (Increment the blink frame sequence number (modulo 256).) */ tx_msg[BLINK_FRAME_SN_IDX]++; }
在這里,可以直接看到進入休眠模式使用這個函數。
dwt_entersleep(DWT_DW_IDLE)。需要使用按鍵來進行控制的話只需在這里初始化一個I/O口。
void tx_timed_sleep_GPIO_INIT()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_Init_structure;
GPIO_Init_structure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init_structure.GPIO_Pin=GPIO_Pin_8;
GPIO_Init_structure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_Init_structure);
}
/**
* Application entry point.
*/
int tx_timed_sleep(void)
{
uint16_t lp_osc_freq, sleep_cnt;
tx_timed_sleep_GPIO_INIT();
/* 串口輸出應用名稱. Display application name on LCD. */
_dbg_printf((unsigned char *)APP_NAME);
/* 配置SPI快速率. Configure SPI rate, DW3000 supports up to 38 MHz */
port_set_dw_ic_spi_fastrate();
/* 硬復位DW3000模塊. Reset DW IC */
reset_DWIC(); /* Target specific drive of RSTn line into DW IC low for a period. */
Sleep(2); // Time needed for DW3000 to start up (transition from INIT_RC to IDLE_RC)
/* 檢查DW3000模塊是否處于IDLE_RC */
while (!dwt_checkidlerc()) /* Need to make sure DW IC is in IDLE_RC before proceeding */
{ };
/* 初始化DW3000模塊 */
if (dwt_initialise(DWT_DW_INIT) == DWT_ERROR)
{
_dbg_printf((unsigned char *)"INIT FAILED ");
while (1)
{ };
}
/* 清除SPI就緒中斷. Clearing the SPI ready interrupt*/
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RCINIT_BIT_MASK | SYS_STATUS_SPIRDY_BIT_MASK);
/* 配置DW3000中斷函數. Install DW IC IRQ handler. NOTE: the IRQ line must have a PULLDOWN or else it may trigger incorrectly when the device is sleeping*/
// port_set_dwic_isr(dwt_isr);
/* 校準和配置UWB計數. Calibrate and configure sleep count. */
lp_osc_freq = XTAL_FREQ_HZ / dwt_calibratesleepcnt();
sleep_cnt = ((SLEEP_TIME_MS * ((uint32_t) lp_osc_freq)) / 1000) >> 12;
//sleep_cnt = 0x06; // 1 step is ~ 175ms, 6 ~= 1s
dwt_configuresleepcnt(sleep_cnt);
/* 配置DW3000信道參數. Configure DW IC. See NOTE 6 below. */
if(dwt_configure(&config)) /* if the dwt_configure returns DWT_ERROR either the PLL or RX calibration has failed the host should reset the device */
{
_dbg_printf((unsigned char *)"CONFIG FAILED ");
while (1)
{ };
}
/* 配置DW3000發送頻譜參數. Configure the TX spectrum parameters (power, PG delay and PG count) */
dwt_configuretxrf(&txconfig_options);
/* 配置DW3000發送頻譜參數. Configure sleep and wake-up parameters. */
dwt_configuresleep(DWT_CONFIG, DWT_PRES_SLEEP | DWT_WAKE_CSN | DWT_SLEEP | DWT_SLP_EN);
/* 注冊中斷回調函數. Register the call-backs (only SPI ready callback is used). */
dwt_setcallbacks(NULL, NULL, NULL, NULL, NULL, &spi_ready_cb);
port_EnableEXT_IRQ();
_dbg_printf("配置成功n");
/* Loop forever sending frames periodically. */
while (1)
{
/* DW3000進入休眠模式,喚醒后進入IDLE. Put DW IC to sleep. Go to IDLE state after wakeup*/
dwt_entersleep(DWT_DW_IDLE);
sleeping = 1;
/* In this example, there is nothing to do to wake the DW IC up as it is handled by the sleep timer. */
while (sleeping)
{Sleep(1);}; /* Wait for device to wake up */
/* 增加延時.必要*/
Sleep(5);
if(KEY==0)
{
_dbg_printf((unsigned char *)"喚醒成功:%04xn", dwt_readdevid());
/* 喚醒時恢復所有配置. Restore the required configurations on wake */
dwt_restoreconfig();
/* Increment the blink frame sequence number (modulo 256). */
tx_msg[BLINK_FRAME_SN_IDX]++;
/* 寫入待發送數據到DW3000準備發送,并設置發送長度. Write frame data to DW IC and prepare transmission. See NOTE 4 below. */
dwt_writetxdata(sizeof(tx_msg), tx_msg, 0); /* Zero offset in TX buffer. */
dwt_writetxfctrl(sizeof(tx_msg), 0, 0); /* Zero offset in TX buffer, no ranging. */
/* 立即發送. Start transmission. */
dwt_starttx(DWT_START_TX_IMMEDIATE);
/* 查詢DW3000是否發送成功. It is not possible to access DW IC registers once it has sent the frame and gone to sleep, and therefore we do not try to poll for TX
* frame sent, but instead simply wait sufficient time for the DW IC to wake up again before we loop back to send another frame.
* If interrupts are enabled, (e.g. if MTXFRS bit is set in the SYS_MASK register) then the TXFRS event will cause an active interrupt and
* prevent the DW IC from sleeping. */
/* Poll DW IC until TX frame sent event set. See NOTE 7 below.
* STATUS register is 4 bytes long but, as the event we are looking at is in the first byte of the register, we can use this simplest API
* function to access it.*/
while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS_BIT_MASK))
{};
/* 清除發送完成事件. Clear TX frame sent event. */
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS_BIT_MASK);
}
}
}
實驗現象
將pb9直接接地時:

將pb9不接地時(接收端和發送端無輸出):

最后,歡迎大家來安信可論壇,筆者發布的原貼下一起交流討論:
原貼地址
【BU03-Kit 測評】UWB 測距初體驗--兩點測距+校準
【BU03-Kit 測評】UWB KIT出廠固件功耗測試
【BU03-Kit 測評】UWB 使用SDK按鍵喚醒
審核編輯 黃宇
-
UWB
+關注
關注
33文章
1285瀏覽量
65306 -
功耗測試
+關注
關注
0文章
20瀏覽量
9797 -
室內定位
+關注
關注
30文章
320瀏覽量
37758
發布評論請先 登錄
UWB模塊讓 UWB 測距、定位與通信更簡單-UWB653使用白皮書
UWB寵物電子圍欄系統解決方案 | 遠距離寵物測距技術
【室內定位】倉庫管理可以有多智能?UWB模組高精度定位
低功耗BLE+iBeacon:打造室內定位與近場通信應用!
新一代UWB通信模塊UWB650Pro對比UWB650的區別
藍牙室內定位核心技術解析:RSSI 與 AOA 的測距原理對比與精度升級邏輯
常見的室內定位技術有哪些?深度剖析UWB、藍牙定位等技術的優劣與應用場景
面對UWB室內定位可靠性需求,網絡協同能力是關鍵
【室內定位UWB模組】工廠人員和設備“秒定位”,高精度、高安全!
UWB - TDOA方案定位技術
UWB 定位測距
精準到厘米!安信可UWB定位模組,讓室內管理更“聰明”
室內定位UWB模組 兩點測距+出廠固件功耗測試,效果如何?
評論