UWB定位 - DWM1000模块调试简单心得 - 2
UWB定位 - DWM1000模块调试简单心得 - 1 上一篇搭建了下软硬件的基础环境,这篇开始记录调试需要注意的地方或者”坑”。先以一基站一标签来进行。
1、将我们的模块连接后上电。注意这里DWM1000模块(也就是stm32开发板)一定要使用独立电源(5v / 1.5A ↑↑↑)单独供电,如果你用USB to TTL或者电脑的USB接口给stm32开发板供电(dwm10003.3V与stm32引脚3.3连接)后续多半会出现数据大幅度波动(波动单位为米级别!!!),亦或是基站与标签通信时直接断开。博主调试的时候遇到过查了不少资料,据说dwm1000模块峰值电流可以达到1A,建议基站采用电源5v/1.5A以上单独供电给stm32开发板。标签可以采用移动电源供电,当然这不代表这标签会省电,功耗关键还是在于程序控制(包括算法的不同耗电量也根不同,目前最省电最理想的测距算法还是TDOA 。对于定位来说我们的TWR 也就是TOA 也可以实现功能,但当我们的项目工程需要多标签多基站时,还是需要TDOA的方式来进行。TWR 定位方式当多个标签的时候会遇到事件轮询排队的情况,当然这都是后续的,可以自己根据需要选择,目前咱们先调试官方的模块代码)
2、基站部分代码调试
打开我们的标签项目project,其实现在直接分别编译-烧录-运行 到我们的开发板 ,然后基站的stm32开发板外接一个usb to TTL (程序内串口已经初始化,具体初始化在port.c 文件中,主程序部分点进入peripherals_init()即可看见,波特率默认115200)。
为了方便我们串口调试,打开port.c文件加入我们自己的串口打印函数
void USART_putc(char c)//向串口输出字符
{
//while(!(USART2->SR & 0x00000040));
//USART_SendData(USART2,c);
/* e.g. write a character to the USART */
USART_SendData(USART1, c);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;
}
void USART_putstr(const char *s)//向串口输出字符串
{
int i;
for(i=0; s[i]!=0; i++)
{
USART_putc(s[i]);
}
}
记得在port.h里声明
void USART_putc(char c);
void USART_putstr(const char *s);
可以将代码中显示屏部分的代码直接去掉,在输出显示数据部分加入我们的串口打印字符串函数
sprintf(dist_str, "DIST: %3.2f m", distance);
USART_putstr(dist_str);
USART_putc('\n');
基站、标签上电,或许你就可以看到串口输出的DIST: xx m 。
如果没有,不要着急。先检查代码和硬件接线部分,确保没有问题后,那就是我们程序的发送和接收延时需要修改(依据个人模块合理修改,如果没有通信成功 可将延时倍数增大,调整部分如下截图)这里的延时是标签与基站发送接收对方数据的延时。
以下是我的个人调整(如还是不行继续加大,基站与标签延时部分代码 都需要加大,并不是只改基站部分的,注意!!):
未完待续。。