- Библиотека для 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 | Встроенное | Нет |
- Создать объект с именем (в данном случае BATT), указав ссылку на объект Wire (&Wire).
I2CBATTBATT (TwoWire *twi);- метод запуска линии I²C. Если эта библиотека единственная с I²C, то нужно вызвать его в блоке setup()
voidbegin(void);- Проверить соединение с АКБ. Построен на том же принципе, что и стандартный сканер устройств I²C.
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_trequestSingleRegister(void);
uint16_trequestPairRegisters(void);- отправить байт команду для получения данных в регистрах BlockData().
voidsendCommandManufactureBlock(uint8_t command);- отправить байт первого (начального) регистра. С этого байта будет начало запроса на чтение.
voidsendFirstRegister(uint8_t reg_addr);- записать слово в регистр Control().
voidwriteControlAddresses(uint8_t low_payload, uint8_t high_payload);Скачать ZIP-архив нужной версии из раздела Releases. Запустить Arduino IDE. Выбрать Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку. В появившемся окне выбрать скаченный архив. Более наглядная инструкция. Не забудьте изучить скетч из примеров.
- Для корректной передачи данных, необходимо между контактами SDA-SCL и +VBATT АКБ подключить резисторы номиналом 4.7кОм - 10кОм.
- Можно подключить резисторы к контакту +5В, но делать этого я не рекомендую, если контакт не толерантен к 5В.
- HDQ Communication Basics
- HDQ Communication Basics for TI’s Battery Monitor ICs
- Start Guide for the BQ27546-G1
- Configuring the bq2754x Data Flash
- bq27546-G1 Technical Reference Manual
- bq27546-G1 Single-Cell Li-Ion Battery Fuel Gauge for Battery Pack Integration
- bq27545-G1 Single Cell Li-Ion Battery Fuel Gauge for Battery Pack Integration
- bq27425-G2 System-Side Impedance Track™ Fuel Gauge With Integrated Sense Resistor
- bq27541 Single Cell Li-Ion Battery Fuel Gauge for Battery Pack Integration
