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