基于STM32利用PWM完成呼吸灯的实现

一、pwm的介绍

1.高级控制定时器功能实现框图

在这里插入图片描述
其中分为6个板块:①时钟源②控制器 ③时基单元 ④输入捕获 ⑤输出比较 ⑥断路功能

2.pwm的定义

pwm是​​​​​​​一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定。脉冲宽度调制(PWM )是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,利用方波的占空比调制来对一个具体模拟信号的电平进行编码。pwm​​​​​​​信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。

3.pwm的控制方式

1.线电压控制PWM
2.电流控制 PWM
3.空间电压矢量控制PWM
4.矢量控制PWM​​​​​​​
5.直接转矩控制PWM
6.非线性控制PWM
7.谐振软开关PWM

4.主要参数

PWM:脉宽调制
脉宽调试是数字信号输出对模拟信号输出的一种方式。
占空比:一个周期内,高电平时间与整个周期的比值。

5.实现原理

PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,作用于开关元器件。如下图
在这里插入图片描述

6.端口的选择

IO模拟PWM输出时速度不是很快。端口选择时,普通IO可以输出PWM,但还是尽量选择PWM口进行PWM输出。

7.PWM口对应配置

在这里插入图片描述

8.PWM 输入模式

该模式是输入捕获的特例,只能使用通道 1 和通道 2,通道 3 和通道 4 使用不了。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM 输入模式需要占用两个捕获寄存器。在这里插入图片描述

9.PWM 输出模式

PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。
PWM 模式分为两种,PWM1 和 PWM2,总得来说是差不多,具体的区别。

PWM1 与 PWM2 模式的区别:
模式|计数器 CNT 计算方式|说明
PWM1 递增 CNT<CCR,通道 CH 为有效,否则为无效
PWM2 递减 CNT>CCR,通道 CH 为无效,否则为有效 PWM2 递增 CNT<CCR,通道 CH 为无效,否则为有效
PWM2 递减 CNT>CCR,通道 CH 为有效,否则为无效

(1) PWM 边沿对齐模式
在递增计数模式下,计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件。在这里插入图片描述
(2)PWM 中心对齐模式
在中心对齐模式下,计数器 CNT 是工作做递增/递减模式下。开始的时候,计数器CNT 从 0 开始计数到自动重载值减1(ARR-1),生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。
在这里插入图片描述

二、用cubemx创建工程

1.创建新工程

在这里插入图片描述

2.芯片的选择

在这里插入图片描述

3.配置环境

System Core–RCC–Crystal/Ceramic Resonator在这里插入图片描述System Core–SYS–Serial Wire在这里插入图片描述
TM3–Internal Clock(内部时钟–PWM Generation CH1(选择通道1)–Prtscaler (定时器分频系数) : 71–Counter Mode (Up向上计数模式)–Counter Period(自动重装载值 500)–CKD(不分频 No Division)
在这里插入图片描述
TM4–Internal Clock(内部时钟–PWM Generation CH1(选择通道1)–Prtscaler (定时器分频系数) : 71–Counter Mode (Up向上计数模式)–Counter Period(自动重装载值 500)–CKD(不分频 No Division)
在这里插入图片描述

4.时钟的配置

在这里插入图片描述

5.生成项目

三、代码的编译

main.c文件中添加变量

uint16_t pwm=0;   //占空比

添加后如下图所示:
在这里插入图片描述
在main.c中添加PWM的通道

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

在这里插入图片描述
编译未出现错误,连接完电路后准备烧录
在这里插入图片描述

四、电路的连接

3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
LED灯短脚 —> A6
LED灯长脚 —> 3V3
PB6 —> PC13

五、代码实现

利用PWM完成呼吸灯

六、总结

通过本次练习,以PWM输出端实现led呼吸灯。在本次练习的过程中,出现了许多小问题例如代码未添加变量导致无法编译;程序编译成功,由于led引脚接错无法实现呼吸灯;程序编译成功,线路连接也没问题时,烧录软件出错导致无法实现等问题。再出现这些问题时不要急于放弃,沉下心来慢慢摸索,总会成功。希望本篇博客可以帮助到你,欢迎指正!!

参考文献

一文搞懂什么是PWM
pwm超详细解读,大佬细说pwm的控制方式
STM32CUBEMX_基于PWM的呼吸灯
stm32f103呼吸灯(PWM脉冲宽度调制)
使用STM32输出PWM波形

  • 12
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值