STM32定时器中断与PWM脉宽调制实现呼吸灯-STM32CubeMx项目生成

目录

一、概述

二、定时器原理

三、定时器中断的配置

四、PWM配置

五、总结


一、概述

        本文主要通过学习定时器、中断知识与相关原理,实现稍微复杂一点的PWM呼吸灯功能,旨在通过此文掌握STM32的相关技能。


二、定时器原理

        定时器的本身是一个计数器,他记录着时钟信号周期数,每个时钟周期都会使定时器里的计数器增加或减少,当我们知道了时钟周期的频率,算出每个时钟周期的时间,进而就可以通过定时器中的计数器进行定时的操作。 

        定时器的模式有向上计、向下计、中心计数的模式,以向上计数为例,如下图,当计数值达到重装载值时,触发定时器中断,随后CNT继续从初始值开始计数。


三、定时器中断的配置

        首先新建STM32CubeMx工程,并自主完成基础的时钟树配置与工程配置,随后开始进行定时器的配置。

        受芯片型号的影响,各芯片各定时器的功能不同,需要用户自行选择。这里选了一个通用定时器TIM2,开启的方法是将时钟源选择为内部时钟。

         随后根据配置好的时钟树配置如下参数:

        随后我们在左侧的NVIC选项卡中,勾选上TIM2的中断,并配置他的抢断优先级。

         生成代码,并在main.c中启动定时器。

        随后,我们重写中断处理函数,并在其中写LED闪烁程序。

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim==&htim2)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	}
}
/* USER CODE END 0 */

        此时,关于定时器中断的程序已经完成。


四、PWM配置

        PWM即脉冲宽度调制,当高电平触发的LED,我们通过在相同时间内控制其高电平所占的时间来控制LED的亮度,这种方式就是PWM。我们将高电平时间与周期的比值称为占空比

        那么如何在定时器中使用PWM呢?定时器中的通道作为PWM输出的时候,可以连接到一个IO口,那么这个IO口的电平可以通过定时器的计数值发生变化,通过这种方法,我们可以产生PWM波或改变占空比。

        此处我选择TIM4的Channel3进行后续的呼吸灯开发,在STM32CubeMx配置好相关参数。

        随后生成代码,并打开工程。

        首先,仍然要先开启定时器,不过方法有些许改变。

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);

         此处介绍一些扩展的方法:

	//设置重装载值
	__HAL_TIM_GetAutoreload
	//获取重装载值
	__HAL_TIM_GetAutoreload
	//设置计数值
	__HAL_TIM_SetCounter
	//获取计数值
	__HAL_TIM_GetCounter
	//设置比较值
	__HAL_TIM_SetCompare
	//获取比较值
	__HAL_TIM_GetCompare

        最后我们在主函数中加入改变计数值的代码,即可实现呼吸灯功能:

		for(int i=0;i<99;i++)
		{
				__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,i);
				HAL_Delay(1);
		}

五、总结

        本篇主要介绍了定时器中断与PWM脉宽调制的知识,可以实现呼吸灯等功能,但本文学习重点在于定时器的时钟配置与定时器中断的知识。

猜你喜欢

转载自blog.csdn.net/qq_39724355/article/details/127428481