第一次拿到AWR294X开发板时,我对着这个火柴盒大小的黑色模块研究了半天。作为TI毫米波雷达家族的新成员,它集成了DSP、R4F核和硬件加速器,最高支持76-81GHz频段。开发板标配的FMCW天线阵列让我想起小时候玩的激光笔——只不过这次我们要玩的是真正的"空间扫描仪"。
关键硬件参数:
SDK安装比想象中简单,但有几个坑我帮大家提前踩了:
bash复制# 验证SDK安装成功的命令
ls ${MMWAVE_SDK_INSTALL_PATH}/packages/ti/demo/awr294x
第一次烧写Demo程序时,我犯了个低级错误——没接JTAG调试器就点了"Run"。结果当然是一堆报错。这里特别提醒:AWR294X的固件加载必须通过JTAG完成,USB-UART只能用于数据传输。
配置啁啾参数就像给雷达"编程",你需要告诉它:
在profile_3d.cfg示例文件中,关键参数是这样定义的:
c复制chirpStartIdx 0
chirpEndIdx 31
profileId 0
startFreqConst 60.25e9 # 起始频率60.25GHz
idleTimeConst 100e-6 # 100μs空闲时间
rampEndTime 50e-6 # 50μs斜坡时间
实测中发现一个有趣现象:当我把freqSlopeConst从60MHz/μs调到65MHz/μs时,距离分辨率从4cm提升到3.7cm,但信噪比下降了15%。这就像相机调光圈——参数之间需要权衡。
常见配置误区:
AWR294X提供两种工作模式就像汽车的自动挡和手动挡:
| 模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| TDM | 算法简单 | 帧率较低 | 低速高精度 |
| DDM | 帧率高 | 需要解调 | 高速动态 |
在汽车ADAS项目中,我这样选择模式:
数据在MSS和DSS间的传递就像工厂流水线:
c复制// 典型的数据处理链初始化代码
DPC_ObjectDetection_HWA_Init();
DPC_ObjectDetection_DSP_Init();
DPC_ObjectDetection_EDMA_Config();
第一次看到UART输出的十六进制数据包时,我差点以为板子坏了。后来才明白需要按TLV格式解析:
用Python解析点云的代码片段:
python复制def parse_point_cloud(data):
points = []
idx = 0
while idx < len(data):
x = struct.unpack('<f', data[idx:idx+4])[0] # 小端浮点数
y = struct.unpack('<f', data[idx+4:idx+8])[0]
z = struct.unpack('<f', data[idx+8:idx+12])[0]
points.append([x, y, z])
idx += 12
return np.array(points)
实际测试时发现个坑:z轴坐标默认以天线平面为基准。我在做室内定位时,需要额外做坐标系旋转才能匹配世界坐标系。
让AWR294X跑满性能需要些"黑魔法":
DSP优化三板斧:
#pragma MUST_ITERATE指导编译器展开循环内存优化实例:
原始方案把雷达数据立方体放在L3 RAM,访问延迟高达50周期。改为使用HWA专用内存后,处理时间从78ms降到42ms。
c复制// 优化后的内存分配
#pragma DATA_SECTION(radarCube, ".hwaMemSection")
complex16_t radarCube[MAX_ANTENNAS][MAX_RANGE_BINS];
最让我自豪的优化是在DDM模式下实现流水线并行:当前帧的AoA处理和下一帧的FFT计算重叠进行,使帧率从8fps提升到23fps。
天线校准惨案:
有次客户抱怨测距误差总是偏大15cm。排查三天后发现是天线相位补偿参数没生效——原来DDM模式需要用antennaCalibParams命令而不是TDM的compRangeBias。
内存泄漏之谜:
连续运行8小时后系统崩溃,用CCS的Memory Analyzer发现是UART缓冲区的动态分配没释放。改为静态分配后稳定性大幅提升。
温度漂移对策:
rlRfGetTemperatureReport回调中动态调整参数基于AWR294X SDK二次开发时,我推荐这样的代码结构:
code复制my_radar_app/
├── platform/ # 硬件抽象层
├── algorithms/ # 自定义处理算法
├── drivers/ # 外设驱动
└── config/ # 啁啾配置文件
要实现人员跌倒检测,我扩展了原始Demo:
MmwDemo_mssDataPathTask发送原始点云c复制// 自定义TLV类型注册
MMWave_addCustomTlvType(USER_DEFINED_TYPE, parse_my_data);
最近还尝试用LVDS接口替代UART,数据传输速率从1Mbps飙升到600Mbps。不过要注意CBUFF缓冲区的对齐要求——我第一次尝试时就因为没满足64字节对齐导致EDMA传输失败。