这是一个系列文章《如何从零开始实现TDOA技术的 UWB 精确定位系统》第6部分。 重要提示(劝退说明):
Q:做这个定位系统需要基础么? A:文章不是写给小白看的,需要有电子技术和软件编程的基础 Q:你的这些硬件/软件是开源的吗? A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。文章中我会介绍怎么实现UWB定位系统,告诉你如何克服难点,但不会直接把PCB的Gerber文件给你去做板子,不会把软件的源代码给你,不会把编译好的固件给你。我不会给你任何直接的结果,我只是告诉你方法。 Q:我个人对UWB定位很兴趣,可不可以做出一个定位系统? A:如果是有很强的硬件/软件背景,并且有大量的时间,当然可以做得出来。文章就是写给你看的! Q:我是商业公司,我想把UWB定位系统搞成一个商业产品。 A:当然可以。这文章也是写给你看的。如果你想自己从头构建整个系统,看了我的文章后,只需要画电路打板;构思软件结构再编码。就这样,所有的难点我都会在文中提到,并介绍了解决方法。你不需要招人来做算法研究。如果你想省事省时间,可以直接购买我们的电路图(AD工程文件),购买我们的软件源代码,然后快速进入生产环节。(网站: https://uwbhome.top)在之前的文章中,已经介绍了 UWB TDOA定位相关的重要技术,其实这一系列文章可以算是结束了。接下来我陆续介绍一下细节。
频率、时间、长度关系
时间与长度的关系:- 光速是 299702547 m/s
- 1ms光跑的路程299702.547m
- 1us 光跑的路程299.702547m
- 1ns光跑的路程0.299702547m=29.97cm
- 1ps光跑的路程0.000299702547m=0.0299702547cm
- 15.65ps光跑的路程=0.469034486055cm=0.00469034486055 m
- DW1000使用的外部晶振频率为38.4MHz@+/-10ppm
- DW1000的参考时钟是38.4MHz。38.4M进行13倍频后是499.2MHz,再4分频得到124.8MHz作为DW1000的内部系统时钟。
- 38.4MHz的波长为 300Mm/38.4M=7.8125m (300Mm为光速,300M米)
- 124.8MHz的波长为 300Mm/124.8M=2.4m
- 38.4MHz的一个时钟周期为26.04ns
- 124.8MHz的一个时钟周期为8.012ns
- 63.8976 GHz 的一个时钟周期为15.6484375ps,光跑的路程=0.4690305cm
- RTL-SDR的采样率为2.4 MS/s, 两次采样间的间隔为 300Mm/2.4M=125m,即两次采样的距离是125米
- Ettus USRP B210的采样率为61.44MS/s,两次采样间的间隔为 300Mm/61.44M=4.88m,即两次采样的距离是4.88米
简单总结一下
- DW1000的系统时间寄存器实际更新率为124.8MHz,用于定时发送,光距离分辨为240cm
- DW1000的系统时间寄存器理论更新率为63.8976 GHz,用于确定接收帧的时间戳及天线延时校准等,光距离分辨为0.469cm
- 3494.4MHz的波长为299.702547Mm /3494.4M=0.085766m (299.702547Mm为光速,299.702547M米)
- 6489.6MHz的波长为299.702547Mm /6489.6M=0.04618m (299.702547Mm为光速,299.702547M米)
- 3494.4MHz的一个时钟周期为0.286ns
- 6489.6MHz的一个时钟周期为0.154ns
- 110 kbps的一位用时 1/110000=9.09us
- 850 kbps的一位用时 1/850000=1.176us
- 6.8 Mbps的一位用时 1/6800000=0.147us=147ns*29.97=4367.64cm
DW1000的时间戳
DW1000有几个寄存器,可以读到帧的接收时间、帧的发送时间,寄存器是40Bits的,时间单位是(1.0/499.2e6/128.0) = 15.65e-12秒,即15.65ps。这些寄存器的高8位可以忽略,因为DW1000之间的通讯距离不会有那么远,以致于需要那么长的时间帧才会到达。 2^40=0xFFFFFFFFFF=1099511627775 1099511627775*15.65ps = 17,207,356,974,678.75ps = 17,207ms 对于40Bits, 大约17秒多就回绕一次 2^32=0xFFFFFFFF=4294967295 4294967295*15.65ps =67,216,238,166.75ps = 67ms 对于32Bits, 大约67毫秒多就回绕一次Seq32 分析
每一个UWB数据包都有一个序号seq。我们使用uint32 seq32记录这个序号。 最大值是0xFFFFFFFF,十进制值为4294967295 假设1ms发送一个数据包,那么可以表达4294967295ms 4294967295ms = 4294967s 4294967s/3600 = 1193小时 1193/24=49天 实际上我们每200ms发一个包,简化为100ms发一个包,那么可以表达4900天。相当于13年。因为每一次充电都会导致标签重启,seq32重新从0开始计数。 所以,我们基本上不用考虑seq32会重绕的情况。STM32 MCU 选型
这个选型数据是2016年做的,过了这么多年,ST公司的产品有了很大变化。你需要自己重做一次功课。这个选型只能供参考。 TREK1000 的 MUC 是 STM32F105RCT6, 256K Flash, 64K RAM, STM32F10X_CL Tripoint的MCU是STM32F031G6,32K Falsh, 4KRAM,UFQFPN28 Footer 候选:- STM32F103RET6, 64Pin, 512K Flash, 64KRAM
- STM32F103C6T6, 48Pin, 32K Flash, 10KRAM, STM32F10X_MD for TAG
- STM32F103C8T6, 48Pin, 64K Flash, 20KRAM, STM32F10X_MD
- STM32F103CBT6, 48Pin, 128K Flash, 20KRAM, STM32F10X_MD
- STM32F103T8, 36Pin, 64K Flash, 20KRAM, STM32F10X_MD
- STM32F103TB, 36Pin, 128K Flash, 20KRAM, STM32F10X_MD
- STM32L151C8T6: 64KFlash, 4KEEPROM, 32KRAM
- STM32L151CBT6: 128KFlash, 4KEEPROM, 16KRAM
- STM32L151CCT6: 256KFlash, 8KEEPROM, 32KRAM
- STM32F030F4P6, TSSOP-20, 16KFlash, 4KRAM
- STM32F030K6T6, TQFP32, 32KFlash, 4KRAM
- STM32F030C8T6, TQFP48, 64KFlash, 8KRAM