摘要:本文主要补充上一篇博客1.毫米波雷达心率、呼吸原理实现(一)实例,由于平时较忙,没来得及更新。本项目实时处理主要用到两个工具:1.CCS开发平台 ;2.Matlab 2020版本以上(本人使用的2021b)。项目基本思路:通过CCS平台控制AWR1843获取串口实时数据,然后使用Matlab的AppDesign功能设计上位机处理实时获得的串口数据。值得注意的是,在TI的工具箱中有AWR1642运行的生命体征demo,可以在不做任何修改的情况下烧录到AWR1843中运行。
一、CCS串口数据获取
CCS项目创建
打开CCS软件,点击菜单栏中的File,点击New,点击CCS Project,出现如下界面:
Target中选择mmWaveSensor,这里博主用的是AWR1843型号的毫米波雷达,所以选择AWR1843,也可以根据自己的雷达型号进行选择。Project name可以自己命名,我这里命名为adcdata_mss,Project templates and examples中选择SYS/BIOS下的TITarget Examples下的Typical,如下图:
上面的设置对Cortex R[ARM]中设置的,同时在C67XX[C6000]进行相同的设置,只是工程名称不一样为adcdata_dss,如下图:
点击Next,此时在Cortex R[ARM]下面有错误,这是因为没有对Platform进行设置。需要对Platform进行设置
在Cortex R[ARM]中的platform设置为ti.platforms.cortexR:AWR18XX:false:200,C67XX[C6000]中的Platform设置为ti.platforms.c6x:AWR18XX:false:600,分别如下图:
点击Finish后,完成新建工程这时在Project Explorer中会有adcdata_mss和adcdata_dss两个工程。值得说明的是其中前者是用于AWR1843中AWM核控制芯片,后者用于DSP数据处理。再本demo中只用到一个工程即可,数据处理部分我将内嵌上位机中完成。如下图:
2.项目环境搭建
在上一步骤中完成项目创建之后,接下来将是项目环境搭建。再次强调,本demo使用串口数据以达到实时处理的效果。首先从mmwave_sdk_version\packages\ti\platform\xwr18xx目录下复制r4f_linker.cmd文件到工程目录adcdata_mss目录下。同时还需要再创建一个cmd文件,在这里,我命名为mss_adcdata_linker.cmd,如下图所示:
此时mss_adcdata_linker.cmd中的内容为:
/*----------------------------------------------------------------------------*//* Linker Settings*/--retain="*(.intvecs)"/*----------------------------------------------------------------------------*//* Section Configuration*/SECTIONS{systemHeap : {}> DATA_RAM}/*----------------------------------------------------------------------------*/
同时,要在adcdata_mss工程中的Properties(属性)中的General设置linker command file设置为mss_adcdata_linker.cmd,点击Apply and Close。
接下来在adcdata_mss工程中创建一个app.cfg配置文件(如果已经存在该文件就不用再创建),并将其命名为mss_adcdata.cfg(也可以根据自己随意命名)。并将其内容修改为如下:
/* *Copyright 2016 by Texas Instruments Incorporated. * *All rights reserved. Property of Texas Instruments Incorporated. *Restricted rights to use, duplicate or disclose this code are *granted through contract. * */environment['xdc.cfg.check.fatal'] = 'false';/******************************************************************** ************************** BIOS Modules **************************** ********************************************************************/var Memory= xdc.useModule('xdc.runtime.Memory');var BIOS= xdc.useModule('ti.sysbios.BIOS');var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');var Task= xdc.useModule('ti.sysbios.knl.Task');var Idle= xdc.useModule('ti.sysbios.knl.Idle');var SEM = xdc.useModule('ti.sysbios.knl.Semaphore');var Event = xdc.useModule('ti.sysbios.knl.Event');var Hwi = xdc.useModule('ti.sysbios.family.arm.v7r.vim.Hwi');var System= xdc.useModule('xdc.runtime.System');var SysStd= xdc.useModule('xdc.runtime.SysStd');var clock = xdc.useModule('ti.sysbios.knl.Clock');System.SupportProxy = SysStd;/* FIQ Stack Usage: */Hwi.fiqStackSize= 2048;Hwi.fiqStackSection= ".myFiqStack"Program.sectMap[".myFiqStack"] = "DATA_RAM";/* Default Heap Creation: Local L2 memory */var heapMemParams = new HeapMem.Params();heapMemParams.size= 32*1024;heapMemParams.sectionName = "systemHeap";Program.global.heap0= HeapMem.create(heapMemParams);Memory.defaultHeapInstance= Program.global.heap0;/* Enable BIOS Task Scheduler */BIOS.taskEnabled= true;Program.sectMap[".vecs"]= "VECTORS";/* Make sure libraries are built with 32-bit enum types to be compatible with DSP enum types*/BIOS.includeXdcRuntime= true; BIOS.libType= BIOS.LibType_Custom;BIOS.customCCOpts+= " --enum_type=int ";
修改完成后,编译工程会出现如下图所示的错误信息,如下图:
提示的是用到的符号没有定义,对Properties(属性)中的Build中的ARM Linker中的Advanced Options中的Command FilePreproces中添加预先定义添加如下内容:
MMWAVE_L3RAM_NUM_BANK=6MMWAVE_SHMEM_BANK_SIZE=0x20000MMWAVE_SHMEM_TCMA_NUM_BANK=0MMWAVE_SHMEM_TCMB_NUM_BANK=0
如下图所示:
点击Apply and Colse,再次进行编译,仍然会有一个警告,如下图:
接下来,需要修改两处地方就可以消除警告了。
1.对Properties(属性)中的Build中的XDCtools中的Advanced
Options中的Additional complier options(-compileOptions)中修改为”-enum_type=int”, 如下图
2.对Propeties(属性)中的Build中的ARM Compiler中的Advanced Options中的Runtime Model
Options中的Desinate enum type(-enum_type)选为int,如下图
做完以上两步,再次进行编译,就不会有警告了,如下图所示:
接着就是SDK的导入,为后续程序编写做准备。
基本的环境配置好后,接下来要导入mmWave_sdk的路径,在Properties(属性)中的Build中的ARM Compiler中的Include Options中导入mmWave_sdk的路径,导入后如下图:
此外,还需要在Properties(属性)中的Build中的ARM Compiler中的Predefined Symbols中增加SUBSYS_MSS和SOC_XWR18XX,如下图
3.接下来要对Properties(属性)中的Build中的ARM Linker中的File Search Path中的Include library file or command file as input(-library,-l)和Addto library search path(-search_path,-i)添加相应的内容:
Include library file or command file as input(-library,-l)添加的内容如下:
Addto library search path(-search_path,-i)添加的内容如下:
注意:上述添加内容皆为mmwave_sdk中库的路径地址。添加后的效果图为:
最后就是文件后缀的修改。对Properties(属性)中的Build中的ARM Linker中的Basic Options中的Specify output file name(-output file,-o)中的文件后缀名修改为”xer4f”,如下图
3.程序结构分析
adcdata_mss项目程序基本流程图如下图所示:
接下来就是对上述程序结构进行简要描述
main函数:
首先,程序进入main函数,进行SOC驱动初始化,创建InitDriver_Task线程来初始化所需要的一些驱动程序,最后调用BIOS_start。
InitDriver Task函数:
首先,进行Pin引脚复用,接下来对串口、GPIO、邮箱等驱动进行初始化,初始化串口参数以及打开串口,调用InitAdcBufDriver函数初始化驱动程序,注册frame、 chirp开始的监听函数,mmWave初始化、同步,创建uartSendSemHandle信号量, 该信号显用于协调串口发送数据的线程,创建Adcdata MSS_mssWaveCtrITask线程, 该线程调用MMWave_execute()函数,创建Adcdata_MSS_UartSendTask(线程,该线程用于发送原始数据,调用Adcdata_MSS_Start函数,该函数用于配置雷达发射信号参数以及启动雷达。
InitAdcBufDriver函数:
该函数用于初始化ADCbuf中的一些配置,对ADCBuf进行初始化、参数配置以及打开ADCBuf,调用Adcdata_ADCbufConfig函数。
Adcdata_ADCbufConfig函数:
配置ADCBuf存储数据的格式以及接收到数据的存储位置。
AdcdataMSS_mssWaveCtrITask函数:
调用MMWave_execute函数。
Adcdata_MSS_UartSendTask函数:
该函数用于将雷达采集到的原始数据发送到上位机。
Adcdata_MSS_Start函数:
该函数用于配置雷达发射信号的参数以及启动雷达。
该项目文件放已经在文章末尾。
小结:在上面的部分中,我们初步通过CCS平台控制AWR1843雷达获得原始的未经过处理的串口数据,接下来下一部分内容中我将通过matlab编写一个上位机来处理从串口传回来的原始数据(另外,在AWR1843中有内置的DSP芯片进行数据处理,可以直接输出处理结果,但是由于工程量以及时间问题,博主就不做这部分内容了,读者可以自行完成或者可以看TI给出的1642demo,这个demo可以直接在1843里运行)。
二、上位机数据处理
1.简介
这部分内容将是我使用Matlab的AppDesigner制作的上位机软件,关于该上位机的制作的详细过程,由于篇幅问题在这里就不详细讲解了。上位机的界面如下图所示:
2.软件使用指南
首先连接PC与AWR1843设备并通电,使用AWR1843的debug模式与CCS平台进行调试,并加载在上文中项目编译后产生的.xer4f文件并运行,这时候可以通过串口助手检测是否有数据传回到PC端。我相信大家都知道TI毫米波雷达CCS的debug模式,如果实在不知道如何操作可以去顺便看看TI的开源demo,上面有详细的指导步骤。如下图:
可以看到此时我的PC和毫米波雷达已经可以正常通信了,这时打开上位机就可以正常处理了。
另外需要说明的是,界面中一些按钮以及功能的介绍:
1.端口方面
关于端口方面有两个按钮和两个下拉选择框,端口号是自己识别电脑中的端口,到时候根据自己电脑端口选择即可。波特率选择跟我上图界面一致。
2.抖动消除
该功能用于消除身体抖动,有效值为0和1,0表示不执行,1表示执行。该部分算法借鉴TI的demo。
3.静态杂波消除
该功能用于消除背景噪声,采用基于指数平均对消算法,有效值为0和1,0表示不执行,1表示执行。
4.加权因子
该因子是静态杂波消除算法中用的因子,有效值在0到1之间。
5.呼吸时域窗长和心跳时域窗长
该窗长之间关系傅里叶长度的大小,为2的幂次方。
6.搜索范围
表示此时目标距离雷达前端的有效距离,一般不超过1m为最佳。
结束语
这期内容到这里就结束了,制作不易,希望各位读者可以毫不吝啬的加个点赞和关注,感谢支持。
有关上述的所用到的代码取件地址:
链接:https://pan.baidu.com/s/1UR9PQEtbzm6jFX7D07gs2A
提取码:rrdy