当前位置:   article > 正文

STM32运用PWM实现呼吸灯_stm32呼吸灯pwm

stm32呼吸灯pwm

一、PWM简介

1.1 PWM定义

PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

1.2 PWM参数

  • pwm的频率:是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期

    单位: Hz

    表示方式: 50Hz 100Hz

  • pwm的周期:T=1/f(周期=1/频率),例如50Hz = 20ms 一个周期,如果频率为50Hz ,也就是说一个周期是20ms
    那么一秒钟就有 50次PWM周期

  • 占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例

    单位: % (0%-100%)

    表示方式:20%

    脉宽时间占总周期时间的比例,就是占空比

1.3 基本原理

  • PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。

  • 也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

  • PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。
    PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压;PWM频率越大,相应越快。
    在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值);
    当CNT小于CCRx时,TIMx_CHx通道输出低电平;
    当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平;
    这个时候就可以对其下一个准确的定义了:所谓脉冲宽度调制模式(PWM模式),就是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术

二、STM32上的PWM

2.1 PWM产生

STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:(其他定时器框图类似)
在这里插入图片描述

2.2 PWM相关寄存器

包含三个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。在TIMx_CCMRx寄存器中的OCxM位写入110(PWM模式1)或111(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。

2.2.1 捕获/比较模式寄存器(TIMx_CCMRx)

下图为TIMx_CCMR1寄存器的各位描述:
在这里插入图片描述
这里需要使用的是模式设置位OCxM,总共有两种PWM模式,这两种PWM 模式的区别就是输出电平的极性相反。

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

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

2.2.2 捕获/比较使能寄存器(TIMx_CCER)

下图为TIMx_CCER寄存器的各位描述:
在这里插入图片描述
该寄存器控制着各个输入输出通道的开关。这里只用到了CC2E位,该位是输入/捕获 2 输出使能位,要想PWM 从 I/O 口输出,这个位必须设置为 1。

2.2.3 捕获/比较寄存器(TIMx_CCRx)

下图为TIMx_CCR1寄存器的各位描述:
在这里插入图片描述
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果在OC1端口上产生输出信号。利用这点,我们通过修改这个寄存器的值实现控制 PWM 的输出脉宽。

三、CubeMX配置项目

3.1 配置RCC

在这里插入图片描述

3.2 配置SYS

在这里插入图片描述

3.3 配置定时器TIM3

在这里插入图片描述

3.4 配置定时器TIM4

与TIM3相同
在这里插入图片描述

3.5 时钟配置

在这里插入图片描述

3.6 生成项目

在这里插入图片描述
在这里插入图片描述

四、Keil代码编写

4.1 main.c编写

在main.c中定义一个全局变量

uint16_t pwm=0;   //占空比
  • 1

在这里插入图片描述

4.2 打开PWM通道

在主函数中添加两行代码

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 
  • 1
  • 2

在这里插入图片描述

4.3 while循环中代码编写

while (pwm< 500)
{
	pwm++;
	__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);  
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  			
	HAL_Delay(1);
}
while (pwm)
{
	pwm--;
	__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
    __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);  		
	HAL_Delay(1);
}
HAL_Delay(200);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

五、 编译 烧录 运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置TIM3与TIM4可以通过CubeMX看到输出管脚为PA6和PB6,因此从这两个引脚引线即可,PC13为最小板自带LED的引脚

六、参考资料

https://blog.csdn.net/zmhDD/article/details/111942507
https://blog.csdn.net/jynyyhd/article/details/127655245

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/302282
推荐阅读
相关标签
  

闽ICP备14008679号