STM32로 특수 칩 없이 SDR GPS 수신기 구현하기
STM32F4는 GNSS RF 프론트엔드 MAX2769에서 16.368MHz로 공급되는 2비트 데이터 스트림을 실시간으로 캡처하고 처리할 수 있습니다. ADC부터 상관관계 계산까지 전체 체인을 소프트웨어로 구현했습니다—ASIC이나 FPGA 없이—DMA와 최적화된 비트 연산을 활용했습니다.
GNSS 수신기 구조
전통적인 GPS 수신기는 GP2021 같은 전용 상관기(correlator)를 사용해 PRN 코드 상관 피크를 찾습니다. 이 프로젝트는 해당 하드웨어 체인을 MCU로 대체합니다:
- RF 프론트엔드(MAX2769)가 IF 4.092MHz에서 신호를 디지털화
- DMA가 순환 버퍼로 데이터 캡처
- 소프트웨어 처리: 캐리어 제거(carrier wipeoff), 코드 제거(code wipeoff), 상관 계산
한 PRN 주기(1ms)에는 16368개의 샘플이 들어갑니다—칩당 정확히 16개(총 1023칩). 비트 압축 데이터를 칩당 2바이트로 그룹화합니다.
하드웨어: MAX2769 프론트엔드
MAX2769는 사전 설정 모드(PGM=1, 변형 2)에서 SPI 설정 없이 I1에서 1비트 부호 신호를 출력합니다. 보드 구성:
- 16.368MHz TCXO
- 3.0V LDO
- J3의 능동 안테나
- P5의 클럭 출력
- P3의 데이터
주파수는 완벽한 정렬을 위해 선택: 16368 / 1023 = 칩당 16샘플. IF에서의 이상적 칩 패턴: 0b1100110011001100.
STM32F4-Discovery에서의 데이터 캡처
STM32F4(Cortex-M4, 168MHz, 192KB RAM, 1MB Flash)는 SPI + DMA를 순환 모드로 사용해 16Mbps를 처리합니다.
- 더블 버퍼링: 4KB 버퍼의 반/전체에서 인터럽트
- PRN당 2KB(2046바이트)
- DMA 중단 없이 처리할 수 있는 여분 버퍼
DMA 코드는 연속 수신을 보장합니다: 단 하나의 바이트 손실만으로도 동기화가 깨집니다.
비트 최적화 DSP
FPU 스타일 처리(16Msamples/s) 없이, 자작 GPS/GLONASS 수신기에서 가져온 기법을 사용합니다: 부호 데이터에서 곱셈을 XOR로 대체.
XNOR(반전 XOR)은 곱셈과 같습니다(-1 -1 = 1, -1 1 = -1). 순차 XOR로 반전을 처리합니다.
연산은 속도를 위해 32비트 워드에서 벡터화합니다.
신호 처리 체인
- 캐리어 NCO: 도플러, TCXO 오차, 4.092MHz IF를 고려한 I/Q 고조파 생성. 듀얼 믹서로 베이스밴드로 이동.
- 코드 NCO: 로컬 PRN(1023칩)을 칩당 16샘플로 보간.
- 상관 계산: 입력 데이터와 로컬 코드의 요소별 XOR + 누적.
복소 I/Q 형태로 사이드밴드를 분리합니다.
// 비트 상관 예시(의사코드)
for (i = 0; i < 2046; i += 4) {
uint32_t input = buffer[i];
uint32_t replica = prn_replica[i];
corr += __builtin_popcount(input ^ replica) - 16;
}
자원 사용량과 한계
- 4 상관 채널: 168MHz에서 CPU ~70%
- RAM: 채널당 12KB(버퍼 + 상태)
- 기본 버전은 추적(tracking)이나 네비게이션 데이터 없음
- 수동 에페메리스 초기화
이 프로젝트는 SNR > 35dB·Hz에서 콜드 스타트 30~60초를 달성합니다.
주요 요약
- STM32에서 완전 소프트웨어 GPS 체인—ASIC/FPGA 불필요
- 비트 XOR가 곱셈 압도: DSP 10배 속도 향상
- PRN 보간을 위한 칩당 16샘플
- 동기화 핵심: 연속 DMA 캡처
- F4/F7에서 6~8채널 확장 가능
- L1 C/A 실험용 오픈소스 코드
— Editorial Team
아직 댓글이 없습니다.