PWM jest w UAV nazwą używaną dla dwóch podobnie wyglądających, lecz funkcjonalnie różnych sygnałów. W energoelektronice oznacza przebieg o regulowanym współczynniku wypełnienia, którego średnia wartość steruje mocą. Na złączu serwa lub starszego ESC informacja jest zwykle zakodowana w bezwzględnej szerokości pojedynczego impulsu, natomiast długa przerwa służy głównie odświeżaniu ramki. Zmiana okresu bez zmiany szerokości impulsu nie powinna wtedy zmieniać komendy, choć zmienia współczynnik wypełnienia.
To rozróżnienie jest praktyczne. Błąd o 20 µs może być nieistotny dla grzałki sterowanej rzeczywistym PWM, a zauważalny na sterze. Z kolei wpisanie „50%” zamiast liczby mikrosekund do abstrakcji wyjścia serwa może wysłać sygnał poza dopuszczalnym zakresem. Projektant powinien więc opisywać każdy kanał trzema osobnymi wielkościami: okresem ramki, czasem stanu aktywnego i znaczeniem wartości dla odbiornika.
Spis treści#
- Dwa znaczenia terminu PWM
- Wielkości i równania
- Sygnał klasycznego serwa
- PWM dla ESC
- Timer sprzętowy mikrokontrolera
- Prescaler, okres i compare
- Rozdzielczość i kwantyzacja
- Aktualizacja synchroniczna
- Grupy timerów
- Mapowanie funkcji na wyjścia
- Min, max, trim i odwrócenie
- Stany podczas startu i resetu
- Failsafe
- Jitter i opóźnienie
- Warstwa elektryczna
- Zasilanie serw
- Integralność sygnału i EMC
- OneShot, Multishot i DShot
- Pomiar input capture
- Diagnostyka oscyloskopem
- Kalibracja
- Implementacja firmware
- Przykład obliczeniowy STM32
- Plan testów
- Typowe błędy
- Kryteria odbioru
- Powiązane tematy
- Przypisy
Dwa znaczenia terminu PWM#
Właściwy PWM opisuje przebieg okresowy, w którym odbiornik reaguje na stosunek czasu włączenia do całego okresu. Przetwornica, mostek tranzystorowy albo grzałka po filtracji widzi wartość zależną od wypełnienia. Jeśli okres wynosi 100 µs, a stan wysoki trwa 30 µs, wypełnienie wynosi 30%. Przy zachowaniu 30% można podwoić częstotliwość i nadal żądać zbliżonej wartości średniej, chociaż zmienią się straty przełączania i tętnienia.
Interfejs serwa modelarskiego jest lepiej nazwany sterowaniem szerokością impulsu. Odbiornik mierzy czas między wybranym zboczem narastającym i opadającym. Typowa konwencja używa okolic 1000–2000 µs, z punktem neutralnym blisko 1500 µs, lecz nie jest to uniwersalna gwarancja. Producent aktuatora może dopuszczać inny zakres i inną częstotliwość odświeżania. Ustawienia flight controllera także mogą rozszerzać lub ograniczać końce.
W dokumentacji portalu określenie „PWM serwa” oznacza tę drugą rodzinę, chyba że jawnie mowa o sterowaniu mocą. Wymaganie interfejsu powinno zawierać:
- polaryzację impulsu;
- minimalną, neutralną i maksymalną szerokość w mikrosekundach;
- okres lub dopuszczalny zakres częstotliwości ramek;
- poziomy napięć i obciążenie wejścia;
- zachowanie przy braku impulsów oraz przy wartości spoza zakresu;
- czas od ostatniej poprawnej ramki do przejścia w stan bezpieczny.
Sam napis „PWM 50 Hz” nie opisuje komendy ani zachowania awaryjnego.
Wielkości i równania#
Dla okresu T, częstotliwości f i czasu aktywnego t_on:
f = 1 / T
D = t_on / T
D[%] = 100 · t_on / T
Dla okresu 20 ms i impulsu 1,5 ms częstotliwość wynosi 50 Hz, a wypełnienie 7,5%. Dla tego samego impulsu przy okresie 10 ms wypełnienie wynosi 15%, ale komenda serwa nadal może oznaczać ten sam punkt neutralny — o ile serwo dopuszcza odświeżanie 100 Hz.
W oprogramowaniu najlepiej przechowywać żądanie aktuatora w jednostce domenowej, a konwersję wykonywać na granicy sterownika. Dla serwa może to być kąt, pozycja znormalizowana [-1, 1] albo liczba mikrosekund. Dla silnika — znormalizowany thrust lub wartość miksera. Liczba taktów rejestru timera jest szczegółem sprzętowym i nie powinna przenikać do regulatora lotu.
Przykładowe liniowe mapowanie pozycji u ∈ [-1, 1] na impulsy:
if u >= 0:
pulse_us = trim_us + u · (max_us - trim_us)
else:
pulse_us = trim_us + u · (trim_us - min_us)
Asymetryczna postać uwzględnia różne odległości neutralnego punktu od obu końców. Potem należy zastosować ograniczenie, kontrolę poprawności i dopiero przeliczyć mikrosekundy na takty.
Sygnał klasycznego serwa#
Kanał serwa niesie jedną wartość na ramkę. Zbocze rozpoczyna pomiar, drugie go kończy, a przerwa oddziela kolejną komendę. Serwo analogowe, cyfrowe i inteligentny aktuator mogą różnić się tolerowanym odświeżaniem, martwą strefą, filtrowaniem oraz zachowaniem po zaniku sygnału. „Cyfrowe serwo” nie oznacza automatycznie cyfrowego protokołu na przewodzie — wiele takich urządzeń nadal przyjmuje impulsy o szerokości kodującej pozycję.
Zakres 1000–2000 µs jest dobrym punktem startowym do rozumienia interfejsu, nie procedurą kalibracji. Niektóre mechanizmy wymagają zawężenia, ponieważ wcześniej dochodzą do ogranicznika. Inne systemy korzystają z rozszerzonego zakresu. Częstotliwość także trzeba potwierdzić w datasheecie. Zbyt szybkie odświeżanie może powodować niestabilną pracę lub przegrzewanie urządzenia, które nie było do niego przeznaczone.
Neutralny impuls nie gwarantuje neutralnej geometrii. Wartość trim kompensuje ustawienie dźwigni i cięgna, ale duża korekta programowa świadczy zwykle o złym montażu mechanicznym. Serwo powinno mieć zapas ruchu w obu kierunkach, a przy końcach nie może dociskać mechanizmu do oporu. Prąd zablokowanego aktuatora może przeciążyć BEC i wywołać brownout całego flight controllera.
PWM dla ESC#
Starszy lub uniwersalny ESC może przyjmować sygnał podobny do serwa. Zwykle istnieje wartość minimalna, przy której napęd jest zatrzymany albo uzbrojony, i maksimum odpowiadające pełnej komendzie. Znaczenie dokładnych impulsów, procedura inicjalizacji i obsługiwane tempo ramek zależą od firmware ESC.
Sygnał wejściowy ESC nie jest tym samym co PWM faz silnika. Kontroler silnika interpretuje komendę, a następnie sam przełącza tranzystory mostka z częstotliwością i algorytmem wymaganym przez komutację. Oscyloskop na przewodzie sygnałowym pokazuje żądanie flight controllera; pomiar na fazie pokazuje pracę energoelektroniki o znacznie wyższym napięciu i innej topologii.
Przy multirotorze ważna jest równoczesność aktualizacji kanałów. Jeśli cztery komendy powstają z jednego wyniku miksera, lecz timery przeładowują rejestry w różnych chwilach, poszczególne ESC otrzymają próbki z niejednakowego cyklu sterowania. W spokojnym locie efekt może być mały, ale jest to niepotrzebny składnik opóźnienia i asymetrii. Kanały napędu powinny korzystać ze spójnego punktu publikacji.
Kalibracja zakresu ESC nie jest zamiennikiem prawidłowej konfiguracji bezpieczeństwa. Przed testem bezwzględnie usuwa się śmigła, zapewnia ograniczenie ruchu platformy i osobny sposób odłączenia energii. Test samego przebiegu można przeprowadzić przy odłączonym napędzie na sztucznym obciążeniu logicznym lub analizatorze.
Timer sprzętowy mikrokontrolera#
Timer z jednostką output compare generuje zbocza bez wykonywania instrukcji CPU w każdej mikrosekundzie. Licznik rośnie od zera do wartości okresu, a kanał porównuje go z rejestrem określającym koniec impulsu. Sprzętowa generacja zmniejsza jitter i uwalnia procesor dla odczytu IMU, estymatora oraz regulatora.
Typowy blok zawiera:
clock ─> prescaler ─> counter ─> compare channel ─> pin
│ ▲
└─ period │ pulse width
register │
CPU/DMA ─────────────── preload/shadow registers
W rodzinie STM32 nazwy rejestrów często obejmują PSC dla preskalera, ARR dla okresu i CCRn dla wartości porównania kanału. Dokładna kolejność zegarów, mnożniki zegara timera, tryby wyrównania i dostępne kanały zależą od konkretnego MCU. Schemat zegarowy oraz reference manual mają pierwszeństwo przed ogólnym przykładem.
Timer zaawansowany może mieć wyjścia komplementarne, dead-time i wejście break przeznaczone do sterowania mostkiem mocy. Wyjście serwa zwykle potrzebuje prostszego kanału. Nie należy jednak automatycznie uznawać każdego pinu oznaczonego TIMx_CHy za dostępny: może być współdzielony z inną funkcją, niedoprowadzony na złącze albo zajęty przez inny sterownik.
Prescaler, okres i compare#
Dla popularnego modelu licznika zliczającego w górę:
f_counter = f_timer / (PSC + 1)
f_frame = f_counter / (ARR + 1)
ticks_on = t_on · f_counter
Jeżeli licznik ma takt 1 MHz, jeden takt odpowiada 1 µs. Ramka 20 ms wymaga 20 000 taktów, więc ARR + 1 = 20000. Impuls 1500 µs odpowiada wartości compare 1500. Taka konfiguracja jest czytelna diagnostycznie i daje rozdzielczość 1 µs.
Nie wolno podstawiać częstotliwości rdzenia bez sprawdzenia drzewa zegarów. Timer może być taktowany z innej magistrali niż CPU, a ustawienia preskalera magistrali mogą w niektórych MCU zmieniać efektywny zegar peryferium. Błąd dwukrotny prowadzi do ramki 25 lub 100 Hz zamiast 50 Hz i do impulsów dwa razy dłuższych albo krótszych.
Wartość okresu jest o jeden większa od maksymalnej wartości licznika, ponieważ licznik obejmuje zero. To klasyczny błąd off-by-one. Przy długiej ramce różnica jednego taktu jest niewielka, ale jednolity model obliczeń zapobiega problemom przy wyższych częstotliwościach.
Rozdzielczość i kwantyzacja#
Rozdzielczość czasu wynosi:
Δt = 1 / f_counter
Przy 1 MHz jest to 1 µs; przy 10 MHz — 0,1 µs. Zwiększanie częstotliwości licznika poprawia kwantyzację, ale wymaga większej wartości okresu. Timer 16-bitowy mieści maksymalnie 65 536 stanów. Dla ramki 20 ms licznik 10 MHz potrzebowałby 200 000 taktów i nie zmieści się bez dodatkowego preskalera albo licznika 32-bitowego.
Liczba użytecznych poziomów w zakresie serwa jest w przybliżeniu:
N = (max_us - min_us) / Δt + 1
Dla zakresu 1000 µs i kroku 1 µs otrzymujemy około 1001 poziomów, czyli niecałe 10 bitów efektywnej rozdzielczości. Większa rozdzielczość rejestru nie ma znaczenia, jeśli mechanika ma luzy, serwo martwą strefę, a pomiar pozycji jest zaszumiony. Kryterium dobiera się do wymaganej dokładności powierzchni sterowej i dynamiki, nie do największej możliwej liczby taktów.
Zaokrąglanie powinno być jawne. Stałe obcięcie w dół wprowadza mały bias. Konwersja przez liczby całkowite wymaga kolejności działań unikającej przepełnienia. W systemie krytycznym testuje się wartości minimalną, maksymalną, środkową oraz o jeden krok poza zakresem.
Aktualizacja synchroniczna#
Bez bufora zmiana rejestru compare w trakcie ramki może utworzyć impuls o niezamierzonej długości. Jeśli licznik już minął nową wartość, zbocze może nie wystąpić aż do następnego okresu. Rejestry preload/shadow pozwalają zapisać nową komendę, ale przenieść ją do aktywnego compare dopiero przy zdarzeniu update na granicy ramki.
Poprawny wzorzec wygląda następująco:
- regulator i mikser obliczają cały wektor aktuatorów;
- warstwa ograniczeń sprawdza zakresy i stan uzbrojenia;
- wszystkie wartości trafiają do bufora ramki;
- DMA lub krótka sekcja krytyczna zapisuje rejestry preload;
- timer publikuje kanały przy wspólnym zdarzeniu update;
- licznik sekwencji i znacznik czasu trafiają do logu.
DMA ma wartość szczególnie wtedy, gdy wiele kanałów albo zmienna sekwencja impulsów wymaga deterministycznego transferu. Nie jest jednak automatycznym lekarstwem: zła konfiguracja źródła, długości lub zdarzenia DMA może cyklicznie wysyłać stare dane. Nadzór powinien potwierdzać postęp numeru bufora i czas ostatniej aktualizacji.
Grupy timerów#
Kilka fizycznych wyjść bywa kanałami jednego timera. Dzielą wtedy okres i preskaler, choć mają osobne wartości compare. PX4 jawnie opisuje grupowanie wyjść według timerów: kanały należące do jednej grupy muszą korzystać z tego samego protokołu i częstotliwości. Ta własność pochodzi ze sprzętu, a nie z interfejsu użytkownika.
Konsekwencje projektowe:
- serwo wymagające 50 Hz i ESC pracujący z szybszą ramką nie powinny trafić do tej samej grupy;
- przełączenie protokołu jednego kanału może zmienić całą grupę;
- liczba złączy nie jest równa liczbie niezależnych generatorów czasu;
- mapę timer–kanał–pin trzeba utrzymywać razem ze schematem PCB;
- test regresyjny powinien objąć wszystkie wyjścia po zmianie jednego parametru.
W kontrolerach z procesorem wejścia/wyjścia część kanałów może powstawać w osobnym MCU. Daje to możliwość podtrzymania bezpiecznych funkcji po awarii głównego procesora, ale tworzy dodatkową granicę protokołu, kolejkę i źródło opóźnienia. Dokumentacja konkretnej płyty rozstrzyga, które wyjścia mają którą ścieżkę.
Mapowanie funkcji na wyjścia#
Numer złącza jest zasobem elektrycznym; funkcja aktuatora jest rolą logiczną. ArduPilot i PX4 oddzielają te pojęcia, pozwalając przypisać silnik, lotkę, ster kierunku, gimbal lub funkcję pomocniczą do obsługiwanego kanału. Dzięki temu geometria platformy nie jest zaszyta w sterowniku timera.
Warstwy mapowania można zapisać tak:
kontroler osi / misji
↓ żądanie funkcji
mixer / control allocation
↓ wartości aktuatorów
limity + arming + failsafe
↓ mikrosekundy/protokół
driver grupy timerów
↓ compare
pin i złącze
Konfiguracja musi być spójna ze schematem wiązki. Opis motor 1 bez wskazania orientacji, kierunku obrotu i złącza nie wystarcza do serwisu. Dla powierzchni sterowych potrzebne są nazwa powierzchni, strona płatowca, znak wychylenia dodatniego i ograniczenia mechaniczne.
Zmianę mapowania traktuje się jak zmianę konfiguracji sterowania: wymaga testu bez śmigieł, kontroli kierunków i zapisania wersji parametrów. Nie należy przepinać kanałów „aż zacznie działać”, bo można ukryć błąd miksera lub odwrócenia.
Min, max, trim i odwrócenie#
min, max i trim mają różne znaczenia:
minimaxograniczają dozwoloną komendę elektryczną;trimokreśla neutralną wartość funkcji dwukierunkowej;- odwrócenie zmienia znak mapowania logicznego;
- ograniczenie mechaniczne może być węższe od zdolności elektrycznej serwa;
- limit prędkości lub slew-rate ogranicza zmianę w czasie, a nie pozycję.
Odwrócenie nie powinno być realizowane zamianą min z max w przypadkowych miejscach kodu. Powinno wystąpić w jednej, testowalnej transformacji. Dla silnika jednokierunkowego wartość minimalna może oznaczać stop, natomiast dla napędu odwracalnego środek może oznaczać zero momentu. Użycie niewłaściwego typu funkcji jest poważniejsze niż drobna niedokładność impulsu.
Po ograniczeniu należy wykrywać NaN, nieskończoność i utratę świeżości danych. Funkcja constrain() nie naprawi NaN, jeśli porównania zwracają fałsz i wartość przejdzie do konwersji całkowitoliczbowej w sposób zależny od implementacji. Każdy kanał powinien mieć zdefiniowaną wartość dla danych niepoprawnych.
Stany podczas startu i resetu#
Pin MCU po resecie często zaczyna jako wejście o wysokiej impedancji. Bootloader, inicjalizacja GPIO i uruchomienie timera zajmują czas. W tym oknie odbiornik może widzieć brak sygnału, zakłócenia albo stan wymuszony przez rezystor. Jeśli pin ma alternate function dopiero po konfiguracji, kolejność ustawień decyduje, czy pojawi się krótki impuls.
Bezpieczna sekwencja:
- sprzętowe pull-down/pull-up ustala nieaktywny stan zgodny z odbiornikiem;
- firmware wczytuje sprawdzoną konfigurację kanałów;
- rejestry okresu i compare otrzymują wartości disarmed;
- flagi przerwań i zdarzeń są czyszczone;
- dopiero wtedy pin przechodzi do funkcji timera i włącza się wyjście;
- stan armed jest możliwy po zakończeniu pre-arm checks.
Po watchdog reset system powinien wrócić do stanu nieuzbrojonego, chyba że architektura lotnicza ma jawnie przeanalizowany mechanizm podtrzymania przez osobny procesor I/O. Sam restart głównego firmware nie może wygenerować maksimum na kanale przez domyślną wartość rejestru.
Failsafe#
Failsafe wyjścia to decyzja systemowa, nie jedna liczba PWM. Dla każdego kanału określa się zachowanie przy:
- utracie RC;
- utracie łącza GCS;
- przedawnieniu komendy companion computera;
- awarii estymatora lub przekroczeniu limitów;
- zablokowaniu głównej pętli;
- resecie MCU lub procesora I/O;
- utracie zasilania serw przy działającym FC;
- przerwaniu przewodu sygnałowego.
Możliwe działania to utrzymanie ostatniej wartości przez krótki, ograniczony czas, przejście do neutralnej pozycji, ustawienie zdefiniowanego położenia awaryjnego albo zaprzestanie generacji impulsów. To ostatnie nie zawsze znaczy „bezpiecznie”: niektóre urządzenia utrzymują poprzednią komendę, inne przechodzą w lokalny failsafe, a jeszcze inne zachowują się nieokreślenie. Zachowanie odbiornika należy zmierzyć.
Deadline powinien być liczony od znacznika świeżości źródła, nie od tego, że sterownik timera nadal cyklicznie odtwarza rejestr. Sprzęt może bezbłędnie generować stary impuls przez wiele minut, podczas gdy software sterowania dawno się zatrzymał. Watchdog wyjść musi mieć niezależną obserwację postępu danych.
Jitter i opóźnienie#
Jitter szerokości impulsu jest zmianą czasu aktywnego przy stałej komendzie. Jitter okresu jest zmianą odstępu między ramkami. Opóźnienie end-to-end obejmuje więcej etapów:
próbka IMU → estymator → regulator → mixer → kolejka drivera
→ granica ramki PWM → odbiornik → mechanika
Nawet idealny timer nie usuwa oczekiwania na następną granicę ramki. Dla 50 Hz dodatkowe oczekiwanie wynosi od prawie zera do 20 ms. Dlatego szybkie napędy multirotorów przeszły do szybszych protokołów. W serwach płatowca częstotliwość dobiera się jednak do aktuatora i dynamiki, nie tylko do chęci zmniejszenia latency.
Źródła jittera:
- programowe przełączanie GPIO;
- zapis compare bez preload;
- długie sekcje krytyczne i wyłączone przerwania;
- konkurencja DMA lub błędny priorytet magistrali;
- niedokładny albo zmienny zegar;
- asynchroniczne kopiowanie kanałów różnych timerów;
- konwersje jednostek z niestabilnym zaokrągleniem;
- opóźnienie procesora I/O lub transportu między MCU.
Pomiar powinien podawać rozkład, minimum, maksimum, percentyle i warunki obciążenia CPU, a nie jedną obserwację z oscyloskopu.
Warstwa elektryczna#
Szerokość impulsu nie definiuje poziomów logicznych. Flight controller może generować 3,3 V, a starszy odbiornik może oczekiwać 5 V. Wiele wejść poprawnie rozpoznaje 3,3 V, ale trzeba to potwierdzić dla konkretnego urządzenia. Określenie „5 V servo” zwykle dotyczy zasilania, niekoniecznie progu wejścia sygnałowego.
Do specyfikacji należą:
- napięcie stanu niskiego i wysokiego nadajnika;
- progi
VILiVIHodbiornika; - maksymalne napięcie pinu MCU;
- typ wyjścia push-pull albo open-drain;
- prąd wejścia i pojemność przewodu;
- polaryzacja oraz wspólna masa;
- odporność na stan odbiornika zasilonego przy wyłączonym FC i odwrotnie.
Brak wspólnej referencji masy jest częstą przyczyną niestabilnego działania. Jednocześnie bezmyślne łączenie mas w wielu miejscach może tworzyć pętle, przez które płyną prądy serw lub napędu. Schemat powinien rozdzielać powrót dużego prądu od referencji sygnałowej i kontrolować miejsce ich połączenia.
Bufor poziomów bywa potrzebny przy długich przewodach, wielu równoległych wejściach albo niezgodnych progach. Musi zachować czasy zboczy i bezpieczne zachowanie po wyłączeniu jednej domeny zasilania. Automatyczny dwukierunkowy translator przeznaczony do wolnej magistrali open-drain nie jest domyślnie dobrym buforem PWM push-pull.
Zasilanie serw#
Trzyżyłowe złącze sugeruje jeden interfejs, ale sygnał i zasilanie są oddzielnymi torami. W wielu autopilotach szyna serw nie jest zasilana przez flight controller. BEC lub osobny zasilacz musi dostarczyć napięcie i prąd wymagany przez wszystkie aktuatory.
Prąd serwa jest impulsowy. Rozruch, szybka zmiana kierunku i kontakt z ogranicznikiem mogą dawać wielokrotność prądu ruchu bez obciążenia. Wspólny BEC dobiera się z zapasem na najgorszą kombinację ruchów, temperaturę i spadek napięcia w przewodach. Pojemność lokalna ogranicza krótkie zapady, ale nie naprawia zbyt słabego źródła.
Brownout szyny może wywołać jednoczesny restart wielu serw. Po powrocie napięcia każde wykonuje impuls prądowy i próbuje wrócić do zadanej pozycji, tworząc oscylację zasilania. Flight controller może nadal poprawnie generować PWM i nie wiedzieć, że aktuatory się resetują. Pomiar napięcia/prądu szyny oraz sygnał power-good zwiększają obserwowalność.
Zasilanie payloadu i serw nie powinno wprowadzać zakłóceń do analogowych sensorów oraz GNSS. Układ mas, filtracja, prowadzenie przewodów i zabezpieczenia należy rozpatrywać dla całej platformy.
Integralność sygnału i EMC#
PWM ma małą przepływność informacyjną, ale strome zbocza zawierają składowe wysokoczęstotliwościowe. Długi, nieekranowany przewód biegnący równolegle do faz silnika może odbierać zakłócenia. Krótki fałszywy impuls lub przesunięcie progu może zostać zinterpretowane jako inna szerokość.
Praktyki projektowe:
- prowadzić sygnał z referencją masy i ograniczać powierzchnię pętli;
- oddzielać wiązkę od faz silnika, przewodów baterii i przetwornic;
- stosować kontrolowane miejsce połączenia mas;
- rozważyć mały rezystor szeregowy przy nadajniku dla tłumienia ringing;
- użyć bufora lub transmisji różnicowej na nietypowo długich odcinkach;
- nie dobierać filtra RC tak dużego, aby przesuwał próg zbocza o istotne mikrosekundy;
- testować przy maksymalnym prądzie napędu i ruchu serw.
Oscyloskop należy podłączać z krótkim przewodem masowym. Długi krokodylek sondy sam tworzy antenę i może pokazać ringing, którego w rzeczywistym odbiorniku nie ma. Sondowanie układu napędowego wymaga też uwzględnienia kategorii przepięciowej, izolacji i różnicy potencjałów; zwykła masa oscyloskopu nie może zostać przypadkowo zwarta z fazą.
OneShot, Multishot i DShot#
OneShot i Multishot skracają czas impulsu oraz ramkę w porównaniu z klasycznym sterowaniem ESC. Nadal kodują wartość czasem impulsu, dlatego wymagają dokładnego timingu i właściwego trybu wyjścia. Ich zakresów nie należy zgadywać na podstawie nazwy — firmware oraz dokumentacja ESC określają format.
DShot jest protokołem cyfrowym. Wartość jest kodowana słowem bitowym z kontrolą integralności, a nie analogową długością pojedynczego impulsu komendy. Nadal może wykorzystywać timer i DMA do precyzyjnego generowania przebiegu, lecz semantycznie oraz diagnostycznie nie jest „szybszym PWM”. Zalety obejmują brak kalibracji analogowych endpointów i wykrywanie części błędów transmisji.
Wspólna grupa timerów może ograniczać mieszanie protokołów. Przed przypisaniem DShot jednemu wyjściu trzeba sprawdzić, czy pozostałe kanały tej grupy nie obsługują serw. Dokumentacja PX4 wskazuje to w konfiguracji aktuatorów; podobne ograniczenie wynika z peryferiów również w innych firmware.
Szczegółowe kodowanie i telemetrię opisuje osobny artykuł DShot w UAV.
Pomiar input capture#
Timer może nie tylko generować, ale też mierzyć PWM. W trybie input capture sprzęt zapisuje stan licznika przy zboczu. Różnica dwóch znaczników daje szerokość impulsu, a różnica kolejnych zboczy tego samego typu — okres.
t_rise[n] = capture rising edge
t_fall[n] = capture falling edge
high_ticks = t_fall[n] - t_rise[n]
period = t_rise[n+1] - t_rise[n]
Odejmowanie musi poprawnie obsługiwać przepełnienie licznika. Dla licznika bez znaku o rozmiarze potęgi dwóch naturalna arytmetyka modulo często daje poprawny wynik, o ile między zdarzeniami nie wystąpiło więcej niż jedno nieobsłużone przepełnienie. Dłuższe przerwy wymagają licznika epok albo osobnego timeoutu.
Pomiar można zrealizować dwoma kanałami wyzwalanymi przeciwnymi zboczami, zmianą polaryzacji jednego kanału lub sprzętowym trybem PWM input. Wybór zależy od MCU. DMA pozwala zbierać serię próbek bez jittera przerwań. Microchip AVR135 pokazuje użycie capture do pomiaru wypełnienia; dla sygnału serwa interesuje nas przede wszystkim czas wysoki w jednostkach bezwzględnych.
Walidator wejścia powinien sprawdzać zarówno szerokość, jak i okres. Impuls 1500 µs powtarzany co 500 ms może być poprawną liczbą, ale nie świeżą komendą sterującą. Osobny timeout wykrywa całkowity brak zboczy.
Diagnostyka oscyloskopem#
Minimalny pomiar obejmuje dwa kanały: sygnał PWM przy flight controllerze i ten sam sygnał przy odbiorniku albo napięcie szyny serw. Przy problemie dynamicznym warto dodać linię debug GPIO ustawianą w chwili publikacji wyniku regulatora. Pozwala to oddzielić latency software od oczekiwania na ramkę i propagacji elektrycznej.
Należy zmierzyć:
- szerokość impulsu dla minimum, trim i maksimum;
- okres oraz jego rozrzut;
- poziomy napięcia i czasy zboczy;
- overshoot, undershoot i ringing;
- zachowanie w trakcie bootu, armingu, disarmingu i resetu;
- reakcję na utratę źródła komendy;
- korelację z ruchem serw, prądem BEC i pracą napędu;
- różnicę czasową między kanałami jednej ramki.
Analizator logiczny jest wygodny dla długiego zapisu, ale jego próg wejściowy ukrywa jakość analogową. Oscyloskop ujawnia wolne zbocze i spadek poziomu, lecz zwykle ma krótszy rekord. Najlepsza diagnoza łączy oba przyrządy lub zapisuje timestampy input capture w samym systemie.
Wynik „około 1500 µs” nie wystarcza. Raport powinien podać podstawę czasu, próg pomiaru, liczbę ramek, min/max/percentyle, temperaturę, obciążenie CPU i stan napędu.
Kalibracja#
Kalibrację wykonuje się na nieuzbrojonym stanowisku, etapami:
- potwierdzenie poprawnego mapowania funkcji i kanału;
- ustawienie mechanicznego neutralnego położenia dźwigni;
- mały zakres elektryczny wokół trim;
- powolne zwiększanie wychylenia przy obserwacji prądu i mechaniki;
- zapis bezpiecznych
minimaxprzed fizycznymi ogranicznikami; - sprawdzenie kierunku dla dodatniej komendy osi;
- test przy obciążeniu aerodynamicznym zastępczym lub obliczonym;
- weryfikacja failsafe i zaniku zasilania.
Nie kalibruje się mechaniki poprzez wielokrotne dobijanie do końca. Dźwignię na wieloklinie ustawia się możliwie blisko neutralnego punktu, a trim służy do małej korekty. Cięgła powinny zachować wymaganą geometrię i nie przechodzić przez martwy punkt.
Dla ESC procedura zależy od firmware i protokołu. DShot nie wymaga kalibracji endpointów tak jak analogowy sygnał impulsowy. W przypadku PWM sprawdza się udokumentowany zakres wejściowy oraz to, czy minimum rzeczywiście zatrzymuje napęd we wszystkich stanach. Test rozpoczyna się bez śmigieł.
Implementacja firmware#
Warstwa sterownika powinna przyjmować kompletną ramkę i znacznik czasu, a nie serię niezależnych wywołań „ustaw kanał”. Przykładowy bezpieczny interfejs:
typedef struct {
uint16_t pulse_us[8];
uint32_t source_timestamp_us;
uint32_t sequence;
bool armed;
} actuator_frame_t;
bool pwm_submit(const actuator_frame_t *frame)
{
if (frame == NULL || !source_is_fresh(frame->source_timestamp_us)) {
return pwm_request_failsafe();
}
uint16_t shadow[8];
for (unsigned i = 0; i < 8; ++i) {
uint16_t value = frame->armed ? frame->pulse_us[i] : disarmed_us[i];
if (value < safe_min_us[i] || value > safe_max_us[i]) {
return pwm_request_failsafe();
}
shadow[i] = us_to_ticks(value);
}
return timer_commit_at_update(shadow, frame->sequence);
}
Kod jest szkicem interfejsu, nie gotowym sterownikiem. Produkcyjna implementacja obsługuje grupy timerów, atomowość, timeout, przepełnienia, błąd DMA, zwrot z failsafe, błędy konfiguracji i testy wartości granicznych. source_is_fresh() korzysta z monotonicznego zegara, nie z czasu ściennego.
Bit armed nie powinien być jedyną barierą. Warstwa bezpieczeństwa sprawdza poprawność konfiguracji, stan estymatora, zgodę operatora oraz interlock. Wyjście diagnostyczne może publikować żądaną i faktycznie zaprogramowaną szerokość, numer sekwencji oraz czas ostatniego update.
Programowe opóźnienia typu delayMicroseconds() i ręczne przełączanie GPIO blokują wykonanie i tworzą jitter zależny od przerwań. Nadają się najwyżej do prostego eksperymentu laboratoryjnego, nie do wielokanałowego flight controllera.
Przykład obliczeniowy STM32#
Załóżmy timer taktowany rzeczywiście 84 MHz, licznik 16-bitowy i żądaną ramkę 50 Hz. Chcemy krok 1 µs:
PSC + 1 = 84 → f_counter = 1 MHz
ARR + 1 = 20 000 → f_frame = 50 Hz
CCR(min) = 1000 → 1000 µs
CCR(trim) = 1500 → 1500 µs
CCR(max) = 2000 → 2000 µs
Jeżeli reference manual definiuje aktywność kanału dla CNT < CCR, powyższa zależność jest bezpośrednia. Inny tryb PWM lub polaryzacja może odwrócić przebieg. Po konfiguracji należy zmierzyć rzeczywisty czas, bo błąd źródła zegara oraz niepoprawne założenie o zegarze magistrali nie są widoczne w samych rejestrach.
Gdy na tym samym timerze ma działać serwo 50 Hz i urządzenie wymagające 400 Hz, wspólny ARR uniemożliwia niezależne okresy. Rozwiązaniem jest przeniesienie jednego kanału do innego timera, użycie innego protokołu lub wybór zgodnego aktuatora — nie chaotyczna zmiana compare.
Przy kroku 0,5 µs licznik działałby z 2 MHz, a okres wymagał 40 000 taktów, nadal mieszcząc się w 16 bitach. Krok 0,1 µs wymagałby 200 000 taktów i nie zmieściłby się. To pokazuje kompromis między rozdzielczością a zakresem.
Plan testów#
Testy statyczne firmware#
- konwersja mikrosekund na takty dla min/trim/max;
- zaokrąglenie i wartości o jeden takt od granicy;
- wykrywanie
NaN, overflow i nieaktualnego timestampu; - mapowanie oraz odwrócenie każdego kanału;
- konflikt protokołów/częstotliwości w jednej grupie timera;
- stan disarmed i failsafe dla każdej funkcji.
Testy HIL i elektryczne#
- co najmniej tysiąc ramek przy małym i maksymalnym obciążeniu CPU;
- równoczesna aktywność SPI, UART, logowania i DMA sensorów;
- pomiar min/max/percentyli jittera;
- reset software, watchdog reset i cykl zasilania;
- zanik źródła komendy oraz uszkodzenie strumienia;
- test poziomów przy minimalnym i maksymalnym napięciu zasilania;
- test długiej wiązki i zakłóceń od ESC/przetwornic.
Testy mechaniczne#
- kierunek i neutralne położenie bez obciążenia;
- dojazd do bezpiecznych końców bez kontaktu z ogranicznikiem;
- prąd przy szybkim ruchu wielu serw;
- temperatura BEC, przewodów i aktuatorów;
- zachowanie po chwilowym zapadzie szyny;
- pełna procedura awaryjna z bezpiecznym obciążeniem zastępczym.
Test regresyjny konfiguracji#
Po aktualizacji firmware albo parametrów automatycznie porównuje się mapę funkcji, częstotliwości grup, min/max/trim, wartości disarmed/failsafe i typ protokołu z zatwierdzonym manifestem platformy. Zmiana jednego kanału może wpływać na całą grupę timerów.
Typowe błędy#
| objaw | prawdopodobna przyczyna | pomiar rozstrzygający |
|---|---|---|
| serwo drży przy stałej komendzie | jitter, zakłócenia, słabe zasilanie lub luz mechaniczny | jednoczesny zapis PWM, szyny i pozycji |
| wszystkie serwa resetują się przy ruchu | przeciążony BEC lub spadek na przewodach | napięcie i prąd przy złączach serw |
| tylko część kanałów ma złą częstotliwość | błędna grupa timera lub clock tree | rejestry PSC/ARR i pomiar okresu |
| zmiana jednego wyjścia psuje inne | wspólny timer/protokół | mapa timer–kanał–pin |
| po resecie występuje skok | niebezpieczna inicjalizacja GPIO/compare | zapis od włączenia zasilania |
| wartość neutralna nie daje neutralnej mechaniki | złe ustawienie dźwigni albo trim | pomiar geometrii i impulsu |
| sygnał poprawny przy FC, zły przy serwie | masa, kabel, poziomy lub ringing | sonda na obu końcach wiązki |
| ESC nie startuje mimo poprawnego zakresu | arming sequence, zły protokół lub częstotliwość | dokumentacja ESC i dekodowany przebieg |
| wyjście nadal działa po zatrzymaniu pętli | timer odtwarza stary compare bez freshness watchdog | numer sekwencji i timestamp źródła |
| okres jest dwa razy inny | błędne założenie o zegarze timera | clock tree i pomiar częstotliwości |
Najpierw rozdziela się domeny: komenda logiczna, rejestr timera, sygnał przy pinie, sygnał przy odbiorniku, napięcie zasilania i ruch mechaniczny. Zmiana kilku parametrów naraz utrudnia znalezienie przyczyny.
Kryteria odbioru#
| obszar | przykładowe kryterium |
|---|---|
| semantyka | dla każdego kanału opisano jednostkę, zakres, polaryzację i funkcję |
| timing | okres i szerokość mieszczą się w budżecie dla wszystkich obciążeń CPU |
| synchronizacja | kanały napędu publikują spójną ramkę w określonym oknie |
| rozdzielczość | kwantyzacja jest mniejsza od przydzielonego błędu aktuatora |
| grupy timerów | nie występuje konflikt częstotliwości lub protokołów |
| start/reset | brak niezamierzonego impulsu przy boot, reset i brownout |
| failsafe | stary sygnał nie jest odtwarzany po przekroczeniu deadline |
| elektryka | poziomy, masa i zbocza spełniają marginesy odbiornika |
| zasilanie | BEC przechodzi najgorszą kombinację ruchu bez resetu |
| EMC | napęd i przetwornice nie przekraczają limitu jittera/błędów |
| konfiguracja | manifest min/max/trim/disarmed/failsafe jest wersjonowany |
| diagnostyka | log zawiera żądanie, wartość wyjściową, sekwencję i timestamp |
PWM jest interfejsem prostym dopiero po zamknięciu całego łańcucha wymagań. Timer może generować idealny impuls, a aktuator nadal zachowywać się źle wskutek zasilania, błędnej geometrii, niezgodnej częstotliwości lub starej komendy. Kwalifikacja musi objąć sygnał, energię, firmware i mechanikę razem.
Powiązane tematy#
- Serwa dla UAV
- Dobór ESC
- DShot w UAV
- Flight controller — jak działa
- Harmonogram czasu rzeczywistego flight controllera
- Failsafe jako maszyna stanów
- Architektura zasilania flight controllera
- EMI/EMC w kontrolerze lotu
Przypisy#
- STMicroelectronics, AN4776: General-purpose timer cookbook for STM32 microcontrollers, https://www.st.com/resource/en/application_note/an4776-generalpurpose-timer-cookbook-for-stm32-microcontrollers-stmicroelectronics.pdf (dostęp: 15 sierpnia 2026).
- PX4, Actuator Configuration and Testing, https://docs.px4.io/main/en/config/actuators (dostęp: 15 sierpnia 2026).
- PX4, Parameter Reference — PWM output configuration, https://docs.px4.io/main/en/advanced_config/parameter_reference (dostęp: 15 sierpnia 2026).
- ArduPilot, Autopilot Output Functions, https://ardupilot.org/copter/docs/common-rcoutput-mapping.html (dostęp: 15 sierpnia 2026).
- Microchip, AVR135: Using Timer Capture to Measure PWM Duty Cycle, https://ww1.microchip.com/downloads/en/Appnotes/Atmel-8014-Using-Timer-Capture-to-Measure-PWM-Duty-Cycle_ApplicationNote_AVR135.pdf (dostęp: 15 sierpnia 2026).
- Microchip, AN2682: Using the AVR128DA48 TCA to Generate PWM Waveforms, https://www.microchip.com/en-us/application-notes/an2682 (dostęp: 15 sierpnia 2026).
Źródła z centralnego rejestru
- STMicroelectronics AN4776: General-purpose timer cookbook for STM32 microcontrollers [nota aplikacyjna producenta]
- PX4 Guide: Actuator Configuration and Testing [dokumentacja projektu open source]
- PX4 Parameter Reference: PWM output configuration [dokumentacja projektu]
- ArduPilot: Autopilot Output Functions [dokumentacja projektu]
- Microchip AVR135: Using Timer Capture to Measure PWM Duty Cycle [nota aplikacyjna producenta]
- Microchip AN2682: Using the AVR128DA48 TCA to Generate PWM Waveforms [nota aplikacyjna producenta]
- Terry Kilby, Belinda Kilby, „Make: Drony dla początkujących” [książka]
- Sumit Sharma, „Drone Development from Concept to Flight” [książka]