RPM-фільтр Betaflight: налаштуй і перевір роботу за логом
RPM-фільтр — найточніший фільтр у Betaflight: польотний контролер отримує швидкість кожного мотора й прибирає шум саме на цих частотах. Нижче — що для цього потрібно, як увімкнути фільтр, що означають параметри та як перевірити за реальним логом, що він працює.
Що робить RPM-фільтр і чому він кращий за lowpass
Мотор і пропелер розгойдують раму на частоті обертання (1×) та її кратних; частота проходження лопатей — 2× для дволопатевого пропелера і 3× для трилопатевого. Усі ці частоти зростають разом із газом, тому на тепловій карті «газ — частота» вони виглядають як діагональні лінії.
Без даних RPM у Betaflight є два інструменти. Lowpass зрізає все вище частоти зрізу, але додає значну затримку й не може добре прибрати лінію на 200 Гц. Динамічний notch шукає піки спектра, відстає від змін газу й має лише 3 notch-фільтри за замовчуванням, максимум — 5. RPM-фільтр на кожному циклі зчитує швидкість усіх моторів через двонаправлений DShot і ставить вузький notch на кожну гармоніку кожного мотора. Це 4 мотори × 3 гармоніки = 12 notch-фільтрів, які майже без затримки стежать за RPM.

Але фільтр має свою ціну: notch із добротністю Q на частоті f затримує повільний рух дрона приблизно на 1/(2π·Q·f). Для PID-циклу 4 кГц 12 notch-фільтрів із Q = 5 за швидкості моторів 200 Гц (1×) додають близько 1,15 мс. Один PT1 на 150 Гц додає майже стільки ж (1,06 мс). Але він послаблює лінію 200 Гц лише на 4–5 дБ, а notch — на десятки дБ. Тож за однакової затримки ти прибираєш майже весь шум моторів і можеш зробити lowpass-фільтри м’якшими. Найбільше затримки додають низькі notch: на 100 Гц ті самі 12 фільтрів коштують 2,3 мс. Для цього й потрібні min_hz і діапазон згасання.
Що потрібно
- Betaflight 4.1 або новіший. У версії 4.1 з’явилися двонаправлений DShot і RPM-фільтр.
- Протокол DShot (DSHOT150/300/600): через PWM, OneShot, Multishot або ProShot дані RPM не надходять.
- Прошивка ESC із підтримкою двонаправленого DShot (див. таблицю нижче). Bluejay прошивається через esc-configurator.com.
- Правильне значення motor_poles: кількість магнітів у дзвоні. Betaflight ділить електричні оберти за хвилину (eRPM) на motor_poles/2, щоб отримати механічні RPM.
| ESC | Двонаправлений DShot | Що робити |
|---|---|---|
| BLHeli_S (стокова прошивка) | ні | прошити Bluejay (або JESC) |
| Bluejay, JESC | так | нічого, увімкнути на польотному контролері |
| BLHeli_32 старіша за 32.7 | ні | оновити до 32.7+ |
| BLHeli_32 32.7+, AM32 | так | нічого, увімкнути на польотному контролері |
Налаштування крок за кроком
- Зніми пропелери. Збережи копію конфігурації командою
diff all. - Перевір прошивку ESC: esc-configurator.com читає BLHeli_S, Bluejay і AM32, а BLHeliSuite32 — BLHeli_32. Якщо встановлена стокова BLHeli_S, проший Bluejay.
- Порахуй магніти в дзвоні одного мотора.
- У CLI (підстав свій протокол і кількість полюсів):
set motor_pwm_protocol = DSHOT300 set dshot_bidir = ON set motor_poles = 14 save
- Після перезавантаження відкрий вкладку Motors. Для кожного мотора мають відображатися RPM і відсоток помилок. Розкрути мотори повзунком: RPM мають плавно зростати, а кількість помилок залишатися близькою до нуля. У CLI команда
dshot_telemetry_infoпоказує RPM і кількість хибних пакетів для кожного мотора. Якщо RPM-фільтр увімкнений, а хоча б один ESC не передає RPM, Betaflight не дозволить армити дрон і покаже RPMFILTER в OSD. - Переконайся, що сам фільтр увімкнений: за замовчуванням він має 3 гармоніки, але в запозичених конфігураціях інколи стоїть 0.
- У версії 4.5 і новіших перевір, що запис RPM у blackbox не вимкнений (за замовчуванням він увімкнений), інакше лог нічого не доведе:
set blackbox_disable_rpm = OFF save
Поле eRPM у логах з’явилося лише у версії 4.5 (у коді blackbox для 4.4 його немає): у нашому логу 4.4.1 із двонаправленим DShot RPM відсутній, тоді як у всіх логах 4.5.x є eRPM[0]…eRPM[3]. А в логу 2025.12.5 фільтр був увімкнений, але запис RPM вимкнений, тож перевірити його роботу неможливо.
Параметри та значення з реальних логів
У Betaflight 4.3 параметри перейменували, а у версії 4.5 додали ваги для окремих гармонік; у таблиці наведено стандартні значення та параметри з реальних логів.
| 4.3 і новіші | 4.1–4.2 | Стандартне значення | Що робить | Значення в логах |
|---|---|---|---|---|
rpm_filter_harmonics | gyro_rpm_notch_harmonics | 3 | кількість гармонік для notch-фільтрації; 0 вимикає фільтр | скрізь 3 |
rpm_filter_q | gyro_rpm_notch_q | 500 (Q = 5) | ширина notch: що вище значення, то він вужчий і додає менше затримки | 500; 700 (2025.12.5); 850 (VX3.5, 4.5.2) |
rpm_filter_min_hz | gyro_rpm_notch_min | 100 | найнижча частота notch | 100; 70 (7 дюймів, 4.6.0) |
rpm_filter_fade_range_hz | — | 50 | діапазон вище min_hz, у якому notch поступово згасає | 50; 70; 80 |
rpm_filter_weights (4.5+) | — | 100,100,100 | глибина notch для кожної гармоніки, % | 100,60,100 (4.6.0); 90,50,90 (2025.12.5) |
rpm_filter_lpf_hz | rpm_notch_lpf | 150 | згладжує значення RPM перед обчисленням notch-фільтрів | скрізь 150 |
rpm_filter_q. Вузький notch додає менше затримки, але потребує точних даних RPM. Для notch на 200 Гц частота, що відрізняється від його центру на 10 Гц, послаблюється майже на 7 дБ за Q = 5, але лише на 3,6 дБ за Q = 8,5. Натомість 12 notch-фільтрів із Q = 8,5 додають близько 0,7 мс замість 1,15 мс. На VX3.5 зі стабільною телеметрією (менш як 0,02 стрибка за секунду) використовується 850, але вікі Betaflight не радить перевищувати 750, а збільшувати q на дроні з помилками eRPM не варто.
rpm_filter_min_hz і діапазон згасання. Notch не опускається нижче min_hz, а від min_hz + fade до min_hz його глибина зменшується до нуля. Це здебільшого впливає на 1× повільних моторів під час скидання газу та в пропвоші, а за дуже низьких RPM — також на 2×. На 7-дюймовому дроні з Betaflight 4.6.0 (min 70, fade 50) найповільніший мотор чверть польоту (24%) працював нижче 120 Гц, у зоні згасання, а 4,4% польоту — нижче 70 Гц. За газу нижче 5% медіанна швидкість мотора становила 58 Гц. На п’ятидюймових дронах мотори обертаються швидше, тож стандартні значення підходять. Знижуй min_hz лише для великих пропелерів і лише якщо лог показує шум 1× на малому газі: низькі notch дорого коштують у затримці.
rpm_filter_weights (версія 4.5 і новіші) задає глибину notch для кожної гармоніки: 100 — повний notch, 50 — половинний. На тому самому 7-дюймовому дроні стоїть 100,60,100, і лог це підтверджує: на 2× припадало лише 4–6% сирого шуму вище 80 Гц, тоді як на 3× — 68% по крену. Змінюй ваги лише за власним логом: кількість лопатей змінює розподіл енергії між 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
У версіях 4.3–4.4 пропусти рядок rpm_filter_weights — такого параметра там немає.
Що змінити після запуску
Динамічний notch: зменш кількість, але не вимикай. Тепер за лінії моторів відповідає RPM-фільтр, а динамічному notch залишаються резонанси рами й стека, частота яких не змінюється з газом. Для них вистачає одного або двох notch-фільтрів. Для версії 4.2 і новіших вікі Betaflight пропонує dyn_notch_count = 1 і dyn_notch_q = 500; майже в усіх наших логах 4.5.x використовується 1, в одному — 2. Якщо RPM-фільтр увімкнений, перевірка конфігурації не попередить, що динамічний notch вимкнений, але тоді резонанс рами потрапить безпосередньо в PID-контролери.
Стає доступним Dynamic Idle. Для нього теж потрібні RPM: без двонаправленого DShot параметр dyn_idle_min_rpm нічого не робить, і перевірка конфігурації bbdoctor про це повідомляє. Значення вказується у сотнях RPM; bbdoctor радить 30 для 5 дюймів, 40–50 для 3 дюймів і 20–25 для 7 дюймів. Функція не дає моторам зупинитися під час скидання газу й належить до перших способів усунути пропвош. У версії 4.2 параметр називається idle_min_rpm. Він зберігається в PID-профілі, тож задай його в кожному профілі, яким користуєшся.
set dyn_notch_count = 1 set dyn_notch_q = 500 set dyn_idle_min_rpm = 30 save
Lowpass-фільтри: не поспішай. Часто радять одразу підняти частоту зрізу lowpass. bbdoctor радить збільшувати частоти зрізу гіроскопа на 15% (а потім перевірити температуру моторів) лише за одночасного виконання всіх умов: відфільтрований шум нижче 1 град/с, затримка фільтрів понад 1,5 мс, лог записано на частоті 500 Гц або вище, сирий сигнал гіроскопа тихий (нижче 4 град/с) і резонансів рами немає. На 7-дюймовому дроні видно чому: 0,66 град/с після фільтрації та затримка 2,1 мс наче вказують на запас. Але сирий шум по тангажу становить 7,9 град/с, тож висновок такий: «запас є, але послаблювати фільтри зарано» — спершу механіка. Пояснення показників шуму — у гайді з фільтрів.
Перевірка за логом
Потрібен лог із полем eRPM і нефільтрованим гіроскопом, записаним на частоті 1 кГц або вище, бажано 2 кГц (див. гайд із налаштування blackbox). Завантаж його в bbdoctor і перевір три речі.
1. Після фільтрації лінії моторів зникають. На сирій тепловій карті видно діагоналі, а на відфільтрованій їх бути не повинно. Якщо вони залишилися, notch-фільтри стоять не там: перевір motor_poles і помилки eRPM.

2. Мотори узгоджено працюють між собою. bbdoctor порівнює RPM кожного мотора з іншими за однакової команди. На цьому 7-дюймовому дроні відхилення становить від −0,7% до +0,8%. За відхилення 6% з’являється попередження, а мотор, що повільніший за решту на 10% або більше, позначається як серйозна проблема. Якщо шукаєш мотор, який гальмує або вібрує, дивись гайд із вібрацій.
3. Помилки телеметрії eRPM. RPM-фільтр покладається на кожен пакет, тож хибний пакет на мить зміщує notch. bbdoctor рахує такі помилки для кожного мотора лише під час обертання (команда вище 12%):
- стрибки: RPM змінюється більш ніж на 35% між сусідніми кадрами, коли швидкість вище 30 Гц. Мотор із пропелером не може так швидко змінити швидкість, отже це помилка зчитування;
- нулі: RPM нижче 5 Гц у мотора, що обертається.
Понад 1 стрибок за секунду або понад 1% нулів викликає попередження «помилки телеметрії eRPM» із порадою перевірити пайку сигнального дроту ESC, перешкоди від силових дротів і прошивку 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 стрибка за секунду.
RPM у логу допомагає розібратися й після крашу: bbdoctor шукає десинхронізацію перед ударом, коли мотор із командою 40% або вище понад 30 мс обертається повільніше за 35% від RPM інших моторів. Якщо раніше в польоті на цьому моторі були нулі eRPM, це вважається помилкою телеметрії, а не десинхронізацією.
Усунення несправностей: симптом, причина, рішення
| Симптом | Причина | Рішення |
|---|---|---|
| За ввімкненого dshot_bidir мотори не обертаються або показують 0 RPM | ESC не підтримує двонаправлений DShot (стокова BLHeli_S, BLHeli_32 старіша за 32.7) | прошити Bluejay або оновити BLHeli_32; AM32 підтримує його одразу |
| Не вдається армити, в OSD показано RPMFILTER | RPM-фільтр увімкнений, але принаймні один ESC не передає RPM | знайти мотор без RPM у вкладці Motors або командою dshot_telemetry_info, перевірити його ESC і дріт |
| Одночасно є помилки на всіх моторах | спільна причина на польотному контролері: спосіб виведення DShot або перепризначені ресурси моторів | спробувати dshot_bitbang = OFF замість стандартного AUTO (або навпаки), відновити стандартні ресурси |
| Помилки eRPM або стрибки на одному моторі | пайка сигнального дроту, прокладання поруч із силовими дротами, канал ESC | перепаяти, змінити прокладання, оновити прошивку ESC; якщо помилка переходить разом з ESC під час заміни, замінити його |
| RPM у вкладці Motors завищений або занижений | неправильне значення motor_poles | порахувати магніти й указати їхню кількість |
| Двонаправлений DShot увімкнений, але в логу немає eRPM | 4.5+: вимкнено запис RPM; 4.1–4.4: немає поля eRPM | blackbox_disable_rpm = OFF або оновити Betaflight до 4.5+ |
| Фільтр увімкнений, а мотори все одно гарячі | шум не на гармоніках: резонанс рами, погнутий пропелер, підшипник; або надто великий D за послаблених lowpass D-term | перевірити теплову карту: вертикальна лінія означає резонанс, сильний 1× на одному моторі — механічну проблему; потім перевірити D та його фільтри |
| Перевірка конфігурації: «Двонаправлений DShot увімкнено, але протокол не DShot» | dshot_bidir = ON разом із PWM/OneShot/ProShot | перемкнути протокол на DShot |
| Перевірка конфігурації: «RPM-фільтр вимкнений, хоча дані RPM є» | rpm_filter_harmonics = 0 | повернути значення 3 |
Про кількість полюсів: мотор із 12 магнітами, налаштований як 14, показує 6/7 від реальних RPM, тому за реальних 200 Гц notch опиниться на 171 Гц. Notch із Q = 5 послаблює частоту за 29 Гц від центру лише на 1,5 дБ, тож фільтр майже не працює. На 3× похибка ще більша: 514 замість 600 Гц. Перевірка конфігурації просить перерахувати полюси, якщо motor_kv становить 6000 або більше, а motor_poles = 14. Це спрацьовує лише якщо ти ввів значення KV: у кожному нашому логу, де записано motor_kv, стоїть стандартне значення 1960. bbdoctor теж перераховує eRPM за motor_poles із заголовка, тому неправильна кількість полюсів зміщує і гармонічні лінії на його графіках.
Типові помилки: ввести 12 із позначення 12N14P у motor_poles (це кількість зубців статора), підняти частоту зрізу lowpass без логу, вимкнути динамічний notch, збільшити rpm_filter_q попри помилки eRPM. А десинхронізація під час скидання газу — це проблема ESC і мотора, а не RPM-фільтра.
INAV, ArduPilot і PX4
INAV тут не використовує двонаправлений DShot. Він отримує RPM від ESC через окремий дріт до RX-контакту вільного UART; телеметрію ESC потрібно ввімкнути для цього порту у вкладці Ports. Її передають ESC BLHeli_32 і AM32 з контактною площадкою телеметрії; Bluejay цього не вміє. Кількість полюсів задається через motor_poles. Параметри фільтра: rpm_gyro_harmonics (за замовчуванням 1, максимум 3), rpm_gyro_min_hz (100; документація INAV допускає 60–70 для 7 дюймів) і rpm_gyro_q (500). Увімкни його так:
set rpm_gyro_filter_enabled = ON save
Якщо фільтр увімкнений, але жоден порт не отримує телеметрію ESC, перевірка конфігурації bbdoctor повідомить, що фільтр не працює. Blackbox INAV записує лише одне значення escRPM у повільних кадрах, без RPM для кожного мотора, тому перевірка eRPM для логів INAV недоступна.
ArduPilot використовує гармонічний notch, яким керує телеметрія ESC. SERVO_BLH_BDMASK — це бітова маска виходів із двонаправленим DShot (15 охоплює перші чотири), SERVO_BLH_POLES задає кількість полюсів. Значення INS_HNTCH_MODE = 3 прив’язує notch до RPM ESC, а INS_HNTCH_OPTS = 2 задає окремий notch для кожного мотора. На платах з IOMCU (Pixhawk, Cube) двонаправлений DShot працює лише на виходах AUX, тож маска AUX1–4 дорівнює 3840; для деяких плат потрібна прошивка, у назві якої є -bdshot. Задай INS_HNTCH_FREQ нижче частоти зависання; INS_HNTCH_BW зазвичай починають із половини FREQ, але для окремих notch-фільтрів документація радить чверть. У наших логах 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 відстежує RPM ESC, біт 1 — FFT (для цього також потрібен IMU_GYRO_FFT_EN), значення 3 вмикає обидва режими. IMU_GYRO_DNF_HMC задає кількість гармонік. RPM надходять через двонаправлений DShot, дротову телеметрію DShot (DSHOT_TEL_CFG) або ESC DroneCAN. У наших логах 1.16–1.17 параметр DSHOT_BIDIR_EN = 1 вмикає двонаправлений DShot, а 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 використовувався лише для датчиків: RPM-режиму не було за чим стежити, а в лозі взагалі не було параметрів IMU_GYRO_FFT_*.
DSHOT_BIDIR_EN = 1 MOT_POLE_COUNT = 14 IMU_GYRO_DNF_EN = 1 IMU_GYRO_DNF_HMC = 3
Докладніше — у гайді з логів ArduPilot та гайді з PX4 ULog.
Підсумок
Увімкни двонаправлений DShot, перевір кількість магнітів і помилки у вкладці Motors, а параметри фільтра залиш стандартними. Потім політай із записом eRPM і завантаж лог у bbdoctor, щоб перевірити, чи зникли лінії моторів і чи чиста телеметрія eRPM. Перевірка конфігурації працює без польоту, а приклад звіту показує готовий аналіз.
Часті запитання
Чи потрібен двонаправлений DShot, якщо в мене вже є динамічний notch?
Так, якщо ESC його підтримують. Динамічний notch із затримкою знаходить піки в спектрі гіроскопа й розміщує кілька notch-фільтрів для всього квадрокоптера (3 за замовчуванням). RPM-фільтр знає швидкість кожного мотора на кожному циклі й ставить notch на кожну гармоніку кожного мотора. У логу 7-дюймового дрона з цього гайда 84–87% сирого шуму гіроскопа вище 80 Гц припадало точно на гармоніки моторів. Залиш динамічний notch разом із RPM-фільтром, але зменш його до 1–2 notch-фільтрів для резонансів рами.
Скільки гармонік задавати в rpm_filter_harmonics?
Залиш 3 — значення за замовчуванням. Більшість шуму припадає на 1× і частоту проходження лопатей: 2× для дволопатевих пропелерів, 3× для трилопатевих. На 7-дюймовому дроні з цього гайда 3× давали 68% сирого шуму по крену. Якщо в логу одна гармоніка порожня, у Betaflight 4.5 і новіших зменш її вагу через rpm_filter_weights, а не кількість гармонік.
motor_poles має бути 12 чи 14?
Це кількість магнітів у дзвоні мотора. У позначенні 12N14P другим числом указано 14 магнітів: 12 зубців статора, 14 магнітів. У більшості моторів 22xx–28xx є 14 магнітів, а в малих 08xx–11xx часто 12. Якщо помилишся, Betaflight покаже RPM із похибкою 14–17%, і кожен notch опиниться поруч із шумом.
DShot300 чи DShot600 для двонаправленого DShot?
Залежить від частоти PID-циклу. Для циклів 4 кГц і 3,2 кГц вікі Betaflight рекомендує DShot300 як найнадійніший варіант; DShot600 теж працює, але переваг не дає. Для 8 кГц потрібен DShot600, бо DShot300 оновлює мотори лише через цикл. У більшості наших логів із двонаправленим DShot на 4 і 3,2 кГц використовувався DShot300, а єдиний лог на 8 кГц — DShot600.
Оновлено: