|
关于你的这个问题,我们这边进行了复现。
发现当合入之前的更新后,为了处理多区域干扰问题,无法处理多标签冲突问题了。
具体原因:
- // dwt_setinterrupt(DWT_INT_RFCG , 1);
- // dwt_setautorxreenable(1);
复制代码 这个代码的意思是,只有当接收成功后,上传中断给软件。
而我们软件流程中会处理节点冲突
- if(!(status_reg & SYS_STATUS_RXRFTO))//
- Tag_receive_poll = 1;//
- dwt_write32bitreg(SYS_STATUS_ID, (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR));
复制代码 上面表示,当产生任何接收异常,将认为标签和其他标签产生冲突,产生冲突的原因就是因为同时发送了,而发送是通过定制器控制的,那当产生冲突后,微调一下定制器,让产生冲突的标签延后一点,具体代码
- else
- {
- HAL_TIM_Base_Stop(&htim3);
- TIM3->ARR = TIM3_Delay_Step*((SHORT_ADDR%10)+1);//random delay
- Tag_receive_poll = 0;
- }
复制代码
以上就是多标签冲突避免机制。
之前让你加的更新,导致软件无法收到接收异常(硬件配置后只报告接收正常)。导致冲突处理机制不能工作,相互冲突的标签不做处理,每次都是冲突的。表象就是某些标签一直不更新距离信息,看起来像死机一样。
以上分析,如果多个标签,尽量使用更新以前的代码
- dwt_setinterrupt(DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO /*| DWT_INT_RXPTO*/), 1);
- // dwt_setinterrupt(DWT_INT_RFCG , 1);
- // dwt_setautorxreenable(1);
复制代码 如果是一个标签,多个区域定位,可以加入更新。
另外一个注意的问题是,标签编译地址尽量错开,因为我们的delay是模低地址
- TIM3->ARR = TIM3_Delay_Step*((SHORT_ADDR%10)+1);//random delay
复制代码 实际编译地址可以选用1001 1003 1005 依次类推。
我们实际测试效果如下:
另外补充一下,上面也提到了原理部分,冲突避免是一个“自适应”过程,当模块刚刚上电后,可能某些标签会同时发送产生冲突,会相互干扰。这个时候会有一段时间的自适应调整过程,一般根据标签多少会有一定时间消耗。慢慢逐步稳定下来。
通信信息个数统计:
每个标签和每个基站测距一次需要3条信息。6个标签*4个基站*5 = 120,每个信息发送时间槽只有8个ms左右,而信息本身需要几个ms发送,相互之间空闲时间槽其实已经非常小了。 这个配置基本算是TWR的极限了。
|
|