嵌入式——使用定时器输出PWM波形,实现 LED呼吸灯的效果

一、实验要求:

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

PWM波介绍:

1.PWM波

在一个周期波形中,高电平占整个周期的比例称之为占空比,而高电平宽度通常被称为脉冲宽度。当我们在控制占空比,从而控制电路导通或者关闭时间,从而控制导通的有效电压。
在这里插入图片描述

PWM的频率:

指1秒钟内信号从高电平到低电平再回到高电平的次数。

PWM的周期:

T = 1 / f,周期 = 1 / 频率

PWM的占空比:

指一个脉冲周期内,高电平的时间与整个周期时间的比例

脉宽时间:

高电平时间,脉宽时间占总周期时间的比例,就是占空比

调节PWM:

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

分频-计数时钟

定时器时钟提供较高的频率,计数器不需要这么高的频率来计数,所以会进行降频,使用一个合适的低频时钟来计数。
定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数。PSC是一个16位的预分频器,可以对时钟TIMxCLK进行1~65536之间的任何一个数进行分频。
即:CK_CNT = TIMxCLK / (PSC+1)

比如,使用STM32F4的通用定时器2(TIM2CLK为APB1的时钟的两倍即84MHz),PSC设置为83,则计数时钟为84MHz/(83+1)=1MHz,即1ms计一个数。

计数器

计数器是一个16位的计数器,只能往上计数,最大数值为65535。当计数达到自动重装载值时产生更新事件,并清零从头开始计数。

2.定时器输出PWM原理

定时器工作模式设置为向上计数PWM模式,且当CNT<CCRx时,输出1,当CNT>=CCRx时输出0,则:

当CNT值小于CCRx的时候,IO输出高电平(1),
当CNT值大于等于CCRx的时候,IO输出低电平(0),
当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。

二、开始实验

1.工程设置

在STM32CubeMX中新建文件夹并按如下进行设置

(1)打开System core,点击RCC设置为外部时钟源

在这里插入图片描述

(2)设置串口通信

在这里插入图片描述

(3)设置定时器

设置分频系数为71,计数周期为500,其它默认。

设置占空比初始值为10。
在这里插入图片描述

在这里插入图片描述
其余配置不变

(4)引脚设置:

在这里插入图片描述
工程设置结束生成工程文件并打开

2.代码编写

(1)添加一个变量用来储存占空比

uint16_t duty_num = 10;  //定义变量储存占空比

在main.c文件中找到
/* USER CODE BEGIN PV */

/*USER CODE END PV */
并将此变量添加在里面
在这里插入图片描述

(2)添加启动定时器TIM2和管道2以及定时器TIM4和管道4的代码,输出PWM

 HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);  //开启定时器4和4号通道
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);   //开启定时器2和2号通道

在main.c文件中找到
/* USER CODE BEGIN 2 /

/
USER CODE END 2*/
并将代码添加在里面
在这里插入图片描述

(3)添加执行呼吸灯程序的代码

 //每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0.
			HAL_Delay(50);
		duty_num = duty_num + 10;
		if(duty_num > 500)
		{
			duty_num = 0;
		}

		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_4,duty_num); 
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,duty_num);

在main.c文件中找到
/*USER CODE BEGIN 3 */

/*USER CODE END 3 */
并将代码添加在里面
在这里插入图片描述

编译无误后进行烧录

3.实验结果演示

(1)PWM波形

在这里插入图片描述

(2)结果演示

在这里插入图片描述

参考博客:

https://blog.csdn.net/qq_66144143/article/details/127600830

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值