您好!
我正在使用带有微控制器的 I2C 接口使用 BQ27441-G1A 电量监测计。 我使用 I2C 成功地与 BQ27441-G1A 通信、并成功进行读取和写入。 为了供您参考、我附上了我的代码。 如我在 Fualguage_initialize ()函数中的代码所示,我将写入电池电容、配置、设计能量、终止电压、整形器电压至电量。 所有这些参数都成功地写入了燃油表、我通过读取这些值来验证。 在 Fualguage_parameter()函数中,我正在读取电池百分比、电流、电压、设计容量、满容量、 可用容量、电池充电/放电状态。 我还附上了硬件原理图供您参考。 在我的代码中,我在经过一些延迟(7 - 8秒)后连续调用 Fualguage_parameter()。
我正面临着我在下面提到的困境:
=================== 第一种情况===========================
1) 1)考虑到我当前未将 USB 充电器与电路板连接、代码显示 Battery Percentage = 54%、工作正常。
2) 2)现在、我将 USB 充电电缆连接到电路板、现在电池正在充电、工作正常。
3) 3)现在、我按下控制器中的复位开关(仍然 USB 充电电缆连接到电路板上)、现在在 UART 显示屏中、电池百分比= 75%。
所以这里的电池百分比突然增加,差异比上次的读数大。 因此、我在这里得到21%的差异、这比预期的要大得多。
=================== 第二种情况===================
1) 1)考虑到 USB 充电电缆已与我的板连接、并且代码显示电池百分比= 75%、工作正常。
2) 2)现在我从电路板上拔下 USB 充电电缆、电池正在放电、工作正常。
3) 3)现在、我在 UART 显示屏中按控制器中的 RESET 开关电池百分比= 55%。
所以这里的电池百分比突然下降,差异比上次的读数大。 因此、在这里、我会得到20%的差异、这比预期的要大得多。
我仅在连接/移除 USB 充电电缆并复位微控制器、否则工作正常时才会面临这些问题。
那么、为什么我在电池百分比方面会有这么大的差异呢?
请帮我解决这个问题。
感谢您在这方面提供的任何帮助。
谢谢你
Bhavin
======================================================================== Fuelguage 原理图================================================================
======================================================================== 电池充电器原理图================================================================
================================================================================ main.c ===================================================================
#ifndef __FUALGUAGE_H
#define __FUALGUAGE_H
#define TIMEOUT 10000
#define BQ72441_I2C_TIMEOUT 2000
///---------------- 电池参数宏-------------------------------------------------------
#define battery_capacity 5000 //例如800mAh 电池
// DesignEnergy = battery_capacity (mAh)* 3.7V
#define design_energy 18500
#define TERMINATE_VOLTAGE 3300 //终止电压= 3300mV
#define 锥形电流115 //锥形电流= 115mA
// Taper_rate =(int)(battery_capacity /(0.1 * Taper_current))
#define Tape_Rate 434
#define Taper_voltage 4200
#define SOC1_SET_THRESHOLD 10 //低电池阈值百分比中断
#define SOC1_CLEAR_THRESHOLD 11 //在达到此百分比后、低电池阈值中断清除
#define FC_set 98 //充电在此百分比之后终止
#define FC_CLEAR 95 //标志的 FC 位清零低于此百分比
#define OPCONFIG 0x1DFC
typedef 结构
{
uint8_t 充电:1;
uint8_t 放电:1;
uint8_t Bat_Low:1;
int16_t 百分比;
int16_t 电流;
int16_t Design_capacity;
int16_t full_capacity;
int16_t ave_capacity;
浮动电压;
}电池;
typedef 枚举
{
Set_battery_capacity、
SET_OPCONFIG、
Set_design_energy、
SET_TERMINATE_VOLTAGE、
Set_Tape_Rate、
Set_Tape_Voltage、
SET_SOC1_THRESHOLD、
SET_FC_SET、
SET_FC_CLEAR、
SET_SOC1_CLEAR_THRESHOLD
}Fual_Guage_Init;
typedef 枚举
{
ENTER_CONFIG、
Compute _ block_CHKSUM、
GET_CHECKSUM、
WRITE_CHECKSUM、
EXIT_CONFIG
} Write_ExtendedData;
#define TIMER_EXPIE FG_Timer_Flag >= 2.
/* I2C 读取需要此延迟*/
(j = 0;j < 500;j++)的#define delay
#define SOC1_CLR_THRESHOLD ((偏移= 1)&&(ClassID = 49)
#define DEDIGN_Capacity ((offset ==10)&&(ClassID ==82)
#define FG_INITIALL_COMPLETE FG_Init > SET_SOC1_CLEAR_THRESHOLD
// Current()函数的参数,指定要读取的电流
typedef 枚举{
平均值、//平均电流(默认值)
STBY、//待机电流
最大//最大电流
} CURRENT_measure;
// capacity()函数的参数,指定要读取的容量
typedef 枚举{
保留、//剩余容量(默认)
全容量、//全容量
可用、//可用容量
AVALE_FULL、//完全可用容量
LEASE_F、//过滤剩余容量
LEASE_UF、//未过滤的剩余容量
FULL_F、//已过滤全部容量
FULL_UF、//未过滤的满容量
设计//设计容量
} capacity_measure;
// SoS()函数的参数
typedef 枚举{
已过滤、//已过滤充电状态(默认)
未过滤//充电状态未过滤
} SoC_Measure;
// SOH()函数的参数
typedef 枚举{
百分比、//运行状况百分比(默认值)
SOH_STAT //运行状况状态位
} SOH_measure;
// temperature ()函数的参数
typedef 枚举{
电池、//电池温度(默认值)
INTERNAL_TEMP //内部 IC 温度
} temp_measure;
// setGPOUTFunction()函数的参数
typedef 枚举{
SoC_INT、//将 GPOUT 设置为 SOC_INT 功能
// BAT_LOW //将 GPOUT 设置为 BAT_LOW 功能<--- 对此进行了注释
} gpout_function;
//////////////////////////////////////////////
//常规常量//
//////////////////////////////////////////////
#define BQ27441_unseque_key 0x8000 //密钥代码来解封 BQ27441-G1A
#define BQ27441_DEVICE_ID 0x0421 //默认器件 ID
//////////////////////////////////////////////
//标准命令//
//////////////////////////////////////////////
//电量监测计使用一系列2字节标准命令来启用系统
//读取和写入电池信息。 每个命令都有一个关联的
//顺序命令代码对。
#define BQ27441_COMMAND_CONTROL 0x00 //控制()
#define BQ27441_COMMAND_TEMP 0x02 //温度()
#define BQ27441_COMMAND_VOLTAGE 0x04 //电压()
#define BQ27441_COMMAND_FLAGS 0x06 // Flags()
#define BQ27441_COMMAND_NOM_Capacity 0x08 // NominalAvailableCapacity()
#define BQ27441_COMMAND_AVALE_Capacity 0x0A //可用 Capacity ()
#define BQ27441_COMMAND_REM_CAPTURE 0x0C //重新定义 Capacity ()
#define BQ27441_COMMAND_FUL_Capacity 0x0E // FullChargeCapacity()
#define BQ27441_COMMAND_AVG_CURRENT 0x10 // AverageCurrent ()
#define BQ27441_COMMAND_STDBY_CURRENT 0x12 //标准电流()
#define BQ27441_COMMAND_MAX_CURRENT 0x14 // MaxLoadCurrent ()
#define BQ27441_COMMAND_AVG_POWER 0x18 // AveragePower()
#define BQ27441_COMMAND_SOC 0x1C // StateOfCharge ()
#define BQ27441_COMMAND_TEMP 0x1E //内部温度()
#define BQ27441_COMMAND_SOH 0x20 // StateOfHealth ()
#define BQ27441_COMMAND_REM_CAP_UNFL 0x28 //重新保护电容未过滤()
#define BQ27441_COMMAND_REM_CAP_FIL 0x2A //重新保护电容已分配()
#define BQ27441_COMMAND_FULL_CAP_UNFL 0x2C // FullChargeCapacityUnfiltered ()
#define BQ27441_COMMAND_FULL_CAP_FIL 0x2E // FullChargeCapacityFiled()
#define BQ27441_COMMAND_SOC_UNFL 0x30 // StateOfChargeUnfilter()
///////////////////////////////////////////////////////
//控制子命令//
///////////////////////////////////////////////////////
//发出 Control()命令需要后续的2字节子命令。 这些
//附加字节指定所需的特定控制函数。 。
// Control()命令允许系统控制燃油的特定功能
正常运行期间的//测量仪表以及器件处于中时的附加功能
//不同的访问模式。
#define BQ27441_CONTRAL_STATUS 0x00
#define BQ27441_CONTRAL_DEVICE_TYPE 0x01
#define BQ27441_CONTRAL_FW_VERSION 0x02
#define BQ27441_CONTRAL_DM_CODE 0x04
#define BQ27441_CONTROL_PREV_MACWRITE 0x07
#define BQ27441_CONTRAL_CHEM_ID 0x08
#define BQ27441_CONTRAL_BAT_INSERT 0x0C
#define BQ27441_CONTRAL_BAT_REMOVE 0x0D
#define BQ27441_CONTRAL_SET_HIBERNATE 0x11
#define BQ27441_CONTRAL_CLEAR_HIBERNATE 0x12
#define BQ27441_CONTRAL_SET_CFGUPDATE 0x13
#define BQ27441_CONTRAL_SHUTDOWN_ENABLE 0x1B
#define BQ27441_CONTRAL_SHUTDOWN 0x1C
#define BQ27441_CONTRAL_SABLECed 0x20
#define BQ27441_CONTRAL_PULSE_SOC_INT 0x23
#define BQ27441_CONTRAL_RESET 0x41
#define BQ27441_CONTRAL_SOFT_RESET 0x42
#define BQ27441_CONTRAL_EXIT_CFGUPDATE 0x43
#define BQ27441_CONTROL_EXIT_RESIM 0x44
////////////////////////////////////////////////////////////////////////////////////////////
//控制状态字-位定义//
////////////////////////////////////////////////////////////////////////////////////////////
// CONTRAL_STATUS 的16位数据的位位置。
// control_status 指示电量监测计将状态信息返回到
// Control()地址0x00和0x01。 只读状态字包含状态
//作为条件保证或自动置位或清零的位
//通过使用指定的子命令。
#define BQ27441_STATUS_SHUTDOWNEN (1<<15)
#define BQ27441_STATUS_WDRESET (1<<14)
#define BQ27441_STATUS_SS (1<<13)
#define BQ27441_STATUS_CALMODE (1<<12)
#define BQ27441_STATUS_CCA (1<<11)
#define BQ27441_STATUS_BCA (1<<10)
#define BQ27441_STATUS_Qmax_up (1<<9)
#define BQ27441_STATUS_RES_UP (1<<8)
#define BQ27441_STATUS_INITCOMP (1<<7)
#define BQ27441_STATUS_HIBERNATE (1<<6)
#define BQ27441_STATUS_SLEEP (1<<4)
#define BQ27441_STATUS_LDMD (1<<3)
#define BQ27441_STATUS_RUP_DIS (1<<2)
#define BQ27441_STATUS_VOK (1<<1)
////////////////////////////////////////////////////////////////////////////
//标志命令-位定义//
////////////////////////////////////////////////////////////////////////////
// Flags()的16位数据的位位置
//此读字函数返回电量监测状态的内容
//寄存器、描述当前的运行状态。
#define BQ27441_FLAG_OT (1<<15)
#define BQ27441_FLAG_UT (1<<14)
#define BQ27441_FLAG_FC (1<<9)
#define BQ27441_FLAG_CHG (1<<8)
#define BQ27441_FLAG_OCVTAKEN (1<<7)
#define BQ27441_FLAG_ITPOR (1<<5)
#define BQ27441_FLAG_CFGUPMODE (1<<4)
#define BQ27441_FLAG_BAT_DET (1<<3)
#define BQ27441_FLAG_SOC1 (1<<2)
#define BQ27441_FLAG_SOCF (1<<1)
#define BQ27441_FLAG_DSG (1<0)
///////////////////////////////////////////////////////////
//扩展数据命令//
///////////////////////////////////////////////////////////
//扩展数据命令提供了标准之外的附加功能
//命令集。 它们的使用方式相同;但与标准不同
//命令、扩展命令不限于2字节字。
#define BQ27441_extended _OPCONFIG 0x3A // OpConfig ()
#define BQ27441_extended _ capacity 0x3C // DesignCapacity ()
#define BQ27441_DELEDAND_DATACLASS 0x3E // DataClass ()
#define BQ27441_DELEDAND_DATABLOCK 0x3F //数据块()
#define BQ27441_extended BLOCKDATA 0x40 // BlockData ()
#define BQ27441_extended 校验和0x60 // BlockDataCheckSum ()
#define BQ27441_extended _control 0x61 // BlockDataControl ()
//////////////////////////////////////////////////////////////////////////////////////
//配置偏移//
//////////////////////////////////////////////////////////////////////////////////////
#define capacity_offset 10.
#define design_energy_offset 12.
#define TERMINAT_VTG_OFFSET 16.
#define TAPRATE_OFFSET 27
#define Tape_VTG_OFFSET 29
#define OPCCONFIG_OFFSET 0
#define SOC1_OFFSET 0
#define SOC1_CLEAR_OFFSET 1.
#define FC_set_offset 5.
#define FC_clear_offset 6.
//////////////////////////////////////////////////////////////////////////////////////
//配置类,子类 ID //
//////////////////////////////////////////////////////////////////////////////////////
//要访问扩展数据的子类,请设置 DataClass()函数
//使用这些值之一。
//配置类
#define BQ27441_ID_SAFETY 2 //安全
#define BQ27441_ID_CHG_Termination 36 //充电终止
#define BQ27441_ID_CONFIG_DATA 48 //数据
#define BQ27441_ID_DELOD 49 //放电
#define BQ27441_ID_REGISTERS" 64 //寄存器
#define BQ27441_ID_POWER 68 //电源
//电量监测类别
#define BQ27441_ID_IT_CFG 80 // IT 配置
#define BQ27441_ID_CURRENT_THRESH 81 //电流阈值
#define BQ27441_ID_STATE 82 //状态
// Ra 表类
#define BQ27441_ID_R_A_RAM 89 // R_A RAM
//校准类
#define BQ27441_ID_CALIB_DATA 104 //数据
#define BQ27441_ID_CC_CAL 105 // CC 校准
#define BQ27441_ID_CURRENT 107 // Current
//安全类
#define BQ27441_ID_CODETS112 //代码
//////////////////////////////////////////////////////////////////////////////////////////
// OpConfig 寄存器-位定义//
//////////////////////////////////////////////////////////////////////////////////////////
// OpConfig 寄存器的位位置
#define BQ27441_OPCONFIG_BIE (1<<13)
#define BQ27441_OPCONFIG_BI_PU_EN (1<<12)
#define BQ27441_OPCONFIG_GPIOPOL (1<<11)
#define BQ27441_OPCONFIG_SLEEP (1<<5)
#define BQ27441_OPCONFIG_RMFCC (1<<4)
#define BQ27441_OPCONFIG_BATLOWEN (1<<2)
#define BQ27441_OPCONFIG_TEMPS (1<0)
//函数声明
uint8_t begin (void);
uint8_t setCapacity (uint16_t 容量);
uint16_t 电压(void);
int16_t CURRENT (CURRENT_Measure 类型);
uint16_t capacity (capacity_measure 类型);
int16_t power (void);
uint16_t soc (soc_measure 类型);
uint8_t SOH (SOH_Measure 类型);
uint16_t 温度(temp_measure 类型);
uint16_t deviceType (void);
uint8_t enterConfig (uint8_t UserControl);
uint8_t exitConfig (uint8_t 电阻);
uint16_t flags (void);
uint16_t status (void);
uint8_t 密封(void);
uint8_t seal (void);
uint8_t unseal (void);
uint16_t opConfig (void);
uint16_t readWord (uint16_t 子地址);
uint16_t readControlWord (uint16_t 函数);
uint8_t executeControlWord (uint16_t 函数);
uint8_t blockDataControl (void);
uint8_t blockDataClass (uint8_t id);
uint8_t blockDataOffset (uint8_t offset);
uint8_t blockDataChecksum (void);
uint8_t readBlockData (uint8_t offset);
uint8_t writeBlockData (uint8_t offset、uint8_t data);
uint8_t computeBlockChecksum (void);
uint8_t writeBlockChecksum (uint8_t csum);
uint16_t readExtendedData (uint8_t ClassID、uint8_t offset);
uint8_t writeExtendedData (uint8_t ClassID、uint8_t offset、uint8_t * data、uint8_t len);
uint8_t softReset (void);
uint8_t setDesign_Energy (uint16_t 容量);
uint8_t setTerminate_Voltage (uint16_t capacity);
uint8_t setTaper_rate (uint16_t capacity);
uint16_t my_readBlockData (uint8_t offset);
void Fualguage_initialize (void);
void Fualguage_parameter (void);
uint8_t setTaper_Voltage (uint16_t capacity);
uint8_t setGPOUT (uint16_t 容量);
uint8_t SET_SOC1_Threshold (uint16_t 容量);
uint8_t clear_SOC1_Threshold (uint16_t 容量);
void read_battery_percentage (void);
void Check_Battery_Chg_Discg (void);
uint8_t SET_FcSet_Threshold (uint16_t 容量);
uint8_t SET_FcClear 阈值(uint16_t 容量);
void FG_I2C_Read (uint8_t 地址、uint8_t Read_Bytes);
void FG_I2C_Write (uint8_t Address、uint8_t write_bytes、uint8_t *数据);
#endif