在之前博文開源一套uwb 框架,后面幾篇博文會基於這個開源框架進行簡單開發。 讓uwb使用者更清楚了解基於這個basecode 開發工作。
這里所做內容是,采集dwm1000 溫度,並發送到另一個節點,另一個節點通過串口打印,也就是這里是一個遠程采集溫度的工程。當然可以使用主控stm32 采集任何傳感器,按照本文思路將數據打包發送到另外一個節點。
1 在tx_main.c增加溫度采集函數,並做驗證。
溫度采集函數
uint16 BPhero_UWB_Get_Temperature(void)
{
uint16 register_result;
uint16 Temperature = 0;
/* Note on Temperature: the temperature value needs to be converted to give the real temperature
* the formula is: 1.13 * reading - 113.0
* Note on Voltage: the voltage value needs to be converted to give the real voltage
* the formula is: 0.0057 * reading + 2.3
* input parameters:
* @param fastSPI - set to 1 if SPI rate > than 3MHz is used
*
* output parameters
*
* returns (temp_raw<<8)|(vbat_raw)
*/
register_result = dwt_readtempvbat(1);
//Temperature = (((register_result&0xFF00)>>8)*1.13 - 113)*100;
return (register_result>>8);
}
在tx_main 函數讀取溫度信息,驗證可以正確采集到溫度信息。tx_main 驗證代碼如下:
int tx_main(void)
{
bphero_setcallbacks(Tx_Simple_Rx_Callback);
char temp_result[5];
int temp = 0 ;
/* Infinite loop */
dwt_enableframefilter(DWT_FF_DATA_EN);
dwt_rxenable(0);
while(1)
{
// BPhero_Distance_Measure_Specail_TAG();
Delay_us(10000);//5ms
Delay_us(10000);//5ms
temp = (BPhero_UWB_Get_Temperature()*1.13 - 113);
temp_result[0] = (temp/100)+0x30;
temp_result[1] = (temp%100/10)+0x30;
temp_result[2] = (temp%10)+0x30;
temp_result[3]='\n';temp_result[4]='\0';
USART1DispFun(temp_result);
}
}
主要是讀取溫度,並將溫度百十個位分開並發送到串口顯示。 tx_main 函數相對之前basecode,除了讀取溫度函數以外,在while(1) Enable RX,在while(1)內注釋掉發送代碼,這樣做主要是,rx 功耗較大,可以明顯看到溫度變化。實際后面會回復原樣。
編譯下載后,串口收到溫度信息:

可以看到使能接收的時候,dwm1000的文檔可以穩定在53度左右,使用熱風槍加熱,溫度會更高。
2 以上測試已經完成,開始修改tx_main,將發送的數據放到tx_message中。
A tx_main函數恢復原樣,里面只保留調用發送函數,與basecode一致
int tx_main(void)
{
bphero_setcallbacks(Tx_Simple_Rx_Callback);
while(1)
{
BPhero_Distance_Measure_Specail_TAG();
}
}
B 在發送message 中把溫度信息打包進去
void BPhero_Distance_Measure_Specail_TAG(void)
{
int temp = 0 ;
// 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;
/* Write all timestamps in the final message. See NOTE 10 below. */
final_msg_set_ts(&msg_f_send.messageData[FIRST_TX], tx_node[(SHORT_ADDR+1) &0xFF].tx_ts[0] );
final_msg_set_ts(&msg_f_send.messageData[FIRST_RX], tx_node[(SHORT_ADDR+1) &0xFF].rx_ts[0] );
msg_f_send.seqNum = distance_seqnum;
msg_f_send.messageData[0]='D';
msg_f_send.messageData[1]=(SHORT_ADDR+1) &0xFF;
temp = (BPhero_UWB_Get_Temperature()*1.13 - 113);
msg_f_send.messageData[2]=(temp/100)+0x30;
msg_f_send.messageData[3]=(temp%100/10)+0x30;
msg_f_send.messageData[4]=(temp%10)+0x30;
可以看到與之前basecode 相比,在messageData[2'3'4] 把溫度信息打包了,只需要在rx階段,同樣讀取messageData[2'3'4] 即可。
注意 psduLength 這個長度,不要小於要發送的數據長度,不然會收不全數據。
dwt_writetxdata(psduLength, (uint8 *)&msg_f_send, 0) ;
C rx_main.c 讀取同樣讀取messageData[2'3'4]
switch(msg_f->messageData[0])
{
case 'D'://distance
msg_f_send.messageData[0]='d';
msg_f_send.messageData[1]=msg_f->messageData[1];
temp_result[0] = msg_f->messageData[2];
temp_result[1] = msg_f->messageData[3];
temp_result[2] = msg_f->messageData[4];
temp_result[3] = '\n';
temp_result[4] = '\0';
temp_result[5] = 1;
其中temp_result[5] 為接收成功標志位,當接收成功后將其置位1,while(1)中根據這個,將temp_result 打印出來
while (1)
{
if(temp_result[5] ==1)
{
USART1DispFun(temp_result);
temp_result[5] = 0;
}
}
到此,本文完
代碼開源網址:www.51uwb.cn
