Construction d'un récepteur SDR GPS sur STM32 sans puces spécialisées
Le STM32F4 peut capturer et traiter en temps réel un flux de données 2 bits provenant du front-end RF GNSS MAX2769 à 16,368 MHz. Toute la chaîne, de l'ADC à la corrélation, est implémentée en logiciel — sans ASIC ni FPGA — en utilisant le DMA et des opérations sur bits optimisées.
Architecture du récepteur GNSS
Les récepteurs GPS traditionnels s'appuient sur des corrélateurs dédiés comme le GP2021 pour détecter les pics de corrélation des codes PRN. Ce projet remplace cette chaîne matérielle par un MCU :
- Front-end RF (MAX2769) numérise le signal à IF 4,092 MHz
- DMA capture les données dans un tampon circulaire
- Traitement logiciel : suppression du porteuse, suppression du code, corrélation
Une période PRN (1 ms) contient 16368 échantillons — exactement 16 par puce (1023 puces). Les données compactées en bits sont regroupées en 2 octets par puce.
Matériel : Front-end MAX2769
Le MAX2769 en mode Preconfigured Device State (PGM=1, variante 2) délivre un signal de signe 1 bit sur I1 sans configuration SPI. La carte inclut :
- TCXO à 16,368 MHz
- Régulateur LDO 3,0 V
- Antenne active sur J3
- Sortie d'horloge sur P5
- Données sur P3
Les fréquences sont choisies pour un alignement parfait : 16368 / 1023 = 16 échantillons/puce. Motif idéal de puce sur IF : 0b1100110011001100.
Capture de données sur STM32F4-Discovery
Le STM32F4 (Cortex-M4, 168 MHz, 192 Ko RAM, 1 Mo Flash) utilise SPI + DMA en mode circulaire pour 16 Mbps.
- Double tamponnage : interruptions à mi-rempli du tampon 4 Ko
- 2 Ko par PRN (2046 octets)
- Tampon supplémentaire pour le traitement sans arrêter le DMA
Le code DMA assure une réception continue : perdre ne serait-ce qu'un octet rompt la synchronisation.
DSP optimisé sur bits
Sans traitement de type FPU (16 échantillons/s), nous adoptons une technique issue d'un récepteur GPS/GLONASS maison : remplacer la multiplication par un XOR pour les données de signe.
XNOR (XOR inversé) équivaut à une multiplication (-1 -1 = 1, -1 1 = -1). Des XOR séquentiels gèrent l'inversion.
Les opérations sont vectorisées sur des mots 32 bits pour plus de vitesse.
Chaîne de traitement du signal
- Générateur NCO porteuse : Produit des harmoniques I/Q tenant compte du Doppler, de l'erreur TCXO et de l'IF 4,092 MHz. Deux mélangeurs décalent vers la bande de base.
- Générateur NCO code : Code PRN local (1023 puces) interpolé à 16 échantillons/puce.
- Corrélation : XOR élément par élément des données d'entrée avec le code local + accumulation.
La forme complexe I/Q sépare les flancs de bande.
// Exemple de corrélation sur bits (pseudocode)
for (i = 0; i < 2046; i += 4) {
uint32_t input = buffer[i];
uint32_t replica = prn_replica[i];
corr += __builtin_popcount(input ^ replica) - 16;
}
Utilisation des ressources et limites
- 4 canaux de corrélation : ~70 % CPU à 168 MHz
- RAM : 12 Ko/canal (tampons + états)
- Pas de suivi ni données de navigation dans la version de base
- Initialisation manuelle des éphémérides
Le projet parvient à un démarrage à froid en 30–60 s à SNR > 35 dB·Hz.
Points clés
- Chaîne GPS logicielle complète sur STM32 — sans ASIC/FPGA
- XOR sur bits surpasse la multiplication : gain de vitesse DSP x10
- 16 échantillons/puce pour interpolation PRN précise
- Capture DMA continue essentielle pour la synchronisation
- Évolutif vers 6–8 canaux sur F4/F7
- Code open source pour expériences L1 C/A
— Editorial Team
Aucun commentaire pour le moment.