STM32实现模拟呼吸灯效果-非PWM-STM32CubeMx项目生成-手动控制呼吸灯调光

目录

一、概述

二、实现原理

三、代码实现

四、总结


一、概述

        上期我们讲解了关于使用定时器来实现PWM调光的效果,本文我们主要讲解呼吸灯的简单实现方式,这里将不讨论占空比等相关知识。(源码最后免费提供)


二、实现原理

        我们讲到,定时器功能实现呼吸灯效果依赖的是发出PWM波,控制高低电平所占周期的时间,根据视觉的暂留效果,改变光的强弱。

        那么,在不使用定时器的前提下,我们需要手动控制其占空比,那么首先我们需要确定周期时长,重点在于:周期时长并不能用Hal_Delay()函数,因为如果使用ms精度的呼吸灯,是达不到暂留效果的,因为我们需要使用额外方法(下文介绍)

        至此,思路清晰之后我们就可以使用代码实现。


三、代码实现

        首先,我们新建STM32CubeMx工程,并自定义任意GPIO口作为呼吸灯。

        配置好时钟相关参数,生成并打开工程。

        随后我们自定义一个Delay()函数,函数体如下:

void Delay(int i)
{
	while(i--);
}

        我们来深究一下这个Delay()函数的意义,与Hal_Delay()不同,Hal_Delay是延迟响应毫秒数,显而易见,毫秒数并不能使得我们达到视觉暂留的效果,因此我们必须选择一种高于毫秒级的方式,这种方式就是利用函数的执行语句的速度。

        下面,我们自定义一个周期为1000条语句的速度,我们在这个周期内,使LED亮起的时间由1条语句的执行时间到1000条语句的执行时间变化,再变化回来,随后循环执行此操作,即可实现呼吸灯效果!

while (1)
  {
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		for(int i=0;i<5000;i++)
		{
				HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
				Delay(i);
				HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
				Delay(5000-i);
		}
		for(int i=5000;i>0;i--)
		{
				HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
				Delay(i);
				HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
				Delay(5000-i);
		}
}

        程序编译完成后,烧写进开发板即可。

四、总结

        本文仅是介绍了一种简单方法用于实现呼吸灯,在之前的文章中定时器呼吸灯已经讲解过,但在实际上与定时器的呼吸灯并无太大区别,仅仅只是时钟周期的不同而已,本质上都是通过控制占空比实现呼吸灯效果。

猜你喜欢

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