影子寄存器:改ARR下个周期才生效,防波形“断片”

影子寄存器:改ARR下个周期才生效,防波形“断片” 短文标题影子寄存器改ARR下个周期才生效防波形“断片”你有没有想过一个问题PWM正在输出你突然改了ARR周期波形会不会断一下或出现毛刺取决于ARPE位。如果没开预装载修改ARR立即生效——计数中途改周期可能导致计数器永远达不到新ARR值产生一个“超长”的异常周期电机抖动一下。影子寄存器的双层结构定时器的ARR、CCR、PSC等寄存器实际上有两层预装载寄存器Preload软件读写的“窗口”影子寄存器Shadow硬件实际使用的“工作副本”软件写ARR → 写到预装载寄存器。影子寄存器的值才是计数器比较的对象。ARPE0立即生效可能突变ARPE0时预装载寄存器直通影子寄存器写ARR立即生效。计数器正在计数当前值800ARR从1000改成500800 500计数器永远达不到新ARR一直跑到16位定时器的65535才溢出一个周期变得超级长波形完全乱掉电机可能猛抖一下ARPE1下个周期生效平滑过渡ARPE1时预装载寄存器和影子寄存器隔离。当前周期继续用旧ARR跑计数到旧ARR值 → 产生更新事件 → 影子寄存器从预装载寄存器加载新ARR → 下个周期用新ARR。TIM2-CR1 | TIM_CR1_ARPE; // 使能预装载TIM2-ARR 2000; // 修改ARR下个周期才生效波形连续无毛刺。CCR也是一样PWM占空比由CCR控制也有影子寄存器通过CCMRx寄存器的OCxPE位控制。修改CCR后占空比变化同样在更新事件时生效避免脉冲宽度突变。更新事件的触发时机更新事件在以下情况产生计数器溢出向上计数从ARR→0向下计数从0→ARR软件设置UG位TIMx_EGR寄存器ARPE保护的是更新时机不影响UG位的立即更新。软件写UG位会强制立即生效。这个故事的启示ARPE不是“延迟”是“优雅交接”。让新ARR在更新事件时生效不是在周期中间“野蛮插入”。波形平滑电机不抖PWM不毛刺。写在最后动态改变定时器周期或占空比时设ARPE1。不设可能周期突变设了平滑过渡。一个bit决定波形质量。本文灵感源于于振南《新概念ARM32单片机》教程第6.4节、第6.7节。觉得有用点赞、转发让更多人知道“影子寄存器”防突变的作用。