在之前博文开源一套 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
来源: http://www.bubuko.com/infodetail-3343212.html