影子寄存器:改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节"基本定时器原理与动态周期控制"。)

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

相关推荐
Zwawa37 分钟前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
倔强的胡萝卜3 小时前
基于STM32F103C8T6的温度报警器设计
stm32·单片机·嵌入式硬件
缘来是你远去是我3 小时前
ZYNQ 系列芯片中断机制详解:类型、处理过程与中断处理函数
单片机·嵌入式硬件
Zw-awa3 小时前
两根线怎么挂住一堆设备:I2C 协议原理
stm32
LCG米5 小时前
STM32 定时器主从模式输出精确脉冲数实测:TRGO 触发链拆解、多发一脉冲根因与干净停止时序落地
stm32·单片机·嵌入式硬件·嵌入式
青梅味猪大肠5 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
FakeOccupational5 小时前
【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置
笔记·stm32·实时音视频
ChaseVLSI6 小时前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
东莞市壹星自动化设备有限公司6 小时前
透明圆瓶内部特征怎样定位:折射追踪与近远相位分支
嵌入式硬件·自动化·需求分析·几何学·骨骼绑定
Dev_XH6 小时前
【成品设计】基于物联网的配电箱智能防护系统设计
stm32·单片机·嵌入式硬件·物联网