Skip to content

Repository files navigation

HDQBATT

Header Picture

Содержание

Описание

  • Библиотека для Arduino IDE, сделана в виде класса. Позволяет получить доступ к некоторым основным функциям (API) контроллера bq27546 от компании Texas Instruments, используя для связи интерфейс HDQ.
  • Можно использовать для подключения к другим контроллерам семейства bq2754x, например bq27541 или bq27545, но адреса регистров и их названия будут отличатся. Для доступа к ним есть вспомогательные функции.
  • Эта библиотека написана по мотивам HDQLib за авторством mozzwald. На ней я уже делал читалку АКБ iPhone.

Особенности

  • Протокол HDQ реализован программно (софтверно), использует несколько стандартных функций Arduino IDE.
pinMode();
digitalRead();
digitalWrite();
delayMicroseconds();
  • Библиотека позволяет читать информацию с АКБ от Apple iPhone 4 - 7Plus включительно. В них используется интерфейс HDQ. Начиная с iPhone 8 используется I²C. Для подключения по I²C есть библиотекаI2CBATT.
  • При использовании с микрокотроллерами, выводы которых не толерантны к 5В, необходимо использовать согласователь уровней, например TXS0108E(HW-221) или подобный, иначе есть риск спалить микроконтроллер!

Поддерживаемые платы

  • Список плат и ядер, с которыми работает библиотека. Проверен мной лично. Не забывайте про согласование уровней!
ПлатаЯдроСогласователь
STM32F103C8T6Arduino_STM32Нет
STM32F103C8T6Arduino_Core_STM32Нет
STM32F401CCU6Arduino_STM32Нет
STM32F401CCU6Arduino_Core_STM32Нет
STM32F411CEU6Arduino_STM32Нет
STM32F411CEU6Arduino_Core_STM32Нет
STM32_F4VEArduino_Core_STM32Нет
ESP8266 WeMos D1 MiniArduino ESP8266TXS0108E
ESP8266 WeMos D1 R2Arduino ESP8266TXS0108E
ESP32 Devkit V4arduino-esp32TXS0108E
Arduino NanoВстроенноеНет
Arduino UnoВстроенноеНет
Arduino Leonardo R3ВстроенноеНет
Arduino Pro MicroВстроенноеНет
Arduino Pro MiniВстроенноеНет

API

Инициализация

  • Создать объект с именем (в данном случае HDQ), указав номер вывода микроконтроллера к которому подключен контакт HDQ АКБ.
HDQBATTHDQ (uint8_t pin);

Основные методы

  • Проверить соединение с АКБ. Запрашивает два байта DEVICE_TYPE череp регистр CONTROL_STATUS. Костыль, но работает.
boolisConnected(void);
  • Запрос через регистр CONTROL_STATUS.
uint16_tgetControlStatus(void);
boolgetFlagSEPinIsActive(void);
boolgetFlagIsFullAccessSealedMode(void);
boolgetFlagIsSealedMode(void);
boolgetFlagCalibrationFunctionIsActive(void);
boolgetFlagCoulombCounterCalibrationRoutineIsActive(void);
boolgetFlagBoardCalibrationRoutineIsActive(void);
boolgetFlagQMAXUpdate(void);
boolgetFlagHDQInterruptFunctionIsActive(void);
boolgetFlagShutdownCommandIsSent(void);
boolgetFlagRequestHibernateFromSleepMode(void);
boolgetFlagIsFullSleepMode(void);
boolgetFlagIsSleepMode(void);
boolgetFlagImpedanceTrackAlgorithm(void);
boolgetFlagRaTableUpdatesDisabled(void);
boolgetFlagCellVoltagesOK(void);
boolgetFlagQmaxUpdatesEnabled(void);
  • Запрос регистра Flags().
uint16_tgetFlags(void);
boolgetFlagBatteryHighIndicating(void);
boolgetFlagBatteryLowIndicating(void);
boolgetFlagChargeInhibitindicates(void);
boolgetFlagFullChargedIsDetected(void);
boolgetFlagChargeSuspend(void);
boolgetFlagIndicatesComputedImax(void);
boolgetFlagChargingAllowed(void);
boolgetFlagStateOfChargeThreshold1(void);
boolgetFlagStateOfChargeThresholdFinal(void);
boolgetFlagDischargingDetected(void);
  • Запрос DEVICE_TYPE через регистр CONTROL_STATUS. Позволяет получить модель контроллера АКБ. Например, если контроллер bq27546, то результат будет 0x0546.
uint16_tgetDeviceType(void);
  • Запрос FW_VERSION через регистр CONTROL_STATUS. Позволяет получить версию прошивки контроллера АКБ.
floatgetFirmwareVersion(void);
  • Запрос HW_VERSION через регистр CONTROL_STATUS. Позволяет получить версию оборудования контроллера АКБ.
floatgetHardwareVersion(void);
  • Запрос регистра Temperature(). Позволяет получить температуру контроллера АКБ в градусах Кельвина, Цельсия, Фаренгейта.
floatgetTemperatureKelvin(void);
floatgetTemperatureCelsius(void);
floatgetTemperatureFahrenheit(void);
  • Запрос регистра Voltage(). Позволяет получить напряжение на банке АКБ в милливольтах и вольтах.
unsignedshortgetVoltageMilli(void);
floatgetVoltage(void);
  • Запрос регистра DesignCapacity(). Позволяет получить заводскую емкость банки в миллиамер-часах.
unsignedshortgetDesignCapacity(void);
  • Запрос регистра RemainingCapacity(). Позволяет получить оставшуюся емкость АКБ в миллиамер-часах.
unsignedshortgetRemainingCapacity(void);
  • Запрос регистра FullChargeCapacity(). Позволяет получить доступную для зарядки емкость АКБ в миллиамер-часах.
unsignedshortgetFullChargeCapacity(void);
  • Запрос регистра AverageCurrent(). Позволяет получить ток зарядки/разрядки АКБ в миллиамерах и амперах.
shortgetAverageCurrentMilli(void);
floatgetAverageCurrent(void);
  • Запрос регистра AveragePower(). Позволяет получить мощность зарядки/разрядки АКБ в милливаттах и ваттах.
shortgetAveragePowerMilli(void);
floatgetAveragePower(void);
  • Запрос регистра CycleCount(). Позволяет получить количество зарядок/разрядок АКБ.
unsignedshortgetCycleCount(void);
  • Запрос регистра StateOfCharge(). Позволяет получить уровень зарядки АКБ в процентах.
byte getStateOfCharge(void);
  • Запрос регистра TimeToEmpty(). Позволяет получить врямя до полной разрядки АКБ в минутах.
unsignedshortgetTimeToEmpty(void);
  • Запрос регистров Manufacturer Information Blocks. Позволяет получить данные о производителе АКБ. Обычно в этих блоках серийные номера.
  • В докумментации от bq27545 и bq27546, Block C не описан, но в нем есть данные. Смотрите bq27541 Single Cell Li-Ion Battery Fuel Gauge for Battery Pack Integration.
char* getManufacturerInfoBlockA(void);
char* getManufacturerInfoBlockB(void);
char* getManufacturerInfoBlockC(void);
  • Запрос регистра BlockDataChecksum(). Позволяет получить контрольную сумму регистров BlockData контроллрера.
uint8_tgetBlockDataChecksum(void);

Вспомогательные методы

  • прочитать байт из одиночного и слово из парного регистров.
uint8_treadByte(uint8_t reg);
uint16_treadWord(uint8_t low_reg, uint8_t high_reg);
  • прочитать слово из регистра Control().
uint16_treadControlAddresses(void);
  • записать байт в одиночный и слово в парный регистры.
voidwriteByte(uint8_t reg, uint8_t payload);
voidwriteWord(uint8_t low_reg, uint8_t high_reg, uint8_t low_payload, uint8_t high_payload);
  • записать слово в регистр Control().
voidwriteControlAddresses(uint8_t low_payload, uint8_t high_payload);

Настройки задержек HDQ

  • Эти значения настраиваются при необходимости. Смотрите 7.13 HDQ Communication Timing Characteristics.
boolsetTimeCYCH(uint8_t new_delay);
boolsetTimeCYCD(uint8_t new_delay);
boolsetTimeHW1(uint8_t new_delay);
boolsetTimeDW1(uint8_t new_delay);
boolsetTimeHW0(uint8_t new_delay);
boolsetTimeDW0(uint8_t new_delay);
boolsetTimeRSPS(uint16_t new_delay);
boolsetTimeB(uint16_t new_delay);
boolsetTimeBR(uint16_t new_delay);
  • Этой задержки нет в документации. Она настраивает время ожидания ответа от контроллера, после передачи ему байта.
boolsetTimeFailTries(uint16_t new_delay);

Установка

Скачать ZIP-архив нужной версии из раздела Releases. Запустить Arduino IDE. Выбрать Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку. В появившемся окне выбрать скаченный архив. Более наглядная инструкция. Не забудьте изучить скетч из примеров.

Подключение АКБ

Connecting Picture

  • Для корректной передачи данных, необходимо между контактом HDQ и +VBATT АКБ подключить резистор номиналом 4.7кОм - 10кОм.
  • Можно подключить резистор к контакту +5В, но делать этого я не рекомендую, если контакт не толерантен к 5В.

Дополнительная документация

About

Arduino библиотека для подключения BQ27546 по интерфейсу HDQ

Topics

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Contributors

Languages