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

📄 hw_battery.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/*********************************************************************************
*     Copyright (C),2004-2005,  Fuzhou Rockchip Co.,Ltd.
*         All Rights Reserved
*          V1.00
* FileName :  hw_battery.c
* Author :  lzy
* Description:
* History  :
*   <author>  <time>    <version>    <desc>
*    lzy        07/9/17        1.0     ORG
$Log: hw_battery.c,v $
Revision 1.3  2008/06/19 04:43:29  Administrator
代码整理!

Revision 1.2  2008/05/19 13:21:37  Administrator
IdleDetec 修改提交,各个模块可能需要修改 IdleDetec 相关的部份代码!

Revision 1.1.1.1  2008/03/06 13:29:04  Lingzhaojun
no message


*********************************************************************************/
#include "hw_include.h"
//#include "idledetec.h"
#include "usb.h"
#include "include.h"


BATT_INFO gBattery;
INT16U Batt_StaticCnt;

extern unsigned short AdcValue[];


#define CHARGEOKCNTRMAX 20

static UINT32 ChargeOKcnt = 0;
const UINT16 Batt_Level[BATT_TOTAL_STEPS] =
{
    BATT_LEVEL0, \
    BATT_LEVEL1, \
    BATT_LEVEL2, \
    BATT_FULL_VALUE
};
/**************************************************************************
* 函数名称:   RealBattValue
* 函数描述:
* 入口参数:   adc
* 出口参数:
* 返回值:
***************************************************************************/
UINT32 RealBattValue(UINT16 adc)
{
    UINT32 ret = (UINT32)adc;

    ret <<= 1;
    ret *= VCC_VALUE;
    ret >>= 10;

    return ret;
}

/**************************************************************************
* 函数名称:   Battery_GetChargeState
* 函数描述:
* 入口参数:
* 出口参数:
* 返回值:
***************************************************************************/
UINT16 Battery_GetChargeState(void)
{
    UINT32 batt_state = CHARGE_NO;

    if (VBUS_OK())
    {

        UINT32 batt = (UINT32)RealBattValue(AdcValue[BATTERY_ADC]);
        batt_state = CHARGE_BATT;

        if (batt > BATT_FULL_VALUE)
        {
            if (++ChargeOKcnt > CHARGEOKCNTRMAX)
                batt_state =  CHARGE_FULL;
        }
        else
            ChargeOKcnt = 0;
    }
    else
    {
        ChargeOKcnt = 0;
        batt_state =  CHARGE_NO;
    }

    return batt_state;
}


/**************************************************************************
* 函数名称:   Battery_GetLevel
* 函数描述:   得到系统的电池电量信息200ms/tick
* 入口参数:   无
* 出口参数:    无
* 返回值:         无
***************************************************************************/
UINT16 Battery_GetLevel(void)
{
    UINT32 battlevel;
    UINT32 ChargeState = Battery_GetChargeState();

    switch (ChargeState)
    {
        case CHARGE_BATT:
            {
                if (++gBattery.Batt_Level > 3)
                    gBattery.Batt_Level = 0;
                gBattery.Batt_Value = BATT_FULL_VALUE;
            }
            break;
        case CHARGE_FULL:
            {
                gBattery.Batt_Level = 3;
                gBattery.Batt_Value = BATT_FULL_VALUE;
            }
            break;
        default:
            {
                battlevel = (UINT32)RealBattValue(AdcValue[BATTERY_ADC]);

                gBattery.Batt_Value += battlevel;
                gBattery.Batt_Value >>= 1;

                if (gBattery.Batt_Value < BATT_POWEROFF_VALUE)
                    gBattery.Batt_LowCnt++;
                else
                    gBattery.Batt_LowCnt = 0;

                for (gBattery.Batt_Level = 0;gBattery.Batt_Level < BATT_TOTAL_STEPS - 1;gBattery.Batt_Level++)
                {
                    if (battlevel < Batt_Level[gBattery.Batt_Level])
                        break;
                }
            }
            break;
    }
    return gBattery.Batt_Level;
}


/**************************************************************************
* 函数名称:   Battery_PowerOnCheck
* 函数描述:   开机时检查电池容量
* 入口参数:   无
* 出口参数:   无
* 说明:       刚上电时检查电池容量,如太低则直接须直接关机
                   如冲电器插入开机,则电池电压一般会较高
                   开机电池检测采用1.25 v 作为基准
***************************************************************************/
UINT32 Battery_PowerOnCheck(void)
{
    UINT16 i, adcref, adcbat;
    UINT16  temp;

//
// the ADC frequency is no set after frist power on, so set to MAX APB frequency here, LZY modify  4-15
//
    ADC_PowerOnInit();


    ADC_Start(BATTERY_ADC, NULL);
    USDELAY(20);
    ADC_ReadData((UINT16 *)&adcbat);


    ADC_Start(VREF_ADC, NULL);
    USDELAY(20);
    ADC_ReadData((UINT16 *)&adcref);


    for (i = 0; i < 5; i++)
    {
        ADC_Start(BATTERY_ADC, NULL);
        USDELAY(20);
        ADC_ReadData((UINT16 *)&temp);
        adcbat += temp;
        adcbat >>= 1;

        ADC_Start(VREF_ADC, NULL);
        USDELAY(20);
        ADC_ReadData((UINT16 *)&temp);
        adcref += temp;
        adcref >>= 1;
    }

//转换到1.2v参考电压
    temp = ((UINT32)adcbat * 2L * BATT_1V2_VALUE) / ((UINT32)adcref);

// 当电池电压小于BATT_EMPTY_VALUE  -0.25v,返回false
    if ((!(VBUS_OK())) && (temp < (BATT_EMPTY_VALUE - 250)))
        return FALSE;
    else
    {
        gBattery.Batt_Value = BATT_FULL_VALUE;
        gBattery.Batt_LowCnt = 0;
        return TRUE;
    }
}

⌨️ 快捷键说明

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