SY883x_For_WEIHUA_W13/UsrSrc/bat/bat.c

169 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @file bat.c
* @brief Voltage-based RC model gauge algorithm
*
*
* @version 1.0
* @date 2023/02/20 17:35:40
* @author Alex Xu
*
* Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
* All Rights Reserved
*
* History:
* Revision Date Author Desc
* 1.0.0 2023/02/20 Alex build this file
******************************************************************************
*/
#include "bat.h"
#include "adc.h"
#include "userapp.h"
#include "led.h"
#include "system.h"
#include "vox_module.h"
#include "sleep.h"
idata uint8_t bat_level = 0;
//bit F_batlevel_low = 0; //电池低压
#if BAT_VALUE
#define C_offset_bat_level_MAX 60
#define C_offset_bat_level_MIN 10
#define C_bat_level_protect 0
#define C_bat_level_lowpower 1
bit F_batlevel_protect = 0; //低电保护
idata uint8_t offset_bat_level = ( C_offset_bat_level_MAX + C_offset_bat_level_MIN ) / 2;
#define C_batLevel_SetMax 11
/*充电电池电压会浮高,具体电压需要测试。*/
const uint16_t Boost_batlevel_Threshold[C_batLevel_SetMax] =
{
#if 1
/*实际测试电压会有偏差原因adc误差在50mV左右。*/
3200, //0
//3300, //5%
3450, //10%
3510, //20%
3575, //30%
3630, //40%
3700, //50%
3785, //60%
3875, //70%
4000, //80%
4100, //90%
4200 //100%
#else
/*实际测试电压会有偏差原因adc误差在50mV左右。*/
3200, //0
//3300, //5%
3450, //10%
3510, //20%
3554, //30%
3590, //40%
3690, //50%
3775, //60%
3875, //70%
4000, //80%
4100, //90%
4200 //100%
#endif
};
void check_bat_level(void)
{
uint8_t i = 0;
//get bat level
#if ADC_ENABLE
for(i=0; i < C_batLevel_SetMax; i++)
{
if( Vbat_Adc < Boost_batlevel_Threshold[i] )
{
break;
}
}
#endif
if( i > bat_level )
{
offset_bat_level++;
}
else
{
offset_bat_level--;
}
//debounce
if( (offset_bat_level > C_offset_bat_level_MAX) || (offset_bat_level < C_offset_bat_level_MIN) )
{
//update
bat_level = i;
/*系统重启后,显示电量*/
if( System_Init_Flag )
{
System_Init_Flag = 0;
if( Vbat_Adc < Boost_batlevel_Threshold[1] )
{
bat_level = 0;
}
else
{
bat_level = i;
}
#if LED_188
g_188_Num = 10 * bat_level;
Display_Show_Num(g_188_Num);
/*初始化显示电量*/
CHG_LED_Disp_Flag = 1;
Init_LED_Disp_Flag = 1;
// Enter_Sleep_Cnt_Restart_Flag = 1;
#endif
}
offset_bat_level = ( C_offset_bat_level_MAX + C_offset_bat_level_MIN ) / 2;
}
if( bat_level <= C_bat_level_protect )
{
F_batlevel_protect = 1;
}
else if( bat_level > ( C_bat_level_protect + 1 ) )
{
F_batlevel_protect = 0;
}
#if 0
if( bat_level <= C_bat_level_lowpower )
{
F_batlevel_low = 1;
}
else if( bat_level > (C_bat_level_lowpower + 1) )
{
F_batlevel_low = 0;
}
#endif
}
#endif