bbdoctor
Діагностика дрона за логом: Betaflight, INAV, ArduPilot, PX4
RUENESPTUA

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.

Теплова карта сирого гіроскопа по крену на 7-дюймовому квадрокоптері: діагональні смуги шуму та накладені лінії 1×, 2× і 3× кожного мотора за eRPM; смуги збігаються з лініями
REKON 7, 6S, Betaflight 4.6.0, лог 1980 Гц: сирий гіроскоп по крену з медіанними лініями 1× (суцільна), 2× (пунктир) і 3× (крапки) кожного мотора за eRPM у кожному діапазоні газу; кольори M1–M4. 84–87% енергії сирого шуму вище 80 Гц лежить у межах ±10 Гц від цих ліній — саме там RPM-фільтр розміщує notch-фільтри.

Але фільтр має свою ціну: 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 і діапазон згасання.

Що потрібно

ESCДвонаправлений DShotЩо робити
BLHeli_S (стокова прошивка)ніпрошити Bluejay (або JESC)
Bluejay, JESCтакнічого, увімкнути на польотному контролері
BLHeli_32 старіша за 32.7ніоновити до 32.7+
BLHeli_32 32.7+, AM32такнічого, увімкнути на польотному контролері

Налаштування крок за кроком

  1. Зніми пропелери. Збережи копію конфігурації командою diff all.
  2. Перевір прошивку ESC: esc-configurator.com читає BLHeli_S, Bluejay і AM32, а BLHeliSuite32 — BLHeli_32. Якщо встановлена стокова BLHeli_S, проший Bluejay.
  3. Порахуй магніти в дзвоні одного мотора.
  4. У CLI (підстав свій протокол і кількість полюсів):
    set motor_pwm_protocol = DSHOT300
    set dshot_bidir = ON
    set motor_poles = 14
    save
  5. Після перезавантаження відкрий вкладку Motors. Для кожного мотора мають відображатися RPM і відсоток помилок. Розкрути мотори повзунком: RPM мають плавно зростати, а кількість помилок залишатися близькою до нуля. У CLI команда dshot_telemetry_info показує RPM і кількість хибних пакетів для кожного мотора. Якщо RPM-фільтр увімкнений, а хоча б один ESC не передає RPM, Betaflight не дозволить армити дрон і покаже RPMFILTER в OSD.
  6. Переконайся, що сам фільтр увімкнений: за замовчуванням він має 3 гармоніки, але в запозичених конфігураціях інколи стоїть 0.
  7. У версії 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_harmonicsgyro_rpm_notch_harmonics3кількість гармонік для notch-фільтрації; 0 вимикає фільтрскрізь 3
rpm_filter_qgyro_rpm_notch_q500 (Q = 5)ширина notch: що вище значення, то він вужчий і додає менше затримки500; 700 (2025.12.5); 850 (VX3.5, 4.5.2)
rpm_filter_min_hzgyro_rpm_notch_min100найнижча частота notch100; 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_hzrpm_notch_lpf150згладжує значення 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.

Дві теплові карти шуму по крену: ліворуч сирий гіроскоп із яскравими діагональними лініями, праворуч відфільтрований гіроскоп, майже темний за тієї самої шкали кольорів
Той самий REKON 7, крен, однакова шкала кольорів. Ліворуч: сирий гіроскоп. Праворуч: після RPM-фільтра, трьох динамічних notch-фільтрів і lowpass на 375 Гц. Шум вище 80 Гц знизився з 5,3 до 0,54 град/с по крену і з 7,9 до 0,66 по тангажу: на лініях моторів стало на 25,5 дБ менше шуму, поза ними — на 13–14 дБ. Слабка ділянка близько 680 Гц за газу 15–30% не збігається з відстежуваними гармоніками й перевищує dyn_notch_max_hz = 400, тому жоден із фільтрів її не прибирає.

2. Мотори узгоджено працюють між собою. bbdoctor порівнює RPM кожного мотора з іншими за однакової команди. На цьому 7-дюймовому дроні відхилення становить від −0,7% до +0,8%. За відхилення 6% з’являється попередження, а мотор, що повільніший за решту на 10% або більше, позначається як серйозна проблема. Якщо шукаєш мотор, який гальмує або вібрує, дивись гайд із вібрацій.

3. Помилки телеметрії eRPM. RPM-фільтр покладається на кожен пакет, тож хибний пакет на мить зміщує notch. bbdoctor рахує такі помилки для кожного мотора лише під час обертання (команда вище 12%):

Понад 1 стрибок за секунду або понад 1% нулів викликає попередження «помилки телеметрії eRPM» із порадою перевірити пайку сигнального дроту ESC, перешкоди від силових дротів і прошивку ESC. Для порівняння: у чотирьох логах VX3.5 було від 0 до 0,02 стрибка за секунду.

RPM чотирьох моторів за eRPM: M1 і M4 мають часті різкі стрибки, а M2 і M3 працюють плавно; у масштабі 100 мс M4 стрибає між 103 і 171 Гц, а M2 тримається в межах 121–150 Гц
Квадрокоптер 6S, Betaflight 4.5.1, лог 801 Гц, політ 10. A: усі чотири мотори за 1 с; на M1 і M4 є шуми. B: 100 мс, точки — кадри логу: M2 тримається в межах 121–150 Гц, M4 стрибає між 103 і 171 Гц. Медіанна зміна між кадрами: M3 0,6%, M2 3,4%, M1 9,8%, M4 10,3%. Стрибків за секунду: M4 6,1, M1 1,1, M3 0,24, M2 0.

На цьому дроні 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 RPMESC не підтримує двонаправлений DShot (стокова BLHeli_S, BLHeli_32 старіша за 32.7)прошити Bluejay або оновити BLHeli_32; AM32 підтримує його одразу
Не вдається армити, в OSD показано RPMFILTERRPM-фільтр увімкнений, але принаймні один ESC не передає RPMзнайти мотор без RPM у вкладці Motors або командою dshot_telemetry_info, перевірити його ESC і дріт
Одночасно є помилки на всіх моторахспільна причина на польотному контролері: спосіб виведення DShot або перепризначені ресурси моторівспробувати dshot_bitbang = OFF замість стандартного AUTO (або навпаки), відновити стандартні ресурси
Помилки eRPM або стрибки на одному моторіпайка сигнального дроту, прокладання поруч із силовими дротами, канал ESCперепаяти, змінити прокладання, оновити прошивку ESC; якщо помилка переходить разом з ESC під час заміни, замінити його
RPM у вкладці Motors завищений або заниженийнеправильне значення motor_polesпорахувати магніти й указати їхню кількість
Двонаправлений DShot увімкнений, але в логу немає eRPM4.5+: вимкнено запис RPM; 4.1–4.4: немає поля eRPMblackbox_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.

Оновлено:

Інші гайди