⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 headset_charger.c

📁 bluelab的一个很好的例程
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2005

FILE NAME
    headset_charger.c

DESCRIPTION
    This file contains the battery charging functionality for NiMH batteries.
	
NOTES
	
*/


/****************************************************************************
    Header files
*/
#include "headset_private.h"
#include "headset_charger.h"
#include "headset_battery.h"


#include <pio.h>
#include <vm.h>


#ifdef CHARGER_DEBUG
#define CH_DEBUG(x) DEBUG(x)
#else
#define CH_DEBUG(x) 
#endif   

#define SET_CHARGER_STATE(s)	(power->charger.state = s);

#define VBAT_OFFSET		(100)
#define	TBAT_OFFSET		(2)
#define VBAT_NOMINAL	(2400)
#define VBAT_ABNORMAL	(3700)

/* Private messages for controlling battery charging process */
#define CHARGER_MESSAGE_BASE	(0)
enum
{
	CHARGER_UPDATE = CHARGER_MESSAGE_BASE
};

/* Forward declaration of charger task handler */
void charger_handler(Task task, MessageId id, Message message);

/* Local function prototypes */
static uint16 getVbatThreshold(power_type* power);
static void resetFastCharge(power_type* power);
static void startFastCharge(power_type* power);
static void endFastCharge(power_type* power);
static bool monitorCharge(power_type* power);
static void trickleCharge(power_type* power);
static void chargerError(power_type* power);
static bool dvDetect(power_type* power);
static bool dtDetect(power_type* power);
static bool fastChargeTimeExpired(power_type* power);
static void updateBatteryTemperature(power_type* power);


/****************************************************************************
NAME    
    getVbatThreshold
    
DESCRIPTION
  	This function is called to get the threshold used to determine if -dV
	detection should be enabled
    
RETURNS
    void
*/
static uint16 getVbatThreshold(power_type* power)
{
	uint16 vthres = VBAT_NOMINAL;

	/* Note vdet_m is actually vdet_m * 10000
			vdet_c is actually vdet_c * 1000
			vthres is in mV (*1000) */
	if(power->config.charger.vdet_m != 0 && power->config.charger.vdet_c !=0)
	{
		vthres = (((int16)power->config.charger.vdet_m * (int16)batteryGetCurrentTemperature(power))/(int16)100) + ((int16)power->config.charger.vdet_c);
	} 

	CH_DEBUG(("VDET: %dmv\n", vthres));

	return vthres;
}

/****************************************************************************
NAME    
    setChargeEnable
    
DESCRIPTION
  	This function is called to set/reset the charge enable pio line
    
RETURNS
    void
*/
static void setChargeEnable(bool state)
{
	hsTaskData * theHeadset = (hsTaskData *) getAppTask();
	
	if(theHeadset->PIO.ChargerEnablePIOEnabled)
	{
		PioSetDir(1 << theHeadset->PIO.ChargerEnablePIO, 1 << theHeadset->PIO.ChargerEnablePIO);
		if(state)
			PioSet(1 << theHeadset->PIO.ChargerEnablePIO, ~0);
		else
			PioSet(1 << theHeadset->PIO.ChargerEnablePIO, 0);
	}
}


/****************************************************************************
NAME    
    resetFastCharge
    
DESCRIPTION
  	This function is called to reset the fast charge algorithm
    
RETURNS
    void
*/
static void resetFastCharge(power_type* power)
{
	CH_DEBUG(("CH: FC Reset\n"));
	
	/* Reset -dV peak detection */
	power->charger.dv_peak = 0;
	power->charger.prev_dv_peak = 0;
	
	/* Reset dT level */
	power->charger.dt_level = batteryGetCurrentTemperature(power);
	power->charger.prev_dt_level = power->charger.dt_level;
	
	/* Enable fast charge timer */
	power->charger.fast_charge_inhibit = FALSE;
	
	/* Reset fast charge timer */
	power->charger.fast_charge_timer = 0;
}


/****************************************************************************
NAME    
    startFastCharge
    
DESCRIPTION
  	This function is called to start the fast charge algorithm
    
RETURNS
    void
*/
static void startFastCharge(power_type* power)
{
	CH_DEBUG(("CH: FC Start\n"));
	
	/* Fast charge state */
	SET_CHARGER_STATE(fast_charge);
	
	/* Enable fast charge enable PIO line */
	setChargeEnable(TRUE);
	
	/* Send fast charge event */
	MessageSend(getAppTask(), EventFastCharge, 0);
	
	/* Start fast charge */
	power->charger.fast_charge_inhibit = FALSE;
}


/****************************************************************************
NAME    
    endFastCharge
    
DESCRIPTION
  	This function is called to end the fast charge algorithm
    
RETURNS
    void
*/
static void endFastCharge(power_type* power)
{
	CH_DEBUG(("CH: FC End\n"));
	
	/* end fast charging */
	power->charger.fast_charge_inhibit = TRUE;
	
	/* Disable fast charge enable PIO line */
	setChargeEnable(FALSE);
	
	/* Fast cycle has completed, move into trickle charge state */
	trickleCharge(power);
}


/****************************************************************************
NAME    
    dvDetect
    
DESCRIPTION
  	This function monitors the voltage of the battery during charging and 
	attempts to detect the -dV point.  This indicates that the battery is fully
	charged and the fast charge cycle should be terminated.  Fast charging 
	beyond this point may result in permanent damage to the battery.
    
RETURNS
    void
*/
static bool dvDetect(power_type* power)
{
	bool detected = FALSE;
	
	/* Get the current battery voltage level */
	int16 vb = batteryGetCurrentVoltage(power);
	
	/* Get the -dV threshold */
	int16 dv = power->config.charger.dv_voltage;
	
	/* Check for -dV termination condition */
	if(vb >= power->charger.dv_peak)
	{
		/* Record peak */
		power->charger.dv_peak = vb;
	}
	else
	{
		/* Look for -dV threshold */
		if((power->charger.dv_peak - vb) > dv)
			detected = TRUE;
	}
	
	CH_DEBUG(("CH: vb=%d dv=%d peak=%d\n",vb, dv, power->charger.dv_peak));
	 
	return detected;
}




/****************************************************************************
NAME    
    dtDetect
    
DESCRIPTION
  	This function monitors the temperature of the battery.  If the temperature
	rise of the battery exceeds the a defined level (dt) then fast charge
	will terminate.  Charging the battery outside of defined limits can cause
	damage to the battery.
    
RETURNS
    void
*/
static bool dtDetect(power_type* power)
{
	bool detected = FALSE;
	
	/* Get the current battery temperature level */
	int16 tb = batteryGetCurrentTemperature(power);
	int16 vb = batteryGetCurrentVoltage(power);
	
	/* Get the dT threshold */
	int16 dt = power->config.charger.dt;
	
	CH_DEBUG(("CH: dT=%d\n",tb - power->charger.dt_level));
	CH_DEBUG(("CH: dT=%d\n",tb - power->charger.prev_dt_level));
	
	/* If the battery temperature has increased by greater than dt then terminate 
	   fast charge */
	if( ((tb - power->charger.dt_level) > dt) || ((tb - power->charger.prev_dt_level) > dt) )
	{
		if((power->charger.dv_peak - vb) > 0)
			detected = TRUE;
	}
	 
	/* Record current battery temperature for next update */
	power->charger.prev_dt_level = power->charger.dt_level;
	power->charger.dt_level = tb;
	
		
	return detected;
}


/****************************************************************************
NAME    
    fastChargeTimerExpired
    
DESCRIPTION
  	This function monitors the amount of time the current fast charge cycle
	has been active.  Note that the timer counts in charger unpdate units
	(power->config.charger.update_period)
    
RETURNS
    void
*/
static bool fastChargeTimeExpired(power_type* power)
{
	CH_DEBUG(("CH: T=%d\n",power->charger.fast_charge_timer));
	
	if(power->charger.fast_charge_timer > power->config.charger.time)
		return TRUE;
	else
		return FALSE;
}


/****************************************************************************
NAME    
    updateBatterytemperature
    
DESCRIPTION
  	This function records the current temperature of the battery
    
RETURNS
    void
*/
static void updateBatteryTemperature(power_type* power)
{
	/* Get the current battery temperature level */
	int16 tb = batteryGetCurrentTemperature(power);
	
	/* Record current battery temperature */		   
	power->charger.dt_level = tb;
	power->charger.prev_dt_level = tb;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -