UWB发送接收调测记录之超时时间

最近调测UWB的收发,比较困扰的是DW1000是半双工通信方式,也就是要么在RX,要么在TX,那么标签和基站如何协同工作呢,比方B标签发包的时候,基站一定要在RX才能收到包,否则发包就会失败,这个协同如何来做呢?


其实官方给的例子有一个demo,是能说明这个协同的想法的,但是其中的延时,配置多少合适,这也是困扰我好久的问题!



呱牛笔记



1、延时发送

//final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;

final_tx_time =   dwt_readsystimestamphi32() + ((RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME) >> 8);//0x17cdc00 / 70; //10ms/7

//logD("[5] final_tx_time = %u", final_tx_time);

dwt_setdelayedtrxtime(final_tx_time);

比方:final_tx_time = dwt_readsystimestamphi32() + 0x17cdc00/10;//1ms 

uwb 1个时钟大概是1.56ps

dwt_readsystimestamphi32()返回的是高32bit,返回值每个单位 对应是1.56<<8 ,大约400ps

dwt_readsystimestamphi32()  + 0x17cdc00/10 相当于  当前时间 + delay,当前时间是dwt_readsystimestamphi32() ,delay 是0x17cdc00/10, 而这个公式对应时间单位大概是400ps,所以就有下面的实际delay

400*0x17cdc00/10 = 9,984,000,00 大约就是1ms

参考:https://www.cnblogs.com/tuzhuke/p/11638221.html  来源:蓝点论坛


uwb毫秒和设备时间单元的转换关系:

/* UWB microsecond (uus) to device time unit (dtu, around 15.65 ps) conversion factor. 

* 1 uus = 512 / 499.2 µs and 1 µs = 499.2 * 128 dtu. */

#define UUS_TO_DWT_TIME 65536


DW1000的时钟频率为63.8976GHz,这个Counter 每增加一个step,对应的时间是1/63.8976G=15.56ps ,这个时间再乘以光速,大概距离是0.0047m.



问题:1ms后开始启动tx,如何配置?

1ms = 1000µs   转换为uwb毫秒 = 1000µs、
1µs转换为dwt时间单元
1000*UUS_TO_DWT_TIME = 1000*65536 = 65536000 
dwt_setdelayedtrxtime的参数是设置高32位
dwt_readsystimestamphi32() + ( 65536000  >> 8) = dwt_readsystimestamphi32() + 256000


2、延时接收

标签:

dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);//#define POLL_TX_TO_RESP_RX_DLY_UUS 300

基站:

dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS);//#define RESP_TX_TO_FINAL_RX_DLY_UUS 500



从tx自动切到rx的时间延时delay: dwt_setrxaftertxdelay(uint32 rxDelayTime); 

它的入参rxDelayTime,表示设置的时间大小, 这个时间值的大小宽度为20bit,也就是最大为

2^{20}-1=1048575 这个时间值的单位是UWB ms,该单位与正常的时间关系为1 U W B m s = 512 / 499.2 M h z u s = 1.0256 u s  

这个值最小可以设置为0,设置为0的时候,则DW1000会在发送完成后立即打开接收模式,这个操作大概需要花费6.2us的时间。而且如果设置的值小于7us,则花费的时间依然会是6.2us。


根据延时发送和延时接收的time推测,对时间窗口的对齐的理解还是有帮助的,但是具体值应该配置为多少,这里以官方的代码验证这个值应该如何配置!

POLL_TX_TO_RESP_RX_DLY_UUS0x68001f2
    失败的包/总共发送的包
丢包率计算
0149/750
159/8060.19
300126/752
218/11750.18
260032/2700.11
61/4900.12
68/529
71/572
230028/3280.08
32/356
33/361
210037/228
220028/1950.14
240011/93
44/3000.14
235016/109
2310101/8700.11

始终没有找到一个最优值,还需要继续研究!


3、RX超时

dwt_setrxtimeout(0);//配置为0表示不超时


/*

假设数据实际接收的时间为12ms左右,所以要设置为12000(UWB ms),一个UWB ms几乎可以按1us来算,为了保险起见,设置为15000

*/

dwt_setrxtimeout(15000);


如果设置rx timeout 为40ms超时

dwt_setrxtimeout(20000); //20ms超时


4、SFD超时次数控制;

config 中会配置SFD检测失败的最大次数:

static dwt_config_t config =
{
    2,               /* Channel number. */
    DWT_PRF_64M,     /* Pulse repetition frequency. */
    DWT_PLEN_1024,   /* Preamble length. Used in TX only. */
    DWT_PAC32,       /* Preamble acquisition chunk size. Used in RX only. */
    9,               /* TX preamble code. Used in TX only. */
    9,               /* RX preamble code. Used in RX only. */
    1,               /* 0 to use standard SFD, 1 to use non-standard SFD. */
    DWT_BR_110K,     /* Data rate. */
    DWT_PHRMODE_STD, /* PHY header mode. */
    (1025 + 64 - 32) /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
};


#define DWT_SFDTOC_DEF              0x1041
void dwt_configure(dwt_config_t *config)
{
    if(config->sfdTO == 0)
    {
        config->sfdTO = DWT_SFDTOC_DEF;
    }
}

这个值还是根据建议值走,如果设置SFD timeout为0 官方文档说可能产生器件故障;

5、前导码超时控制;

这个超时是失败重试的次数,简单说,就是前导码检测多少次失败后,会上报一个超时中断!

/* Preamble timeout, in multiple of PAC size. See NOTE 6 below. */

#define PRE_TIMEOUT 2048//64

dwt_setpreambledetecttimeout(PRE_TIMEOUT);


前导码检测超时 1个symbol是1us

2048次超时,则是2048us 约是2ms


6、MAC层协议:IEEE 802.15.4 UWB physical layer

呱牛笔记


0x68001F2


参考:https://blog.csdn.net/Mculover666/article/details/115034596






-----2022.05.18更新---------------------------

之前有一个问题,一直被困扰着,就是收发不稳定,这个不稳定表现为标签发送完包后,始终等不到基站回应的包,要么等待SFD超时,要么PHY超时,错误码也是很多种,比方:0x20800FF3、0x20200F3、0x20017F3、0x28001F3、0x68001F3、0x48001F3

怎么解决的呢?每次标签定位之前,先重置下Radio,发现就稳定好多:

dwt_write8bitoffsetreg(SYS_CTRL_ID, SYS_CTRL_OFFSET, (uint8)SYS_CTRL_TRXOFF) ; // Disable the radio


请先登录后发表评论
  • 最新评论
  • 总共0条评论