单色灯驱动

发布于 2022-10-11  554 次阅读


#include "singleLed.h"

#define TRUE    1
#define FALSE   0

Bright_t Br_t;

/** 函数名:BrightLampParams_Init
  * 功能	:单色灯初始化
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
Bright_t* BrightLampParams_Init(void)
{
	Br_t.Mode = LedOnMode;
	Br_t.BrightPara.FastTimeCount = 500;  //ms单位
	Br_t.BrightPara.SlowTimeCount = 2000;  //ms单位
	Br_t.BrightPara.FlashBrightValue = 600; //
	
	Br_t.BrightPara.FastBreathTimeCount = 4000;  //ms单位
	Br_t.BrightPara.SlowBreathTimeCount = 6000;  //ms单位
	
	Br_t.BrightPara.darkTimeCount = 1000;
	Br_t.BrightPara.holdTimeCount = 1000;
	
	Br_t.BrightPara.BrightMinValue = 400;
	Br_t.BrightPara.BrightMaxValue = 900;
	
	Br_t.BrightPara.BrightMin = 150;	
	Br_t.BrightPara.BrightMax = 800;
	
	Br_t.BrightPara.dataBrightValue = 600;
	Br_t.BrightPara.dataFlashCount  = 300;
	Br_t.BrightPara.dataFlashNum   = 0;
	return &Br_t;
}

/** 函数名:BrightIsOn
  * 功能	:单色灯亮灭状态
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
unsigned short BrightIsOn(void)
{
	if((Br_t.PwmSetCh1 > 0))
	{
		return TRUE;
	}
	return FALSE;
}


/** 函数名:BrigthBreath
  * 功能	:常灭模式
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrightOff(void)
{
	Br_t.BrightPara.TimerEnableFlag = FALSE;
	Br_t.PwmSetCh1 = 0;//Br_t.BrightPara.BrightMinValue;
	Br_t.PwmSetCh2 = 0;//Br_t.BrightPara.BrightMinValue;
}

/** 函数名:BrigthBreath
  * 功能	:常亮模式
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrightOn(uint16_t BrightValue)
{
	Br_t.BrightPara.TimerEnableFlag = FALSE;
	Br_t.PwmSetCh1 = BrightValue;
	Br_t.PwmSetCh2 = BrightValue;
}

/** 函数名:BrigthBreath
  * 功能	:闪烁模式
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrithFlash(uint16_t timecount)
{
	Br_t.BrightPara.TimerEnableFlag = TRUE;
	if(Br_t.BrightPara.TimerTick < timecount)
	{
		return;
	}
	Br_t.BrightPara.TimerTick = 0;
	if(BrightIsOn())
	{
			BrightOff();		
	}else
	{
			BrightOn(Br_t.BrightPara.FlashBrightValue);		
	}
}



/** 函数名:BrigthBreath
  * 功能	:呼吸模式
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrigthBreath(uint16_t timecount)
{
	unsigned short t1 = timecount / 2;
	unsigned int t2,t3,t4;
	float value;
	Br_t.BrightPara.TimerEnableFlag = TRUE;
	unsigned int Tsum = 0;
	
	//1.计算总时间
	Tsum = Br_t.BrightPara.darkTimeCount +  t1 + //暗区时间
	                Br_t.BrightPara.holdTimeCount;
	
	
	t2 = Br_t.BrightPara.darkTimeCount + t1;
	t3 = t2 + Br_t.BrightPara.holdTimeCount;
	t4 = t3 + t1;
	
	Tsum = t4;
	if(Br_t.BrightPara.TimerTick >= Tsum)
	{
		Br_t.BrightPara.TimerTick = 0;
	}
	if(Br_t.BrightPara.TimerTick > 0 && Br_t.BrightPara.TimerTick < Br_t.BrightPara.darkTimeCount)
	{
		value = Br_t.BrightPara.BrightMin;
	}
	else if(Br_t.BrightPara.TimerTick >= Br_t.BrightPara.darkTimeCount  && Br_t.BrightPara.TimerTick<= t2)
	{
		value = (float)((Br_t.BrightPara.BrightMax - Br_t.BrightPara.BrightMin) / pow(t1,1.4f))  \
										 * pow((Br_t.BrightPara.TimerTick-Br_t.BrightPara.darkTimeCount),1.4f) +  Br_t.BrightPara.BrightMin;
	}
	else if(Br_t.BrightPara.TimerTick > t2  && Br_t.BrightPara.TimerTick< t3)
	{
		value = Br_t.BrightPara.BrightMax;
	}
	else if(Br_t.BrightPara.TimerTick >= t3  && Br_t.BrightPara.TimerTick<= t4)
	{
		value = (float)((Br_t.BrightPara.BrightMin - Br_t.BrightPara.BrightMax ) / pow(t1,1.4f))  \
									 * pow((Br_t.BrightPara.TimerTick - t3),1.4f) +  Br_t.BrightPara.BrightMax;	
		if(value < Br_t.BrightPara.BrightMin )
		{
			value = Br_t.BrightPara.BrightMin;
		}
	}
	Br_t.PwmSetCh1 = (unsigned short)value;
	Br_t.PwmSetCh2 = Br_t.PwmSetCh1;

}

/** 函数名:BrigthData
  * 功能	:
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrigthData(void)
{
	Br_t.BrightPara.TimerEnableFlag = TRUE;
	static uint8_t num = 0;
	if(Br_t.BrightPara.TimerTick < Br_t.BrightPara.dataFlashCount)
	{
		return;
	}
	else
	{
		Br_t.BrightPara.dataFlashTick++;
		
		if(Br_t.BrightPara.dataFlashTick <= 3)
		{
			BrightOff();
			return;
		}
		else if(Br_t.BrightPara.dataFlashTick > (Br_t.BrightPara.dataFlashNum)*2 +3)
		{
			Br_t.BrightPara.dataFlashTick = 0;
			return;
		}
	}
	if(BrightIsOn())
	{
			BrightOff();		
	}else
	{
			BrightOn(Br_t.BrightPara.dataBrightValue);		
	}
	
}

/** 函数名:BrightLampHander
  * 功能	:
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrightLampHander(void)
{
	switch((int)Br_t.Mode)
	{
		case LedOffMode:       //灭
			BrightOff();
			break;
		case LedOnMode:        //亮
			BrightOn(Br_t.BrightPara.BrightMinValue);
			break;
		case LedOnHighMode:        //亮
			BrightOn(Br_t.BrightPara.BrightMaxValue);
			break;
		case LedSlowFlashMode:        //闪烁
			BrithFlash(Br_t.BrightPara.SlowTimeCount);
			break;
		case LedFastFlashMode:        //闪烁
			BrithFlash(Br_t.BrightPara.FastTimeCount);
			break;
		case LedSlowBreathMode:     //呼吸
			BrigthBreath(Br_t.BrightPara.SlowBreathTimeCount);
			break;
		case LedFastBreathMode:    //呼吸
			BrigthBreath(Br_t.BrightPara.FastBreathTimeCount);
			break;
		case LedInfoShowMode:  //数据显示
			BrigthData();
			break;
		
		default:
			break;
	}
}

/** 函数名:BrightLampTick
  * 功能	:单色灯计数
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void BrightLampTick(uint16_t tick)
{
	Br_t.BrightPara.TimerTick+=tick;
}

/** 函数名:BrightLampSet
  * 功能	:单色灯模式设置
  * 输入	:
	* 输出	:
	* 编写人:ZJ
  */
void BrightLampSet(int mode)
{
	if(mode >= 0 && mode < 7)
	{
		Br_t.BrightPara.dataFlashTick = 0;
		Br_t.Mode = mode;
	}
}


/** 函数名:BrightLampGet
  * 功能	:单色灯模式获取
  * 输入	:
	* 输出	:
	* 编写人:ZJ
  */
int BrightLampGet(void)
{
	return Br_t.Mode;
}


/** 函数名:BrightLampSet
  * 功能	:单色灯数据设置
  * 输入	:
	* 输出	:
	* 编写人:ZJ
  */
void BrightInfoSet(uint16_t num)
{ 
	Br_t.BrightPara.dataFlashNum = num;
	Br_t.BrightPara.dataFlashTick = 0;
	Br_t.Mode = LedInfoShowMode;
}



#ifndef __SIGLELED_H__
#define __SIGLELED_H__

#include "main.h"

typedef enum
{
	LedOffMode=0,      //关闭模式
	LedOnMode=1,       //打开模式
	LedOnHighMode = 2,  //
	LedSlowFlashMode,    //闪烁模式
	LedFastFlashMode,    //闪烁模式
	
	LedSlowBreathMode,   //呼吸模式
	LedFastBreathMode,   //呼吸模式
	LedInfoShowMode, //数据显示模式 
}BrightModeType_e;

typedef struct
{
	unsigned short FastTimeCount;        //闪烁时间设置
	unsigned short SlowTimeCount;        //闪烁时间设置
	unsigned short FlashBrightValue;    //闪烁亮度设置
	
	unsigned short darkTimeCount;    //暗区时间设置
	unsigned short holdTimeCount;    //辉光时间设置
	
	
	unsigned short FastBreathTimeCount;  //呼吸时间设置
	unsigned short SlowBreathTimeCount;  //呼吸时间设置
	
	unsigned short BrightMax;   //最高亮度设置
	unsigned short BrightMin;   //最低亮度设置
	
	unsigned short TimerTick;        //定时器控制
	unsigned short TimerEnableFlag;  //定时器使能
	
	
	unsigned short BrightMaxValue;   //最高亮度设置
	unsigned short BrightMinValue;   //最低亮度设置
	
	
	uint16_t dataFlashCount;     //闪烁时间设置
	uint16_t dataBrightValue;    //闪烁亮度设置
	uint16_t dataFlashNum;       //闪烁次数
	uint16_t dataFlashTick;      //闪烁次数记录
}BrightParams_t;

typedef struct
{
	BrightModeType_e Mode;             //运行模式
	BrightParams_t BrightPara;
	
	
	unsigned short PwmSetCh1;
	unsigned short PwmSetCh2;
}Bright_t;


void BrightLampHander(void);
Bright_t* BrightLampParams_Init(void);
void BrightLampSet(int mode);
int BrightLampGet(void);
void BrightLampTick(uint16_t tick);

#endif

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。