This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ25731:UPS 电源 IC

Guru**** 2389240 points
Other Parts Discussed in Thread: BQ25731, BQ25731EVM, EV2400, BQSTUDIO
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1444152/bq25731-ups-power-ic

器件型号:BQ25731
主题中讨论的其他器件:EV2400BQSTUDIO

工具与软件:

主题:BQ25731的电池充电控制、状态更新、电池电压和 I2C 通信问题

我在使用时目前面临几个问题 BQ25731 I2C 上的电池管理系统。 这些问题阻碍了系统正常运行、我需要帮助解决这些问题。

1.充电未启用

我无法通过 I2C 命令启用充电。 以下命令:

sudo i2cset -y 1 0x6b 0x10 0x01 #启用充电

始终失败并显示错误消息:

错误:写入失败

尽管进行了多次尝试并验证了寄存器地址和数据是否正确、但仍然不启用充电。

2.充电在一段时间后被禁用

即使我设法启用充电、它也会在一段时间后被禁用、没有任何明确的指示或触发信号。 这表明寄存器设置或硬件配置可能出现问题、从而可能导致系统自动禁用充电。

3.无法读取电池状态和电压更新

尝试读取电池电压和状态寄存器时、我始终会遇到以下问题:
电池电压和电量百分比未按预期更新。
电池状态和电压寄存器要么返回不正确的值、要么根本不提供更新。
0x2C (电池电压)等特定寄存器会返回恒定值(例如0x00)、这可能表明存在通信问题或寄存器设置不正确。

4.连续远程 I/O 错误

我在尝试读取或写入 I2C 总线时遇到持续远程 I/O 错误、尤其是在访问与电池状态和电压相关的某些寄存器时。 这些错误发生在基本 I2C 操作(例如读取或写入电池管理 IC)期间。

这是代码

#include
#include
#include
#include //切换到 pigpio 以实现更好的 GPIO 控制
#include
#include
#include

#define BQ25731_ADDR 0x6b // BQ25731的 I2C 地址
#define BQ25731_CHARGE_ON 0x01 //开启充电
#define BQ25731_CHARGE_OFF 0x00 //关闭充电
#define BQ25731_STATUS 0x20 //电池状态寄存器
#define BQ25731_CONTROL 0x23 //电池控制寄存器
#define BQ25731_INPUTVOLTAGE 0x0A //输入电压寄存器
#define BQ25731_CHARGE_CURRENT 0x03 //电池充电电流寄存器
#define BQ25731_CHARGE_VOLTAGE 0x05 //电池充电电压寄存器
#define BQ25731_OTGVOLTAGE 0x07 //过压保护寄存器
#define BQ25731_OTGCURRENT 0x09 //过流保护寄存器
#define MAX_BATTERY_PERSISTENT 100 //最大电池百分比
#define LOW_BATTERY_THRESHOLD 20 //低电池警告阈值(以百分比表示)
#define MIN_BATTERY_VOLTAGE 10.5 //关闭前的最低电压(适用于铅酸电池)

#define LEAD_ACID_MAX_VOLTAGE 14.4 //铅酸电池的最大充电电压
#define LEAD_ACID_MIN_VOLTAGE 10.5 //关闭前的最小电压(适用于铅酸电池)
#define LEAD_ACID_CHARGE_CURRENT 1.0 //充电电流(例如、10Ah 电池为1A)
#define LEAD_ACID_OVER_VOLTAGE 14.7 //过压保护阈值(对于铅酸电池)
#define LEAD_ACID_OVER_CURRENT 2.0 //过流保护阈值(单位为安培)

int fd;// I2C 的文件描述符
int battery_per;//电池百分比
float battery_voltage;//电池电压(根据 IC 寄存器计算)
char buffer[3];//用于 I2C 通信的缓冲器

void initBQ25731 (void);
int battery_status (float battery_voltage);
void monitor_battery_status (void);
void enable_charging (void);
void disable_charging (void);
悬空 READ_BATTERY_VOLTAGE (void);
void set_battery_charge_voltage (float voltage);
void SET_BATTERY_CHARGE_CURRENT (float current);
void SET_VOLTAGE_PROTECTION (浮动电压);
void set_overCurrent_protection (浮点电流);

void initBQ25731 (){
如果((FD = open ("/dev/i2c-1、O_RDWR))< 0){
perror ("Failed to open the I2C bus");
退出(1);
}
如果(ioctl (FD、I2C_SLAVE、BQ25731_ADDR)< 0){
perror ("Failed to access BQ25731 IC (访问 BQ25731电源失败)");
退出(1);
}
}
int battery_status (float battery_voltage){
INT soc = 0;
if (battery_voltage >= 12.7){
soc = 100;
否则、如果(BATTERY_VOLTAGE >= 12.5 && BATTERY_VOLTAGE < 12.7){
soc = 75;
否则、如果(BATTERY_VOLTAGE >=12.3 && BATTERY_VOLTAGE <12.5)
soc = 50;
否则、如果(BATTERY_VOLTAGE >=12.0 & BATTERY_VOLTAGE >12.3)
soc = 25;
否则、如果(BATTERY_VOLTAGE < 11.0){
soc = 0;
}
返回 soc;
}

void monitor_battery_status (){
BATTERY_STATUS (BATTERY_VOLTAGE);

如果(BATTERY_PER < LOW_BATTERY_THRESHOLD){
printf ("警告:电池低于%d%%\n"、LOW_BATTERY_THRESHOLD);
enable_charging();
}否则、如果(BATTERY_PER >= MAX_BATTERY_PERSISTENT){
printf ("电池已充满电。\n");
disable_charging();
}
}

void enable_charging(){
Buffer[0]= BQ25731_control;
Buffer[1]= BQ25731_Charge_on;
如果(write (fd、buffer、2)!= 2){
perror ("无法启用充电");
其他{
printf ("已启用充电。\n");
}
}

void disable_charging(){
Buffer[0]= BQ25731_control;
Buffer[1]= BQ25731_CHARGE_OFF;
如果(write (fd、buffer、2)!= 2){
perror ("无法禁用充电");
其他{
printf ("已禁用充电。\n");
}
}

void set_battery_charge_voltage (float voltage){
int voltage_value =(int)(voltage * 10);

Buffer[0]= BQ25731_CHARGE_VOLTAGE;
Buffer[1]=(VOLTAGE_VALUE >> 8)和0xFF;
Buffer[2]= VOLTAGE_VALUE & 0xFF;

如果(write (fd、buffer、3)!= 3){
perror ("未能设置充电电压");
其他{
printf ("充电电压设置为%.2fv\n"、电压);
}
}

void set_battery_charge_current (float current){
int current_value =(int)(current * 10);

Buffer[0]= BQ25731_Charge_Current;
Buffer[1]= Current_Value;

如果(write (fd、buffer、2)!= 2){
perror ("未能设置充电电流");
其他{
printf ("充电电流设置为%.2fa\n"、Current);
}
}

void SET_VOLTAGE_PROTECTION (浮动电压){
int voltage_value =(int)(voltage * 10);

Buffer[0]= BQ25731_OTGVOLTAGE;
Buffer[1]=(VOLTAGE_VALUE >> 8)和0xFF;
Buffer[2]= VOLTAGE_VALUE & 0xFF;

如果(write (fd、buffer、3)!= 3){
perror ("未能设置过压保护");
其他{
printf ("过压保护设置为%.2fv\n"、电压);
}
}

void set_overCurrent_protection (浮点电流){
int current_value =(int)(current * 10);

Buffer[0]= BQ25731_OTGCURRENT;
Buffer[1]= Current_Value;

如果(write (fd、buffer、2)!= 2){
perror ("未能设置过流保护");
其他{
printf ("过流保护设置为%.2fa\n"、current);
}
}
float read_battery_voltage(){
Buffer[0]= 0x2C;// VBAT 寄存器地址(低字节)

如果(write (fd、buffer、1)!= 1){
perror ("写入电池电压寄存器失败");
返回-1.0;
}

if (read (fd、buffer、2)!= 2){
perror ("读取电池电压失败");
返回-1.0;
}

INT VOLTAGE_mV =(BUFFER[1]<< 8)| BUFFER[0];//高字节<< 8 |低字节

return voltage_mV/1000.0;//以伏特为单位的返回电压
}

int main(){
if (gpioInitialize ()< 0){//初始化 pigpio 库
fprintf (stderr、"pigpio 初始化失败\n");
返回1;
}

initBQ25731 ();

SET_BATTERY_CHARGE_VOLTAGE (LEAD_ACID_MAX_VOLTAGE);
SET_BATTERY_CHARGE_CURRENT (LEAD_ACID_CHARGE_CURRENT);
SET_VOLTAGE_PROTECTION (LEAD_ACID_OVER_VOLTAGE);
SET_OVERRIDA_PROTECTION (LEAD_ACID_OVER_CURRENT);

unsigned long last_check_time = gpioTick ();

while (1){
unsigned long current_time = gpioTick ();

if (current_time - last_check_time >= 1000000){
MONITOR_BATTERY_STATUS();
last_check_time = current_time;
}
BATTERY_PER = BATTERY_STATUS (BATTERY_VOLTAGE);
printf ("电池百分比:%d%%\n"、battery_per);
BATTERY_VOLTAGE = READ_BATTERY_VOLTAGE ();
如果(BATTERY_VOLTAGE!=-1){
printf ("电池电压:%.2fv\n"、battery_voltage);
如果(BATTERY_VOLTAGE < LEAD_ACID_MIN_VOLTAGE){
printf ("警告:电池电压过低! 禁用充电。\n");
disable_charging();
}
}

usleep(500000 );//休眠0.5秒以避免高 CPU 使用率
}

gpioTerminate();
返回0;
}

///这里我们主要面临着 Read_battery_voltage()、enable_charging,disable_charging 的问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Sai、

    很遗憾、在美国感恩节假期之前、没有人可以支持此帖子。  很抱歉耽误你的时间。

    此致、

    Jeff

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jeff F:

    我是否可以知道您的团队何时可以为该问题提供支持?

    此致、

    Sai Ravali。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    由于美国节假日、我们的回复将会延迟、由此给您带来的不便、我们深表歉意。

    此致、

    Wyatt Keller

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     尊敬的 Wyatt Keller:

    因为今天是12月2日,我想跟进我们先前讨论的问题的解决,让我知道什么时候可以提供支持?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、SAI、

    感谢您的耐心。  

    我认为这与通信问题有关、但我们不支持任何自定义代码调试。 我建议您订购 BQ25731EVM 及其相关的 EV2400。  

    BQStudio 处理所有 I2C 代码和通信。  

    www.ti.com/.../BQ25731EVM

    此致、

    老虎

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tiger、

    感谢您的答复。 然而,我目前面临着一些配置和监控电池电压和充电状态的挑战:

    1.我无法用0x00/01、0x03/02充电电流、0x05/04充电电压给电池充电。

    输出电容损耗:

    i2cset -y 1 0x2B 0x00 0x01
    错误:写入失败
    sudo i2cset -y 1 0x2B 0x00 0x01 0x02 0x05 I
    错误:写入失败
    sudo i2cset -y 1 0x2B 0x00 0x02 0x05 0x01 I
    错误:写入失败

    我无法使用0x2C/2D 读取电池电压寄存器、即使使用寄存器0x3B/3A 启用 ADCOption ()、也不能读取电池电压寄存器。

    输出电容损耗:


    充电电压设置为14.40V
    充电电流设置为1.00A
    输入电压(VBUS):126mV
    启用充电
    故障状态:0x41
    检测到故障! 正在重置故障...
    故障已清除
    电瓶电压:0.00 V
    电瓶电压:0.00 V
    同时测量具有12伏电荷的多用途电池时。

    3、充电 状态极低,接近260V 和0A

    输出电容损耗:

    充电电压设置为14.40V
    充电电流设置为1.00A
    启用充电
    输入电压(VBUS):126mV
    电池电流(IBAT):0 mA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、SAI、

    我不确定 i2c 代码的工作原理。 我建议您探测 SDA 和 CLK、看看它是否符合 I2C 时序图。  

    此致、

    老虎

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tiger、

    我无法通过0x2C/2D 读取电池电压寄存器、甚至在使用寄存器0x3B/3A 启用 ADCOption ()之后、也无法读取电池电压寄存器。

    输出电容损耗:


    充电电压设置为14.40V
    充电电流设置为1.00A
    输入电压(VBUS):126mV
    启用充电
    故障状态:0x41
    检测到故障! 正在重置故障...
    故障已清除
    电瓶电压:0.00 V
    电瓶电压:0.00 V
    同时测量具有12伏电荷的多用途电池时。

    这是运行命令时的 o/p 值:

    sudo i2cset -y 1 0x6B 0x3B 0x01
    sudo i2cset -y 1 0x6B 0x3B 0x40
    睡眠1

    sudo i2cget -y 1 0x6B 0x2C
    0x00
    sudo i2cget -y 1 0x6B 0x2d
    0x00

    2、充电 状态显示出极低的 MV 及0A 值

    输出电容损耗:

    充电电压设置为14.40V
    充电电流设置为1.00A
    启用充电
    输入电压(VBUS):126mV
    电池电流(IBAT):0 mA
    也无法进行电池充电...

    此致、

    Sai Ravali。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要 GUI 来查看寄存器值。  

    www.ti.com/.../BQSTUDIO