【STM32+HAL+Proteus】系列学习教程---PWM(呼吸灯)

实现目标

1、利用定时器输出PWM实现呼吸灯

2、学会STM32CubeMX软件输出PWM的配置

3、具体目标:利用定时器3的通道2(部分重映射到PB5管脚)输出1KHz的矩形波,实现呼吸灯。


一、PWM涉及的几个概念

1、什么是PWM?

        PWM(Pulse width modulation)脉冲宽度调制。PWM是通过编程控制输出方波的频率和占空比(高低电平的比例)。广泛应用在从测量、通信、功率控制与变换的许多领域中

2、PWM的占空比?

        占空比(Duty Cycle),是指在一个周期内,高电平时间占整个信号周期的百分比,即高电平时间与周期的比值:

占空比=T1/T

ea85ca175784459a8a1e5d0df2ce6cd1.png

二、定时器产生PWM

1、定时器输出PWM主要特点

(1)STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。

(2)STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出。

(3)STM32中每个定时器有4个输入通道:TIMx_CH1~TIMx_CH4

(4)每个通道对应1个捕获/比较寄存器TIMx_CRRx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到PWM信号;

(5)脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

2、PWM的工作模式:              

PWM模式分为两种,PWM1和PWM2,都可以设置计数器递增计数或者递减计数。具体如下表

caa212109f5f4d4bb8f8e82b15075a29.png

(1)PWM模式1(向上计数)  :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件。在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平(高电平),否则为无效电平(低电平);在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。   
(2)PWM模式2(向上计数)  :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件。在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平(低电平),否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平(高电平),否则为无效电平。  

以下为PWM模式1向上计数模式输出PWM原理:

f244acea8e6b4d9eb933a24bfaa92528.png

(1)在PWM的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器TIMx_CNT值小于TIMx_CCRx值,输出无效电平(低电平);
(2)在t1-t2时间段,定时器计数器TIMx_CNT值大于TIMx_CCRx值,输出有效电平(高电平);
(3)当定时器计数器的值TIMx_CNT达到ARR时,定时器溢出,重新从0开始向上计数,如此循环。

总结:

TIMx_ARR寄存器确定PWM频率,

TIMx_CCRx寄存器确定占空比

三、定时器3输出通道2管脚重映射

1、重映射简介     

   每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。

        换种说法:重映射就是引脚重映射,本来每个内置外设都有原来设定的引脚,所谓的重映射就是通过某种方式,将外设本来的引脚的功能赋予给另外的引脚(比如一个本项目中定时器3输出PWM的通道2的引脚是PA7,但这个引脚没有接LED,然而可以通过重映射,将PA7设定成PB5,也就是说PA7取代了PB5的功能,成为了时器3输出PWM的通道2的引脚),但是重映射也是有规定可以映射到哪个引脚的(需要查看手册)而不是你想映射到哪个引脚就映射到哪个引脚。

2、两种重映射

部分重映射 & 完全重映射

  • 部分重映射:功能外设的部分引脚重新映射,还有一部分引脚是原来的默认引脚。
  • 完全重映射:功能外设的所有引脚都重新映射

3、TIM3重映射表

c6b24d3b5f434f77ab560a45d46aa956.jpeg

二、原理图设计

10ff38e25e884532aae713e94b50fc66.jpeg

三、STM32CubeMX 配置

1.定时器3时钟源

206c090ba2ad412ca461fb648f6dc032.jpeg

2.产生PWM配置

d0fddeb5fd234376b6a8adf8ac71481d.png

        在预分频系数确定的条件下,PWM模式的信号频率是由自动重装载寄存器ARR来确定的,占空比则由比较寄存器CCR来确定。

(1)输出PWM频率f计算:

92de32659ac94203b8c3eb6b99429cb9.png

例如:假设系统时钟为8MHz,通用定时器3时钟Tclk为8MHz,设置如下: 预分频系数PSC=8-1;    ARR=1000-1; 则,定时时间Tout=8×1000/8000000=1ms,其频率f = 1/Tout=1000Hz.

(2)Channelx:输出PWM通道

  - PWM Generation CH1:CH1输出正常的PWM波形
  - PWM Generation CH1N:产生互补的PWM波形
  - PWM Generation CH1 CH1N:产生正常和互补的波形(通过两个引脚)
  - PWM Generation No Output:不输出PWM波到引脚
  - Forced Output CH1:强制CH1输出某个电平

四、程序设计

1.定义一个全局变量

int pwmVal = 500;

2.开启定时器3通道2产生PWM

  /* USER CODE BEGIN 2 */
  
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
  
  /* USER CODE END 2 */

3.调整占空比

	  while (pwmVal< 1000)
	  {
		  pwmVal++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal);    //修改比较值,修改占空比
//		  TIM3->CCR2 = pwmVal;    与上方相同
		  HAL_Delay(2);
	  }
	  while (pwmVal)
	  {
		  pwmVal--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwmVal);    //修改比较值,修改占空比
//		  TIM3->CCR2 = pwmVal;     与上方相同
		  HAL_Delay(2);
	  }
	  HAL_Delay(1000);

五、实验现象

14ef90884dc849a0b85aea4e9d125267.gif

六、仿真实现

Protues 8.8 仿真的时候TIM3输出PWM的通道2  不能够管脚重映射,PWM输出在PA7 !!!

092fa8de3901456c8c8e57ba6261b38b.jpeg


总结

  • 29
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面包板扎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值