Powrót do strony głównej

SDR GPS na STM32: przetwarzanie bez ASIC

Artykuł opisuje implementację odbiornika SDR GPS na STM32F4 z front-end MAX2769. Programowe przetwarzanie surowych danych wykorzystuje bitowe XOR do korelacji kodów PRN zamiast tradycyjnych ASIC. Przechwytywanie przez SPI+DMA zapewnia czas rzeczywisty.

Programowy odbiornik GPS na mikrokontrolerze STM32
Advertisement 728x90

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.

Google AdInline article slot

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.

Google AdInline article slot
  • 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ę.

Google AdInline article slot

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

Advertisement 728x90

Czytaj dalej