Implementacja odbiornika SDR GPS na STM32 bez specjalistycznych układów
STM32F4 jest w stanie przechwytywać i przetwarzać dwubitowy strumień danych z GNSS RF front-end MAX2769 z prędkością 16,368 MHz w czasie rzeczywistym. Cały łańcuch od ADC po korelację jest realizowany programowo bez ASIC czy FPGA, wykorzystując DMA i zoptymalizowane operacje bitowe.
Architektura odbiornika GNSS
Tradycyjne odbiorniki GPS używają specjalistycznych korelatorów, takich jak GP2021, do wyszukiwania szczytu korelacji kodów PRN. W projekcie ten łańcuch zastąpiono mikrokontrolerem:
- RF front-end (MAX2769) digitalizuje sygnał na IF 4,092 MHz
- DMA przechwytyje dane do bufora kołowego
- Programowa obróbka: carrier wipeoff, code wipeoff, korelacja
Jeden okres PRN (1 ms) zawiera 16368 próbek, dokładnie 16 na chip (1023 chipy). Dane bitowe grupowane są po 2 bajty na chip.
Część sprzętowa: MAX2769 front-end
MAX2769 w trybie Preconfigured Device State (PGM=1, wariant 2) generuje jednobitowy sygnał sign z I1 bez konfiguracji SPI. Płytka zawiera:
- TCXO 16,368 MHz
- LDO 3,0 V
- Aktywna antena na J3
- Wyjście zegarowe P5
- Dane na P3
Częstotliwości dobrano dla idealnego dopasowania: 16368 / 1023 = 16 próbek/chip. Idealny chip na IF: 0b1100110011001100.
Przechwytywanie danych na STM32F4-Discovery
STM32F4 (Cortex-M4, 168 MHz, 192 KB RAM, 1 MB Flash) wykorzystuje SPI + DMA w trybie kołowym do 16 Mbit/s.
- Podwójna buforizacja: przerwania na połowie/końcu bufora 4 KB
- 2 KB na PRN (2046 bajtów)
- Dodatkowy bufor do obróbki bez zatrzymywania DMA
Kod DMA zapewnia ciągły odbiór: utrata bajtu niszczy synchronizację.
Zoptymalizowany DSP na bitach
Bez przetwarzania typu FPU (16 Ms próbek/s) zastosowano metodę z domowego odbiornika GPS/GLONASS: zastąpienie mnożenia operacją XOR dla danych sign.
XNOR (odwrócenie XOR) jest równoważne mnożeniu (-1 -1 = 1, -1 1 = -1). Sekwencyjne XOR kompensują inwersję.
Operacje wektoryzowano na słowach 32-bitowych dla prędkości.
Łańcuch przetwarzania sygnału
- Carrier NCO: Generowanie harmonicznych I/Q z uwzględnieniem Dopplera, błędu TCXO i IF 4,092 MHz. Dwa mieszacze przenoszą na pasmo podstawowe.
- Code NCO: Lokalny PRN (1023 chipy) z interpolacją do 16 próbek/chip.
- Korelacja: Elementowe XOR danych wejściowych z lokalnym kodem + sumowanie.
Kompleksowa forma I/Q pozwala oddzielić pasma boczne.
// Przykład bitowej korelacji (pseudokod)
for (i = 0; i < 2046; i += 4) {
uint32_t input = buffer[i];
uint32_t replica = prn_replica[i];
corr += __builtin_popcount(input ^ replica) - 16;
}
Zużycie zasobów i ograniczenia
- 4 kanały korelacji: ~70% CPU na 168 MHz
- RAM: 12 KB/kanał (bufor + stany)
- Brak śledzenia (tracking) czy danych nawigacyjnych w wersji bazowej
- Inicjalizacja efemeryd ręczna
Projekt osiąga cold start w 30–60 s przy SNR > 35 dB·Hz.
Co najważniejsze
- Pełna programowa realizacja łańcucha GPS na STM32 bez ASIC/FPGA
- Bity XOR zamiast mnożenia: 10x przyspieszenie DSP
- 16 próbek/chip zapewnia precyzyjną interpolację PRN
- Ciągłe przechwytywanie DMA kluczowe dla synchronizacji
- Skalowalne do 6–8 kanałów na F4/F7
- Otwarty kod do eksperymentów z L1 C/A
— Editorial Team
Brak komentarzy.