PWM抖动大先分清是硬件还是软件问题。软件上,检查定时器时钟源和预分频是否稳定,避免在中断里频繁修改CCR值(建议用DMA或影子寄存器)。硬件上,重点查电源纹波(示波器看VDD和GND噪声,加100nF+10uF去耦)、输出引脚是否悬空(加下拉电阻)、以及PWM频率是否接近晶振谐波。实操步骤:1) 用示波器测TIMx->CCR和CNT寄存器值,确认是否软件抖动;2) 若寄存器稳定但输出抖,查GPIO速度等级(设为High)和外部干扰;3) 检查是否使用了PLL倍频过高导致时钟抖动,可改用HSE直连。代码示例:
```c
// 使用影子寄存器避免更新毛刺
TIM_OCInitTypeDef oc = {0};
oc.OCMode = TIM_OCMODE_PWM1;
oc.Pulse = 500; // 初始值
HAL_TIM_PWM_ConfigChannel(&htim, &oc, TIM_CHANNEL_1);
// 更新时用HAL_TIM_PWM_Start_DMA或直接写CCR(但需等待更新事件)
```
最后,若抖动<1%,可忽略;若>5%,检查负载是否引起电源跌落。
mcuku 阿沐 · 2026-08-18