Аналого-цифровой преобразователь: напряжение и ток аккумуляторной батареи … ↩
mod. Четверг, 15 октября 2026 22:55 . См. 2
BeeFC · Урок S9 из 33 · Уровень «Старт»
Как микроконтроллер измеряет напряжение аккумуляторной батареи через делитель, как определить число элементов и состояние разряда, почему напряжение снижается под нагрузкой и как сгладить измерения цифровым фильтром первого порядка.
Фильтр первого порядка, написанный в этом уроке, ещё не раз понадобится в BeeFC: та же функция в уроке P3 будет фильтровать показания гироскопа.
Содержание
1. Цели урока
Продолжительность урока — четыре часа: 1,5 часа теории и 2,5 часа практики. После урока слушатель:
- настраивает аналого-цифровой преобразователь и выбирает время выборки;
- пересчитывает код преобразователя в напряжение батареи и калибрует делитель по мультиметру;
- определяет число элементов батареи и знает ограничения такого определения;
- реализует фильтр первого порядка и проверяет его переходную характеристику тестом;
- реализует предупреждение о разряде с гистерезисом.
2. Термины и сокращения
| Термин | Определение |
|---|---|
| аналого-цифровой преобразователь (АЦП) | блок, преобразующий напряжение на входе в число |
| разрядность АЦП | число битов результата; у STM32F405 — 12 бит, коды 0–4095 |
| опорное напряжение | напряжение, которому соответствует наибольший код АЦП |
| делитель напряжения | два резистора, уменьшающие напряжение батареи до допустимого для входа АЦП |
| время выборки | время, за которое внутренний конденсатор АЦП заряжается до напряжения входа |
| фильтр нижних частот первого порядка (PT1) | фильтр, который пропускает медленные изменения сигнала и ослабляет быстрые |
| частота среза | частота, на которой фильтр ослабляет сигнал примерно до 70,7 % |
| гистерезис | разница между порогом перехода в состояние и порогом выхода из него |
3. Аналого-цифровой преобразователь
В STM32F405 три 12-битных АЦП. Каналы 10–15 подключены к выводам PC0–PC5, поэтому на полётных контроллерах делитель напряжения батареи почти всегда подключён к одному из этих выводов. На плате Diatone Mamba F405 это вывод PC1, канал 11.
\( U_{вх} = \frac{N}{4095} \cdot U_{оп} \)
Опорное напряжение на полётных контроллерах равно напряжению питания аналоговой части, то есть 3,3 В. Один код соответствует примерно 0,8 мВ на входе АЦП.
Время выборки
Во время выборки внутренний конденсатор АЦП заряжается через сопротивление источника. Делитель напряжения батареи имеет сопротивление порядка килоом, и при коротком времени выборки конденсатор не успевает зарядиться: показания получаются заниженными. Для делителя выбирается наибольшее время выборки — 480 тактов. При частоте АЦП 21 МГц выборка вместе с преобразованием занимает около 23 мкс, что несущественно для задачи, которая выполняется 50 раз в секунду.
Файл hal/stm32f4/adc_stm32.c
4. Делитель напряжения
Напряжение полностью заряженной батареи из шести элементов — 25,2 В, а на вход АЦП можно подавать не больше 3,3 В. Делитель из резисторов 10 кОм и 1 кОм уменьшает напряжение в одиннадцать раз: 25,2 В превращаются в 2,29 В. В Betaflight коэффициент делителя по умолчанию задан параметром vbat_scale со значением 110, что соответствует такому делителю.
Файл core/battery.h
Файл core/battery.c
Точность резисторов делителя обычно составляет 1 %, поэтому коэффициент калибруется: напряжение батареи измеряется мультиметром и сравнивается с показанием BeeFC. Новое значение коэффициента равно старому, умноженному на отношение показания мультиметра к показанию BeeFC.

Определение числа элементов
Напряжение заряженного литий-полимерного элемента не превышает 4,35 В. Число элементов оценивается делением напряжения батареи на 4,35 В с округлением вверх. Для заряженной батареи из четырёх элементов 16,8 В дают ровно четыре элемента.
force_battery_cell_count.5. Датчик тока
Датчик тока на полётном контроллере или регуляторе состоит из резистора малого сопротивления и усилителя. Напряжение на выходе усилителя пропорционально току: \( I = (U - U_0) \cdot k \), где \( k \) — коэффициент в амперах на вольт, \( U_0 \) — напряжение при нулевом токе. Израсходованная ёмкость получается суммированием тока по времени.
\( Q_{мА·ч} = \sum I_{мА} \cdot \frac{\Delta t_{с}}{3600} \)
| Прошивка | Коэффициент напряжения | Коэффициент тока |
|---|---|---|
| Betaflight | vbat_scale | ibata_scale, ibata_offset |
| ArduPilot | BATT_VOLT_MULT | BATT_AMP_PERVLT, BATT_AMP_OFFSET |
| PX4 | BAT1_V_DIV | BAT1_A_PER_V |
6. Фильтр первого порядка
Показания АЦП содержат шум от регуляторов и двигателей. Фильтр первого порядка на каждом шаге приближает выход к входу на долю \( k \).
\( y_n = y_{n-1} + k\,(x_n - y_{n-1}), \qquad k = \frac{\omega\,\Delta t}{\omega\,\Delta t + 1}, \qquad \omega = 2\pi f_c \)
Здесь \( \Delta t \) — период вызова фильтра, \( f_c \) — частота среза. Постоянная времени фильтра \( \tau = 1/(2\pi f_c) \): за это время выход проходит 63,2 % пути к новому значению входа. Для частоты среза 10 Гц постоянная времени составляет около 15,9 мс.
Файл core/pt1.h
Файл core/pt1.c
Файл tests/unit/test_level1.c
7. Падение напряжения под нагрузкой
У батареи есть внутреннее сопротивление, и под нагрузкой её напряжение падает: \( U = E - I \cdot R \). Например, при внутреннем сопротивлении батареи 0,08 Ом и токе 30 А напряжение снижается на 2,4 В. Эти числа — учебный ориентир, а не данные конкретной батареи. После снятия нагрузки напряжение восстанавливается.
Если сравнивать с порогом мгновенное напряжение, предупреждение будет срабатывать при каждом резком увеличении газа. Поэтому решение о разряде принимается по отфильтрованному напряжению и с гистерезисом: состояние «предупреждение» сменяется на «норму», только когда напряжение элемента превысит порог на величину гистерезиса.
| Состояние | Переход вниз | Переход вверх |
|---|---|---|
| норма | напряжение элемента не выше 3,50 В | — |
| предупреждение | напряжение элемента не выше 3,30 В | напряжение элемента не ниже 3,60 В |
| критический разряд | — | напряжение элемента не ниже 3,40 В |
Пороги совпадают со значениями по умолчанию параметров vbat_warning_cell_voltage и vbat_min_cell_voltage в Betaflight, гистерезис BeeFC — 0,1 В на элемент.
8. Практика
Задание S9.1. Напряжение и состояние батареи
Продолжительность — 40 минут, выполняется на компьютере.
Реализовать функции adc_to_mv, battery_detect_cells и battery_update.
Критерий автоматической проверки: тест test_battery пройден; скрытые тесты проверяют пересчёт без переполнения при наибольшем коде и коэффициенте, батареи из одного–шести элементов и многократное колебание напряжения около порога.
Задание S9.2. Фильтр первого порядка
Продолжительность — 30 минут, выполняется на компьютере.
Реализовать модуль core/pt1.
Критерий автоматической проверки: тест test_pt1_reaches_63_percent_after_time_constant пройден; скрытый тест проверяет ослабление синусоиды на частоте среза до 0,707 ± 0,03.
Задание S9.3. Измерение на плате и калибровка
Продолжительность — 50 минут, требуется мультиметр.
Добавить задачу батареи с частотой 50 Гц и вывод напряжения в команду консоли status. Откалибровать коэффициент делителя по мультиметру при трёх разных напряжениях лабораторного источника. Слушатели с пакетом Proteus могут дополнительно проверить модуль на модели STM32F401 с потенциометром вместо батареи.
Критерий: после калибровки расхождение с мультиметром не больше 1 % во всех трёх точках; таблица измерений приложена к отчёту docs/s9_report.md.
Задание S9.4. Ток и израсходованная ёмкость
Продолжительность — 30 минут, выполняется на компьютере.
Реализовать модуль core/current_meter, который по коду АЦП, коэффициенту и смещению вычисляет ток и суммирует израсходованную ёмкость в миллиампер-часах.
Критерий автоматической проверки: скрытый тест: постоянный ток 10 А в течение 360 секунд модельного времени даёт 1000 ± 1 мА·ч.
9. Как это сделано в больших прошивках
| Прошивка | Версия | Файл в исходном коде |
|---|---|---|
| Betaflight | 2026.6.2 | src/main/drivers/adc.c, src/platform/STM32/adc_stm32f4xx.c, src/main/sensors/battery.c |
| INAV | 9.1.0 | src/main/drivers/adc.c, src/main/sensors/battery.c |
| ArduPilot | Copter-4.7.2 | libraries/AP_HAL_ChibiOS/AnalogIn.cpp, libraries/AP_BattMonitor/AP_BattMonitor_Analog.cpp |
| PX4 | v1.17.0 | src/modules/battery_status/analog_battery.cpp |
- В Betaflight АЦП работает непрерывно и через DMA записывает результаты всех каналов в массив: файл
adc_stm32f4xx.c. Модульvoltage.cфильтрует напряжение фильтрами первого порядкаdisplayFilterиsagFilter, второй из них служит для компенсации падения напряжения. - Модуль
battery.cBetaflight определяет число элементов как целую часть от деления напряжения наvbat_max_cell_voltageплюс единица, если число элементов не задано параметромforce_battery_cell_count. Порог «батарея не подключена» задан параметромvbat_detect_cell_voltage. - В INAV модуль
battery.cидёт дальше: он оценивает внутреннее сопротивление батареи (функцияgetPowerSupplyImpedance), оставшуюся ёмкость (getBatteryRemainingCapacity) и средний расход энергии на метр пути (calculateAverageEfficiency). Эти оценки нужны для решения о возврате самолёта или мультиротора. - В ArduPilot класс
AP_BattMonitor_Analogчитает напряжение и ток черезAnalogIn.cpp; коэффициенты задаются параметрамиBATT_VOLT_MULTиBATT_AMP_PERVLT. - В PX4 модуль
analog_battery.cppиспользует параметрыBAT1_V_DIVиBAT1_A_PER_V; номер батареи в имени параметра позволяет подключить несколько батарей.
10. Проверьте себя
- Почему для входа делителя напряжения выбирается наибольшее время выборки АЦП?
- Какое напряжение попадёт на вход АЦП от заряженной батареи из шести элементов через делитель 1:11?
- Почему автоматическое определение числа элементов ошибается на разряженной батарее?
- Чему равна постоянная времени фильтра первого порядка с частотой среза 10 Гц и что она означает?
- Зачем предупреждению о разряде гистерезис?
11. Чек-лист самопроверки
12. Источники
- Справочное руководство RM0090, раздел 13, АЦП.
- Указания по применению AN2834: точность АЦП в микроконтроллерах STM32.
- Модуль батареи Betaflight.
- Документация ArduPilot.
- Документация PX4.
13. Что дальше
- Следующий урок: S10. Итоговая работа уровня «Старт»: тяговый стенд, версия 1.
- Полный перечень уроков приведён в статье «Курс BeeFC: содержание уровня „Старт“».
Проверено: 13.10.2026
↑ К оглавлению- мод. : Четверг, 15 октября 2026