Both_Way_Comm_SY8833/TP3310_Demo.si4project/Backup/bat(5818).c

96 lines
2.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"
#if BAT_VALUE
#define C_offset_bat_level_MAX 50
#define C_offset_bat_level_MIN 10
#define C_bat_level_protect 0
#define C_bat_level_lowpower 1
bit F_batlevel_low ;
bit F_batlevel_protect ;
idata uint8_t offset_bat_level = ( C_offset_bat_level_MAX + C_offset_bat_level_MIN ) / 2;
idata uint8_t bat_level = 0;
#define C_batLevel_SetMax 5
const uint16_t C_batlevel_Threshold[C_batLevel_SetMax] =
{
3000, //1
3300, //2
3650, //3
4000, //4
4200 //5
};
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 < C_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;
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( bat_level <= C_bat_level_lowpower )
{
F_batlevel_low = 1;
}
else if( bat_level > (C_bat_level_lowpower+1) )
{
F_batlevel_low = 0;
}
}
#endif