253 lines
5.7 KiB
C
253 lines
5.7 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @file charger_module.c
|
||
* @brief charger 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
|
||
******************************************************************************
|
||
*/
|
||
/*_____ I N C L U D E S ____________________________________________________*/
|
||
#include "charger_module.h"
|
||
#include "adc.h"
|
||
#include "sys_tim.h"
|
||
#include "discharge_module.h"
|
||
#include "system.h"
|
||
#include "vox_module.h"
|
||
|
||
bit Charger_Done = 0;
|
||
|
||
#if CHARGER_ENABLE
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
#define NTC_PRO_DEBOUNCE_TIM 10
|
||
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
|
||
#if ADC_CHN_ENABLE
|
||
|
||
bit NTC_Low_Pro_Flag = 0;
|
||
bit NTC_High_Pro_Flag = 0;
|
||
|
||
uint8_t NTC_Pro_Debounce_Cnt = 0;
|
||
|
||
#endif
|
||
/******************************************************************************\
|
||
Functions definitions
|
||
\******************************************************************************/
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Charger_init(void)
|
||
*
|
||
* Description : Charger Initialization
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
#if 0
|
||
void Charger_Init(void)
|
||
{
|
||
SFRADDR = PMU_CTL1;
|
||
SFRDATA |= 0x07; //电池低压检测 enable 信号;电池低压检测档位选择:3.3V
|
||
/* Setting CV */
|
||
REG_CHG2 = 0x00; //0:4.20V;1:4.35V
|
||
/* Setting CHG Current */
|
||
REG_CHG1 = 0x03; //000:100mA;001:200mA;010:250mA;011:300mA;100:350mA;101:400mA;110:450mA;111:500mA
|
||
|
||
}
|
||
#endif
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* uint8_t Charger_NTC_Control(uint8_t Charge_sta)
|
||
*
|
||
* Description : Charger NTC Control
|
||
* NTC 支持 103 和 104 电阻,NTC 温度检测由软件通过 ADC 采集 NTC 引脚电压。
|
||
* 如果支持电量计温度检测线性化,支持电量计方案 103 的 NTC 需要并一个 8.2k
|
||
|
||
* 电阻(20uA 电流,103 NTC 需要串联 10k 电阻),104 的 NTC 并联 82k 电阻。
|
||
* 在使能充电前,软件先检测NTC 温度,如果 NTC 浮空,屏蔽 NTC 功能,
|
||
* 并锁定;如果 NTC 下拉到 0V,关闭充电和放电。NTC 保护后,软件关闭充电,
|
||
* 温度恢复正常并持续 250ms,再继续充电。
|
||
*
|
||
* Arguments : NTC_Protect_Type_e NTC_Type:Shield 、JEITA or IEC;Charge_sta:Charge or not
|
||
|
||
* Returns :NTC_Flag (0:Shield; 1:JEITA; 2:IEC)
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
#if 1
|
||
uint8_t PMU_NTC_Control(void)
|
||
{
|
||
uint16_t NTC_Adc = 0;
|
||
uint8_t NTC_Flag = TRUE;
|
||
|
||
#if ADC_CHN_ENABLE
|
||
#if 1
|
||
NTC_Adc = ADC_Chn_Value(ADC_CH4);
|
||
#else
|
||
NTC_Adc = VNTC_Adc;
|
||
#endif
|
||
if(NTC_Adc >= 0x2FF) ////屏蔽NTC功能,NTC浮空,屏蔽 NTC 功能,并锁定。
|
||
{
|
||
return NTC_Flag;
|
||
}
|
||
|
||
if(CHIP_STA4 & 0x80)
|
||
{
|
||
if(NTC_Adc <= T_0C && NTC_Adc > T_45C) //正常充电
|
||
{
|
||
NTC_Flag = TRUE;
|
||
if(NTC_Low_Pro_Flag)
|
||
{
|
||
if( NTC_Adc < T_3C )
|
||
{
|
||
NTC_Low_Pro_Flag = 0;
|
||
NTC_Flag = TRUE;
|
||
}
|
||
else
|
||
{
|
||
NTC_Flag = FALSE;
|
||
}
|
||
}
|
||
|
||
if(NTC_High_Pro_Flag)
|
||
{
|
||
if( NTC_Adc > T_42C )
|
||
{
|
||
NTC_High_Pro_Flag = 0;
|
||
NTC_Flag = TRUE;
|
||
}
|
||
else
|
||
{
|
||
NTC_Flag = FALSE;
|
||
}
|
||
}
|
||
}
|
||
else //异常不充电
|
||
{
|
||
NTC_Pro_Debounce_Cnt++;
|
||
if(NTC_Pro_Debounce_Cnt > NTC_PRO_DEBOUNCE_TIM) //100ms
|
||
{
|
||
NTC_Pro_Debounce_Cnt = 0;
|
||
|
||
if(NTC_Adc > T_0C)
|
||
{
|
||
NTC_Low_Pro_Flag = 1;
|
||
}
|
||
else
|
||
if(NTC_Adc < T_45C)
|
||
{
|
||
NTC_High_Pro_Flag = 1;
|
||
}
|
||
|
||
CHG_CTL &= ~0x01; //Disable Charger.
|
||
|
||
NTC_Flag = FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
return NTC_Flag;
|
||
}
|
||
#endif
|
||
/*
|
||
*******************************************************************************
|
||
* void Charger_Handler(void)
|
||
*
|
||
* Description : Charger Handle. ---- 充电过程除了根据 NTC 动态调节充电电流和截止电压外,其他由硬件控制。充电过程
|
||
发生异常,硬件进行相应处理,并发送标志位,软件可以进行相应处理。
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
/*
|
||
1、充电超时:充电超时后,软件关闭充电使能,等待VIN拔出。
|
||
*/
|
||
void Charger_Handler(void)
|
||
{
|
||
uint8_t Ret = 0;
|
||
#if 1
|
||
if( !(CHIP_STA4 & 0x80) ) //未检测到Power good,则关闭Charger使能后返回。
|
||
{
|
||
CHG_CTL &= ~0x01; //Disable Charger
|
||
Charger_Done = 0;
|
||
return;
|
||
}
|
||
|
||
if( CHIP_STA4 & 0x70 ) //Charger BAT over voltage、VIN DPM、temp loop.
|
||
{
|
||
CHG_CTL &= ~0x01; //Disable Charger
|
||
return;
|
||
}
|
||
|
||
/*NTC Handle*/
|
||
Ret = PMU_NTC_Control(); //使能Charger前先检测NTC温度,异常就不开充电。(CHIP_STA4 & 0x80):PG
|
||
if( Ret == FALSE ) //NTC保护,不充电。
|
||
{
|
||
return;
|
||
}
|
||
|
||
if( Charger_Done )
|
||
{
|
||
#if ADC_ENABLE
|
||
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Chg Done\r\n");
|
||
#endif
|
||
if( Vbat_Adc < BAT_RECHARG )
|
||
{
|
||
CHG_CTL |= 0x01; //Enable Charger
|
||
Charger_Done = 0;
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("En Chg\r\n");
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
CHG_CTL &= ~0x01; //Disable Charger
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Dis Chg\r\n");
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
}
|
||
else
|
||
#endif
|
||
{
|
||
CHG_CTL |= 0x01; //Enable Charger
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|