364 lines
8.8 KiB
C
364 lines
8.8 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"
|
||
|
||
|
||
idata bit Charger_Done = 0;
|
||
|
||
#if CHARGER_ENABLE
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
#define NTC_PRO_DEBOUNCE_TIM 10
|
||
|
||
#define CHG_CUR_1K 150 //ADC内恒流电源20uA,外接1K电阻,电压0.2V,为保证获取的值有效,取0.15V
|
||
#define CHG_CUR_5K 800 //ADC内恒流电源20uA,外接5K电阻,电压1V,为保证获取的值有效,取0.8V
|
||
#define CHG_CUR_10K 1800 //ADC内恒流电源20uA,外接10K电阻,电压2V,为保证获取的值有效,取1.8V
|
||
#define CHG_CUR_NONE 3000
|
||
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
|
||
|
||
bit g_Bat_Det_Flag = 0; //电池检测开始标志位,触发条件:1、VIN插入;2、没有电池条件下定时4s;3、Chg Done检测一次,Chg Done后不再每4s检测一次。
|
||
|
||
idata uint8_t Cnt_Bat_Det_Tim = 0;
|
||
|
||
idata uint8_t Cnt_Die_OT_Tim = 0;
|
||
|
||
|
||
|
||
/******************************************************************************\
|
||
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
|
||
|
||
#if SET_CHG_TIM
|
||
/* Set Charge Time*/
|
||
Set_Charger_Time();
|
||
|
||
#endif
|
||
|
||
CHG_CTL &= ~0x80;
|
||
}
|
||
#endif
|
||
/*
|
||
*******************************************************************************
|
||
* void Set_Charge_Time(void)
|
||
*
|
||
* Description : Set Charger Time
|
||
*
|
||
* Arguments : void
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
|
||
#if SET_CHG_TIM
|
||
void Set_Charger_Time(void)
|
||
{
|
||
CHG_CTL &= 0xF0;
|
||
CHG_CTL |= 0x10; //Safety timer enable
|
||
CHG_CTL |= 0x01 << 3; //设置涓流时间:0:1 hour;1:2:hours
|
||
|
||
CHG_CTL |= 0x03 << 2; //设置恒流恒压时间:00:3 hours;01:5 hours;10:8 hours;11:13 hours
|
||
|
||
}
|
||
#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
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
uint8_t PMU_NTC_Control(void)
|
||
{
|
||
uint16_t NTC_Adc = 0;
|
||
uint8_t NTC_Flag = FALSE;
|
||
|
||
|
||
// NTC_Adc = VTS_Value();
|
||
// NTC_Adc = ADCx_Value(ADC_CH4);
|
||
|
||
if(NTC_Adc >= 0xFFF) ////屏蔽NTC功能,NTC浮空,屏蔽 NTC 功能,并锁定。
|
||
{
|
||
return NTC_Flag;
|
||
}
|
||
|
||
return NTC_Flag;
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Charger_Protect_Handle(void)
|
||
*
|
||
* Description : Charger Protect Handle(输入 UVLO 保护,输入过压保护,电池过压保护,电池短路保护,NTC 保护,过温保护,ICH 短路保护)
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns :uint8_t Protect_Type_Flg (bit0~bit8分别代表不同的保护类型。)
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
uint8_t Charger_Protect_Handle(void)
|
||
{
|
||
uint16_t VIN_Adc = 0;
|
||
uint8_t Pro_Flag = TRUE;
|
||
|
||
if( CHIP_STA3 & 0x02 ) //过温(Die ot)保护
|
||
{
|
||
Protect_Type_Flg |= DIE_OT_PRO_TYPE;
|
||
Cnt_Die_OT_Tim = 0;
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Chg Pro DIR OT!\r\n");
|
||
#endif
|
||
return FALSE;
|
||
}
|
||
|
||
if( CHIP_STA3 & 0x20 ) //VIN Over voltage
|
||
{
|
||
Protect_Type_Flg |= VBUS_OVERVOL_PRO_TYPE;
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Chg Pro Over Vol!\r\n");
|
||
#endif
|
||
return FALSE;
|
||
}
|
||
|
||
if(Protect_Type_Flg & VBUS_OVERVOL_PRO_TYPE)
|
||
{
|
||
if( !(CHIP_STA3 & 0x20) ) //系统解除VBUS Over Vol后进入正常工作模式,清标志位。
|
||
{
|
||
Protect_Type_Flg &= ~VBUS_OVERVOL_PRO_TYPE;
|
||
Pro_Flag = TRUE;
|
||
}
|
||
}
|
||
|
||
if( CHIP_STA4 & 0x10 ) //Charger BAT over voltage
|
||
{
|
||
Protect_Type_Flg |= BAT_OVERVOL_PRO_TYPE;
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Chg Pro Bat Over Vol!\r\n");
|
||
#endif
|
||
return FALSE;
|
||
}
|
||
|
||
if(Protect_Type_Flg & BAT_OVERVOL_PRO_TYPE)
|
||
{
|
||
if( !(CHIP_STA4 & 0x10) ) //系统解除Charger BAT over voltage后进入正常工作模式,清标志位。
|
||
{
|
||
Protect_Type_Flg &= ~BAT_OVERVOL_PRO_TYPE;
|
||
Pro_Flag = TRUE;
|
||
}
|
||
}
|
||
|
||
return Pro_Flag;
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* uint8_t VIN_Detect_Handle(void)
|
||
*
|
||
* Description : VIN Detect Handle
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : Plug State (0:NO Plug; 1:Plug Out; 2:Plug In)
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
#if 0
|
||
uint8_t VIN_Detect_Handle(void)
|
||
{
|
||
uint8_t VIN_Plug_State = 0;
|
||
|
||
switch(g_Plug_Irq_Flg)
|
||
{
|
||
case 0:
|
||
|
||
VIN_Plug_State = 0;
|
||
|
||
break;
|
||
case VBUS_PLGOUT_FLG:
|
||
|
||
VIN_Plug_State = 1;
|
||
Charger_Done = 0;
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Vin PlugOut(line:%d)\r\n",(uint16)__LINE__);
|
||
#endif
|
||
#if 1
|
||
/* 充电过程中 VIN 拔出,会触发 DPM!DPM 功能可以通过软件关闭! */
|
||
if(CHIP_STA4 & 0x40) //Charger vin DPM status
|
||
{
|
||
SFRADDR = REG_CHG0;
|
||
|
||
SFRDATA &= ~0x04; //关闭DPM环
|
||
}
|
||
#endif
|
||
break;
|
||
case VBUS_PLGIN_FLG:
|
||
|
||
if(CHIP_STA4 & 0x80) //Power Good
|
||
{
|
||
VIN_Plug_State = 2;
|
||
g_Bat_Det_Flag = 1;
|
||
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Vin PlugIn(line:%d)\r\n",(uint16)__LINE__);
|
||
#endif
|
||
}
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
g_Plug_Irq_Flg = 0;
|
||
return VIN_Plug_State;
|
||
}
|
||
#endif
|
||
/*
|
||
*******************************************************************************
|
||
* void Charger_Handler(void)
|
||
*
|
||
* Description : Charger Handle. ---- 充电过程除了根据 NTC 动态调节充电电流和截止电压外,其他由硬件控制。充电过程
|
||
发生异常,硬件进行相应处理,并发送标志位,软件可以进行相应处理。
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void Charger_Handler(void)
|
||
{
|
||
uint8_t Ret = 0;
|
||
uint16_t Vbat_Adc = 0;
|
||
uint16_t Bat_Adc = 0;
|
||
|
||
Ret = Charger_Protect_Handle(); //Get Charger Protect Type.
|
||
if(Ret == FALSE) //保护,不开启后续充电。
|
||
{
|
||
CHG_CTL &= ~0x01; //Disable Charger
|
||
return;
|
||
}
|
||
|
||
/*NTC Handle*/
|
||
Ret = PMU_NTC_Control(); //使能Charger前先检测NTC温度,异常就不开充电。(CHIP_STA4 & 0x80):PG
|
||
if(Ret == FALSE) //NTC保护,不充电。
|
||
{
|
||
return;
|
||
}
|
||
|
||
/*VIN Detection and Power good.注意硬件已对VIN消抖!*/
|
||
//VIN_Detect_Handle();
|
||
|
||
if( !(CHIP_STA4 & 0x80) ) //未检测到Power good,则关闭Charger使能后返回。
|
||
{
|
||
CHG_CTL &= ~0x01; //Disable Charger
|
||
Charger_Done = 0;
|
||
return;
|
||
}
|
||
|
||
if( Charger_Done )
|
||
{
|
||
#if ADC_ENABLE
|
||
Bat_Adc = Vbat_Value(); //获取Bat电压
|
||
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Charge Done!\r\n");
|
||
#endif
|
||
#endif
|
||
if( Bat_Adc < BAT_RECHARG )
|
||
{
|
||
CHG_CTL |= 0x01; //Enable Charger
|
||
Charger_Done = 0;
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Enable Charge!\r\n");
|
||
#endif
|
||
}
|
||
else
|
||
{
|
||
CHG_CTL &= ~0x01; //Disable Charger
|
||
#ifdef _DEBUG_CHARGER
|
||
printf("Disable Charge!\r\n");
|
||
#endif
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CHG_CTL |= 0x01; //Enable Charger
|
||
}
|
||
}
|
||
|
||
#endif
|