Both_Way_Comm_SY8833/TP3310_Demo.si4project/Backup/charger_module(1740).c

416 lines
9.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @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"
#if CHARGER_ENABLE
/******************************************************************************\
Macro definitions
\******************************************************************************/
#define NTC_PRO_DEBOUNCE_TIM 10
/******************************************************************************\
Variables definitions
\******************************************************************************/
bit Charger_Done = 0;
bit NTC_Low_Pro_Flag = 0;
bit NTC_High_Pro_Flag = 0;
uint8_t NTC_Pro_Debounce_Cnt = 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 = TRUE;
#if ADC_CHN_ENABLE
NTC_Adc = ADC_Chn_Value(ADC_CH4);
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.
#ifdef _DEBUG_CHARGER
printf("NTC Pro!NTC_Adc:%d,CHG_CTL:0x%x,(line:%d)\r\n",(uint16)NTC_Adc,(uint16)CHG_CTL,(uint16)__LINE__);
#endif
NTC_Flag = FALSE;
}
}
}
#endif
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)
{
uint8_t Pro_Flag = TRUE;
if( CHIP_STA3 & 0x02 ) //过温(Die ot)保护
{
Protect_Type_Flg |= DIE_OT_PRO_TYPE;
#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 拔出,会触发 DPMDPM 功能可以通过软件关闭! */
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
*
*******************************************************************************
*/
/*
1、充电超时充电超时后软件关闭充电使能等待VIN拔出。
*/
void Charger_Handler(void)
{
uint8_t Ret = 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;
}
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