当前位置: 首页 > article >正文

GPIO+TIM(无PWM)实现呼吸灯功能

程序特点:

1、模块化,可快速移植,5分钟便可完成移植。

2、通过GPIO+普通定时器,实现呼吸灯功能。

3、PWM周期为5ms,占空比调节时间为20ms,占空比为100等份,即呼吸灯从暗到亮需要20ms*100=2s。

4、可以通过更改参数来更改占空比等份数和呼吸灯周期。

BreathLed.c

#include "Breathled.h"

Breath_LED Breathled;

void Breath_Led_Init()
{
	Breathled.EN=0;
	Breathled.DIR=1;
	Breathled.pwm_cnt=0;
	Breathled.stall=0;
	Breathled.pwm_period=100;
	Breathled.pwm_duty=0;
	Breathled.cnt=0;
}

void Breath_Led_Driver()//放在50us中断
{
	if(!Breathled.EN)
		return;
	if(Breathled.pwm_cnt<Breathled.pwm_period)//50*100=5ms
		Breathled.pwm_cnt++;
	else
	{
		Breathled.pwm_cnt=0;
		if(Breathled.stall<4)//5ms*4=20ms
			Breathled.stall++;
		else
		{
			Breathled.stall=0;
			if(Breathled.DIR)
			{
				if(Breathled.pwm_duty<Breathled.pwm_period)//20ms*100=2s
					Breathled.pwm_duty++;
				else
				{
					Breathled.EN=0;
					Breathled.DIR=0;
				}
			}
			else
			{
				if(Breathled.pwm_duty)
					Breathled.pwm_duty--;
				else
				{
					Breathled.EN=0;
					Breathled.DIR=1;
				}
			}
		}
	}		
	if(Breathled.pwm_cnt<Breathled.pwm_duty)
		Set_ALL_LED_ON();
	else
		Set_ALL_LED_OFF();
}


BreathLed.h

#ifndef BREATHLED_H
#define BREATHLED_H
struct Breath_LED
{
	byte EN	:1;
	byte DIR:1;
	byte pwm_cnt;
	byte pwm_duty;
	byte pwm_period;
	byte stall;
	byte cnt;
};

extern Breath_LED Breathled;

#endif

tim.c

#include "tim.h"

void TIM2_Init()
{
	tm2ct = 0;					
	tm2b = 200;				
	$ TM2C SYSCLK,Disable,Period;						
	$ TM2S 8BIT,/1,/1;
	INTEN.TM2 = 1;
	INTRQ.TM2 = 0;
}

main.c

#include "tim.h"
#include "Breathled.h"

int main(void)
{
    TIM2_Init();
    Breath_Led_Init();
    Breathled.EN=1;//呼吸灯从暗到亮,然后全亮并停止呼吸。
    while()
    {
        
    }
}

void Interrupt (void)
{
    pushaf;
	if(Intrq.TM2)//50us
	{
		Intrq.TM2=0;
		Breath_Led_Driver();	
	}
    popaf;
}


http://www.kler.cn/a/453582.html

相关文章:

  • 芯片Tapeout power signoff 之IR Drop Redhawk Ploc文件格式及其意义
  • Java线程池面试题
  • Spring基础分析14-用户认证与授权
  • Qt使用QZipWriter和QZipReader来解压、压缩文件
  • 计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习
  • 聚类算法DBSCAN 改进总结
  • Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena
  • mysql三种读取模式(普通、流式、游标)
  • node.js web框架koa的使用
  • Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品
  • ip-协议
  • OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载
  • C语言练习-if语句
  • 【JavaEE】网络(6)
  • vulnhub靶场【shuriken】之node
  • 如何永久解决Apache Struts文件上传漏洞
  • Matrix-Breakout 2 Morpheus(找到第一个flag)
  • Linux下比ack更快的ag搜索命令详解
  • 基于QT(C++)+MySQL实现的旅行模拟器
  • Idea 添加tomcat 并发布到tomcat
  • ubuntu22.04安装PPOCRLabel
  • 踏踏实实练SQLday1-2 lead/lag使用(股票波峰波谷)
  • cesium通过经纬度获取3dtiles 得feature信息
  • Eclipse 修改项目栏字体大小
  • ADB 上传文件并使用脚本监控上传百分比
  • USB Hub 检测设备