影子寄存器:改ARR下个周期才生效,波形不突变

短文标题:影子寄存器:改ARR下个周期才生效,波形不突变

你有没有想过一个问题:定时器正在输出PWM,突然改了ARR(周期),波形会不会断一下或出现毛刺?取决于ARPE位。 STM32的ARR(自动重装载寄存器)有两层:预装载寄存器 (软件读写)和影子寄存器(硬件使用)。影子寄存器在更新事件发生时从预装载寄存器加载新值。

**ARPE=0:立即生效(可能突变),**ARPE=0时,预装载寄存器直通影子寄存器,写ARR立即生效。计数器正在计数,比如当前值=800,ARR从1000改成500:

  • 800 > 500,计数器永远达不到ARR
  • 一直跑到16位定时器的上限65535才溢出
  • 一个周期变得超级长,波形完全乱掉

这称为"周期突变",可能导致PWM波形畸变、电机抖动。ARPE=1:下个周期生效(平滑过渡),ARPE=1时,预装载寄存器和影子寄存器隔离。修改ARR后,当前周期继续用旧ARR跑,计数到旧ARR值 → 产生更新事件 → 影子寄存器从预装载寄存器加载新ARR → 下个周期用新ARR。

波形连续,无毛刺。更新事件的发生时刻更新事件由硬件在计数器溢出(向上计数:从ARR→0;向下计数:从0→ARR)时自动产生,也可由软件设置UG位强制产生。设置UG位后:

  • 影子寄存器立即更新(ARR、PSC、CCR预装载值全部加载)
  • 计数器立即归零(如果设置了URS位,不触发更新中断,但仍更新影子寄存器)

重要:ARPE保护的是影子寄存器的更新时机,不是更新事件本身。 即使ARPE=1,软件写UG位仍会强制立即更新。配置方法

TIM2->CR1 |= TIM_CR1_ARPE; // 使能预装载,ARPE=1(默认0)

TIM2->ARR = 2000; // 修改ARR,下个周期生效

电机控制、PWM调光等需要连续波形的场合,必须设ARPE=1。PSC也一样,预分频器(PSC)也有影子寄存器,修改PSC后也是在下一次更新事件时才生效。所有会影响计数频率的寄存器,都有这种"缓冲"设计。

这个故事的启示, ARPE不是"延迟",是"优雅交接"。让新ARR在更新事件时生效,而不是在周期中间"野蛮插入"。波形平滑,电机不抖,PWM不毛刺。写在最后, 动态改变定时器周期或占空比时,设ARPE=1。不设,可能周期突变;设了,平滑过渡。一个bit,决定波形质量。


(本文灵感源于于振南《新概念ARM32单片机》教程第6.4节"基本定时器原理与动态周期控制"。)

觉得有用?点赞、转发,让更多人知道"影子寄存器"防突变的作用。

相关推荐
芯岭技术7 小时前
XL2411蓝牙透传模组,通过MCU发送简单的串口AT指令,就能完成配网、数据传输等操作
单片机·嵌入式硬件
LS_learner7 小时前
内存申请和使用的场景分析(以AP->kernal->ISP为例)
嵌入式硬件
210Brian8 小时前
蓝桥杯单片机学习笔记(十四) V2026大模板源代码
单片机·学习·蓝桥杯
大卡片8 小时前
TIM控制器原理
单片机·嵌入式硬件
Tech_D8 小时前
微米级的精准魔法:激光微加工,解锁高端制造新可能
人工智能·单片机·机器人·自动化·制造
小+不通文墨8 小时前
在树莓派中用*C语言*实现MQTT通信
c语言·经验分享·笔记·嵌入式硬件·学习
保安大队王队长8 小时前
对于单片机以及单片机的应用,要学的还有涉及到的电路都有哪些
单片机·嵌入式硬件
大卡片9 小时前
时钟控制器原理
单片机·嵌入式硬件
神仙别闹9 小时前
基于C语言来实现图形界面画板的功能
c语言·开发语言·单片机