STM32G474 HRTIM PWM仅主定时器比较值大于70ns时正常工作故障咨询
STM32G474 HRTIM多路移相PWM小角度输出异常问题
开发环境与需求
- 开发环境:STM32CubeIDE 1.7.0
- 硬件平台:STM32G474芯片
- 功能需求:实现4路PWM通道,支持5°间隔移相(示例配置:A=0°、B=5°、C=10°、D=180°),PWM占空比固定为50%,核心指标为通道间移相精度。
实现方案

主定时器配置
- HRTIM输入时钟为170 MHz
- 主定时器PWM频率为1.6 MHz
- 预分频倍率为HRTIM时钟倍频32,fHRCK = 5.44E9 Hz
- 周期值计算:
HRTIM_INPUT_CLOCK * 32 / TIMM_PWM_FREQ = 3400 - 主定时器配置4路比较值,计算规则为
masterCompareN= period/360*shift
定时器A~D配置
- 预分频倍率为HRTIM时钟倍频32,fHRCK = 5.44E9 Hz
- 每路定时器配置1路比较值,计算规则为
(masterCompareN + (period/2)) % period
逻辑规则
主定时器对应比较事件触发对应通道输出置高,对应定时器自身比较事件触发通道输出置低。
故障现象
当所有通道移相角度≥8°(对应70ns)时输出符合预期,低于该阈值如A通道移相5°时偶尔无输出,疑似对应比较事件未生效。
测试波形对应移相值:A(红)2°、B(蓝)5°、C(绿)7°、D(黄)10°。
HRTIM初始化代码
// static void MX_HRTIM1_Init(void) // Master Timer LL_HRTIM_TIM_SetPrescaler(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_PRESCALERRATIO_MUL32); LL_HRTIM_TIM_SetCounterMode(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_MODE_CONTINUOUS); LL_HRTIM_TIM_SetPeriod(HRTIM1, LL_HRTIM_TIMER_MASTER, TIMM_PERIOD); LL_HRTIM_TIM_SetRepetition(HRTIM1, LL_HRTIM_TIMER_MASTER, 0x00); LL_HRTIM_TIM_DisableHalfMode(HRTIM1, LL_HRTIM_TIMER_MASTER); LL_HRTIM_TIM_SetInterleavedMode(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_INTERLEAVED_MODE_DISABLED); LL_HRTIM_TIM_DisableStartOnSync(HRTIM1, LL_HRTIM_TIMER_MASTER); LL_HRTIM_TIM_DisableResetOnSync(HRTIM1, LL_HRTIM_TIMER_MASTER); LL_HRTIM_TIM_SetDACTrig(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_DACTRIG_NONE); LL_HRTIM_TIM_DisablePreload(HRTIM1, LL_HRTIM_TIMER_MASTER); LL_HRTIM_TIM_SetUpdateGating(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_UPDATEGATING_INDEPENDENT); LL_HRTIM_TIM_SetUpdateTrig(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_UPDATETRIG_NONE); LL_HRTIM_TIM_SetBurstModeOption(HRTIM1, LL_HRTIM_TIMER_MASTER, LL_HRTIM_BURSTMODE_MAINTAINCLOCK); LL_HRTIM_ForceUpdate(HRTIM1, LL_HRTIM_TIMER_MASTER); LL_HRTIM_TIM_SetCompare1(HRTIM1, LL_HRTIM_TIMER_MASTER, TIMM_Compare1); LL_HRTIM_TIM_SetCompare2(HRTIM1, LL_HRTIM_TIMER_MASTER, TIMM_Compare2); LL_HRTIM_TIM_SetCompare3(HRTIM1, LL_HRTIM_TIMER_MASTER, TIMM_Compare3); LL_HRTIM_TIM_SetCompare4(HRTIM1, LL_HRTIM_TIMER_MASTER, TIMM_Compare4); // Timer A LL_HRTIM_TIM_SetPrescaler(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_PRESCALERRATIO_MUL32); LL_HRTIM_TIM_SetCounterMode(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_MODE_CONTINUOUS); LL_HRTIM_TIM_SetPeriod(HRTIM1, LL_HRTIM_TIMER_A, TIMM_PERIOD); LL_HRTIM_TIM_SetRepetition(HRTIM1, LL_HRTIM_TIMER_A, 0x00); LL_HRTIM_TIM_SetUpdateGating(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_UPDATEGATING_INDEPENDENT); LL_HRTIM_TIM_SetCountingMode(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_COUNTING_MODE_UP); LL_HRTIM_TIM_SetComp1Mode(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_GTCMP1_GREATER); LL_HRTIM_TIM_SetDACTrig(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_DACTRIG_NONE); LL_HRTIM_TIM_DisableHalfMode(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_SetInterleavedMode(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_INTERLEAVED_MODE_DISABLED); LL_HRTIM_TIM_DisableStartOnSync(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_DisableResetOnSync(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_DisablePreload(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_DisableResyncUpdate(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_SetUpdateTrig(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_UPDATETRIG_NONE|LL_HRTIM_UPDATETRIG_NONE); LL_HRTIM_TIM_SetResetTrig(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_RESETTRIG_NONE); LL_HRTIM_TIM_DisablePushPullMode(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_DisableDeadTime(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_SetBurstModeOption(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_BURSTMODE_MAINTAINCLOCK); LL_HRTIM_ForceUpdate(HRTIM1, LL_HRTIM_TIMER_A); LL_HRTIM_TIM_SetCompare1(HRTIM1, LL_HRTIM_TIMER_A, TIMA_Compare1); LL_HRTIM_OUT_SetPolarity(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUT_POSITIVE_POLARITY); LL_HRTIM_OUT_SetOutputSetSrc(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUTPUTSET_MASTERCMP1); LL_HRTIM_OUT_SetOutputResetSrc(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUTPUTRESET_TIMCMP1); LL_HRTIM_OUT_SetIdleMode(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUT_NO_IDLE); LL_HRTIM_OUT_SetIdleLevel(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUT_IDLELEVEL_INACTIVE); LL_HRTIM_OUT_SetFaultState(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUT_FAULTSTATE_NO_ACTION); LL_HRTIM_OUT_SetChopperMode(HRTIM1, LL_HRTIM_OUTPUT_TA1, LL_HRTIM_OUT_CHOPPERMODE_DISABLED); // Timer B、C、D配置逻辑与Timer A一致
排查记录
- 2021-10-15:添加
__disable_irq()排除中断导致定时器寄存器重载的影响,确认故障与中断无关。 - 2021-10-15:查阅
LL_HRTIM_TIM_SetCompare1()函数说明,要求比较值需≥3个fHRTIM时钟周期,fHRTIM为170MHz对应周期约5.88ns,3倍值为17.65ns;实测可正常工作的10°移相对应时延约12ns以上,0°移相偶尔可正常输出。
内容的提问来源于stack exchange,提问作者codeshredder726b
相关产品推荐
相关产品推荐

