在STM上用PWM波形实现2个 LED呼吸灯

STM32最小核心板使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯


软件版本:

STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103c8t6

1.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寄存器确定占空比的信号。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术

2.STM32上的PWM

2.1 PWM产生

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

image-20221102161854938

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寄存器的各位描述:

image-20221102162005136

这里需要使用的是模式设置位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寄存器的各位描述:

image-20221102163013672

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

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

下图为TIMx_CCR1寄存器的各位描述:

image-20221102163104777

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

3. STM32CubeMx创建工程

3.1 配置RCC

image-20221102164206235

3.2 配置SYS

image-20221102164245971

3.3 配置定时器TIM3

  1. 勾选Internal Clock(内部时钟)
  2. 通道1选择:PWM Generation CH1(PWM输出通道1)
  3. Prtscaler (定时器分频系数) : 71
  4. Counter Mode(计数模式):Up(向上计数模式)
  5. Counter Period(自动重装载值) : 500
  6. CKD(时钟分频因子) :No Division (不分频 )

image-20221102164415265

3.4 配置定时器TIM4

TIM4配置与TIM3相同

image-20221102164549834

由右边的芯片显示可知TIM3_CH1由PA6输出,TIM4_CH2由PB6输出

image-20221102170151651

3.5 配置时钟

image-20221102164646856

3.6 生成项目

image-20221102164804584

image-20221102164824886

4.keil代码编写

4.1 定义变量

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

uint16_t pwm=0;   //占空比

image-20221102165020035

4.2 打开PWM通道

在主函数中添加两行代码

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 

image-20221102165157025

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);

image-20221102165605956

4.4 编译成HEX,烧录

image-20221102170352005

5. 运行效果

LED灯的短脚与PA6相连,PB6与PA13(最小板上自带的LED)相连

[video-to-gif output image]

6. 总结

这次实验,对PWM的部分知识有了初步了解,并用使用定时器的TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动的外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

7. 参考文章

STM32最小核心板使用TIM3和TIM4,分别输出一个PWM波形实现2个 LED呼吸灯的效果_多吃点蔬蔡的博客-CSDN博客

sc=%7B%22request%5Fid%22%3A%22166737606116782412520549%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=166737606116782412520549&biz_id=0&spm=1018.2226.3001.4187)

使用STM32输出PWM波形_不#曾&轻听的博客-CSDN博客_stm32输出pwm波形

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值