当前位置:   article > 正文

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

stm32f103hal库写呼吸灯不用pwm

目录

一、概述

二、实现原理

三、代码实现

四、总结


一、概述

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


二、实现原理

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

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

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


三、代码实现

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

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

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

  1. void Delay(int i)
  2. {
  3. while(i--);
  4. }

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

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

  1. while (1)
  2. {
  3. /* USER CODE END WHILE */
  4. /* USER CODE BEGIN 3 */
  5. for(int i=0;i<5000;i++)
  6. {
  7. HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
  8. Delay(i);
  9. HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
  10. Delay(5000-i);
  11. }
  12. for(int i=5000;i>0;i--)
  13. {
  14. HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
  15. Delay(i);
  16. HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
  17. Delay(5000-i);
  18. }
  19. }

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

四、总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/791255
推荐阅读
相关标签
  

闽ICP备14008679号