工具与软件:
大家好!
我是一名软件开发人员、负责为 VR 游戏开发触觉设备。
最近、我收到了集成 BQ25622充电器的新 PCB、这样我就可以读取电池电压。
我设法通过 I2C 协议激活 ADC 控制器、读取二进制值、并将它们转换为不稳定值。 (使用 ESP-IDF)
但我注意到插装充电器时的电流变化。
不执行任何操作时、电池的充电电流为1A (正常)
通过 I2C 总线启用 ADC 控制(因此我可以读取电池电压)时、电池的充电电流为0.5A
当通过 I2C 总线读取电池电压时(每3秒)、我的电池充电电流为0.1A
这是正常行为吗? (如果是这样、我只需要在充电时禁用 ADC 控制和电池读数)
如果不是、我更有可能弄乱了 I2C 对话框、还是它来自 PCB 的架构本身? (我不是电工、因此我可能不了解有关硬件的一些内容)
下面是我如何 设置 I2C 总线并启用 ADC 控制
// Config i2c i2c_config_t conf; conf.mode = I2C_MODE_MASTER; conf.sda_io_num = SDA; conf.sda_pullup_en = GPIO_PULLUP_ENABLE; conf.scl_io_num = SCL; conf.scl_pullup_en = GPIO_PULLUP_ENABLE; conf.master.clk_speed = 1000000; i2c_param_config(I2C_NUM_0, &conf); i2c_driver_install(I2C_NUM_0, conf.mode, 0, 0, 0); i2c_cmd_handle_t cmdConfig = i2c_cmd_link_create(); i2c_master_start(cmdConfig); i2c_master_write_byte(cmdConfig, (0x6b << 1) | I2C_MASTER_WRITE, 1); // on donne l'adresse du device i2c_master_write_byte(cmdConfig, 0x26, 1); // on donne l'dresse du registre (adresse de l'adc) i2c_master_write_byte(cmdConfig, 0xB0, 1); i2c_master_stop(cmdConfig); i2c_master_cmd_begin(I2C_NUM_0, cmdConfig, pdMS_TO_TICKS(1000)); i2c_cmd_link_delete(cmdConfig);
下面是我读取 VBAT 值的方式:
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_WRITE, 1); // device address i2c_master_write_byte(cmd, reg, 1); // register address i2c_master_start(cmd); i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_READ, 1); // device address i2c_master_read(cmd, data, 2, I2C_MASTER_LAST_NACK); // reading value i2c_master_stop(cmd); i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(1000)); i2c_cmd_link_delete(cmd);
到目前为止、我已经能够读取准确的电池电压值(这就是我 认为我正确设置 I2C 的原因、我假设如果我没有设置 I2C、我将永远无法获得有意义的值)
唯一的问题是我的电池现在的充电电流为0.1A、而不是1A
谢谢大家!