十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32G484 HRTIM高分辨率定时器详解:CubeMX配置PWM与死区实战

STM32G484 HRTIM高分辨率定时器详解:CubeMX配置PWM与死区实战 最近在折腾一块STM32G484重点就是它的HRTIM高分辨率定时器。这颗料最吸引我的点不是170MHz主频也不是Cortex-M4F内核而是这颗HRTIM。HRTIM能把PWM边沿控制做到纳秒级天然支持多路输出、互补通道、死区插入和故障保护做LLC谐振变换器、移相全桥、三相无刷电机控制时非常实用。不过HRTIM也是G4系列里公认难啃的外设寄存器多、命名绕、时序关系复杂刚上手很容易懵。好在有CubeMX做图形化配置能把一部分工作量从“对着参考手册翻寄存器”变成“填几个参数”但前提是得知道每个参数填什么、为什么这么填。下面我用一颗实际的STM32G484芯片从CubeMX的时钟树开始把HRTIM的单通道PWM、互补输出带死区、故障保护以及用普通定时器测量输出占空比和频率的整个流程完整走一遍过程中穿插一些个人踩坑经验。1. HRTIM的价值与STM32G484的资源盘点1.1 为什么普通定时器不够用STM32G4的通用定时器最高时钟其实也是170MHz理论上也能输出很高频率的PWM但如果直接让计数器按170MHz跑输出50kHz的PWM时一个周期只有3400个计数点。3400这个数字看起来不少可一旦要做占空比精调比如从50%调到50.1%对应调整量就是3到4个计数周期误差在纳秒级别会被放大。更麻烦的是电力电子场景里经常需要“上升沿和下降沿分别由不同事件决定”比如移相全桥里的死区、单周期控制里的占空比补偿普通定时器的输出边沿只能跟着计数器走做不到灵活组合。HRTIM的思路不一样。它把定时器分成了多个独立的时基单元每个单元有自己的周期寄存器、比较寄存器、死区发生器还能通过复位、使能、外部事件触发来联动。简单说普通定时器是“一个计数器输出一组固定边沿”HRTIM是“一组计数器配合事件逻辑生成任意形状的波形”。这就是它被称为高分辨率定时器的原因。1.2 G484的HRTIM有哪些资源STM32G484的HRTIM1包含5个定时器单元命名为Timer A到Timer E外加一个主定时器MST。每个定时器单元可以输出两路信号所以HRTIM1总共提供10根输出线其中TIMA1/TIMA2、TIMB1/TIMB2等两两组合天然形成5对互补输出。每个单元都有独立的周期寄存器、多个比较单元CMP1/CMP2/CMP3/CMP4、死区插入逻辑、DAC触发/ADC触发事件还能接收外部事件输入。所有定时器可以通过主定时器MST或外部同步信号联动实现多相时钟输出。时钟方面G484的HRTIM时钟最高170MHz最小时间分辨率约5.88ns。周期寄存器是16位加上预分频之后频率覆盖范围很宽。它还支持与内部比较器、ADC联动比如比较器输出直接作为故障输入ADC转换完成触发定时器动作这些组合起来就是数字电源控制器的完整骨架。特性通用定时器TIM1HRTIM1时基1个16/32位计数器5个定时器单元1个主定时器互补通道最多3对TIM1/TIM85对死区调节8位粗粒度每路独立Rising/Falling可到纳秒级故障输入FLT1~FLT3FLT1~FLT8内部比较器事件联动简单复位、使能、DAC/ADC触发均可配置相位调节有限可通过其他定时器复位偏移1.3 适合谁如果你只是点亮LED或者驱动普通电机通用定时器完全够用没必要上HRTIM。但如果你要做半桥、全桥驱动器需要精心控制死区需要多路相位可调需要硬件故障封锁HRTIM才是正确选择。G484这颗芯片的HRTIM基本就是为数字电源准备的也正因如此刚接触的人最容易“一上来就懵”。我的建议是不要一口气学全部功能先拿一路PWM跑通再逐步叠加高级功能。2. CubeMX工程与时钟树准备2.1 硬件与软件清单我用的硬件是STM32G484RE核心板也可以直接用同封装的G474系列外设基本一致。烧录调试用板载ST-Link。示波器建议至少2通道如果要看死区波形4通道会更顺手。软件方面STM32CubeMX用6.9以上版本STM32CubeG4固件包用1.5.0以上编译器我习惯用STM32CubeIDE用Keil也没问题。有几次我在CubeMX里从官网下载固件包卡在60%然后提示“this file is either corrupted or not a recognized package”这种基本是下载不完整。解决方法是手动用浏览器下载固件包zip解压后放到CubeMX的Repository目录或者直接在“Manage embedded software packages”里重新下载。不要硬着头皮在一个坏包上反复尝试。2.2 时钟树里的一个关键点新建工程选好芯片型号后第一件事不是急着打开HRTIM而是先把时钟树搞定。G484最高主频170MHz我一般用外部8MHz晶振在Clock Configuration里把PLL Source设为HSE设置PLLM2、PLLN85、PLLR2计算结果是8/2×85/2170MHz即SYSCLK170MHz。这里要特别提醒HRTIM1的计数器时钟和系统主频HCLK绑定。如果你为了省电把HCLK降到85MHzHRTIM的时间分辨率也跟着降到11.76ns如果你误改了AHB预分频CubeMX时钟树里的HRTIMCLK会显示一个不是你预期的数值而你实际输出PWM的频率也会跟着偏。配置完PLL后我总会瞄一眼时钟树底部的HRTIMCLK直接确认是不是170MHz免得后面排错排半天。2.3 工程生成前的准备在Project Manager里设置好工程名和路径工具链选STM32CubeIDE或MDK-ARM。Code Generator设置里我习惯勾上“Generate peripheral initialization as a pair of .c/.h files per peripheral”这样HRTIM的初始化代码会单独放在hrtim.c和hrtim.h里后期维护很清爽。不勾的话所有外设初始化代码都堆在main.c里时间长了会越看越乱。3. 用CubeMX配置HRTIM输出PWM3.1 单通道PWM最小配置打开HRTIM1外设在Mode下拉里选择“PWM Generation”会看到Timer A到Timer E的选项。只输出一路的话我选Timer A展开后把Output A下面的“Enable”勾上。CubeMX会自动分配一个GPIO引脚给HRTIM1_TIMA1具体是哪个引脚取决于芯片封装和AF映射芯片图上能直接看到高亮不用手动找。接着切到Parameter面板需要填这几个关键参数Prescaler计数器预分频默认DIV1先保持不动。Mode选Continuous模式也就是连续计数模式。Period Count16位周期寄存器PERxR的值我填1699。Compare Count比较寄存器CMPxR的值我填849。Output Polarity输出有效电平选High。Idle Level计数器空闲或故障时输出电平选Low。Dead-time Insertion先不开启保持Disable。生成工程后只需要在main函数里启动计数器和输出就能在引脚上看到100kHz、占空比约50%的方波。关于占空比的计算这里有个细节HRTIM从0计到PERIOD所以一个周期实际有PERIOD1个计数点。当Period Count1699时一个周期1700拍CMP849时高电平持续850拍占空比850/170050%。严格一点说占空比(CMP1)/(PERIOD1)。CubeMX的界面里也可以切换到按百分比或时间单位填写但内部换算逻辑就是这个公式。我习惯直接填寄存器值因为特殊波形用百分比表达不一定直观。3.2 互补输出与死区配置继续在Timer A下把Output B也勾上Enable引脚会自动分配为TIMA2。这时去看Dead-time Insertion设置HRTIM会把Rising和Falling两个方向分开设置单位可以填纳秒。我填500nsCubeMX会自动换算成对应的死区计数寄存器值500ns×170MHz85拍。如果死区时间不是5.88ns的整数倍CubeMX会向上取整实际时间会略有偏差但几百纳秒级别的误差通常可接受。配置死区后波形应该是两个互补信号上下桥臂切换时都存在一段“双低”间隔这就是死区。需要注意如果你把Output B的极性设成了Low有效死区间隔的表现会不一样。实际使用时要根据半桥驱动电路需求来设定高边开关在高有效时打开低边开关在低有效时打开这在电机驱动和数字电源里很常见。死区配置有几个容易踩的坑。第一死区寄存器是8位最大值255170MHz下最多约1.5μs。如果应用需要2μs死区就必须先调整计数器预分频降低HRTIM计数时钟但同时分辨率也会下降。所以死区需求和PWM频率、分辨率之间需要权衡。第二CubeMX里把死区寄存器设成0并不表示“无死区”而是死区时间为0拍。如果需要完全无死区要把Dead-time Insertion保持Disable而不是填0。第三死区寄存器一旦写了DTRLK/DTFLK锁定位运行中再改就不生效了必须复位芯片。调试时先别开锁定功能不然每次改参数都要重新上下电很麻烦。3.3 一个典型参数计算示例假设要做50kHz互补PWM死区1μs周期计数值 170MHz/50kHz - 1 3399。期望占空比50%则高电平拍数 (33991)×50%1700CMP 1700-11699。死区1μs对应计数 1μs×170MHz170拍Rising和Falling都填170。实际输出时因为死区插入两个边沿都被延后有效导通时间会少于名义占空比。如果最终需要50%的负载电流要把这个误差反向修正回CMP值。示波器上看到的不只是“占空比50%”的方波而是两个互补信号之间有一段双低时间。4. 高级功能故障保护、同步与Burst模式的配置思路4.1 故障保护让输出在异常时强制拉安全电平电力电子里最忌讳的事就是上下管同时导通就算死区设好了如果驱动芯片异常、采样电路短路、过流信号到来也必须在几个微秒内强制关断
返回列表