呼吸灯的实现

news/2024/11/17 9:41:29/

背景

最近做的项目中,有要求要实现LED灯光强弱变化控制的,之前有了解过呼吸灯的概念,也知道通过PWM来控制,但也只是停留在概念上面,以前也没有真正去做过这方面的,所以就在网上再搜罗了一番,感觉还是有些云里雾里的,最后只好自己静下心来,从原理上弄懂先。

原理

了解到要想改变LED亮度改变LED的电流,就需要,一则改变限流电阻,二则改变供电电压值
前者一般电阻都是选定,无法再做实时更改,就算可以实时(如数字电位器)在此也是大材小用。
后者则是一个良好的选择,电压怎么变,如下:

在这里插入图片描述

  • 该图展示了方波(PWM)与其电压有效值或者平均值的关系。
    • t/T的值可以改变输出的电压有效值或者平均值,t则是高电平时间T则是方波(PWM)的周期值
      我们只要固定方波周期值,固定高电平时间,即固定了占空比,也就固定了输出电压值。
      在这里插入图片描述

实践

  • 例程代码:
//灯亮度控制
void Light_LuxAssign(unsigned char Lux_Strenth)//亮度配置(实设置高电平时长)
{static unsigned char breath_rt;         //呼吸计时器static const unsigned char breath_Ta=20;这里就先固定一下周期值(周期值不能超过22ms.否则会有闪烁现象,视觉暂留)static unsigned char breath_Ton; //高电平时间breath_Ton=Lux_Strenth;//注意Lux_Strenth不能超过周期值breath_Taif(breath_Ta<breath_rt)//计时器累加到一个周期{breath_rt=0; //计时器归零	}		else {breath_rt++;//计时器继续累加}(breath_Ton>breath_rt)?(LED7_O(1)):(LED7_O(0));//灯亮灭时间控制
}

这段函数功能是实现输入一个固定的高电平时间值(即固定占空比),然后LED就实现了LED的亮度控制。
在这里插入图片描述

  • 按此思路,然后就来呼吸灯的实现步骤:

    • 实现呼吸灯的效果,即运行过程中,就需要实现占空比(高电平时长)如同呼吸一样消长。因为如上言,改变占空比,即改变LED两端的电压有效值,也就改变了驱动LED的有效电流值,从而实现LED暗亮的渐变效果。即动态占空比的实现
  • 实现代码如下:

void Breath_Light(unsigned char breath_speed,unsigned char breath_Ta)// 呼吸速率(us)|呼吸时间(us)
{#define BREATH_TASK_TIME 200 //时基200usstatic unsigned char breath_dir;//呼吸方向(呼气/吸气)static unsigned char breath_rt;//呼吸计时器static unsigned char breath_speed_cnt;//呼吸速率累加器static unsigned char breath_Ton;//高电平时间if(!breath_dir){if(breath_Ta<breath_rt)//计时器累加到一个周期{breath_rt=0; //计时器归零if(0==breath_speed_cnt++%breath_speed)	{breath_speed_cnt=0;breath_Ton++;//占空比加大}				}		else  //{breath_rt++;//计时器继续累加}if(breath_Ton>=breath_Ta){		breath_dir=1;breath_Ton=breath_Ta;}	(breath_Ton>breath_rt)?(LED7_O(1)):(LED7_O(0));	//Ton导通时间区	}else{if(breath_Ta<breath_rt)//计时器累加到一个周期{breath_rt=0; //计时器归零if(0==breath_speed_cnt++%breath_speed)	{breath_speed_cnt=0;breath_Ton--;//占空比减小}		}		else  //{breath_rt++;//计时器继续累加}if(0>=breath_Ton){		breath_dir=0;breath_Ton=0;}(breath_Ton>breath_rt)?(LED7_O(1)):(LED7_O(0));		}
}
  • 上面函数是在定时器(定时时基为200us)中运行的.

  • 定时器中断如下:

void TIM1_ISR() interrupt 3 
{
//	Breath_Light(5,100);//呼吸灯Light_LuxAssign(20);//暗弱控制
}


http://www.ppmy.cn/news/701104.html

相关文章

FPGA的呼吸灯实现

呼吸灯的实现原理过去在初学电子技术的我的脑中一直是一个迷&#xff0c;后来知道了有PWM脉冲宽度调制这么一个方法可以实现呼吸灯&#xff0c;无奈因为本人过懒&#xff0c;没有在开发板上敲过呼吸灯的代码。恰巧本人最近在学FPGA&#xff0c;里面有一课专门讲呼吸灯&#xff…

定时器实现呼吸灯

文章目录 一.PWM介绍1.含义2.基本原理3.优点及应用范围 二.STM32上的PWM1.PWM产生2.PWM的一个周期 三.stm32cubeMX建立工程1.配置SYS和RCC2.配置定时器3.配置时钟树4.生成keil文件 四.添加代码1.定义变量2.使能TIM3、TIM4的PWM Channel1 输出3.在while循环中添加代码 五.线路连…

基于FPGA的呼吸灯设计

一&#xff1a;背景介绍&#xff1a; 网上类似的标题很多&#xff0c;有一些呼吸灯的设计是基于单片机的&#xff0c;还有一部分设计是基于FPGA的&#xff0c;我也一时手痒&#xff0c;将这两天自己重新写的verilog描述语句晒出来&#xff0c;免得压箱底放久了&#xff0c;出现…

FPGA入门(一)--呼吸灯

呼吸灯主要是利用PWM的方式&#xff0c;在固定的频率下&#xff0c;通过调整占空比的方式来控制LED灯的亮度的变化&#xff0c;从而实现由暗渐亮再由亮渐暗的过程。 呼吸灯的整个FPGA实现流程主要由四个模块组成&#xff0c;分别是计数器模块&#xff0c;调节值产生模块&#x…

Verilog实现呼吸灯效果

呼吸灯的效果采用PWM调波的形式&#xff0c;即快速的改变每个周期的占空比&#xff08;一个周期内高电平时间占一个周期时间的比值&#xff09;来实现点亮到熄灭的效果。示意如下图 而关于整个波形图&#xff0c;用50MHz的晶振&#xff0c;从0开始计数到49则为1us。 而1ms是1u…

android 关闭按键灯,安卓永久关闭键盘灯的方法

安卓永久关闭键盘灯的方法 用RE管理器进入到/system 1.在system里新建文件&#xff0c;文件名为“关灯.sh” ,注意&#xff0c;后缀一定为 .sh 2.输入下面的代码 chmod 666 /sys/class/leds/button-backlight/brightness echo 0 >/sys/class/leds/button-backlight/brightne…

通过矩阵键盘,用PWM来实现呼吸灯的效果

任务如标题&#xff0c;但是这个程序我现在并没有写对&#xff0c;先发上来&#xff0c;等到以后自己能找到问题了在进行修改 #include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */…

基于Verilog实现呼吸灯

时间的单位换算 首先掌握秒的单位换算&#xff0c;这里总结一些。因为笔者目前用的大多为50MHz&#xff0c;所以介绍以此为例。但关于秒的转换全世界都是一样的。 1MHz 1,000kHz 1,000,000Hz 频率&#xff1a;是用单位时间内完成的周期性变化的次数&#xff0c;是描述周期…