Po co dziś budować kontroler na 8051#

Rdzeń MCS‑51 jest radykalnie skromniejszy od STM32, ale właśnie dlatego dobrze odsłania mechanikę kontrolera lotu. Nie ma RTOS, FPU, rozbudowanego DMA ani gotowej warstwy autopilota. Konstruktor musi policzyć czas każdej operacji, wybrać reprezentację liczb, ustalić priorytety przerwań i świadomie zrezygnować z funkcji, które nie mieszczą się w budżecie.

To także rozsądny eksperyment z odpornością łańcucha dostaw: kompatybilne układy 8051 produkowało wielu dostawców, są obecne w starych urządzeniach i można je programować prostymi narzędziami. Nie oznacza to, że każdy odzyskany egzemplarz nadaje się do lotu. Nieznane zużycie, brak identyfikowalności i podróbki zwiększają potrzebę testów.

AT89S52 jest nadal oznaczany przez Microchip jako układ produkowany. Ma 8 KiB Flash ISP, 256 bajtów RAM, 32 linie I/O, trzy 16-bitowe timery, UART i watchdog. Nie ma sprzętowego I²C, SPI, ADC ani jednostki zmiennoprzecinkowej. Ta konkretna konfiguracja pozwala zbudować regulator laboratoryjny, ale nie pełny współczesny autopilot z EKF, GNSS, logami i siecią.

Najpierw określ minimalną funkcję#

Najmniejszy sensowny zakres to stabilizacja prędkości kątowej trzech osi:

  1. odebrać cyfrową próbkę żyroskopu;
  2. odjąć bias i przeskalować wynik;
  3. odebrać wartości zadane ze źródła testowego lub odbiornika;
  4. policzyć trzy regulatory PI/PID;
  5. wykonać mikser czterech wyjść;
  6. wygenerować sygnały dla emulatora ESC;
  7. wykryć starą próbkę, błąd magistrali i przekroczenie czasu pętli.

Estymacja pozycji, lot autonomiczny, zapis na kartę i wideo nie należą do tej rewizji. Filtr komplementarny orientacji można dodać dopiero po ustabilizowaniu szybkiej pętli rate.

Architektura z prostych bloków#

stabilizator 5 V ─┬─ AT89S52 + kwarc + reset + ISP
                  └─ stabilizator 3,3 V ─ IMU

IMU ── bit-bang I²C/SPI ─→ próbka gyro ─→ PID Q-format ─→ mikser
UART ─→ wejście testowe / diagnostyka                    └─→ timery ─→ ESC emulator

Napięcia są krytyczne. Klasyczny AT89S52 pracuje w domenie 5 V, a wiele współczesnych IMU nie toleruje 5 V na wejściach. Potrzebne są właściwe translatory poziomów albo sensor/moduł z jednoznacznie udokumentowaną tolerancją. Rezystor szeregowy nie jest uniwersalnym translatorem.

Minimalna płytka MCU wymaga odsprzęgania przy pinach zasilania, poprawnego obwodu resetu, kwarcu z dobranymi kondensatorami, złącza ISP i zdefiniowanych stanów wyjść. ESC nie może otrzymać aktywnego polecenia podczas resetu.

Budżet czasu#

W klasycznym 8051 cykl maszynowy obejmuje 12 okresów oscylatora; nowsze pochodne mogą wykonywać instrukcje w jednym lub kilku taktach. Dlatego częstotliwość kwarcu nie jest bezpośrednio liczbą instrukcji na sekundę. Budżet trzeba liczyć dla konkretnego datasheetu i kompilatora.

Dla pętli 250 Hz okres wynosi 4 ms. Przykładowy budżet:

Zadanie Limit projektu
transakcja IMU 900 µs
skalowanie i filtr 350 µs
trzy regulatory 450 µs
mikser i ograniczenia 200 µs
obsługa wejścia 300 µs
rezerwa na przerwania i diagnostykę 800 µs
niewykorzystany margines 1000 µs

To nie są parametry AT89S52, lecz przykładowe wymagania do zmierzenia analizatorem logicznym. Jeżeli bit-bang magistrali zabiera 2,5 ms, nie „optymalizuje się PID”; najpierw zmniejsza liczbę bajtów, częstotliwość pętli albo wybiera pochodną ze sprzętowym interfejsem.

Pin diagnostyczny ustawiany na początku i zerowany na końcu pętli pozwala zmierzyć czas oraz jitter:

void control_tick(void) interrupt 1 {
    DEBUG_PIN = 1;
    tick_due = 1;
    DEBUG_PIN = 0;
}

Samo liczenie całej regulacji w przerwaniu jest złym początkiem: blokuje UART i generowanie wyjść. Przerwanie timera powinno ustawić znacznik, a pętla główna wykonać ograniczoną pracę i zgłosić przekroczenie deadline.

Arytmetyka stałoprzecinkowa#

float może być emulowany programowo i zużywać nieprzewidywalnie dużo czasu oraz pamięci. Dla regulatora wystarcza reprezentacja Q, np. Q8.8 albo Q12.4, dobrana do zakresu. Każda operacja potrzebuje analizy przepełnienia.

typedef signed long q16_t;

q16_t q_mul(q16_t a, q16_t b) {
    return (q16_t)((a * b) >> 8);  /* przykład Q8.8; sprawdź zakres long */
}

error = setpoint_rate - gyro_rate;
integral = clamp(integral + q_mul(ki, error), I_MIN, I_MAX);
output = clamp(q_mul(kp, error) + integral, OUT_MIN, OUT_MAX);

Kod jest szkicem do stanowiska, nie gotowym firmware. Na kompilatorze, w którym long ma 32 bity, iloczyn dwóch dużych Q8.8 może się przepełnić przed przesunięciem. Limity wejść należy wyprowadzić matematycznie i przetestować wartościami skrajnymi.

Regulator PI jest dobrym pierwszym celem. Człon D wymaga różniczkowania zaszumionego pomiaru i filtracji, co zwiększa koszt. Jeżeli mechanika i częstotliwość pętli nie uzasadniają D, prostszy regulator jest lepszy.

Odczyt IMU bez sprzętowego I²C#

AT89S52 wymaga programowej obsługi magistrali albo zewnętrznego kontrolera. Bit-bang I²C musi obsłużyć ACK/NACK, timeout przy linii trzymanej w stanie niskim i procedurę recovery. Pętla while (!SCL); bez limitu może zatrzymać sterowanie na zawsze.

Lepszym wyborem może być IMU z SPI i prosty programowy master, ponieważ nie występuje open-drain i arbitraż. Nadal trzeba kontrolować czas setup/hold oraz poziomy napięć. Dostępność konkretnego sensora nie powinna być zaszyta w regulatorze: sterownik ma zwracać ustandaryzowaną próbkę i flagi jakości.

Timery i cztery wyjścia#

Generowanie czterech klasycznych impulsów serwo można zrealizować harmonogramem zboczy jednego timera. Ustawienie wszystkich wyjść, a następnie ich wyłączanie w uporządkowanych terminach ogranicza liczbę przeładowań. DShot jest znacznie trudniejszy bez DMA i nie jest potrzebny w pierwszej rewizji.

Wyjścia najpierw podłącza się do analizatora logicznego lub emulatora ESC. Test sprawdza minimum, maksimum, brak nakładania, zachowanie po resecie i po zatrzymaniu pętli. Fizyczny napęd pojawia się dopiero po przejściu testów, bez śmigła.

RAM jako wymuszenie architektury#

256 bajtów RAM wyklucza duże bufory i rozbudowane logi. Dane można organizować jako małe struktury o jawnej szerokości. double, printf i dynamiczna alokacja nie mają tu miejsca. Diagnostyka przez UART może wysyłać binarne rekordy pojedynczo z kolejki długości dwóch–czterech elementów.

Mapa pamięci powinna znaleźć się w raporcie kompilatora. Jeżeli stos zbliża się do buforów statycznych, błąd może występować dopiero w zagnieżdżonym przerwaniu. Test „program się kompiluje” nie kontroluje najgorszego użycia stosu.

Jak wykorzystać układ 8051 z odzysku#

Układy zgodne z MCS‑51 trafiały przez dziesięciolecia do urządzeń konsumenckich, przemysłowych i biurowych. Można je spotkać między innymi w panelach sterowania, zabawkach, klawiaturach, urządzeniach audio-wideo, sprzęcie AGD, zasilaczach, sterownikach napędów i starszych modułach komunikacyjnych. Nie każdy układ z takim rdzeniem da się jednak wyjąć i zaprogramować jak AT89S52. Rdzeń procesora, rodzaj pamięci programu, obudowa i sposób programowania są osobnymi cechami.

Najpierw należy przepisać pełne oznaczenie z obudowy i znaleźć dokumentację konkretnego producenta. Sama zgodność z „8051” nie mówi, czy pamięć programu jest wielokrotnie zapisywalna.

Odmiana spotykana w starszym sprzęcie Pamięć programu Możliwość ponownego użycia
klasyczny 8051 z mask ROM program zapisany podczas produkcji wewnętrznego programu zwykle nie można zmienić; w wersji z wyprowadzoną magistralą możliwe bywa wykonanie kodu z zewnętrznej pamięci po ustawieniu wejścia EA
8031/8032 bez wewnętrznego ROM wymaga zewnętrznej pamięci programu nadaje się do nowego projektu, ale potrzebuje pamięci, zatrzasku magistrali i większej liczby połączeń
8751 z EPROM pamięć kasowana promieniowaniem UV w odpowiedniej obudowie możliwy do ponownego zaprogramowania, jeśli układ nie jest uszkodzony i dostępny jest właściwy programator oraz napięcia
pochodna OTP jednokrotnie programowalna odzyskany egzemplarz zazwyczaj zachowuje fabryczny program i nie nadaje się do zapisania nowym firmware
pochodna Flash, np. rodziny AT89 Flash równoległy albo ISP zależnie od modelu zwykle najbardziej praktyczna, o ile nie jest zablokowana i znany jest protokół programowania
układ aplikacyjny z rdzeniem 8051 pamięć i peryferia zależne od producenta może nie mieć publicznej dokumentacji, dostępu do programatora albo wszystkich potrzebnych wyprowadzeń

Podstawowy 8051 nie potrzebuje sprzętowego I²C, FPU ani RTOS, aby wykonywać prostą maszynę stanów. Po zapewnieniu pamięci programu, zegara, resetu i odpowiednich interfejsów może:

  • próbkować proste sygnały cyfrowe i impulsy czasowe;
  • odczytywać zewnętrzny przetwornik ADC albo sensor przez interfejs programowy;
  • realizować ograniczony regulator stałoprzecinkowy;
  • utrzymywać prosty stan lub kierunek w niskoenergetycznym, odzyskiwalnym demonstratorze;
  • sterować serwem lub generować klasyczne impulsy dla emulatora napędu;
  • po spełnieniu warunku ustawić GPIO, uruchamiając nieszkodliwą funkcję, na przykład migawkę kamery, znacznik LED, rejestrator pomiarowy albo przekaźnik na stanowisku laboratoryjnym.

To wystarcza do zbudowania edukacyjnego kontrolera, prostego autopilota stanowiskowego albo małego demonstratora poruszającego się według kilku stanów. Nie wystarcza automatycznie do wiarygodnego lotu: potrzebne pozostają sensory, aktuatory, zasilanie, interfejsy napięciowe, watchdog, testy deadline i poprawny płatowiec. Odzyskany mikrokontroler nie rozwiązuje problemów stateczności, środka ciężkości i awarii napędu.

Praktyczna kwalifikacja odzyskanego mikrokontrolera#

  1. Odczytaj pełne oznaczenie, producenta, suffix obudowy i kod daty.
  2. Ustal rodzaj pamięci: mask ROM, ROM-less, EPROM, OTP czy Flash.
  3. Sprawdź, czy dostępny jest datasheet, programator i opis bitów zabezpieczających.
  4. Obejrzyj wyprowadzenia pod kątem korozji, pęknięć i śladów przegrzania.
  5. Zasil układ z ograniczeniem prądu, bez podłączonych aktuatorów.
  6. Sprawdź oscylator, reset i pobór prądu.
  7. Jeżeli układ jest programowalny, wgraj minimalny test zmieniający stan jednego GPIO.
  8. Przetestuj wszystkie potrzebne timery, UART i linie I/O.
  9. Wykonaj wielogodzinny test temperatury, resetów i stabilności zegara.
  10. Nadaj elementowi własny identyfikator i zapisz wynik kwalifikacji w BOM.

Układ w obudowie DIP jest łatwiejszy do odzyskania niż drobny QFP. Wylutowanie może przegrzać strukturę, zerwać wyprowadzenie albo wprowadzić ESD. Jeżeli urządzenie było zasilane z sieci, przed demontażem trzeba je bezpiecznie odłączyć i rozładować kondensatory; część pierwotna zasilacza nie jest miejscem do nauki wylutowywania bez odpowiednich kwalifikacji.

Inne części, które można odzyskać#

W projekcie z zewnętrzną pamięcią przydatne mogą być także EPROM/Flash, zatrzaski adresu, SRAM, rezonatory, podstawki, transoptory, komparatory, proste ADC, złącza i elementy pasywne. Każdy element wymaga osobnego testu. Oznaczenie na obudowie nie potwierdza pojemności kondensatora, ESR, jakości styku ani stabilności regulatora.

Szczególnej ostrożności wymagają:

  • kondensatory elektrolityczne o nieznanym czasie pracy;
  • złącza i przekaźniki ze zużytymi stykami;
  • stabilizatory bez rozpoznanego pinoutu;
  • rezonatory po uszkodzeniu mechanicznym;
  • sensory MEMS podgrzane podczas demontażu;
  • elementy mocy bez informacji o wcześniejszych przeciążeniach;
  • pamięci i MCU z aktywną ochroną odczytu lub nieznanym firmware.

Odporność na brak konkretnego modelu części buduje się przez mały hardware abstraction layer, wersjonowany BOM, kwalifikowane zamienniki oraz test przyjęcia. Dla 8051 oznacza to na przykład oddzielenie sterownika sensora od regulatora, jawne częstotliwości zegara i osobny profil płytki dla wariantu z pamięcią zewnętrzną.

Migawka aparatu jako bezpieczna funkcja wykonawcza#

Pełny tor od żądania do wyjścia można sprawdzić na funkcji wyzwalania zewnętrznego aparatu. Firmware nie ustawia pinu bezpośrednio na czas trwania komendy. Wykrywa zbocze żądania, generuje impuls o ustalonej długości, przechodzi w okres blokady i zapisuje timestamp do logu. Utrata świeżej próbki, reset albo wyłączenie trybu laboratoryjnego natychmiast otwierają obwód.

Pin 8051 nie powinien być łączony bezpośrednio z aparatem lub telefonem. Steruje diodą transoptora przez rezystor, a fototranzystor zwiera wejście remote. Dla telefonu można pozostawić kompletny przewodowy selfie stick i dołączyć fototranzystor równolegle do jego przycisku. Zachowuje to fabryczny pinout TRRS oraz właściwą drabinkę rezystorów, której wartości różnią się między akcesoriami.

Implementacja znajduje się w git/fc-lab-mcs51. Test hostowy sprawdza, że stan po starcie jest otwarty, pojedyncze żądanie daje jeden impuls, przytrzymanie nie tworzy serii, a stara próbka wymusza przerwanie impulsu. Ten sam kontrakt stosują laboratoria STM32, Teensy, Z80 oraz 6502/Commodore/Atari.

Drabina uruchomienia#

  1. Miganie pinem i test timera na oscyloskopie.
  2. UART z numerem wersji i przyczyną resetu.
  3. Odczyt identyfikatora IMU i timeout magistrali.
  4. Surowe próbki na nieruchomym stanowisku.
  5. Kalibracja biasu i test znaku każdej osi.
  6. Jeden regulator osi połączony z symulowanym modelem.
  7. Trzy regulatory i mikser, nadal tylko na emulatorze.
  8. Test resetu, zablokowanej magistrali i starej próbki.
  9. Impuls migawki przez transoptor, najpierw mierzony analizatorem logicznym.
  10. Nieuzbrojona rama uwięziona w bezpiecznym stanowisku.

Każdy etap ma własne kryterium: maksymalny jitter, czas timeoutu, zakres liczbowy i stan wyjść. Dzięki temu konstrukcja z prostych części pozostaje projektem inżynierskim, a nie zbiorem przypadkowo działających fragmentów.

Gdzie kończy się sens AT89S52#

Granica pojawia się szybko przy wielosensorowym estymatorze, szybkim SPI, logach, protokołach cyfrowych ESC i kryptografii łącza. Można wybrać nowoczesną pochodną 8051 o większej wydajności, ale wtedy artykuł musi opisywać konkretny układ, a nie ogólną etykietę „8051”.

Najważniejszy rezultat takiego projektu nie brzmi „8051 jest wystarczający”. Brzmi: konstruktor potrafi policzyć minimalny system, zmierzyć jego ograniczenia i wskazać moment, w którym przejście na AVR, RP2040 lub STM32 jest wymaganiem, a nie modą.

Powiązane laboratorium#

Katalog git/fc-lab-mcs51 zawiera przenośny rdzeń Q8, testy hostowe, port SDCC, emulator ESC, scenariusz HIL, przykładowy log i moduł migawki. make test nie wymaga cross-kompilatora; kompilacja prawdziwego targetu wymaga SDCC oraz pliku startowego i definicji rejestrów konkretnego wariantu MCS‑51.

Przypisy

  1. Microchip AT89S52 — MCS‑51 compatible MCU [datasheet producenta]
  2. STMicroelectronics: STM32WB BLE HID Selfie [oficjalny przykład BLE HID używający klawisza głośności do wyzwalania zdjęcia]
  3. Android Developers: KeyEvent API reference [oficjalna dokumentacja zdarzeń przycisków, w tym KEYCODE_CAMERA]
  4. Terry Kilby, Belinda Kilby, „Make: Drony dla początkujących” [książka]