UWB(DW1000 关键API说明)

数据的接收

dwt_setrxtimeout(0);
//接收器允许接收的超时时间
dwt_rxenable(0);
//立即打开接收器
while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
                { };//检测数据是否接收到数据        
dwt_read32bitreg();//读取32位寄存器的值

数据的发送

dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);
//将数据写入DW1000写入TX缓冲区
dwt_writetxfctrl(sizeof(tx_final_msg), 0);     
//用于配置TX帧控制寄存器
dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED );
//用来启动数据帧的传输,
/*parameter*/
//DWT_START_TX_DELAYED 延时发送数据 此函数用来设置延迟时间dwt_setdelayedtrxtime()   
//DWT_START_TX_IMMEDIATE 立即发送数据       
//DWT_RESPONSE_EXPECTED 发送成功,进入接收响应消息的时间 dwt_setrxaftertxdelay()
 while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))
   { };    
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);    
//对DW1000寄存器,进行数据的写入,清除相应的标志位。
   

时间获取和计算

DW1000配置(stm32)

1.相关引脚和spi初始化。
2.DW1000_RSTn引脚,进行低电平到模拟输入。
3.spi速率降低,不能超过3Mh。
4.DW1000初始化.
5.恢复spi速率.
6.DW1000相关寄存器配置.

//设置天线延时  
7.dwt_setrxantennadelay(RX_ANT_DLY);
dwt_settxantennadelay(TX_ANT_DLY);      

计算时间(TWR算法)

TAG     | T1 |         | T4 |  | T5 |
    
        
            
                
                                
NODE        | T2 |  | T3 |       | T6 | 

1.标签发送数据 T1
2.基站接收到数据 T2(并计算T2的时间) 延时一段时间发送 T3消息
3.标签接收到数据 读取T1发送的时间和此时接收到的时间T4,并把这两个数据,还有发送时间T5传入到final包中,发送final包
4.基站接收final包。

 poll_rx_ts = get_rx_timestamp_u64();      // T2 

resp_tx_ts = get_tx_timestamp_u64();//T3
final_rx_ts = get_rx_timestamp_u64();//T6

/* Get timestamps embedded in the final message. */
final_msg_get_ts(&rx_buffer[FINAL_MSG_POLL_TX_TS_IDX], &poll_tx_ts);//T1
final_msg_get_ts(&rx_buffer[FINAL_MSG_RESP_RX_TS_IDX], &resp_rx_ts);//T4
final_msg_get_ts(&rx_buffer[FINAL_MSG_FINAL_TX_TS_IDX], &final_tx_ts);//T5

/* Compute time of flight. 32-bit subtractions give correct answers even if clock has wrapped. See NOTE 10 below. */
poll_rx_ts_32 = (uint32)poll_rx_ts;
resp_tx_ts_32 = (uint32)resp_tx_ts;
final_rx_ts_32 = (uint32)final_rx_ts;
Ra = (double)(resp_rx_ts - poll_tx_ts);
Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);
Da = (double)(final_tx_ts - resp_rx_ts);
Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);
tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));

tof = tof_dtu * DWT_TIME_UNITS;
distance = tof * SPEED_OF_LIGHT;
distance = distance - dwt_getrangebias(config.chan,(float)distance, config.prf);//距离减去矫正系数
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小昭dedug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值