ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

STM32G431六路互补PWM实验:TIM1死区配置与波形实测

STM32G431六路互补PWM实验:TIM1死区配置与波形实测 1. 为什么六路互补PWM值得单独做一次实验如果你正在用STM32G431做无刷电机驱动、数字电源或者三相逆变器六路互补PWM几乎是绕不开的一道坎。它不是一个“配置完就能跑”的外设而是涉及定时器模式、死区插入、互补通道映射、中断触发、故障保护等一整套机制的协同工作。我见过太多人卡在“波形出不来”“上下桥臂直通”“死区没生效”这类问题上最后只能换方案或者降频凑合用。这次实验的核心目标很明确用STM32G431的TIM1高级定时器生成三对互补PWM共六路带可调死区时间并且验证中心对齐模式下波形的对称性和中断触发行为。关键词里的“六路互补”“TIM1”“STM32G431”“死区时间”正好覆盖了从硬件选型到寄存器配置再到波形验证的完整链路。适合谁来参考如果你已经会用CubeMX配置普通PWM但对互补输出、死区、刹车功能还停留在“知道有但没实际调过”的阶段这篇内容就是为你写的。我会把配置逻辑、参数计算、实测波形、踩坑记录全部摊开讲尽量让你看完就能在自己的板子上复现。2. 六路互补PWM的整体设计思路2.1 为什么选TIM1而不是普通定时器STM32G431属于G4系列主打电机控制和数字电源片内带TIM1和TIM8两个高级定时器。普通定时器比如TIM2/TIM3也能输出PWM但它们没有互补输出和死区插入硬件要做六路互补只能靠软件取反时序精度和安全性都不可靠。TIM1的高级特性正好匹配需求每个通道都有CHx和CHxN一对互补输出硬件死区发生器死区时间可编程刹车输入BKIN可快速封锁输出支持中心对齐模式适合电机FOC和LLC谐振变换器重复计数器和更新中断可灵活触发ADC采样所以选TIM1不是“因为它高级”而是因为互补PWM的硬件需求只有高级定时器能满足。用普通定时器加软件方案在死区精度和故障响应速度上会吃大亏。2.2 三对互补通道的映射关系TIM1有四个通道我们只用前三个就能凑出六路CH1PA8和CH1NPB13或PA7取决于复用CH2PA9和CH2NPB14或PB0CH3PA10和CH3NPB15或PB1在STM32G431上具体引脚要看数据手册的AF映射表。我这次用的是PA8/PA9/PA10作为上桥臂PB13/PB14/PB15作为下桥臂这样布局在常见的驱动板上比较顺手。注意CHxN的极性可以通过CCER寄存器的CCxNP位独立设置默认是高电平有效。如果你的栅极驱动芯片是低电平开通这里必须改否则上电瞬间可能直通。2.3 中心对齐模式的选择理由PWM模式有边沿对齐和中心对齐两种。边沿对齐实现简单但谐波分量集中在开关频率及其倍数上对电机控制来说电流纹波更大。中心对齐模式下计数器先向上再向下PWM脉冲关于中心对称等效开关频率翻倍电流纹波更小FOC算法里的采样时机也更规整。代价是中心对齐模式下更新事件发生在计数器到零和到ARR两个点中断频率翻倍CPU负载略高。但对于G431这种带FPU的Cortex-M4跑FOC完全够用。我这次实验就是用的中心对齐模式1计数器在向上和向下计数时都产生比较动作。2.4 死区时间的计算逻辑死区时间不是随便填的它由目标死区时长和定时器时钟频率共同决定。公式是DTG[7:0] 死区时间 / T_dts其中T_dts是死区时钟周期取决于TIM1的时钟分频。假设TIM1时钟72MHz不分频T_dts≈13.89ns。如果我要500ns死区那DTG值大约36。但DTG不是直接线性映射它分了几段范围需要查参考手册的编码表。实际配置时我一般先用CubeMX算个大概再用示波器实测微调。因为栅极驱动芯片和MOSFET的开关延迟也会吃掉一部分死区纯理论计算往往偏乐观。3. CubeMX配置与寄存器关键位解析3.1 时钟树和TIM1时钟源设置G431的TIM1挂在APB2总线上。CubeMX里先把系统时钟拉到170MHzG431的最大主频APB2不分频所以TIM1时钟就是170MHz。这个频率下T_dts≈5.88ns死区分辨率很高。但170MHz对栅极驱动来说可能太快实际开关频率我设的是20kHzARR值用中心对齐模式计算ARR TIM1_CLK / (2 * F_pwm) 170MHz / (2 * 20kHz) 4250中心对齐模式下PWM频率是时钟除以2倍ARR这个别搞错否则实际频率会差一倍。3.2 时基单元配置要点CubeMX里TIM1的配置项Counter Mode: Center Aligned 1Prescaler: 0Counter Period (ARR): 4250Internal Clock Division: No DivisionRepetition Counter: 0先不启用重复计数Auto-reload preload: EnableRepetition Counter在电机控制里常用来每N个周期触发一次更新中断方便ADC采样。这次实验先设为0保证每个周期都触发。3.3 PWM通道和互补输出配置每个通道的配置Mode: PWM Mode 1Pulse: 初始占空比比如ARR的一半Output compare preload: EnableFast Mode: Disable除非需要极短脉冲CH Polarity: HighCHN Polarity: HighIdle State: Reset互补输出的关键在CCER寄存器CC1E1CC1NE1开启CH1和CH1N输出CC1P和CC1NP根据驱动芯片极性设置我用的栅极驱动是高电平开通所以两个极性都设High。如果你用的是IR2104这类输入高电平对应输出高那也设High。3.4 死区配置的寄存器细节死区寄存器BDTR的低8位是DTG高几位控制OSSR、OSSI、BKE、BKP等。CubeMX里直接填Dead Time值它会自动算DTG编码。我填的是500nsCubeMX算出DTG0x54左右。实测波形显示上下桥臂之间确实有约520ns的间隔包含了驱动芯片的传输延迟基本符合预期。注意BDTR的MOE位主输出使能必须置1否则所有输出都是无效电平。CubeMX生成的代码里会在HAL_TIM_PWM_Start之后自动设置MOE但如果你手动操作寄存器别忘了这一步。3.5 刹车功能和故障保护预留虽然这次实验没接刹车引脚但BDTR里的BKE和BKP位建议先配好。BKE1开启刹车功能BKP设置刹车输入极性。一旦BKIN引脚被拉低或拉高取决于极性硬件会立刻封锁所有输出响应时间只有几个时钟周期比软件中断快得多。实际做电机驱动时过流信号直接接到BKIN引脚比走ADC采样再软件关断可靠得多。这个功能在调试阶段可以先不启用但量产固件里一定要加。4. 代码实现与波形实测过程4.1 初始化代码的关键片段CubeMX生成的初始化代码里重点看这几段htim1.Instance TIM1; htim1.Init.Prescaler 0; htim1.Init.CounterMode TIM_COUNTERMODE_CENTERALIGNED1; htim1.Init.Period 4250; htim1.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter 0; htim1.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE;死区配置在BDTR里sBreakDeadTimeConfig.OffStateRunMode TIM_OSSR_ENABLE; sBreakDeadTimeConfig.OffStateIDLEMode TIM_OSSI_ENABLE; sBreakDeadTimeConfig.LockLevel TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime 54; sBreakDeadTimeConfig.BreakState TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput TIM_AUTOMATICOUTPUT_ENABLE;DeadTime54对应的就是前面算的500ns左右。AutomaticOutput使能后MOE位会在下一个更新事件自动置1省去手动操作。4.2 启动PWM输出的顺序启动顺序很重要搞错了可能瞬间直通先配置好所有通道的比较值和死区调用HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1)等启动各通道最后调用HAL_TIMEx_PWMN_Start启动互补通道如果需要调用__HAL_TIM_MOE_ENABLE(htim1)手动使能主输出我实测下来CubeMX生成的代码在HAL_TIM_PWM_Start内部已经处理了MOE但如果你用的是LL库或直接寄存器操作一定要确认MOE状态。4.3 示波器实测波形分析用四通道示波器抓CH1、CH1N、CH2、CH2N的波形CH1和CH1N严格互补死区约520nsCH1和CH2之间相位差120度中心对齐模式下占空比50%时高电平时间约25us周期50us死区期间两路都是低电平没有重叠这里有个细节中心对齐模式下CH1的上升沿在计数器向上计数到比较值时产生下降沿在向下计数到比较值时产生。所以脉冲是关于中心对称的用示波器的延迟触发能看得很清楚。4.4 更新中断的触发行为开启TIM1更新中断后在中心对齐模式下每个PWM周期会触发两次中断一次在计数器到ARR一次在到0。中断频率是PWM频率的两倍即40kHz。这个特性在FOC里很有用可以在计数器到0时触发ADC采样此时电流纹波最小。但要注意中断服务程序里别做太多事40kHz下留给CPU的时间只有25us。void TIM1_UP_TIM16_IRQHandler(void) { if (__HAL_TIM_GET_FLAG(htim1, TIM_FLAG_UPDATE) ! RESET) { __HAL_TIM_CLEAR_FLAG(htim1, TIM_FLAG_UPDATE); // 这里放ADC触发或换相逻辑 } }4.5 占空比动态调整测试用__HAL_TIM_SET_COMPARE动态改比较值观察波形变化。从10%到90%扫一遍死区时间保持不变互补关系也没有破坏。这说明硬件死区发生器是独立于比较值的改占空比不会影响死区。但要注意如果比较值接近ARR或0可能会吃掉一部分死区。比如占空比99%时高电平时间几乎占满整个周期死区仍然存在但有效占空比会略低于设定值。这是正常现象计算效率时要考虑进去。5. 常见问题与排查技巧实录5.1 波形出不来或只有一路输出最常见的原因是MOE位没置1或者CCxE/CCxNE没使能。排查顺序读BDTR寄存器确认MOE1读CCER寄存器确认CC1E1且CC1NE1检查GPIO复用是否正确PA8应该配成AF1TIM1_CH1确认HAL_TIM_PWM_Start和HAL_TIMEx_PWMN_Start都调用了我遇到过一种情况只调了HAL_TIM_PWM_Start忘了调互补通道的启动函数结果CH1有波形CH1N一直是低电平。补上HAL_TIMEx_PWMN_Start就好了。5.2 死区时间不对或没有死区先确认BDTR的DTG值是否写进去了。CubeMX有时会因为时钟配置变化重新计算DTG如果你手动改过时钟树要重新检查。另一个坑是死区时间只在互补输出之间生效如果你把CH1和CH1N都配成同相输出那死区不会插入。必须确保CC1P和CC1NP设置正确让两路是反相关系。5.3 上下桥臂直通烧管这是最危险的情况。除了死区没配好还有几个可能栅极驱动芯片的使能引脚没控制好上电瞬间两路都开通死区时间太短小于MOSFET的关断延迟刹车功能没启用过流时没有硬件封锁我的经验是第一次上电一定要用限流电源先不接功率管只测驱动芯片输出。确认死区正常后再接母线电压。另外死区时间建议留足余量比如MOSFET关断需要200ns那死区至少设500ns。5.4 中心对齐模式下频率不对中心对齐模式的PWM频率公式是F_pwm TIM_CLK / (2 * ARR)不是TIM_CLK / ARR。很多人按边沿对齐的公式算结果实际频率只有预期的一半。我一开始也踩过这个坑示波器一测发现是10kHz而不是20kHz回头改ARR才对上。5.5 中断频率翻倍导致CPU过载中心对齐模式下更新中断是PWM频率的两倍。如果你在中断里做了太多浮点运算40kHz下CPU可能跑不过来。解决办法用重复计数器降低中断频率把非关键逻辑移到主循环用DMA触发ADC减少中断里的事我实测在170MHz的G431上40kHz中断里只做ADC触发和简单换相CPU占用不到5%。但如果加PID运算和坐标变换就要考虑优化了。5.6 互补输出极性搞反不同栅极驱动芯片的输入极性不一样。有的高电平开通有的低电平开通。如果搞反了上电就是直通。排查方法很简单不接功率管用示波器看驱动芯片输出。如果上桥臂输出高时下桥臂也输出高那就是极性反了改CCxNP位即可。6. 实操心得与参数优化建议6.1 死区时间的实测微调方法理论计算的死区时间只是起点。实际调试时我会先把死区设大一点比如1us用示波器确认互补关系正常然后逐步减小到目标值。每减一次观察驱动芯片输出是否还有重叠。最终值通常比理论值大20%到50%因为要覆盖驱动芯片的传输延迟和MOSFET的关断拖尾。6.2 开关频率与死区时间的权衡开关频率越高死区占空比损失越大。比如20kHz下死区500ns占空比损失约1%。如果提到100kHz同样500ns死区损失就到5%了。所以高频应用要选低栅极电荷的MOSFET和快速驱动芯片把死区压到200ns以内。6.3 用DMA自动更新比较值如果要做正弦波调制手动改比较值太慢。可以用DMA把预先算好的正弦表搬到CCR寄存器。TIM1的更新事件触发DMA请求每个PWM周期自动更新一次CPU几乎不参与。这个方案在FOC和SPWM里都很常用。6.4 刹车输入的硬件保护设计BKIN引脚建议直接接过流比较器的输出不要经过软件。硬件刹车响应时间只有几个时钟周期软件中断至少几微秒差距很大。调试时可以先禁用刹车量产固件里一定要启用并且把刹车后的状态设成安全电平。6.5 示波器抓波形的触发技巧六路互补PWM用四通道示波器抓不全可以分两次抓先抓CH1/CH1N/CH2/CH2N再抓CH2/CH2N/CH3/CH3N。触发源选CH1的上升沿时基设成10us/div能看清死区和相位关系。如果要测死区精确值把时基打到100ns/div用光标测量。6.6 常见参数速查表参数推荐值说明PWM频率20kHz电机驱动常用兼顾效率和噪声死区时间500ns根据MOSFET和驱动芯片调整时钟分频不分频170MHz下死区分辨率约5.88ns计数模式中心对齐1电流纹波小适合FOCARR值4250对应20kHz中心对齐重复计数器0每周期触发更新中断MOE使能必须置1才有输出刹车使能过流保护用这套参数在我自己的G431驱动板上跑得很稳带一个24V/10A的BLDC电机死区波形干净没有直通现象。如果你用的是不同的MOSFET或驱动芯片死区时间需要重新微调但整体配置逻辑是一样的。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表