VP-Digi to funkcjonalny, tani, łatwy w montażu i konfiguracji sterownik APRS digipeater oparty na STM32 z wbudowanym modemem KISS.
Jeśli nie interesuje Cię kod źródłowy, to repozytorium nie jest dla Ciebie. Możesz znaleźć pełny opis projektu, schematy, skompilowany firmware i instrukcje na mojej stronie.
Firmware został napisany przy użyciu System Workbench for STM32 (SW4STM32) i powinieneś być w stanie zaimportować to repozytorium bezpośrednio do IDE. Kod źródłowy jest publicznie dostępny od wersji 1.3.0.
Projekt został zaprojektowany do uruchomienia na płytce Blue Pill (STM32F103C8T6) z kryształem 8MHz. Firmware został napisany z wykorzystaniem jedynie operacji na rejestrach (z nagłówkami ST) oraz bibliotek CMSIS. HAL jest tam tylko dla USB. Kod jest (dość) obszernie komentowany tam gdzie trzeba, więc nie powinien być bardzo trudny do zrozumienia.
Są dwa demodulatory (i dekodery) pracujące równolegle, aby zapewnić lepszą wydajność. Sygnał jest próbkowany z częstotliwością 38400Hz (32 próbki na symbol) przez DMA. Przerwanie jest generowane po otrzymaniu 4 próbek, a próbki są decymowane. Następnie przechodzą one przez filtr preemfazy/deemfazy (jeśli jest włączony), który wyrównuje amplitudy tonów. Przefiltrowane próbki są mnożone przez lokalnie generowane tony znakowe i przestrzenne (ich części I i Q - cosinus i sinus). Daje to współczynnik korelacji pomiędzy sygnałem wejściowym a każdym tonem. W międzyczasie wytwarzany jest niefiltrowany symbol, który służy do wysterowania PLL detekcji nośnej danych. Różnica współczynników korelacji stanowi nową próbkę i jest przepuszczana przez filtr dolnoprzepustowy w celu wyeliminowania szumu. Filtrowane próbki są porównywane z zerem i demodulowany symbol jest wysyłany do mechanizmu odzyskiwania bitów.
Mechanizm odzyskiwania bitów jest oparty na cyfrowym PLL. PLL pracuje nominalnie z częstotliwością 1200Hz (=1200 Baud). Zmiana symbolu powinna nastąpić w pobliżu zera licznika PLL, tak aby licznik przepełnił się w połowie symbolu i wartość symbolu została spróbkowana. Przy każdej zmianie symbolu licznik jest mnożony przez współczynnik <1, aby zbliżyć go do zera, utrzymując PLL i sygnał przychodzący w fazie. Sygnał DCD jest multipleksowany z obu modemów. Wyjaśnione więcej w modem.c. Próbkowany symbol jest dekodowany przez dekoder NRZI i wysyłany do warstwy AX.25.
Dekoder AX.25 jest dość standardowy. CRC, PID i Control Byte są sprawdzane i obie ścieżki modemu są multipleksowane, aby wyprodukować tylko jedną ramkę wyjściową.
DCD wykorzystuje podejście analogowo-cyfrowe: oparte na PLL, ale pracujące na cyfrowym, niefiltrowanym strumieniu symboli. PLL działa w taki sam sposób jak PLL odzyskiwania bitów, z wyjątkiem tego, że jest zaimplementowany specjalny mechanizm liczenia impulsów DCD, wyjaśniony w modem.c. Takie podejście wydaje się być znacznie bardziej efektywne niż typowa, cyfrowa, oparta na AX.25 detekcja.
Koder AX.25 jest również dość prosty. Może obsługiwać wiele ramek w rzędzie (ograniczone długością bufora). Każda transmisja rozpoczyna się od flag preambuły, następnie flag nagłówka, danych rzeczywistych, CRC, flag stopki/rozdzielających, danych rzeczywistych, CRC, flag stopki/rozdzielających... i flag ogona. Bity surowe są żądane przez modulator.
Koder NRZI pracuje dokładnie z częstotliwością 1200Hz (=1200 Baud) i żąda bitów od kodera AX.25. Bity są kodowane do symboli, a interwał timera próbkowania DAC jest ustawiony w zależności od wartości symbolu. Z tego powodu używana jest tylko jedna tabela sinusów. Dla tonu 1200 Hz interwał timera jest większy niż dla tonu 2200 Hz - częstotliwość próbkowania jest zmieniana, aby zmienić częstotliwość sygnału wyjściowego. Indeks tablicy jest zawsze zachowany, aby faza sygnału wyjściowego była ciągła.
Chciałbym usłyszeć o projektach, które implementują kod źródłowy VP-Digi. Jeśli tworzysz taki, daj mi znać na sq8vps(at)gmail.com.
Ukończenie projektu zajęło sporo czasu, ale obecnie jest to prawdopodobnie najbardziej efektywny, publicznie dostępny modem oparty na STM32 i najbardziej konfigurowalny, oparty na mikrokontrolerze digipeater APRS. Chciałbym wspomnieć o kilku źródłach, które uznałem za naprawdę przydatne lub inspirujące:
Wszystkie wkłady są doceniane, ale proszę o utrzymanie kodu w miarę czystego. Proszę również upewnić się, że firmware działa dobrze przed stworzeniem pull request.
Projekt jest objęty licencją GNU GPL v3 (zobacz LICENSE).