313 lines
6.9 KiB
C
313 lines
6.9 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @file discharge_module.c
|
||
* @brief discharge module
|
||
*
|
||
*
|
||
* @version 1.0
|
||
* @date 2022/07/12 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 2022/07/12 Alex build this file
|
||
******************************************************************************
|
||
*/
|
||
#include "discharge_module.h"
|
||
#include "vox_module.h"
|
||
#include "adc.h"
|
||
#include "charger_module.h"
|
||
#include "sys_tim.h"
|
||
#include "system.h"
|
||
#include "led.h"
|
||
|
||
#if DISCHARGE_ENABLE
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
|
||
bit gBoost_Prepared_Flag = 0; //Boost满足开启条件。
|
||
bit gBoost_Opened_Flag = 0; //Boost已正常开启。
|
||
|
||
bit gBoost_UVLO_Flag = 0;
|
||
|
||
/******************************************************************************\
|
||
Functions definitions
|
||
\******************************************************************************/
|
||
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void DisCharge_init(void)
|
||
*
|
||
* Description : DisCharger Initialization
|
||
*
|
||
* Arguments : uint8_t Boost_Vout:Boost输出电压调节,Default:5V,00000~00111:4.0V(硬件设定最小值);01000:4.05 .... 11111:5.2V。设置比电池电压低,会触发短路保护。
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
#if 0
|
||
void Boost_Init(void)
|
||
{
|
||
if(Boost_Vout <= 0x07)
|
||
{
|
||
BST_EN = 0x01;
|
||
}
|
||
}
|
||
#endif
|
||
#ifndef BOOST_AOUT
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void DisCharge_Boost_Open(void)
|
||
*
|
||
* Description : Boost Open
|
||
* VIN 存在时,Boost 在电池电压高于 UVLO(硬件关闭 2.8/3.0V,硬件清 boost 使能。开
|
||
* 软件实现,有 VIN,3.6V,无 VIN,3.3V)和电池存在的情况下才能开启。
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void DisCharge_Boost_Open(void)
|
||
{
|
||
if(!(BST_EN & 0x01) && gBoost_Prepared_Flag) //Boost需满足开启条件
|
||
{
|
||
BST_EN = 1; //Boost Enable;异常时由硬件主动关闭。
|
||
|
||
#ifdef _DEBUG_DISCHARGE
|
||
printf("Boost Open!\r\n");
|
||
#endif
|
||
}
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void DisCharge_Boost_Close(void)
|
||
*
|
||
* Description : Boost Close;主要是出现异常时由硬件主动关闭,软件在电池LOW电量状态下,是否需要关闭boost输出?
|
||
*
|
||
* Arguments :
|
||
|
||
* Returns :
|
||
|
||
* Notes :
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void DisCharge_Boost_Close(void)
|
||
{
|
||
if( BST_EN & 0x01 )
|
||
{
|
||
BST_EN = 0; //Boost Disable
|
||
}
|
||
#ifdef _DEBUG_DISCHARGE
|
||
printf("Boost Close!\r\n");
|
||
#endif
|
||
gBoost_Prepared_Flag = 0;
|
||
}
|
||
|
||
#endif
|
||
/*
|
||
*******************************************************************************
|
||
* void DisCharge_Handler(void)
|
||
*
|
||
* Description : Boost放电的保护功能包括:输出过压保护,输出短路保护,电池过压保护,电池 UVLO 保护,放电过流保护,NTC 保护,过温保护。
|
||
*
|
||
* Arguments :
|
||
|
||
* Returns :
|
||
|
||
* Notes :
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void DisCharge_Handler(void)
|
||
{
|
||
uint16_t Vbat_Adc = 0;
|
||
|
||
/* 输出过压过流保护 --- 硬件实现,无标志位 */
|
||
|
||
/*放电过流保护 --- 硬件实现*/
|
||
|
||
/*过温保护 --- 硬件实现*/
|
||
if(CHIP_STA3 & 0x02)
|
||
{
|
||
gBoost_Prepared_Flag = 0;
|
||
gBoost_Opened_Flag = 0;
|
||
BST_EN = 0;
|
||
|
||
#ifdef _DEBUG_DISCHARGE
|
||
printf("Boost Pro DIR OT!\r\n");
|
||
#endif
|
||
return;
|
||
}
|
||
|
||
/*输出短路保护 -- 短路保护后一直打嗝或者打嗝BOOST_HICCUP_TIM次之后disable boost,打嗝时间 250ms(软件实现)。*/
|
||
if(Protect_Type_Flg & BOOST_OUTPUT_SHORT_PRO_TYPE)
|
||
{
|
||
#ifdef _DEBUG_DISCHARGE
|
||
printf("Boost Pro Output Short!\r\n");
|
||
#endif
|
||
//一直打嗝
|
||
if(F_sys_tim_250ms)
|
||
{
|
||
F_sys_tim_250ms = 0;
|
||
Protect_Type_Flg &= ~BOOST_OUTPUT_SHORT_PRO_TYPE;
|
||
BST_EN = 1; //250ms定时开一次Boost
|
||
}
|
||
return;
|
||
}
|
||
|
||
/*Boost Input UVLO 硬件保护*/
|
||
if( CHIP_STA0 & 0x80 ) //bit8:1:UVLO;0:normal
|
||
{
|
||
gBoost_Prepared_Flag = 0;
|
||
gBoost_Opened_Flag = 0;
|
||
gBoost_UVLO_Flag = 1; //在电池检测过程中,
|
||
BST_EN = 0;
|
||
|
||
#ifdef _DEBUG_DISCHARGE
|
||
printf("Boost Pro Uvlo!\r\n");
|
||
#endif
|
||
return;
|
||
}
|
||
/*BAT Low*/
|
||
if( CHIP_STA2 & 0x04 ) //bat low。不开boost BAT LOW detection enabled only when boost is enabled. 未开Boost,在进入Standby Mode后还是会被电池低电唤醒。
|
||
{
|
||
gBoost_Prepared_Flag = 0;
|
||
gBoost_Opened_Flag = 0;
|
||
BST_EN = 0;
|
||
|
||
#ifdef _DEBUG_DISCHARGE
|
||
printf("BAT LOW Pro!\r\n");
|
||
#endif
|
||
return;
|
||
}
|
||
|
||
#ifndef BOOST_AOUT
|
||
|
||
if( gBoost_UVLO_Flag )
|
||
{
|
||
#if ADC_ENABLE
|
||
Vbat_Adc = Vbat_Value(); //获取Bat电压
|
||
#endif
|
||
/*
|
||
VIN 存在时,Boost 在电池电压高于 UVLO(硬件关闭 2.8/3.0V,硬件清 boost 使能。开
|
||
软件实现,有 VIN,3.6V,无 VIN,3.3V)和电池存在的情况下才能开启。
|
||
软件上只作有 VIN,3.6V开boost,无 VIN,3.3V开boost逻辑。
|
||
*/
|
||
if( CHIP_STA4 & 0x07 ) //Get In Charger Mode
|
||
{
|
||
if(Vbat_Adc >= OPEN_BOOST_VIN)
|
||
{
|
||
gBoost_Prepared_Flag = 1;
|
||
}
|
||
else
|
||
{
|
||
BST_EN = 0; //Boost Disable
|
||
gBoost_Prepared_Flag = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(Vbat_Adc >= OPEN_BOOST_NOVIN)
|
||
{
|
||
gBoost_Prepared_Flag = 1;
|
||
}
|
||
else
|
||
{
|
||
BST_EN = 0; //Boost Disable
|
||
gBoost_Prepared_Flag = 0;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
gBoost_Prepared_Flag = 1;
|
||
}
|
||
|
||
#else
|
||
|
||
gBoost_Prepared_Flag = 1; //未发生Boost相关保护,可以开启Boost。
|
||
|
||
if( gBoost_UVLO_Flag )
|
||
{
|
||
|
||
#if ADC_ENABLE
|
||
Vbat_Adc = Vbat_Value(); //获取Bat电压
|
||
#endif
|
||
|
||
/*
|
||
VIN 存在时,Boost 在电池电压高于 UVLO(硬件关闭 2.8/3.0V,硬件清 boost 使能。开
|
||
软件实现,有 VIN,3.6V,无 VIN,3.3V)和电池存在的情况下才能开启。
|
||
软件上只作有 VIN,3.6V开boost,无 VIN,3.3V开boost逻辑。
|
||
*/
|
||
|
||
if( CHIP_STA4 & 0x07 ) //Get In Charger Mode
|
||
{
|
||
if(Vbat_Adc >= OPEN_BOOST_VIN)
|
||
{
|
||
if( gBoost_Prepared_Flag )
|
||
{
|
||
BST_EN = 1;
|
||
gBoost_Opened_Flag = 1;
|
||
gBoost_UVLO_Flag = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
BST_EN = 0; //Boost Disable
|
||
gBoost_Prepared_Flag = 0;
|
||
gBoost_Opened_Flag = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(Vbat_Adc >= OPEN_BOOST_NOVIN)
|
||
{
|
||
if( gBoost_Prepared_Flag )
|
||
{
|
||
BST_EN = 1;
|
||
gBoost_Opened_Flag = 1;
|
||
gBoost_UVLO_Flag = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
BST_EN = 0; //Boost Disable
|
||
gBoost_Prepared_Flag = 0;
|
||
gBoost_Opened_Flag = 0;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( gBoost_Prepared_Flag )
|
||
{
|
||
gBoost_Opened_Flag = 1;
|
||
BST_EN = 1;
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
|