/I2CBATT

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

Primary LanguageC++MIT LicenseMIT

I2CBATT

Содержание

Описание

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

Особенности

  • Конструктор класса принимает ссылку на объект Wire. Это позволяет работать с другими библиотеками и устройствами на одной шине I²C. Частота шины должна быть 400 кГц.
  • Библиотека позволяет читать информацию с АКБ от Apple iPhone 8 - 12 включительно. В них используется интерфейс I²C. В более ранних используется HDQ.
  • При использовании с микрокотроллерами, выводы которых не толерантны к 5В, необходимо использовать согласователь уровней, например TXS0108E(HW-221) или подобный, иначе есть риск спалить микроконтроллер!

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

  • Список плат и ядер, с которыми работает библиотека. Проверен мной лично. Не забывайте про согласование уровней!
Плата Ядро Согласователь
STM32F103C8T6 Arduino_STM32 Нет
STM32F103C8T6 Arduino_Core_STM32 Нет
STM32F401CCU6 Arduino_STM32 Нет
STM32F401CCU6 Arduino_Core_STM32 Нет
STM32F411CEU6 Arduino_STM32 Нет
STM32F411CEU6 Arduino_Core_STM32 Нет
STM32_F4VE Arduino_Core_STM32 Нет
ESP8266 WeMos D1 Mini Arduino ESP8266 TXS0108E
ESP8266 WeMos D1 R2 Arduino ESP8266 TXS0108E
ESP32 Devkit V4 arduino-esp32 TXS0108E
Arduino Nano Встроенное Нет
Arduino Uno Встроенное Нет
Arduino Leonardo R3 Встроенное Нет
Arduino Pro Micro Встроенное Нет
Arduino Pro Mini Встроенное Нет

API

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

  • Создать объект с именем (в данном случае BATT), указав ссылку на объект Wire (&Wire).
I2CBATT BATT (TwoWire *twi);
  • метод запуска линии I²C. Если эта библиотека единственная с I²C, то нужно вызвать его в блоке setup()
void begin(void);

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

bool isConnected(void);
  • Запрос через регистр CONTROL_STATUS.
uint16_t getControlStatus(void);
bool getFlagSEPinIsActive(void);
bool getFlagIsFullAccessSealedMode(void);
bool getFlagIsSealedMode(void);
bool getFlagCalibrationFunctionIsActive(void);
bool getFlagCoulombCounterCalibrationRoutineIsActive(void);
bool getFlagBoardCalibrationRoutineIsActive(void);
bool getFlagQMAXUpdate(void);
bool getFlagHDQInterruptFunctionIsActive(void);
bool getFlagShutdownCommandIsSent(void);
bool getFlagRequestHibernateFromSleepMode(void);
bool getFlagIsFullSleepMode(void);
bool getFlagIsSleepMode(void);
bool getFlagImpedanceTrackAlgorithm(void);
bool getFlagRaTableUpdatesDisabled(void);
bool getFlagCellVoltagesOK(void);
bool getFlagQmaxUpdatesEnabled(void);
  • Запрос регистра Flags().
uint16_t getFlags(void);
bool getFlagBatteryHighIndicating(void);
bool getFlagBatteryLowIndicating(void);
bool getFlagChargeInhibitindicates(void);
bool getFlagFullChargedIsDetected(void);
bool getFlagChargeSuspend(void);
bool getFlagIndicatesComputedImax(void);
bool getFlagChargingAllowed(void);
bool getFlagStateOfChargeThreshold1(void);
bool getFlagStateOfChargeThresholdFinal(void);
bool getFlagDischargingDetected(void);
  • Запрос DEVICE_TYPE через регистр CONTROL_STATUS. Позволяет получить модель контроллера АКБ. Например, если контроллер bq27546, то результат будет 0x0546.
uint16_t getDeviceType(void);
  • Запрос FW_VERSION через регистр CONTROL_STATUS. Позволяет получить версию прошивки контроллера АКБ.
float getFirmwareVersion(void);
  • Запрос HW_VERSION через регистр CONTROL_STATUS. Позволяет получить версию оборудования контроллера АКБ.
float getHardwareVersion(void);
  • Запрос регистра Temperature(). Позволяет получить температуру контроллера АКБ в градусах Кельвина, Цельсия, Фаренгейта.
float getTemperatureKelvin(void);
float getTemperatureCelsius(void);
float getTemperatureFahrenheit(void);
  • Запрос регистра Voltage(). Позволяет получить напряжение на банке АКБ в милливольтах и вольтах.
unsigned short getVoltageMilli(void);
float getVoltage(void);
  • Запрос регистра DesignCapacity(). Позволяет получить заводскую емкость банки в миллиамер-часах.
unsigned short getDesignCapacity(void);
  • Запрос регистра RemainingCapacity(). Позволяет получить оставшуюся емкость АКБ в миллиамер-часах.
unsigned short getRemainingCapacity(void);
  • Запрос регистра FullChargeCapacity(). Позволяет получить доступную для зарядки емкость АКБ в миллиамер-часах.
unsigned short getFullChargeCapacity(void);
  • Запрос регистра AverageCurrent(). Позволяет получить ток зарядки/разрядки АКБ в миллиамерах и амперах.
short getAverageCurrentMilli(void);
float getAverageCurrent(void);
  • Запрос регистра AveragePower(). Позволяет получить мощность зарядки/разрядки АКБ в милливаттах и ваттах.
short getAveragePowerMilli(void);
float getAveragePower(void);
  • Запрос регистра CycleCount(). Позволяет получить количество зарядок/разрядок АКБ.
unsigned short getCycleCount(void);
  • Запрос регистра StateOfCharge(). Позволяет получить уровень зарядки АКБ в процентах.
byte getStateOfCharge(void);
  • Запрос регистра TimeToEmpty(). Позволяет получить врямя до полной разрядки АКБ в минутах.
unsigned short getTimeToEmpty(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_t getBlockDataChecksum(void);

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

  • прочитать байт из одиночного и слово из парного регистров.
uint8_t requestSingleRegister(void);
uint16_t requestPairRegisters(void);
  • отправить байт команду для получения данных в регистрах BlockData().
void sendCommandManufactureBlock(uint8_t command);
  • отправить байт первого (начального) регистра. С этого байта будет начало запроса на чтение.
void sendFirstRegister(uint8_t reg_addr);
  • записать слово в регистр Control().
void writeControlAddresses(uint8_t low_payload, uint8_t high_payload);

Установка

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

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

Connecting Picture

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

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