资讯动态

别再死记公式了!用STM32F103的TIM3输出PWM,我这样理解ARR、PSC和CCR的关系

发布时间:2026/8/20 12:15:32 来源:尧图企业网站定制
从心跳到呼吸用生活化思维理解STM32的PWM三剑客第一次接触STM32的PWM功能时我盯着数据手册里那些ARR、PSC、CCR的公式看了整整一天结果越看越糊涂。直到有天晚上听着自己的心跳声突然意识到——定时器不就是芯片的心跳吗而PWM不过是让这颗心脏按照我们的节奏呼吸。这种具象化的理解让我豁然开朗今天我就把这个顿悟时刻分享给同样困惑的你。1. 定时器STM32的心跳机制想象你正在数自己的脉搏。每次心跳就是一个滴答60次心跳组成一分钟——这和STM32定时器的工作原理惊人地相似。**ARRAuto-Reload Register就像你设定的计数目标值比如60次而PSCPrescaler**则决定了心跳的快慢相当于你选择用秒表还是沙漏来计时。当TIM3定时器启用时时钟信号经过PSC分频后驱动计数器累加。这个分频过程可以用简单的厨房秤来类比原始时钟频率 → 面粉高频信号 PSC值 → 筛网孔大小分频程度 分频后频率 → 筛过的面粉工作频率假设系统时钟是72MHzPSC设置为71实际分频系数为PSC1那么定时器的实际工作频率为定时器频率 72MHz / (71 1) 1MHz这就相当于把原本高速运转的心脏调整到了一个适合我们观察的节奏。接下来ARR决定了心跳多少次完成一个完整周期周期时间 (ARR 1) / 定时器频率如果ARR设为999那么PWM周期就是(999 1)/1MHz 1ms对应1kHz频率。这种心跳-呼吸的对应关系比死记公式直观多了。注意实际配置时ARR和PSC都是16位寄存器最大值65535。PSC为0表示不分频。2. PWM给心跳加上韵律有了规律的心跳现在要让芯片唱出歌来——这就是PWM的精髓。**CCRCapture/Compare Register**就是我们的歌词本决定了每个周期中高电平的持续时间。占空比的计算突然变得非常简单占空比 CCR / (ARR 1)配置TIM3输出PWM时每个通道都有独立的CCR寄存器。这就好比合唱团的四个声部虽然心跳节奏ARR相同但每个歌手可以有自己的发声时机CCR。具体到代码中// TIM3 PWM初始化示例 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 时基单元配置 TIM_TimeBaseStructure.TIM_Period 999; // ARR值 TIM_TimeBaseStructure.TIM_Prescaler 71; // PSC值 TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); // PWM模式配置以通道1为例 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 500; // CCR值 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM3, TIM_OCInitStructure); // 启用TIM3 TIM_Cmd(TIM3, ENABLE);这段代码产生的PWM波形特征如下参数计算公式示例值物理意义频率定时器频率/(ARR1)1kHz信号重复的快慢周期1/频率1ms一次完整波形的时间占空比CCR/(ARR1)50%高电平所占时间比例分辨率1/(ARR1)0.1%占空比最小调节步进3. 多通道PWM和谐的四重奏TIM3的强大之处在于可以同时输出4路独立的PWM信号。就像指挥家控制不同乐器的强弱我们可以为每个通道设置不同的CCR值// 配置四个通道的CCR值 TIM_SetCompare1(TIM3, 300); // 通道1占空比30% TIM_SetCompare2(TIM3, 500); // 通道2占空比50% TIM_SetCompare3(TIM3, 700); // 通道3占空比70% TIM_SetCompare4(TIM3, 900); // 通道4占空比90%虽然ARR和PSC是全局设置所有通道共享但通过灵活调整CCR我们可以实现LED亮度渐变控制不同占空比电机速度调节相同频率不同功率蜂鸣器音调组合不同频率需调整ARR实际调试时我习惯用这种结构化的检查清单确认配置时钟树验证确认TIM3时钟已使能RCC_APB1PeriphClockCmd检查系统时钟频率默认72MHzGPIO设置复用功能选择正确GPIO_PinRemapConfig推挽输出模式GPIO_Mode_AF_PP定时器基础PSC值是否导致频率超出范围ARR值是否满足分辨率需求PWM特定配置输出比较模式设为PWM1/PWM2各通道CCR初始值合理输出极性符合外设需求4. 实战中的避坑指南第一次使用TIM3输出PWM时我遇到了波形不稳定的问题。后来发现是因为忽略了影子寄存器机制——修改ARR或PSC需要等待更新事件生效。这就像调整心跳节奏后身体需要几个周期来适应。另一个常见误区是认为CCR必须小于ARR。实际上在PWM模式1下OCxREF高电平当CNTCCR在PWM模式2下OCxREF高电平当CNTCCR这意味着CCR可以设为0或ARR1来产生恒低/恒高电平。下表总结了不同CCR值的效果CCR值范围PWM模式1效果PWM模式2效果CCR 0恒低电平恒高电平0 CCR ARR正常PWM反向PWMCCR ARR最后一个时钟周期跳变第一个时钟周期跳变CCR ARR恒高电平恒低电平调试时这些工具能帮你快速定位问题逻辑分析仪直观显示多路PWM时序关系Keil调试模式查看定时器寄存器实时值示波器测量验证实际频率与计算值是否一致检查占空比精度观察边沿是否有抖动记得那次为了驱动舵机我需要50Hz的PWM信号周期20ms。按照公式计算目标频率 50Hz → 周期 20ms 定时器频率 72MHz / (719 1) 100kHz ARR (100kHz * 20ms) - 1 1999配置后发现舵机响应不正常最终发现是ARR值超过了某些舵机控制芯片的解析范围。调整为ARR39999PSC71频率50Hz后问题解决——这提醒我们理论计算还需结合实际器件特性。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价