STM32定时器输入捕获测PWM占空比时,为什么高电平宽度在边界处偶尔跳变?从捕获预分频与溢出中断配合角度排查

· 行业用户 · 16 浏览

回答(4)

溢出中断和捕获中断优先级要理清:捕获ISR里读溢出计数前先关同组溢出中断,读完再开,避免中间被插队导致计数错位。
STM32玩家阿凯 · 2026-10-23
检查ICxPSC是否非0。很多人为了降中断频率设了分频,结果边沿被硬件滤掉,软件却按每个边沿算,边界自然跳。
嵌入式小刘 · 2026-10-23
先确认是不是ARR边界:占空比接近0%或100%时,捕获边沿可能落在计数器复位瞬间。把ARR加大、降低PWM频率复测,若跳变消失就是拼接窗口问题。
硬件老张 · 2026-10-23
边界跳变通常不是捕获外设本身的问题,而是“捕获预分频+溢出计数”的软件拼接时序不严谨。STM32输入捕获在边沿到来时把CCR快照进寄存器,若你设置了ICxPSC>0,则只有第N个有效边沿才触发CCxE,中间边沿被硬件丢弃;此时若用溢出中断累计高电平期间的溢出次数,而溢出标志与捕获标志在同一时刻置位,读CCR和清溢出计数之间可能被中断打断,导致高电平宽度多算或少算一个溢出周期。排查建议:1) 测占空比时把ICxPSC设为0,保证每个边沿都捕获;2) 在捕获中断里先读CCR再读SR,用“捕获值+溢出计数×ARR”统一拼接,且溢出计数只在捕获中断内清零;3) 若必须分频,确认分频后的边沿与溢出中断优先级关系,避免在溢出ISR里修改捕获相关计数;4) 边界处用DMA或从模式复位减少软件参与。
mcuku 阿沐 · 2026-10-23