多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

STM32驱动BGT24MTR11:24GHz多普勒雷达测速方案

STM32驱动BGT24MTR11:24GHz多普勒雷达测速方案 简介这是一份基于STM32微控制器控制BGT24MTR11毫米波雷达芯片的完整工程资源包面向嵌入式开发与雷达信号处理学习人群重点解决硬件通信配置、I/Q数据采集、模数转换、快速傅里叶变换以及目标距离解算等关键问题。压缩包内共包含六百三十七个文件以三百四十七个C源文件和一百一十六个头文件为主体配合六十三个汇编文件、四十四个IAR链接配置文件以及工程管理文件并集成了STM32F4系列HAL驱动库与CMSIS DSP运算库整体压缩后约十四兆字节。目前已被一千六百六十二人下载学习。项目目录结构具有较高参考价值RADAR.ioc用于外设初始化Src目录存放核心算法与主逻辑Drivers目录提供底层驱动EWARM目录为IAR编译工程通过分析与运行源码可以系统掌握从原始I/Q信号到频谱波峰检测再到目标距离计算的全过程适合用于课程设计、毕业设计或工业测距项目的前期验证。1. 先把BGT24MTR11这颗芯片彻底看明白1.1 它到底是一颗什么样的芯片提到24GHz雷达很多人第一反应是“射频门槛太高搞不了”。我之前也是这么想的直到把手上一块基于英飞凌BGT24MTR11的24GHz多普勒雷达模块接到STM32F103上跑通才发现用STM32控制这种芯片本质上就是“供电、调压、读中频”比想象中简单很多。先讲清楚一个关键认知BGT24MTR11不是那种“一上电直接输出目标距离”的完整雷达模块。它是英飞凌在24GHz ISM频段推出的雷达收发MMIC内部集成了VCO、发射功放、接收混频器、分频器等射频前端但射频前端之外的波形控制、信号处理和协议逻辑都需要外部MCU完成。那它对外呈现出来是什么样的工作链路大概是这样VCO产生24.125GHz连续波信号一部分作为本振送给接收混频器一部分通过TX输出给发射天线。遇到运动物体时反射回来的信号产生多普勒频移接收混频器把发射信号和回波信号混在一起输出一个低频中频信号频率落在几百赫兹到几十千赫兹量级。所以从MCU的角度看整个过程就两件事给VT脚提供合适的VCO调谐电压然后从IFP/IFN脚读取中频信号。至于检测什么、测速还是测距、目标在哪里全部由STM32端的数据处理算法决定。还有一点必须提醒BGT24MTR11和BGT24LTR11经常被搞混。LTR11是带SPI数字接口的低成本版本更适合快速做存在检测MTR11更接近一颗纯射频前端适合需要自定义波形或做测速测距的场景。标题既然写的是MTR11这篇就按MTR11的用法来讲。1.2 为什么选STM32而不是专用雷达MCUBGT24MTR11的“大脑”不在射频芯片里而在后级信号处理里。STM32自带ADC、定时器、DMA、UART还有CMSIS-DSP库刚好覆盖“采样中频信号 → FFT频谱分析 → 速度解算 → 串口输出”的完整闭环。不需要配置复杂的射频寄存器不需要跑Linux一片STM32F103最低配就够用。硬件上芯片处理的是模拟中频信号不需要高速数字接口算法上1024点FFT在72MHz主频下跑一次只要几毫秒。如果后面想加测距、多目标跟踪再升级到F4或H7也来得及。我今天这篇就用最常见的STM32F103C8T6举例配合一块BGT24MTR11小模块。整个项目跑通后串口每秒输出一次目标的速度模块放在桌面人从面前走过就能看到速度值在变。2. 硬件链路从雷达模块到STM32怎么接才稳2.1 供电和地回路决定你后面要不要调试到半夜先说我踩过的第一个坑供电。一开始图省事直接把模块的3.3V接到了STM32开发板的3.3V排针。结果传感器静止时串口打出来的ADC原始值有明显周期性波动底噪高得离谱。后来用示波器一看这个排针上的纹波大约有120mV左右数字电路毫不在乎但BGT24MTR11出来的中频信号本身就只有几十毫伏直接给埋没了。正确做法是给BGT24MTR11单独用一颗低噪声LDO供电。普通AMS1117-3.3也行但LDO输入要来自独立的5V输出端靠近模块加10uF钽电容和100nF陶瓷电容并联。如果对功耗和面积有要求可以换成LP5907这类低噪声LDO实测纹波会好很多。地线也要单独处理。雷达模块的地、运放的地、STM32的地尽量单点汇合不要在开发板上绕一大圈再回来。两层洞洞板做这个项目完全可行但电源线和地线必须短粗射频部分和数字部分不要长距离并行。2.2 中频信号调理没有运放基本收不到信号BGT24MTR11输出的是差分中频信号IFP/IFN不是干净的0-3.3V单端信号。幅度与目标反射强度、距离有关近距离强反射时可能几十毫伏距离稍远就只有几毫伏。直接把这两个脚接STM32 ADC要么采不到要么被直流偏置顶到饱和。我的做法是用一颗轨到轨运放做差分转单端放大。电路结构很经典IFP接运放同相输入IFN接反相输入反相端到输出接反馈电阻Rf同相端到大地的基准电压接Rg增益大约为Rf/Rg。实际测试中Rf取100k、Rg取1k到2k增益约50到100倍就够用。不建议单级增益超过几百倍因为运放的失调电压也会被一起放大。信号太弱时宁可加一级放大也不要盲目拉高第一级增益。这里还有一个特别容易忽略的细节运放输出到ADC输入之间要串联隔直电容或者在信号路径上加一阶高通截止频率设在30到100Hz。静止状态下中频输出有直流偏置不隔直的话STM32 ADC满量程3.3V一个1.5V偏置就占据将近一半的动态范围目标信号会被“挤”没。2.3 与STM32的接线方案我实际用的接线是这样的功能信号接STM32备注电源VCC3.3V经独立LDO不要直接并开发板排针使能ENPA1高电平使能VCO调谐电压VTPA4或固定电压CW模式固定即可中频信号IFP/IFN经运放后接PA0差分转单端到ADC串口输出UART TXPA9115200bps地GNDGND单点接地VT电压是很多新手不知道的点。BGT24MTR11的VCO调谐电压不是固定的3.3V而是通过VT脚电压控制频率。在低成本CW多普勒模式下期望模块工作在24GHz附近需要根据模块手册确定VT电压。如果你用的是成品模块卖家一般会告诉你VT怎么接如果是自己做射频部分更稳妥的方案是用STM32输出PWM加RC滤波得到一个可调直流电压配合外部PLL锁频。简单控制场景下固定VT电压就够了后面再展开。3. 软件实现定时器采样、FFT频谱、速度解算3.1 ADC采样怎么触发最靠谱软件部分第一个决定是ADC采样方式。千万不要用delay循环去采样CPU中断和代码执行时间的抖动会导致采样间隔不稳定FFT对这种抖动非常敏感频谱会多出一堆杂散分量。正确做法是定时器更新事件触发ADC采样DMA循环搬运。我用的外设组合是TIM2更新事件作为ADC1外部触发源ADC1在定时器上升沿采样DMA1把转换结果送到内存数组。采样长度1024采样率配置为10kHz这样采一组波形约102毫秒做完一次FFT后刚好覆盖人体走路、跑步的频段。具体配置记住三个关键点TIM2时钟72MHz要得到10kHz更新频率PSC设为71ARR设为99。ADC采样时间不要配太短STM32F1的ADC采样周期建议配到28.5周期以上否则输入电容没建立稳定就开始转换了。DMA必须开循环模式否则采完一轮就停在那里不走了。3.2 拿到原始波形之后必须做的三步处理ADC连续采集到的是一串原始数值里面混着直流偏置、低频干扰和多普勒信号。直接用FFT也能看但效果很差。我每次处理前都按下面三步走。第一步是去直流。雷达静止时中频输出常有一个固定偏置这个偏置在FFT里会变成0Hz附近的巨大能量把低速目标信号淹没。最简单有效的做法是直接减去数组均值效果已经很好。float mean 0; for (int i 0; i FFT_SIZE; i) { mean adc_buf[i]; } mean / FFT_SIZE; for (int i 0; i FFT_SIZE; i) { fft_input[2 * i] (float)adc_buf[i] - mean; fft_input[2 * i 1] 0.0f; }第二步是加窗。FFT有一个固有问题叫频谱泄漏直接截断一段有限长度的波形信号能量会扩散到相邻频点。加汉宁窗能把旁瓣压低几十dB对低速目标识别帮助很大。汉宁窗公式是w[i] 0.5 * (1 - cos(2PIi/(N-1)))计算量不大完全可以在STM32上实时跑。第三步是FFT和幅度谱。用CMSIS-DSP库的arm_cfft_f32做复数FFT再用arm_cmplx_mag_f32取模得到幅度谱。这里注意输入数组是按实部、虚部交错排列的预填充时虚部填0。3.3 速度换算公式和参数选择多普勒频移公式是fd 2 * v * f0 / c其中v是目标相对速度f0是雷达发射频率24.125GHzc是光速。反过来得到v fd * c / (2 * f0) fd * lambda / 2。24GHz信号的波长lambda约等于12.43mm代入后可以得到一个非常实用的换算关系1Hz多普勒频移约对应0.006215m/s。我做FFT时采样率fs10kHz点数N1024频率分辨率约9.77Hz对应速度分辨率约0.061m/s。这个精度用来检测人体走动、车辆经过完全够用。如果想识别更慢的目标可以把采样率降到2kHz但要注意不能低于目标最高频移的2倍否则会发生频谱混叠。3.4 可运行的核心代码骨架下面是一段简化但能跑通的速度解算代码用的HAL库和CMSIS-DSP#define FFT_SIZE 1024 #define FFT_SAMPLE_RATE 10000.0f static float fft_input[FFT_SIZE * 2]; static float fft_magnitude[FFT_SIZE]; static uint16_t adc_buf[FFT_SIZE]; void process_speed(void) { // 1. 去直流 float mean 0; for (int i 0; i FFT_SIZE; i) { mean adc_buf[i]; } mean / FFT_SIZE; // 2. 填FFT输入并加汉宁窗 for (int i 0; i FFT_SIZE; i) { float w 0.5f * (1.0f - arm_cos_f32(2.0f * 3.14159f * i / (FFT_SIZE - 1))); fft_input[2 * i] ((float)adc_buf[i] - mean) * w; fft_input[2 * i 1] 0.0f; } // 3. FFT和幅度谱 arm_cfft_f32(arm_cfft_sR_f32_len1024, fft_input, 0, 1); arm_cmplx_mag_f32(fft_input, fft_magnitude, FFT_SIZE / 2); // 4. 峰值查找 uint16_t peak_index 1; float peak_value 0; for (int i 1; i FFT_SIZE / 2; i) { if (fft_magnitude[i] peak_value) { peak_value fft_magnitude[i]; peak_index i; } } // 5. 换算速度 float fd (float)peak_index * FFT_SAMPLE_RATE / FFT_SIZE; float speed fd * 0.006215f; // 单位m/s printf(fd%.1fHz, v%.2fm/s\r\n, fd, speed); }这段代码跑通没问题但注意峰值查找没有做筛选实际调试时要把0Hz到30Hz的低频杂散区跳过不然静止时也会输出一个跳动的速度值。4. 实测时踩过的三个坑以及完整的排查思路4.1 人站着不动速度却一直在跳现象很典型目标静止串口输出速度值在0.5到2m/s之间乱跳。我的排查链路是先看ADC原始值发现波形在一个很大的直流分量上叠加着低频毛刺。把原始信号导到电脑上看频谱0到30Hz区域有一堆能量而且能量大小和周围环境有关。最后定位到两个原因一是没加隔直和低通低速目标产生的几十赫兹信号被直流偏置淹没二是电源纹波把低频噪声带进了中频链路。解决办法分三步模拟端加100Hz高通软件侧再去一次直流输出速度前做连续几帧的滑动平均。做完之后静止时速度值能稳定在0.1m/s以内。这个坑的通用经验是如果静止时速度不是0而是乱跳先检查时域底噪和供电不要急着调算法参数。4.2 走路的测速结果一直偏小现象是人走得越快测出来的速度越偏离真实值总是偏低。一开始我怀疑FFT频率分辨率不够把采样点数从512提高到2048结果改善有限。后来把ADC采样值导出来看波形发现人快速走动时的中频正弦波有明显锯齿状失真频率已经接近采样率的一半。最终确认是定时器配置分频算错了实际采样率只有3kHz左右而人快走时多普勒频移已经接近1.5kHz超过奈奎斯特频率发生混叠高频分量折叠回低频速度自然就偏小了。解决很简单重新配置定时器用示波器量一下PWM输出频率确认实际值和理论值一致。然后我在代码里把采样率做成宏定义换场景直接改一个数字。经验是做FFT之前采样率必须用手册公式重新核对不能想当然。采样率错误是这类项目里最隐蔽的坑。4.3 底噪忽高忽低换电源之后安静了这个坑最诡异传感器位置完全固定底噪却时高时低把手机靠近雷达波形立刻恶化。排查过程先排除天线问题把模块远离电脑和路由器底噪降了一点。再排除地线问题改用电池供电居然还在波动。最后发现影响最大的是开发板的USB口供电。USB电压不稳时STM32稳压出来的3.3V纹波很大而射频芯片对这个纹波极其敏感。解决方法是换一个5V/2A的电源适配器给开发板供电BGT24MTR11用独立LDO单独供电。换完之后底噪立刻降了一个数量级。这也解释了为什么成品雷达模块都会强调“RF供电必须单独处理”数字地和射频地分开走最后单点汇合这不是玄学是实打实的信号质量问题。5. 这个方案还能往哪些方向做深5.1 做成便携测速仪或人体存在感应器把速度通过OLED显示出来加两个按键切换量程就是一个简单的便携测速仪。同类的集成方案很多很多“基于STM32的智能台灯”项目里也用到类似的人体存在检测逻辑。快速判断的方法是不停通过串口输出“是否有运动目标”和“目标速度”。如果只是做存在检测甚至可以不用FFT直接统计中频信号的能量包络STM32的算力非常富裕。5.2 从测速走向测距CW模式只能测速度想测距离就要改成FMCW模式。VT电压按三角波或锯齿波扫描雷达发射频率随时间线性变化回波与发射信号混频后产生差频差频频率和目标距离成正比。这时的软件复杂度会高一些需要在VT脚加DAC或PWM加RC产生扫描波形FFT输出的频率转换公式也变成距离公式。STM32F4以上的型号做这部分更有优势主频高DSP库性能也更好。5.3 系统级的整合建议如果项目要做成人机交互设备可以在此基础上加LCD显示、旋钮按键、FreeRTOS任务调度甚至跑LVGL。多普勒速度数据作为一路传感输入和温度、光照、惯导数据融合能做出很多有意思的东西。板子布局上我的建议是天线区域要露出板边不要被金属外壳遮挡BGT24MTR11尽量和STM32数字电路保持2cm以上距离运放和ADC之间的走线越短越好。最后再分享一个我个人的小体会调试这类射频相关项目一定要把时域波形和频谱打印出来看而不是只盯着最终的速度值。很多坑答案早就写在时域波形里了。先把模拟链路和环境噪声处理好STM32端的算法反而轻松很多。本文还有配套的精品资源点击获取
返回列表