Thread 中讨论的其他器件: BQSTUDIO
工具与软件:
尊敬的德州仪器(TI)工程团队:
我们正在开发一种新产品、并已将 BQ25622e 集成到我们的设计中。 不过、当我们读取指示充电电压和电流的寄存器值时、我们会注意到读数未经校准。
请告知是否需要对这些值进行任何调整、或者我们是否应该按照不同的程序来获得准确的读数。
感谢您的支持。
此致、
Fabiano Fruett
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.
工具与软件:
尊敬的德州仪器(TI)工程团队:
我们正在开发一种新产品、并已将 BQ25622e 集成到我们的设计中。 不过、当我们读取指示充电电压和电流的寄存器值时、我们会注意到读数未经校准。
请告知是否需要对这些值进行任何调整、或者我们是否应该按照不同的程序来获得准确的读数。
感谢您的支持。
此致、
Fabiano Fruett
尊敬的 Fabiano:
感谢您通过 E2E 联系我们。 请查看我的以下评论。
BQ25622E 器件的电池监控 ADC 作为常规充电器之外的另一项功能提供、仅供参考、没有精度规格。 如果需要高精度的 ADC 测量、建议使用测量仪表器件。
鉴于上述声明、没有用于校准 BQ25622E ADC 的过程。 尽管在一般情况下、充电电压和电流的 ADC 输出不应具有明显的误差。 与实际充电电流和 BAT 引脚电压相比、器件输出的充电电压和电流值是多少?
此致、
Garrett
大家好、Garrett:
感谢您之前的澄清。 根据我们使用 BQ25622E 的观察结果、我们在读取 VBUS 和 IBAT 寄存器时仍然遇到一些问题、这些寄存器不返回任何值。
以下是基于我们测试的一些详细信息:
寄存器和小端字节序格式:
当前代码设置:
初始化和配置:
要求澄清:
非常感谢您的帮助、我们期待您为解决此问题提供任何指导。
此致、
Fabiano Fruett
以下是我们在此应用程序中使用的 Micropython 中的代码:
从机器导入 I2C、Pin、SoftI2C、Timer
从 ssd1306导入 SSD1306_I2C
导入比特实验室
睡眠
# BitDogLab 初始化
bitdoglab.init ()
#全局变量来计算秒数
TIMER_COUNT = 0
#按钮配置
button_A =引脚(5、引脚 IN、引脚。 上拉)
button_b =引脚(6、引脚 IN、引脚。 上拉)
#配置 I2C 以便与 BQ25622E 进行通信
I2C = I2C (0、SCL=Pin (1)、sda=Pin (0)、freq=100000)
endereco_bq25622e = 0x6B # BQ25622E 的 I2C 地址
# OLED 配置
i2c1 = SoftI2C (SCL=引脚(15)、SDA=引脚(14))
OLED = SSD1306_I2C (128、64、i2c1)
#函数从寄存器读取
Def ler_registrador (endereco、registrador、NBytes):
返回 i2c.readfrom_mem(endereco, registrador, NBytes)
#用于读取电池电压(VBAT_ADC)的函数
DEF LER_VBAT ():
#校准常数
calibration_factor =((3.96 /(4095 * 1.99 / 1000))/2)#根据最大 ADC 读数和测量电压进行调整
registrador_VBAT = 0x1E VBAT_ADC 寄存器的地址
Dados_vbat = ler_registrador (endereco_bq25622e、registrador_vbat、2)
#转换为小端字节序并调整位
VBAT =(DADOS_VBAT[1]<< 8 | DADOS_VBAT[0])>> 4 #转换为12位、丢弃4个保留位
tensao_bateria = VBAT * calibration_factor #转换为伏特并应用校准因数
print ("VBAT 数据(字节0):"、DADOS_VBAT[0])
print ("VBAT 数据(字节1):"、DADOS_VBAT[1])
打印("调整后的 VBAT 值:"、VBAT)
返回 tensao_bateria
#函数、用于读取总线电压(VBUS_ADC)
Def ler_vBus ():
registrador_VBUS = 0x2C # VBUS_ADC 寄存器的地址
Dados_vBus = ler_registrador (endereco_bq25622e、registrador_vBus、2)
#转换为小端字节序并调整位
VBUS =(DADOS_VBUS[1]<< 8 | DADOS_VBUS[0])>> 4 #转换为12位、丢弃4个保留位
tensao_barramento = VBUS * 3.97/1000 #转换为伏特(LSB = 3.97mV)
打印("调整后的 VBUS 值:"、VBUS)
返回 tensao_barramento
#函数读取电池电流(IBAT_ADC)
Def ler_ibat ():
registrador_ibat = 0x2A # IBAT_ADC 寄存器的地址
dados_ibat = ler_registrador (endereco_bq25622e、registrador_ibat、2)
#转换为小端字节序并调整位
ibat =(Dados_ibat[1]<< 8 | Dados_ibat[0])#转换为16位
Corrente_bateria = ibat * 4 / 1000 #转换为安培(LSB = 4 mA)
返回 corrente_bateria
# Main 函数显示 OLED 上的读数
默认 exibir_leituras():
tensao_bateria = ler_vbat ()
tensao_barramento = ler_vBus ()
corrente_bateria = ler_ibat ()
#更新 OLED 显示屏
OLED.Fill (0)#清除显示
olid.text ("BitDogLab"、0、0)
olid.text ("Unicamp 4.0"、0、10)
olid.text (f"Vbus:{tensao_barramento:.2f}V"、0、20)
olid.text (f"Vbat:{tensao_bateria:.2f}V"、0、30)
olid.text (f"Ibat:{corrente_bateria:.2f}A"、0、40)
OLED.show()
睡眠(1)
#在控制台中显示值
打印("总线电压 VBUS:{:.2f}V".format (tensao_barramento))
print ("电池电压 VBAT:{:.2f}V".format (tensao_bateria))
Print ("电池电流 IBAT:{:.2f}a".format (corrente_bateria))
#处理中断的功能
DEF interrupt_handler (timer):
全局 TIMER_COUNT
#检查是否两个按钮都被按下
如果 button_a.value ()=0且 button_b.value ()== 0:
TIMER_COUNT += 1
否则:
Timer_count = 0 #如果任何按钮被释放、重置计数
#如果两个按钮都被按下3秒钟或更长时间
如果 TIMER_COUNT >= 3:
#关闭电池充电器
i2c.writeto_mem (endereco_bq25622e、0x18、字节([0x00]))
打印("电池充电器已关闭")
#初始化类用于配置系统
类初始化:
DEF __ init__(self):
#将电流限制设置为480mA : 6 << 6 80mA 位移6位)
i2c.writeto_mem (endereco_bq25622e、0x02、字节([0x01、0x80])
#设置一个计时器周期性中断每1秒
SOFT_TIMER =计时器(周期=1000、模式=计时器。 定期、回调=中断_处理程序)
#初始化系统
init_system = Init()
#运行 main 函数
exibir_leituras()
尊敬的 Fabiano:
感谢您的答复。 请查看我的以下评论。
1)和2)从 ADC 输出寄存器中读取数据的方式应在 REG0x30、REG0x2C、REG0x2A 等器件之间相同 请注意、VBUS、IBAT 和 VBAT 寄存器之间的保留位数不一致。 这可能与您观察到的 VBUS 和 IBAT 值不符合预期有关。
您能否帮助共享 VBUS 输出(REG0x2C)和 IBAT 输出(REG0x2A)的原始16位二进制值、以及与 VBUS 和 IBAT 进行比较的硬件测量值?
此外、如果您还没有使用、我想在 BQSTUDIO 中分享一个 GUI 工具、该工具在软件开发过程中非常有用(可以从 TI.com 下载、链接为: https://www.ti.com/tool/BQSTUDIO)。 GUI 会对所有 ADC 输出执行转换、因此您可以用它来检查您的代码实现是否匹配。 例如、下图以二进制和电压值形式显示了 VBUS_ADC 输出。
3) 3)我可以确认16位 REG0x02的十六进制值0x180 (即 REG03 = 0x01且 REG02 = 0x80)正确、从而设置 ICHG = 480mA。 请注意、ICHG 会设置快速充电电流值、但 REG0x06中设置的 IINDPM 是用于设置降压转换器输入电流限制的合适值。
尽管如此、我们仍不确定这些特定寄存器是否需要任何其他配置。
BQ25622E 能够使用默认寄存器配置运行电池并为电池充电。 因此、通常不需要额外的配置。 与正确充电特定电池或系统级要求相关的规格可能需要进行额外的寄存器配置。
4)要从 VBUS 和 IBAT 寄存器获取有效读数、只需设置 ADC_EN = 1 (REG0x26[7]= 1)即可启用 ADC。 您还需要确保未在 REG0x27中禁用这些通道(默认情况下启用所有 ADC 通道)。 如果试图读得太快、您最初可能看不到有效的读数。 我建议在启用 ADC 和尝试读取之间实现至少50毫秒的延迟、以确保已完成 ADC 转换。
此致、
Garrett