[应用相关] STM32CubeMX教程-PWM呼吸灯

[复制链接]
2022|55
 楼主| 远芳侵古道 发表于 2022-3-29 16:52 | 显示全部楼层 |阅读模式
所用工具:
1、芯片:STM32F407ZET6/ STM32F103ZET6
2、STM32CubeMx软件
3、IDE:MDK-Keil软件
4、STM32F1xx/STM32F4xxHAL库
知识概括:
通过本文您将学到:
  • PWM工作原理
  • STM32CubeMX创建PWM例程
  • HAL库定时器PWM函数库
  • PWM创建呼吸灯

什么是PWM
    脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
PWM工作原理
SMT32F1系列共有8个定时器:
    高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。
SMT32F4系列共有15个定时器:
    高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。
    STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。
    STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出。

 楼主| 远芳侵古道 发表于 2022-3-29 16:53 | 显示全部楼层
原理讲解:

    下图为向上计数模式:
888746242c8f0dec57.png
在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
 楼主| 远芳侵古道 发表于 2022-3-29 16:55 | 显示全部楼层
当CNT小于CCRx时,TIMx_CHx通道输出低电平;

当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
 楼主| 远芳侵古道 发表于 2022-3-29 16:56 | 显示全部楼层
PWM的一个周期:

    定时器从0开始向上计数

    当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平

    t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平

    当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程

    至此一个PWM周期完成
 楼主| 远芳侵古道 发表于 2022-3-29 16:58 | 显示全部楼层
总结:每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)。TIMx_ARR寄存器确定PWM频率,TIMx_CCRx寄存器确定占空比。
 楼主| 远芳侵古道 发表于 2022-3-29 16:58 | 显示全部楼层
若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。

    而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
    如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N 1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N 1)。
 楼主| 远芳侵古道 发表于 2022-3-29 17:02 | 显示全部楼层
PWM的工作模式:
PWM模式1(向上计数)  :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件   

PWM模式2(向下计数)  :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件   
 楼主| 远芳侵古道 发表于 2022-3-29 17:02 | 显示全部楼层
设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式:

PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

    在两种模式下TIMx_CNT(计数器当前值)与TIMx_CCR1(捕获/比较值)   只是决定是有效电平还是无效电平。有效电平可以是高电平也可以是低电平,这需要结合CCER寄存器的CC1P位的值来确定。
 楼主| 远芳侵古道 发表于 2022-3-29 17:05 | 显示全部楼层
PWM的工作过程
713806242cb550faa5.png
 楼主| 远芳侵古道 发表于 2022-3-29 17:06 | 显示全部楼层
1、CCR1寄存器:捕获/比较值寄存器:设置比较值。

    计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平。   

OC1REF=0 无效电平   

OC1REF=1 无效电平
 楼主| 远芳侵古道 发表于 2022-3-29 17:07 | 显示全部楼层
2、TIMx_CCMR1寄存器:OC1M[2:0]位:用于设置PWM模式。

110:PWM模式1

111:PWM模式2
 楼主| 远芳侵古道 发表于 2022-3-29 17:07 | 显示全部楼层
3、CCER寄存器:CC1P位:输入/捕获1输出极性。

0:高电平为有效电平     

1:低电平为有效电平
 楼主| 远芳侵古道 发表于 2022-3-29 17:16 | 显示全部楼层
4、CCER寄存器:CC1E位:输入/捕获1输出使能。

0:关闭使能

1:打开使能
 楼主| 远芳侵古道 发表于 2022-3-29 17:17 | 显示全部楼层
5、输出电平信号。

    TIM定时器的四路通道TIMx_CHx输出PWM
 楼主| 远芳侵古道 发表于 2022-3-29 17:18 | 显示全部楼层
254206242ceb9b1dad.png

评论

摘自:《STM32中文参考手册》254页 通用定时器框图 附:STM32定时器输出通道引脚  发表于 2022-3-29 22:46
 楼主| 远芳侵古道 发表于 2022-4-29 18:20 | 显示全部楼层
附:STM32定时器输出通道引脚
27119626bbbc82dd48.png
 楼主| 远芳侵古道 发表于 2022-4-29 18:21 | 显示全部楼层
工程创建过程
1.设置RCC

    设置高速外部时钟HSE 选择外部时钟源
81229626bbc1b73281.png
 楼主| 远芳侵古道 发表于 2022-4-29 18:22 | 显示全部楼层
2.设置定时器
37384626bbc67d9e4e.png
 楼主| 远芳侵古道 发表于 2022-4-29 18:23 | 显示全部楼层
1.选择TIM3

2.设置定时器时钟源为内部时钟源

设置定时器CH1为PWM模式

3.对应管脚自动设置为复用模式
 楼主| 远芳侵古道 发表于 2022-4-29 18:24 | 显示全部楼层
4.可自行选择是否开启定时器中断

    Channel1~4  就是设置定时器通道的功能:

如输入捕获

输出比较

PWM输出

单脉冲模式

9255626bbceb947d4.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

887

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部