STM32通过输出PWM波形实现呼吸灯

本文将会使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。

一、PWM的介绍

1.什么是PWM

PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。

(1)PWM的频率

是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);

也就是说一秒钟PWM有多少个周期
单位: Hz
表示方式: 50Hz 100Hz

(2)PWM的周期

T=1/f
周期=1/频率
50Hz = 20ms 一个周期

如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期

(3)PWM的占空比

是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%

在这里插入图片描述
周期: 一个脉冲信号的时间 1s内测周期次数等于频率
脉宽时间: 高电平时间

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

比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%

这就是占空比为80%的脉冲信号

而我们知道PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大

以20Hz 占空比为80% 举例 就是1秒钟之内输出了20次脉冲信号 每次的高电平时间为40ms

我们使用这个图

在这里插入图片描述

上图中,周期为T
T1为高电平时间
T2 为低电平时间

假设周期T为 1s 那么频率就是 1Hz 那么高电平时间0.5s ,低电平时间0.5s 总的占空比就是 0.5 /1 =50%
参考自PWM频率与占空比详解

2.PWM的原理

PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。
假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号
在这里插入图片描述
pwm的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降

也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压

pwm就是通过这种原理实现D/A转换的。

总结:
PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压
PWM频率越大,相应越快,

3.PWM的优点及应用范围

由于其控制简单、灵活和动态响应好等优点而成为电力电子技术应用最广泛的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。

4.STM32中的PWM

(1)PWM产生

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

在这里插入图片描述

(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。

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

作用:在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作
在这里插入图片描述

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

作用:在PWM输出模式下,确定PWM的输出极性和输出使能
在这里插入图片描述

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

捕获/比较寄存器(TIMx_CCRx)

在PWM输出模式下,确定比较的值
在这里插入图片描述

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

(3)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为有效电平,否则为无效电平
注意:PWM的模式只是区别什么时候是有效电平,但并没有确定是高电平有效还是低电平有效。这需要结合CCER寄存器的CCxP位的值来确定。

例如:若PWM模式1,且CCER寄存器的CCxP位为0,则当TIMx_CNT<TIMx_CCR1时,输出高电平;同样的,若PWM模式1,且CCER寄存器的CCxP位为2,则当TIMx_CNT<TIMx_CCR1时,输出低电平。

二、配置工程项目

(1)创建新项目

在STMCubeMX主界面,创建新项目,点击ACCEE TO MCU SELECTOR
在这里插入图片描述

(2)芯片选择

在part name里选择自己的芯片(一般选择直接搜索所需芯片),本文采用STM32F103C8T6点击信息栏中的具体芯片信息选中,点击start project

在这里插入图片描述

(3)配置RCC

点System Cor,选择RCC,在右侧弹出的菜单栏中选Crystal/Ceramic Resonator

在这里插入图片描述

(4)配置SYS

选择调试接口,点System Cor,选择SYS。,在右侧弹出的菜单栏中选Serial Wire。
在这里插入图片描述

(5)配置定时器3和定时器4

这里我们选择定时器3和定时器4来实现定时的功位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。通道1选择:PWM Generation CH1(PWM输出通道1)
设置分频系数为71,计数周期为500,其它默认。
设置占空比初始值为10,其实这里不写也没影响。(因为后续我们可以根据代码对其进行修改)
在这里插入图片描述

定时器四我们也选择PWM Generation CH1(PWM输出通道1)
在这里插入图片描述

(6)时钟配置

如图所示更改配置即可。
在这里插入图片描述

(7)配置项目设置

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

三、在keil中设置代码

1.设置占空比

打开工程,主要修改main.c文件。首先定义一个变量,用来存储占空比:初值设为10。

uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;

在这里插入图片描述

2.开启PWM信道

开始TIM3的通道3,输出PWM。
开始TIM4的通道4,输出PWM。

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

在这里插入图片描述

3.调用代码

这里我们设置为每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0。(即灯会从亮倒暗,逐渐变化)

  while (1)
  {
    /* USER CODE END WHILE */
 HAL_Delay(50);
		duty_num3 = duty_num3 + 10;
			duty_num4 = duty_num4 + 10;
		if(duty_num3 > 500)
		{
			duty_num3 = 0;
		}
		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_num3);
			if(duty_num4 > 500)
		{
			duty_num4 = 0;
		}
		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,duty_num4);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

在这里插入图片描述
我进行编译成功,无错误

四、电路连接

芯片和转换器的连接

3V33V3
GNDGND
RXDA9
TXDA10
LED灯和芯片的链接
LED灯短脚A6
--------
LED灯长脚3V3
PB6PC13

在这里插入图片描述

五、程序烧录

我使用的是mcuisp软件进行烧录,将电路连接,然后把可执行文件烧入即可
在这里插入图片描述
烧录成功

六、运行效果

在这里插入图片描述

七、总结

通过这次的呼吸灯实现的实验,首先是将课上学习到的PWM的相关理论知识,运用到了实践,并学会了对其的基本应用。通过PWM脉冲宽度调制来改变IO输出电压来实现LED的亮度逐渐变化,PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大,也意识到了PWM是一个很有用的东西,使用好了帮助很大。当遇见问题了多学习,思考,就会得到结果的。

八、参考资料

STM32CUBEMX_基于PWM的呼吸灯
stm32f103呼吸灯
PWM频率与占空比详解
STM32上的PWM

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值