Оценка уровня заряда аккумулятора¶
Калькулятор уровня заряда аккумулятора в SiFli-SDK оценивает остаточный заряд в процентах по измеренному напряжению. Это не кулонометр: точность результата зависит от заданной зарядной характеристики аккумулятора и корректности сведений о состоянии зарядного устройства.
Модуль определяет состояние зарядного устройства, выбирает соответствующую кривую заряда или разряда и вычисляет процент интерполяцией. Для стабилизации результата также применяется первичный фильтр скачков и дополнительный фильтр со взвешенным усреднением. В опубликованной документации не описан полностью внутренний порядок фильтров, поэтому перед тем, как полагаться на конкретную последовательность, проверьте реализацию в используемой ревизии SDK.
Функции калькулятора¶
| Функция | Поведение |
|---|---|
| Кривые заряда и разряда | Выбирает подходящую зависимость «напряжение — уровень заряда» с учётом текущего состояния зарядки. |
| Линейная интерполяция | Вычисляет процент заряда между соседними точками выбранной кривой. |
| Первичный фильтр | Фильтрует скачки напряжения по заданному порогу и числу последовательных отсчётов, превышающих этот порог. |
| Вторичный фильтр | При включении вычисляет взвешенное среднее предыдущего и текущего значений напряжения. |
| Определение состояния зарядки | Выбирает кривую заряда или разряда на основании конфигурации обнаружения зарядного устройства на плате. |
flowchart LR
A["Считать напряжение аккумулятора через ADC"] --> B{"Зарядное устройство подключено?"}
B -->|"Да"| C["Выбрать кривую заряда"]
B -->|"Нет"| D["Выбрать кривую разряда"]
C --> F["Интерполяция по кривой, фильтрация и правило изменения процента при заряде/разряде<br/>(внутренний порядок зависит от реализации SDK)"]
D --> F
F --> G["Сообщить уровень заряда аккумулятора в процентах"]
Диаграмма показывает общий принцип и не гарантирует внутреннюю последовательность вызовов. В опубликованной документации не указан точный порядок интерполяции, фильтрации и правила изменения процента при заряде/разряде. Проверьте реализацию в ревизии SDK, используемой в устройстве. Согласно документации, при зарядке сообщаемый процент не уменьшается, а при разрядке не увеличивается.
Сначала настройте плату¶
Перед использованием промежуточного ПО SiFli-SDK для оценки уровня заряда аккумулятора настройте плату в menuconfig:
- Включите поддержку ADC для измерения напряжения аккумулятора.
- Включите функцию расчёта уровня заряда аккумулятора.
- Включите поддержку зарядки.
- Выберите микросхему зарядного устройства, установленную на плате. Используйте вариант простого зарядного устройства только в том случае, если ни одна из перечисленных микросхем не подходит.
- Настройте вывод платы для обнаружения подключения зарядного устройства.
- Задайте полярность этого вывода в соответствии с аппаратной схемой.
Макрос BSP_CHARGER_INT_PIN_ACTIVE_HIGH задаёт полярность сигнала обнаружения зарядного устройства. Если макрос определён, высокий уровень означает, что зарядное устройство подключено; если не определён — подключению соответствует низкий уровень. Неверная полярность приводит к выбору неправильной кривой и может вызвать зависание отображаемого процента или его изменение в неверном направлении.
Используйте характеристики аккумулятора¶
Файл battery_table.c в каталоге платы приведён для примера и не является универсальной моделью характеристик аккумулятора. Запросите у производителя зависимость напряжения от уровня заряда для используемого аккумулятора и настройте соответствующие таблицы поиска для изделия.
| Таблица | Требуемое определение |
|---|---|
charging_curve_table |
Таблица const battery_lookup_point_t[] для зарядки. Значения напряжения должны располагаться по убыванию. |
discharge_curve_table |
Таблица const battery_lookup_point_t[] для разрядки. Значения напряжения должны располагаться по убыванию. |
| Содержимое таблиц | Точки должны соответствовать процентам от 100 до 0 и отражать реальные характеристики аккумулятора. |
| Расположение таблиц | Файл battery_table.c, специфичный для платы. |
Для заряда и разряда нужны отдельные кривые: при одном и том же уровне заряда напряжение аккумулятора различается в этих режимах. Не подставляйте произвольную кривую литиевого аккумулятора с напряжением 4,2 V только потому, что совпадает его номинальная химическая система.
Проверьте масштаб напряжения для SDK и платы
В опубликованной документации SiFli есть несоответствие единиц: для voltage_mv и обоих порогов фильтрации указаны mV, однако в примере 38000 передаётся как 3.8 V, а в примере кривой 41808 используется для 4.18 V. Эти числа согласуются с масштабом 0,1 mV, но документация явно его не задаёт. Поэтому это вывод из чисел, а не гарантия API. Перед использованием калькулятора проверьте тракт преобразования ADC, таблицу характеристик аккумулятора и сравнение порогов в точной ревизии SDK и конфигурации платы.
Значение ADC, выбранная таблица кривой и пороги фильтрации должны использовать совместимые масштабы. В документации для порогов приведены значения 50 и 30 с единицами mV; не пересчитывайте их только на основании примеров напряжения. Проверьте, как используемая ревизия SDK интерпретирует и сравнивает каждое поле. Не меняйте только масштаб показаний ADC, оставляя таблицу или пороги в другом масштабе.
Настройте калькулятор¶
Структура battery_calculator_config_t содержит две таблицы кривых и параметры фильтрации.
| Поле | Назначение | Значение из опубликованного примера (единица по документации) |
|---|---|---|
charging_table, charging_table_size |
Кривая заряда и количество точек | Зависит от платы |
discharging_table, discharging_table_size |
Кривая разряда и количество точек | Зависит от платы |
charge_filter_threshold |
Порог скачка напряжения при зарядке | 50 (в документации указано mV; проверьте шкалу целевой версии SDK) |
discharge_filter_threshold |
Порог скачка напряжения при разрядке | 30 (в документации указано mV; проверьте шкалу целевой версии SDK) |
filter_count |
Число последовательных отсчётов, превысивших порог и необходимых первичному фильтру для подтверждения изменения | 3 |
secondary_filter_enabled |
Включает взвешенный вторичный фильтр | true |
secondary_filter_weight_pre |
Вес предыдущего значения напряжения | 90 |
secondary_filter_weight_cur |
Вес текущего значения напряжения | 10 |
При включённом вторичном фильтре сумма secondary_filter_weight_pre + secondary_filter_weight_cur должна быть равна 100. Подбирайте пороги, количество измерений и веса с учётом характеристик реального аккумулятора, переходных процессов нагрузки и требований изделия. Справочные значения SDK не заменяют калибровку.
Инициализация и расчёт¶
Перед запросом процента заряда инициализируйте калькулятор. В опубликованной документации SiFli функция инициализации объявлена с типом возврата void; при сборке ориентируйтесь на заголовочный файл точной ревизии SDK вашего проекта.
void battery_calculator_init(battery_calculator_t *calc,
const battery_calculator_config_t *config);
API возвращает процент от 0 до 100: это уровень заряда, а не ёмкость аккумулятора в mAh. Перед интеграцией проверьте заголовочный файл и реализацию точной ревизии SDK на наличие дополнительных ограничений параметров или возвращаемого статуса инициализации.
Передавайте напряжение в масштабе, который ожидает используемая ревизия SDK. Хотя опубликованный параметр API называется voltage_mv, фактический масштаб нужно проверить, как описано выше:
| Шаг | Действие |
|---|---|
| 1 | Настройте ADC платы, тип зарядного устройства, вывод его обнаружения и полярность сигнала. |
| 2 | Задайте проверенные кривые заряда и разряда в battery_table.c. |
| 3 | Инициализируйте battery_calculator_t с помощью battery_calculator_config_t. |
| 4 | Считайте напряжение аккумулятора через настроенный тракт ADC. |
| 5 | Проверьте единый масштаб напряжения, таблиц и порогов, затем передайте напряжение функции battery_calculator_get_percent(). |
| 6 | Используйте отфильтрованный результат в интерфейсе пользователя, логике предупреждения о низком заряде и телеметрии изделия. |
Проверьте работу на устройстве¶
Отображаемый процент должен соответствовать фактическому состоянию устройства, а не просто выглядеть правдоподобно в лабораторных условиях. Во время зарядки и разрядки, а также при подключении и отключении кабеля совместно проверяйте состояние сигнала обнаружения зарядного устройства, измеренное напряжение, выбранную кривую и отображаемый процент.
| Симптом | Что проверить в первую очередь |
|---|---|
| Процент меняется слишком резко | Сначала убедитесь, что показание ADC, таблицы кривых и пороги используют один масштаб. Затем настройте соответствующий порог или filter_count; при необходимости включите или усильте вторичный фильтр. |
| Процент отображается неточно | Получите кривую для используемого аккумулятора и повторно откалибруйте точки таблицы. |
| Процент не меняется | Проверьте состояние зарядного устройства, передаваемое программе, и полярность BSP_CHARGER_INT_PIN_ACTIVE_HIGH. Согласно опубликованной документации, во время зарядки процент не уменьшается, а во время разрядки не увеличивается. |
| Процент меняется в неверном направлении | Проверьте вывод обнаружения зарядного устройства, его электрическую полярность и выбранную кривую заряда или разряда. |
Официальную документацию по промежуточному ПО SiFli-SDK для оценки уровня заряда аккумулятора и актуальные снимки экрана с настройками см. в разделе Расчёт ёмкости аккумулятора в SiFli-SDK. Для оценки времени автономной работы всей системы перейдите к статье Профилирование энергопотребления умных часов; методику проверки измерениями см. в разделе Измерение и проверка энергопотребления.
Опубликованная документация служит отправной точкой, но не заменяет проверку ревизии SDK, используемой в продукте. Чтобы устранить несоответствие масштаба, проверьте в этой ревизии тракт ADC, таблицу характеристик аккумулятора, сравнение порогов и заголовок API.
Последнее обновление: