赞
踩
目录
上期我们讲解了关于使用定时器来实现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);
- }
- }
程序编译完成后,烧写进开发板即可。
本文仅是介绍了一种简单方法用于实现呼吸灯,在之前的文章中定时器呼吸灯已经讲解过,但在实际上与定时器的呼吸灯并无太大区别,仅仅只是时钟周期的不同而已,本质上都是通过控制占空比实现呼吸灯效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。