使用TIM3和TIM4,驱动外接LED和STM32上已焊接的LED,实现2个 LED呼吸灯的效果

一、PWM相关介绍

1.PWM的含义

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

2.PWM的基本原理

PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 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 的定时器框图如下:(其他定时器框图类似)

5.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。
(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)捕获/比较使能寄存器(TIMx_CCER)
下图为TIMx_CCER寄存器的各位描述:

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

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

6.PWM脉冲宽度调制

(1)使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,如下图:

要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和
间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。
(2)要改变PWM输出波形的宽度,就要改变比较寄存器 CCRx 的值,想要输出不通宽度来拟合正弦波,则需要CCRx的值呈现如下图的变化趋势,即要生成一张CCRx的数值
表,按周期变化将表中元素的值赋给CCRx。

7.PWM的频率

PWM的频率是指1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期。
单位:Hz
一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感(因人而异)。
频率太小的话看起来就会闪烁,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。
频率很高时,看不到闪烁,占空比越大,LED越亮(平均电压越大);频率很低时,可看到闪烁,占空比越大,LED越亮。
所以,在频率一定下,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。

二、实现呼吸灯效果

1.STM32CubeMX工程创建

(1)打开STM32CubeMX主界面,点击“ACCESS TO MCU SELECTOR”,创建新项目

(2)在“Commerical Part Number”里面选择自己需要的芯片,点击信息栏中的具体芯片信息选中,再点击“Start Project”

(3)先点击System Core将其展开,再点击RCC,将HSE设置为Crystal/Ceramic Resonator

(4)点击SYS,将Debug设置为Serial Wire

(5)先点击Timers将其展开,再点击TIM3,勾选Internal Clock,将“Channel1”设置为PWM Generation CH1,然后点击“Parameter Settings”,按下图设置相关参数:

(6)点击TIM4,勾选Internal Clock,将“Channel1”设置为PWM Generation CH1,然后点击“Parameter Settings”,按下图设置相关参数:

(7)点击Clock Configuration勾选PLLCLK和HSE,将晶振频率设置为最大值72MHz

(8)点击Project Manager→Project,配置好自己的项目名和项目存放路径,然后将IDE设置为MDK-ARM

(9)点击Code Generate界面,选择生成初始化文件.c/.h,之后再点击GENERATE CODE即可成功创建工程

2.程序编写

(1)在点击GENERATE CODE之后弹出来的界面点击Open Project即可跳转到Keil5进行程序编写


(2)打开main.c文件
◉加入如下代码设置占空比:

uint16_t pwm=0;   //占空比


◉在main函数中加入如下代码开启TIM3和TIM4的PWM的通道1:

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

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

3.程序编译及hex文件创建

点击Rebuild编译程序,若没有错误即可成功创建hex文件

4.电路连接

USB转TTLSTM32F103C8T6
GNDGND
3v33v3
TXDA10
RXDA9

LED负极接STM32F103C8T6的A6管脚,正极接3.3v管脚。
STM32F103C8T6的B6管脚接自身的C13管脚。

5.程序烧录

置BOOT0为0,BOOT1为1
(1)打开mcuisp,选择串口为COM5,并选择生成的hex文件

(2)点击读器件信息,若显示一切正常则进行下一步

(3)点击开始编程,若显示一切正常则说明烧录成功

6.运行结果


可以观察到,外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),都实现了 LED呼吸灯的效果,说明实验成功!

三、总结

本实验使用TIM3和TIM4,驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现了2个 LED呼吸灯的效果。在实验过程中,我遇到了STM32CubMX相关参数设置错误、电路连接错误等情况,导致达不到预期实验效果,但经过一遍遍地检查和调试,最终较好地完成了实验。通过本次实验,我了解了PWM的相关知识,明白了呼吸灯实现的原理,但对其相关知识理解还不够深入,所以今后遇到相关知识的应用,还需要深入学习。

四、参考链接

https://blog.csdn.net/qq_45237293/article/details/111997424
https://blog.csdn.net/zmhDD/article/details/111942507
https://blog.csdn.net/weixin_46406325/article/details/115320910

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值