169 lines
3.0 KiB
C
169 lines
3.0 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @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
|