定时器实现呼吸灯

一.PWM介绍

1.含义

PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。

2.基本原理

PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,见图
在这里插入图片描述
要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率幅值半周期脉冲数,准确计算 PWM 波各脉冲宽度和间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。在下边编程实现中会详细说明。(此时我才真正明白,将一个正弦波通过PWM即使实现一个波形输出,具体做了哪些工作)

3.优点及应用范围

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

二.STM32上的PWM

1.PWM产生

STM32的定时器除了TIM6和7,其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出。

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

在这里插入图片描述

2.PWM的一个周期

PWM的一个周期

  • 定时器从0开始向上计数
  • 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
  • t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
    至此一个PWM周期完成
    每个定时器有个通道,每一个通道都有一个捕获比较寄存器,
    将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)
    TIMx_ARR寄存器确定PWM频率
    TIMx_CCRx寄存器确定占空比

三.stm32cubeMX建立工程

1.配置SYS和RCC

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

2.配置定时器

选择TIM3定时器
在这里插入图片描述
在这里插入图片描述
TIM4同理
在这里插入图片描述

  • Mode 选择PWM模式1
  • Pulse(占空比值) 先给0
  • Fast Mode PWM脉冲快速模式 : 和我们配置无关,不使能
  • PWM 极性: 设置为低电平
  • PS: 由于LED是低电平点亮,所以我们把极性设置为low
    在 Parameter Settings 页配置预分频系数为 71,计数周期(自动加载值)为 499,定时器溢出频率,即PWM的周期,就是 72MHz/(71+1)/(499+1) = 2kHz

PWM频率

Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)

arr 是计数器值
psc 是预分频值

占空比

duty circle = TIM3->CCR1 / arr(单位:%)
TIM3->CCR1是用户设定值
改CCR1可以修改占空比,修改arr可以修改频率

3.配置时钟树

在这里插入图片描述
1选择外部时钟HSE 8MHz
2PLL锁相环倍频72倍
3系统时钟来源选择为PLL
4设置APB1分频器为 /2

4.生成keil文件

1 设置项目名称
2 设置存储路径
3 选择所用IDE
4点击GENERATE CODE 创建工程

四.添加代码

1.定义变量

 uint16_t dir1 = 10;
 uint16_t dir2 = 10;

在这里插入图片描述

2.使能TIM3、TIM4的PWM Channel1 输出

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

在这里插入图片描述

3.在while循环中添加代码

while (1)
  {
    /* USER CODE END WHILE */
while (dir1< 600)
	  {
		  dir1++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, dir1);    //修改比较值,修改占空比
//		  TIM3->CCR1 = dir1;    与上方相同
		  HAL_Delay(1);
	  }
	  while (dir1)
	  {
		 dir1--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, dir1);    //修改比较值,修改占空比
//		  TIM3->CCR1 = dir1;     与上方相同
		  HAL_Delay(1);
	  }
		while (dir2< 600)
	  {
		  dir2++;
		  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, dir2);    //修改比较值,修改占空比
//		  TIM4->CCR1 = dir2;    与上方相同
		  HAL_Delay(1);
	  }
	  while (dir2)
	  {
		  dir2--;
		  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, dir2);    //修改比较值,修改占空比
//		  TIM4->CCR1 = dir2;     与上方相同
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);
  }/* USER CODE END 3 */
}

五.线路连接

并且由上面所给配置定时器图示可看出,TIM3-CH1的输出端口为PA6,TIM4-CH1的输出端口为PB6
所以,我们只需给相应端口外连接外设即可。
因题目所给要求为驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。因此我们选择将PB6接外接的LED灯,PA6接开发板上已焊接的LED灯。(两个引脚可互换)
3V3 —> 3V3

GND —> GND

RXD —> PA9

TXD —> PA10

LED灯短脚 —> PB6

LED灯长脚 —> 3V3

PA6 —> PC13

六.烧录运行

1.烧录

在这里插入图片描述

2.效果展示

呼吸灯

七.总结

本次实验要点在掌握PWM技术,刚开始实验把注意力放在了如何将定时器和LED灯连接起来的问题,并且多余加入了引脚选择,甚至在查找PC13端口时,发现并没有定时器通道,很懵逼,后来具体了解了PWM技术,发现是直接通过设置其引脚的定时器,然后再直接连接外设就可以,并不需要再设置引脚输出。还是基础知识掌握不牢靠,在本次实验,我通过联系以往实验、和同学交流、参考相关知识,最终还是顺利的解决问题,其实博客里面解释很清楚,但是由于我思路不清晰,导致操作比较散,于是花的时间较长,希望以后继续加油,接受捶打,充实自己。

八.参考资料

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值