工作日记:假关机状态下电量灯还在亮问题

文章讲述了在设备关机模式中,如何通过修改代码逻辑来确保在真正关机状态下关闭电量灯,避免在假关机时灯效继续。作者添加了标志位控制LED灯的行为,使得电量灯在关机灯效结束后自动关闭。
摘要由CSDN通过智能技术生成

1、原来的代码及逻辑

void 	fun_shutdown_mode()
{
	// Motor_Stop();
	bMTR_ON = 0;
	fun_R_horse_led_init();

	while (gWorkMode == Em_Dev_ShutDown)
	{
		if(bTimeBase_Onetime == 1){			//0.8192ms  						
			bTimeBase_Onetime = 0;
			GCC_CLRWDT();

			fun_powerOff_LED();
		}	
		fun_motor_ctrl();	//should call; otherwise motor will stop too quick
	}
	// power off
	EN_POWER = 0;//多余的代码
}

void  fun_powerOff_LED()
{
	gLedCount++;
	if(gLedCount < POWERON_LEDSPEED2){
		return;
	}
	gLedCount = 0;

	if(gLedState == 0){
		LEDall_ON_bit();
		gLedState++;
	}
	else if(gLedState == 1){
		bLED5 = 0;
		gLedState++;
	}
	else if(gLedState == 2){
		bLED4 = 0;
		gLedState++;
	}
	else if(gLedState == 3){
		bLED3 = 0;
		gLedState++;
	}
	else if(gLedState == 4){
		bLED2 = 0;
		gLedState++;
	}
	else if(gLedState == 5){
		bLED1 = 0;
		EN_POWER = 0;
	}
}

void fun_led_breathe()
{
	static unsigned int LIGHTCNT;
	static unsigned int PWMCNT = 0;	
	static unsigned char flag = 0;
	if(gWorkMode == Em_Dev_PowerOn_Mode) 
		return;

	if(bVoltageUnder)	//workmode + chargemode <6.5V shutdown
		gWorkMode = Em_Dev_ShutDown;

	if((gWorkMode == Em_Dev_Charge_Mode) && (bCharge == Em_CHARGE_FULL)){	//chargemode >= 8.1V blue always
		LED15_light();//blue
	}
	else if((gWorkMode != Em_Dev_Charge_Mode) && (bVoltageUnder == 0) && (bVoltageLowWarn == 0)){//has power  workmode >= 7V blue always
		LED15_light();//blue
	}
	else{
		LIGHTCNT ++;
		if(LIGHTCNT < PWMCNT)
		{
			if((gWorkMode == Em_Dev_Charge_Mode) && (bCharge == Em_CHARGE_NOT_FULL))	//chargemode >=7V~<8.1 blue breath
				LED15_light();//blue
			else	//workmode 
				LED16_light();//orange
		}	
		else
		{
			LED_battery_off();
		}
		if(LIGHTCNT > 70)
		{
			LIGHTCNT = 0;
			if(!flag)
			{
				PWMCNT++;
				if(PWMCNT > 70)                   
				flag = 1;
			}
			else
			{
				PWMCNT --;
				if(!PWMCNT)
				flag = 0;
			}    
		}
	}
}

2、导致的现象


关机模式的现象,首先停止电机,然后进行关机灯效(逆时针跑马),最后关闭EN脚(这个你松开手指相当于断电),但是注意,那个我的关灯灯效只有档位灯灯效,没有电量灯的关闭。

那么我在这个时候关闭电量灯,会不会就能解决呢?答案是不能,因为我在关机模式下关掉,但是只要我手指没有松开按钮,就会一直处于假关机状态,程序依旧在运行,电量检测

函数依旧在运行,电量灯函数运行,还是会把关掉的灯亮起来。

3、解决这个问题的代码及逻辑

volatile bit flag_horse_shutdown;
void  fun_powerOff_LED()
{
	gLedCount++;
	if(gLedCount < POWERON_LEDSPEED2){
		return;
	}
	gLedCount = 0;

	if(gLedState == 0){
		LEDall_ON_bit();
		gLedState++;
	}
	else if(gLedState == 1){
		bLED5 = 0;
		gLedState++;
	}
	else if(gLedState == 2){
		bLED4 = 0;
		gLedState++;
	}
	else if(gLedState == 3){
		bLED3 = 0;
		gLedState++;
	}
	else if(gLedState == 4){
		bLED2 = 0;
		gLedState++;
	}
	else if(gLedState == 5){
		bLED1 = 0;
		flag_horse_shutdown = 1;
		// GREEN_LED = 0;
		// RED_LED = 0;
		EN_POWER = 0;
	}
}

extern volatile bit flag_horse_shutdown;
void fun_led_breathe()
{
	static unsigned int LIGHTCNT;
	static unsigned int PWMCNT = 0;	
	static unsigned char flag = 0;
	if(gWorkMode == Em_Dev_PowerOn_Mode) 
		return;
	if(flag_horse_shutdown == 1)
	{
		LED_battery_off();
		return;
	}

	if(bVoltageUnder)	//workmode + chargemode <6.5V shutdown
		gWorkMode = Em_Dev_ShutDown;

	if((gWorkMode == Em_Dev_Charge_Mode) && (bCharge == Em_CHARGE_FULL)){	//chargemode >= 8.1V blue always
		LED15_light();//blue
	}
	else if((gWorkMode != Em_Dev_Charge_Mode) && (bVoltageUnder == 0) && (bVoltageLowWarn == 0)){//has power  workmode >= 7V blue always
		LED15_light();//blue
	}
	else{
		LIGHTCNT ++;
		if(LIGHTCNT < PWMCNT)
		{
			if((gWorkMode == Em_Dev_Charge_Mode) && (bCharge == Em_CHARGE_NOT_FULL))	//chargemode >=7V~<8.1 blue breath
				LED15_light();//blue
			else	//workmode 
				LED16_light();//orange
		}	
		else
		{
			LED_battery_off();
		}
		if(LIGHTCNT > 70)
		{
			LIGHTCNT = 0;
			if(!flag)
			{
				PWMCNT++;
				if(PWMCNT > 70)                   
				flag = 1;
			}
			else
			{
				PWMCNT --;
				if(!PWMCNT)
				flag = 0;
			}      
		}
	}
}

增加一个标志位在关机灯效函数那里,然后在电量灯函数那里,用这个标志位作为限定条件,一旦识别到标志位被置起来了,就说明处于关机模式下且关机灯效正在进行快要完成,这样哪怕是处于假关机状态下,进入电量灯函数也会因为检测到标志位,关闭电量灯然后直接退出电量灯函数。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值