RPM-фильтр в Betaflight: как включить и проверить по логу
RPM-фильтр — самый точный фильтр в Betaflight. Полётник получает обороты каждого мотора и вырезает шум ровно на их частотах. Ниже: что ему нужно, как его включить, что значат его параметры и как проверить по настоящему логу, что он действительно работает.
Что делает RPM-фильтр и чем он лучше ФНЧ
Мотор с пропом трясёт раму на частоте вращения (1×) и на её кратных: 2×, 3×. Частота лопастей — это 2× у двухлопастного пропа и 3× у трёхлопастного. Все эти частоты растут с газом, поэтому на тепловой карте шума «газ — частота» они выглядят как диагональные линии.
Без оборотов Betaflight режет такой шум двумя способами. ФНЧ режет всё выше частоты среза, но на низких частотах даёт много задержки, а глубоко подавить линию на 200 Гц ему не по силам. Динамический notch ищет пики в спектре гироскопа, отстаёт от изменений газа и ставит лишь несколько вырезов: по умолчанию 3, максимум 5. RPM-фильтр берёт обороты из bidirectional DShot в каждом цикле и ставит узкий notch на каждую гармонику каждого мотора: 4 мотора × 3 гармоники = 12 вырезов, которые идут за оборотами почти без запаздывания.

Задержку RPM-фильтр тоже даёт, и это стоит понимать. Notch с добротностью Q на частоте f сдвигает медленные движения квадрика примерно на 1/(2π·Q·f). Мы посчитали это для PID-цикла 4 кГц: 12 вырезов с Q = 5 при оборотах моторов 200 Гц (1×) дают около 1.15 мс. Это почти как один PT1 на 150 Гц (1.06 мс). Но PT1 на 150 Гц ослабит линию на 200 Гц всего на 4–5 дБ, а notch давит её на десятки децибел. Поэтому RPM-фильтр выгоден: за ту же задержку он убирает почти весь моторный шум, и ФНЧ можно держать мягче. Из той же формулы видно, что дороже всего обходятся вырезы на низких частотах, то есть на малых оборотах. На 100 Гц те же 12 вырезов дают уже 2.3 мс. Отсюда параметры min_hz и fade, о них ниже.
Что нужно для RPM-фильтра
- Betaflight 4.1 или новее. В 4.1 появились bidirectional DShot и сам фильтр.
- Протокол DShot (DSHOT150/300/600). С PWM, OneShot, Multishot и ProShot ESC обороты назад не присылают.
- Прошивка ESC с bidirectional DShot. Bluejay (или JESC) на железе BLHeli_S, BLHeli_32 32.7 и новее, AM32. Обычный BLHeli_S этого не умеет. Bluejay ставится через web-конфигуратор esc-configurator.com.
- Правильное число полюсов motor_poles — это число магнитов в колоколе. Из оборотов электрического поля (eRPM) механические обороты получаются делением на motor_poles/2.
| ESC | Bidirectional DShot | Что сделать |
|---|---|---|
| BLHeli_S (стоковый) | нет | прошить Bluejay (или JESC) |
| Bluejay, JESC | да | ничего, включить на полётнике |
| BLHeli_32 старше 32.7 | нет | обновить до 32.7+ |
| BLHeli_32 32.7+, AM32 | да | ничего, включить на полётнике |
Включаем по шагам
- Сними пропы. Сохрани текущий конфиг через
diff all. - Узнай прошивку ESC: BLHeli_S, Bluejay и AM32 показывает esc-configurator.com, BLHeli_32 — BLHeliSuite32. Если там стоковый BLHeli_S, прошей Bluejay.
- Посчитай магниты в колоколе одного мотора.
- Введи в CLI (протокол и число полюсов подставь свои):
set motor_pwm_protocol = DSHOT300 set dshot_bidir = ON set motor_poles = 14 save
- После перезагрузки открой вкладку Motors. Под каждым мотором должны появиться обороты и процент ошибок телеметрии. Покрути моторы ползунком: обороты должны расти плавно, а ошибки — держаться у нуля. То же видно в CLI командой
dshot_telemetry_info: там обороты и доля битых пакетов по каждому мотору. Если RPM-фильтр включён, а хоть один ESC не присылает обороты, Betaflight не даст заармиться и покажет в OSD флаг RPMFILTER. - Проверь, что сам фильтр включён. По умолчанию он включён (3 гармоники), но в чужих конфигах встречается 0.
- На Betaflight 4.5 и новее проверь, что запись оборотов в blackbox не выключена (по умолчанию она включена), иначе фильтр не проверить по логу:
set blackbox_disable_rpm = OFF save
Поле eRPM в логе есть только с 4.5: в коде blackbox 4.4 его ещё нет. В нашем наборе лог 4.4.1 с включённым bidirectional DShot оборотов не содержит, а все логи 4.5.x — содержат: eRPM[0]…eRPM[3]. И наоборот: в логе 2025.12.5 RPM-фильтр был включён, но запись оборотов была выключена в настройках blackbox. По такому логу проверить фильтр нельзя.
Параметры с реальными значениями
В Betaflight 4.3 параметры переименовали, в 4.5 добавили веса гармоник. В таблице — значения по умолчанию и то, что стояло в реальных логах.
| 4.3 и новее | 4.1–4.2 | По умолчанию | Что делает | В логах |
|---|---|---|---|---|
rpm_filter_harmonics | gyro_rpm_notch_harmonics | 3 | сколько гармоник резать; 0 выключает фильтр | 3 везде |
rpm_filter_q | gyro_rpm_notch_q | 500 (Q = 5) | ширина выреза: больше — уже и меньше задержки | 500; 700 (2025.12.5); 850 (VX3.5, 4.5.2) |
rpm_filter_min_hz | gyro_rpm_notch_min | 100 | нижняя граница частоты выреза | 100; 70 (7-дюймовик, 4.6.0) |
rpm_filter_fade_range_hz | — | 50 | полоса над min_hz, в которой вырез плавно гаснет | 50; 70; 80 |
rpm_filter_weights (4.5+) | — | 100,100,100 | глубина выреза по гармоникам, % | 100,60,100 (4.6.0); 90,50,90 (2025.12.5) |
rpm_filter_lpf_hz | rpm_notch_lpf | 150 | сглаживание самих оборотов перед расчётом вырезов | 150 везде |
rpm_filter_q. Узкий вырез даёт меньше задержки, но требует точных оборотов. Мы посчитали notch на 200 Гц. При Q = 5 он ослабляет частоту, которая на 10 Гц в стороне, почти на 7 дБ, а при Q = 8.5 — уже только на 3.6 дБ. Зато 12 вырезов с Q = 8.5 дают около 0.7 мс задержки вместо 1.15. Вики Betaflight не советует ставить q выше 750. На VX3.5 стоит 850, и при чистой телеметрии (меньше 0.02 скачка в секунду) это работает, но это уже на твой страх и риск. Поднимать q при ошибках eRPM — плохая идея.
rpm_filter_min_hz и fade. Ниже min_hz вырез не опускается, а начиная с min_hz + fade его глубина плавно падает до нуля. Это касается в основном 1× медленных моторов на сбросе газа и в пропвоше, а на совсем малых оборотах — и 2×. На 7-дюймовике 4.6.0 (min 70, fade 50) самый медленный мотор был ниже 120 Гц, то есть в зоне fade, четверть полёта (24%), ниже 70 Гц — 4.4%. На газе ниже 5% медиана оборотов там 58 Гц. Пятидюймовики крутятся быстрее, им значения по умолчанию подходят. Опускать min_hz имеет смысл только на больших пропах и только если шум на 1× на малом газе виден в логе: каждый вырез на низкой частоте дорого стоит по задержке.
rpm_filter_weights (с 4.5). Снижает глубину выреза отдельной гармоники. Вес 100 — полный вырез, 50 — половина. На том же 7-дюймовике стоит 100,60,100, и лог это оправдывает: 2× несла лишь 4–6% сырого шума выше 80 Гц, а 3× — 68% по roll. Веса меняй только по своему логу, где видно, какая гармоника пустая. Пропы с другим числом лопастей переставят энергию между 2× и 3×.
Значения по умолчанию для 4.3 и новее, если хочешь вернуть всё как было:
set rpm_filter_harmonics = 3 set rpm_filter_q = 500 set rpm_filter_min_hz = 100 set rpm_filter_fade_range_hz = 50 set rpm_filter_lpf_hz = 150 set rpm_filter_weights = 100,100,100 save
Строку rpm_filter_weights на 4.3–4.4 пропусти: такого параметра там нет.
Что поменять после включения
Динамический notch — уменьши, но не выключай. Моторные линии теперь режет RPM-фильтр. Динамическому notch остаются резонансы рамы и стека, они стоят на одной частоте при любом газе. Для этого хватает 1–2 вырезов. Вики Betaflight для 4.2 и новее советует dyn_notch_count = 1 и dyn_notch_q = 500; в наших логах 4.5.x почти везде стоит 1, в одном — 2. Если выключить его совсем, проверка конфига при работающем RPM-фильтре ругаться не будет, но резонанс рамы пойдёт прямо в PID.
Dynamic Idle теперь доступен. Ему тоже нужны обороты, а без bidirectional DShot dyn_idle_min_rpm просто не работает. bbdoctor подскажет об этом в проверке конфига. Значение — в сотнях оборотов в минуту. bbdoctor советует 30 для 5", 40–50 для 3" и 20–25 для 7". Dynamic Idle держит обороты на сбросе газа, и это одно из первых средств от пропвоша. В 4.2 параметр назывался idle_min_rpm. Хранится он в PID-профиле: летаешь на нескольких профилях — задай в каждом.
set dyn_notch_count = 1 set dyn_notch_q = 500 set dyn_idle_min_rpm = 30 save
ФНЧ — не спеши. Часто советуют сразу поднять ФНЧ, раз шум срезан. bbdoctor предлагает поднять частоты фильтров гироскопа на 15% и после полёта проверить температуру моторов, только если сходится всё сразу. Шум после фильтров ниже 1 °/с, задержка фильтров больше 1.5 мс, лог записан хотя бы на 500 Гц. Кроме того, сырой гироскоп не шумный (ниже 4 °/с) и в спектре нет резонанса рамы. Хорошо видно это на 7-дюймовике: после фильтров всего 0.66 °/с, задержка 2.1 мс, запас вроде есть. Но сырой шум по pitch — 7.9 °/с, и вердикт такой: «запас есть, но ослаблять рано», сначала механика. Подробно про числа шума — в гайде про фильтры и горячие моторы.
Как проверить RPM-фильтр по логу
Нужен лог с полем eRPM и нефильтрованным гироскопом, частота записи — от 1 кГц, лучше 2 кГц. Как настроить запись, есть в гайде по настройке blackbox. Загрузи лог в bbdoctor и смотри три вещи.
1. Линии моторов исчезли после фильтров. На тепловой карте сырого гироскопа видны диагонали, на отфильтрованном их быть не должно. Если диагонали остались, вырезы стоят мимо: проверь motor_poles и ошибки eRPM.

2. Обороты моторов согласованы. bbdoctor сравнивает обороты каждого мотора с остальными при той же команде. На этом 7-дюймовике разброс от −0.7% до +0.8%. С отклонения 6% bbdoctor выдаёт предупреждение, а мотор, который медленнее остальных на 10% и больше, отмечает как серьёзную проблему. Как искать мотор, который тянет хуже или вибрирует, — в гайде про вибрации.
3. Ошибки телеметрии eRPM. RPM-фильтр верит оборотам из каждого пакета. Битый пакет — и вырез на мгновение уезжает в сторону. bbdoctor считает по каждому мотору, пока тот крутится (команда выше 12%):
- скачки — обороты изменились больше чем на 35% от кадра к кадру при частоте выше 30 Гц. Ротор с пропом так быстро разогнаться не может, значит, это ошибка чтения;
- нули — обороты ниже 5 Гц у крутящегося мотора.
Больше 1 скачка в секунду или больше 1% нулей — предупреждение «ошибки телеметрии eRPM» с советом проверить пайку сигнального провода, помехи от силовых проводов и прошивку ESC. Для сравнения: на четырёх логах VX3.5 — от 0 до 0.02 скачка в секунду.

По этому квадрику показательно, что M4 выходит за порог во всех 11 полётах файла: от 1.6 до 6.1 скачка в секунду. M1 перешёл порог в трёх полётах, M3 — в двух, M2 — ни разу (максимум 0.61). Нулей нет нигде. Когда ошибки из полёта в полёт сидят на одном и том же моторе, случайные помехи тут ни при чём. Ищи на этом канале: пайка сигнального провода, провод рядом с силовыми, сам канал ESC. В самом длинном полёте (98 с) bbdoctor показал предупреждения по двум моторам: M3 1.35 и M4 1.61 скачка в секунду.
Обороты в логе нужны и для разбора падений. Если квадрик упал, bbdoctor ищет перед ударом десинк: мотор с командой от 40% крутится медленнее 35% от остальных дольше 30 мс. Если у этого мотора ещё до падения в полёте были нули eRPM, это считается сбоем телеметрии, а не десинком.
Неполадки: симптом → причина → что делать
| Симптом | Причина | Что делать |
|---|---|---|
| После включения dshot_bidir моторы не крутятся или на вкладке Motors обороты 0 | ESC не умеет bidirectional DShot (стоковый BLHeli_S, BLHeli_32 старше 32.7) | прошить Bluejay или обновить BLHeli_32; AM32 умеет из коробки |
| Не армится, в OSD RPMFILTER | RPM-фильтр включён, а хотя бы один ESC не присылает обороты | вкладка Motors или dshot_telemetry_info: найти мотор без оборотов, проверить его ESC и провод |
| Ошибки сразу на всех моторах | общая причина на полётнике: способ вывода DShot, переназначенные ресурсы моторов | попробовать dshot_bitbang = OFF вместо AUTO (по умолчанию) или обратно, вернуть ресурсы по умолчанию |
| Ошибки или скачки eRPM на одном моторе | пайка сигнального провода, провод вдоль силовых, канал ESC | перепаять, развести провода, обновить прошивку ESC; если ошибки переходят вместе с ESC — менять ESC |
| Обороты на вкладке Motors подозрительно высокие или низкие | неверный motor_poles | посчитать магниты, вписать их число |
| bidirectional DShot включён, а в логе нет eRPM | 4.5+: запись оборотов выключена; 4.1–4.4: поля eRPM нет | blackbox_disable_rpm = OFF или обновиться до 4.5+ |
| Фильтр включён, а моторы горячие | шум не на гармониках: резонанс рамы, кривой проп, подшипник; или слишком высокий D при ослабленных ФНЧ D-term | смотреть тепловую карту: вертикальная линия — резонанс, сильная 1× у одного мотора — механика; потом уже D и его фильтры |
| Проверка конфига: «bidirectional DShot включён, а протокол не DShot» | dshot_bidir = ON при PWM/OneShot/ProShot | переключить протокол на DShot |
| Проверка конфига: «RPM-фильтр выключен, хотя обороты есть» | rpm_filter_harmonics = 0 | вернуть 3 |
О числе полюсов подробнее. Если на моторе 12 магнитов, а в конфиге 14, Betaflight посчитает обороты как 6/7 от настоящих. При реальных 200 Гц вырез встанет на 171 Гц. По нашему расчёту notch с Q = 5 ослабляет частоту, которая на 29 Гц в стороне, всего на 1.5 дБ, то есть фильтр почти не работает. На 3× промах ещё больше: 514 Гц вместо 600. bbdoctor в проверке конфига подсказывает пересчитать полюса, если motor_kv 6000 и выше, а motor_poles = 14. Сработает это, только если ты вписал свой KV: во всех наших логах, где motor_kv есть в заголовке, стоит значение по умолчанию 1960. И учти, что bbdoctor пересчитывает eRPM в обороты через motor_poles из заголовка лога: с неверными полюсами съедут и линии гармоник на его графиках.
Частые ошибки: поставить в motor_poles первую цифру из маркировки (12 из 12N14P — это зубцы статора); сразу после включения поднять ФНЧ, не глядя в лог; выключить динамический notch целиком; поднимать rpm_filter_q на квадрике с ошибками eRPM. И если мотор десинкается на сбросе газа, RPM-фильтр тут ни при чём: это ESC и мотор.
RPM-фильтр в INAV, ArduPilot и PX4
INAV берёт обороты не из bidirectional DShot, а из телеметрии ESC по отдельному проводу. Её отдают BLHeli_32 и AM32 на ESC с выводом телеметрии, у Bluejay её нет. Провод заведи на RX свободного UART и включи на этом порту ESC-телеметрию во вкладке Ports. Полюса задаёт тот же motor_poles. У фильтра три параметра: rpm_gyro_harmonics (по умолчанию 1, максимум 3), rpm_gyro_min_hz (100; документация INAV для 7" допускает 60–70) и rpm_gyro_q (500). Включается он так:
set rpm_gyro_filter_enabled = ON save
Если фильтр включён, а ни на одном порту нет ESC-телеметрии, bbdoctor в проверке конфига напишет, что фильтр не работает. В blackbox INAV пишет только одно значение escRPM в медленных кадрах, оборотов по моторам там нет, поэтому проверки eRPM для INAV-логов недоступны.
ArduPilot делает то же через гармонический notch с источником ESC-телеметрии. SERVO_BLH_BDMASK — битовая маска выходов с bidirectional DShot (15 — первые четыре). SERVO_BLH_POLES — число полюсов. INS_HNTCH_MODE = 3 — частота выреза по оборотам ESC. INS_HNTCH_OPTS = 2 — отдельный вырез на каждый мотор. На платах с IOMCU (Pixhawk, Cube) bidirectional DShot работает только на AUX-выходах, маска для AUX1–4 — 3840, а для части плат нужна сборка прошивки с -bdshot в названии. INS_HNTCH_FREQ ставят ниже частоты висения. Ширину INS_HNTCH_BW обычно берут в половину FREQ, а с отдельными вырезами на мотор документация советует четверть. В логах ArduPilot из нашего набора с такой схемой стояли MOT_PWM_TYPE 6 (DShot600), INS_HNTCH_FREQ 50, INS_HNTCH_BW 25, INS_HNTCH_HMNCS 1 (только 1×).
MOT_PWM_TYPE = 6 SERVO_BLH_BDMASK = 15 SERVO_BLH_POLES = 14 INS_HNTCH_ENABLE = 1 INS_HNTCH_MODE = 3 INS_HNTCH_OPTS = 2 INS_HNTCH_REF = 1
PX4 — динамический notch IMU_GYRO_DNF_EN: бит 0 — по оборотам ESC, бит 1 — по FFT (для него нужен ещё IMU_GYRO_FFT_EN), значение 3 — оба. Число гармоник — IMU_GYRO_DNF_HMC. Обороты дают bidirectional DShot, телеметрия DShot по проводу (DSHOT_TEL_CFG) или ESC на DroneCAN. В наших логах PX4 1.16–1.17 bidirectional DShot включает DSHOT_BIDIR_EN = 1, а полюса задаёт MOT_POLE_COUNT; в логах 1.15 параметра DSHOT_BIDIR_EN ещё нет. В текущей документации PX4 BDShot выбирают протоколом в настройке актуаторов, а полюса задают по моторам (DSHOT_MOT_POL1…12), так что сверься со своей версией. В одном логе 1.16.2 мы видели IMU_GYRO_DNF_EN = 3 при DSHOT_BIDIR_EN = 0, DSHOT_TEL_CFG = 0 и DroneCAN только для датчиков: часть по оборотам ничего не получала, а параметров IMU_GYRO_FFT_* в логе нет вовсе.
DSHOT_BIDIR_EN = 1 MOT_POLE_COUNT = 14 IMU_GYRO_DNF_EN = 1 IMU_GYRO_DNF_HMC = 3
Подробности по этим прошивкам — в гайдах по логам ArduPilot и по ULog PX4.
Итог
Включи bidirectional DShot, проверь число магнитов и ошибки на вкладке Motors, параметры фильтра оставь по умолчанию. Потом слетай с записью eRPM и загрузи лог в bbdoctor: он покажет, ушли ли моторные линии и чистые ли обороты. Конфиг без полёта можно прогнать через проверку конфига, а как выглядит готовый разбор — посмотри на примере отчёта.
Частые вопросы
Нужен ли bidirectional DShot, если есть динамический notch?
Нужен, если ESC его умеют. Динамический notch ищет пики по спектру гироскопа с запаздыванием и ставит несколько вырезов на весь квадрик (по умолчанию 3). RPM-фильтр знает обороты каждого мотора в каждом цикле и ставит по вырезу на каждую гармонику каждого мотора. На логе 7-дюймовика из этого гайда 84–87% сырого шума выше 80 Гц лежало ровно на гармониках моторов. Динамический notch с RPM-фильтром не выключай, а уменьши до 1–2: ему остаются резонансы рамы.
Сколько гармоник ставить в rpm_filter_harmonics?
Оставь 3, это значение по умолчанию. Основная энергия шума обычно на 1× и на частоте лопастей: 2× у двухлопастных пропов, 3× у трёхлопастных. На 7-дюймовике из гайда 3× несла 68% сырого шума по roll. Если по логу какая-то гармоника пустая, в Betaflight 4.5 и новее лучше ослабить её через rpm_filter_weights, чем убирать гармоники совсем.
Сколько полюсов ставить в motor_poles: 12 или 14?
Столько, сколько магнитов в колоколе мотора. В маркировке 12N14P это вторая цифра: 12 — зубцы статора, 14 — магниты. Большинство моторов 22xx–28xx имеют 14 магнитов, мелкие 08xx–11xx часто 12. Ошибёшься — Betaflight посчитает обороты на 14–17% неверно, и вырезы встанут мимо шума.
DShot300 или DShot600 для bidirectional DShot?
Решает частота PID-цикла. Для 4 и 3.2 кГц вики Betaflight советует DShot300 как самый надёжный; DShot600 тоже работает, но выигрыша не даёт. На 8 кГц нужен DShot600: DShot300 успевает обновлять моторы только через цикл. В нашем наборе большинство логов с bidirectional DShot на 4 и 3.2 кГц летали на DShot300, а единственный лог с PID-циклом 8 кГц — на DShot600.
Обновлено: