最近调测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_UUS | 0x68001f2 失败的包/总共发送的包 | 丢包率计算 |
0 | 149/750 | |
159/806 | 0.19 | |
300 | 126/752 | |
218/1175 | 0.18 | |
2600 | 32/270 | 0.11 |
61/490 | 0.12 | |
68/529 | ||
71/572 | ||
2300 | 28/328 | 0.08 |
32/356 | ||
33/361 | ||
2100 | 37/228 | |
2200 | 28/195 | 0.14 |
2400 | 11/93 | |
44/300 | 0.14 | |
2350 | 16/109 | |
2310 | 101/870 | 0.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
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com