# GPS PPS zaman modeli Bu dizin, mevcut C navigation yolunu değiştirmeden önce WLS clock-bias ile 125 MHz PPS kontrol döngüsünün zaman davranışını incelemek için hazırlanmış event-driven Python modelidir. Bu bir genel amaçlı GNSS simülatörü değildir. Özellikle aşağıdaki proje davranışlarını taklit eder: - RF `ABS_SAMPLE` sayacı: `16.368 MHz`, 32 bit ve wrap eden sayaç. - Tracking/PPS sayacı: `125 MHz` free-running sayaç. - Navigation solve periyodu: `NAV_SOLVE_TIMER=10`, yani `200 ms`. - Ortak navigation bit transmit epoch'u ve uyduların farklı propagation delay'lerle art arda tracking olayı üretmesi. - Firmware'deki corrected sample denklemi: ```text corrected_abs = ABS_SAMPLE - REM_CODE_PHASE / 1.023e6 ``` - `gps_unwrap_corrected_abs_sample()` ile aynı signed modulo-32 unwrap. - `gps_ip.c` ile aynı pseudorange datum'u: ```text precise_ms_i = abs_i / 16368 - minimum + 68.802 P_i = precise_ms_i * c / 1000 + satellite_clock_i * c ``` - `NavEquations.c` ile aynı dört state: ```text [ECEF_X, ECEF_Y, ECEF_Z, common_bias_m] ``` - Uydu saat düzeltmesi, Earth-rotation düzeltmesi, Klobuchar, aktif C troposfer modeli ve URA/elevation ağırlıkları. - İlk 20 saniye 4 uydu, sonra 5 ve 7 uydu; ayrıca drop/re-acquisition senaryosu. - WLS compute gecikmesi, APB gecikmesi, yapay CPU stall ve 125 MHz PI loop. ## Çalıştırma Software dizininden: ```bash python3 pps_python/simulate_pps.py python3 -m unittest pps_python/test_pps_model.py ``` Kısa veya farklı PI koşusu: ```bash python3 pps_python/simulate_pps.py \ --duration 300 \ --loop-bandwidth-hz 0.02 \ --max-slew-ppm 10 ``` Varsayılan çıktılar `pps_python/output/` altına yazılır: - `01_wls_time_model.png`: raw WLS bias, doğru zaman rekonstrüksiyonu, konum hatası ve referans uydu değişimi. - `02_latency_timeline.png`: satellite arrival span, WLS ve APB gecikmeleri. - `03_pi_loop_response.png`: timestamp'lı PI, free-run ve yanlış APB-now davranışı. - `04_pps_edge_error.png`: 8 ns çıkış quantization dahil PPS kenar hatası. - `05_startup_tow_alignment.png`: ilk HOW, propagation delay ve WLS ile coarse PPS hizalama karşılaştırması. - `epoch_results.csv`: bütün epoch sonuçları. - `summary.txt`: RMS ve percentile özeti. Matplotlib GUI kullanmaz; grafikler doğrudan PNG üretilir. ## Teknik PDF raporu Teori, mevcut C/RTL mapping'i, LNAV/HOW/subframe zaman şemaları, WLS bias türetimi, 125 MHz cross-timestamp, APB commit ve PI mimarisi tek raporda: ```text GPS_PPS_Teori_Proje_Mapping.pdf ``` Grafikler güncellendikten sonra raporu yeniden üretmek için: ```bash python3 pps_python/simulate_pps.py python3 pps_python/generate_report.py ``` Rapor A4, 27 sayfadır. `generate_report.py` içindeki şemalar PDF'e vektörel olarak yazılır; simülasyon sonuç sayfaları `output/` altındaki PNG'leri kullanır. ## Modeldeki doğru zaman bağı Mevcut observation denkleminde WLS bias doğrudan PPS fazı değildir. Minimum kanal için yaklaşık ilişki: ```text b/c = STARTOFFSET - signal_flight_time_min ``` Bu nedenle doğru GPS referansı: ```text GPS_TIME_AT_CAPTURE = transmit_epoch_TOW + STARTOFFSET - b/c ``` ile kurulur ve minimum kanala ait `tracking_tick_125` ile eşlenir. Referans uydu değiştiğinde raw `b/c` milisaniyeler seviyesinde basamak yapabilir; TOW ve eşlenmiş timestamp ile oluşturulan GPS zamanı ise sürekli kalır. Üretilen ilk grafik bu farkı açıkça gösterir. Raw `b/c` değerini PI phase error olarak doğrudan kullanmak doğru değildir. ## İlk HOW ve PPS başlangıcı `parse_subframe()` HOW Z-count alanını `6 s` ile çarpıp `tow.sec` yapar. Bu, uydunun transmit subframe sınırı etiketidir. Full-subframe interrupt'ının receiver'a ulaştığı an değildir. Mevcut hardware, subframe doğrulama/parity akışında takip eden subframe'den 8 bit daha bekler. Navigation data 50 bit/s olduğu için bu sabit readout gecikmesi `8 × 20 ms = 160 ms` olur ve yazılımda `POSTPONE_TOW=0.160` ile temsil edilir. Bu yüzden ilk teslim edilen subframe için: ```text transmit_epoch_TOW = HOW_TOW + POSTPONE_TOW GPS_TIME_AT_CAPTURE = transmit_epoch_TOW + STARTOFFSET - b/c ``` `POSTPONE_TOW` signal flight time veya receiver clock bias değildir; hardware readout/pipeline epoch düzeltmesidir. Bundan sonra ayrıca uydu clock düzeltmesi ve yaklaşık 65--85 ms signal flight time gelir. Mevcut baremetal kodda `eph->tow.sec` raw HOW değerini tutmaya devam eder; `satpos()` kullanım anında `eph->tow.sec + POSTPONE_TOW` hesaplar. PPS yolu da epoch-aligned transmit time'ı baremetal navigation katmanında tam bir kez oluşturmalıdır. PPS APB periferiki kendisine verilen GPS reference time'a `POSTPONE_TOW` değerini tekrar eklememelidir. İlk HOW'un hangi kanaldan geleceği sadece uydunun yakınlığına bağlı değildir. Acquisition tamamlanma anı, bit lock ve bir sonraki tam subframe sınırı çoğu zaman propagation delay farkından daha baskındır. Monte Carlo startup modeli bu üç etkiyi ayrı gösterir. Önerilen ownership: 1. Raw 125 MHz counter resetten itibaren free-running çalışır. 2. İlk geçerli HOW week/6-second mutlak zaman etiketini sağlar; ilk hardware delivery epoch'u için 160 ms sabit readout düzeltmesi ayrıca eklenir. 3. İlk coherent WLS çözümünde minimum corrected-ABS kanalının uçuş süresi `STARTOFFSET - b/c` ile elde edilir. 4. Bu receive GPS zamanı aynı kanalın yakalanmış 125 MHz timestamp'ıyla eşlenerek PPS accumulator coarse-align edilir. 5. Sonraki çözümler aynı eşleşmeden residual phase error üretip PI'yi besler. Minimum kanal yalnız zaman datum'unu seçer; `b` bütün WLS uydularıyla beraber çözülür. İstenirse çözüm sonrası her uydu için `(rho + iono + tropo) / c - satellite_clock` hesaplanıp kendi timestamp'ına bağlanabilir. Doğru hizalamada bunların hepsi aynı receiver time mapping'ini vermelidir; bu ayrıca güçlü bir coherency testi olur. ## Compute ve APB gecikmesi Doğru model şu çifti taşır: ```text (GPS_TIME_AT_CAPTURE, TRACKING_COUNTER_AT_CAPTURE, epoch_sequence) ``` Commit anında peripheral geçen süreyi 125 MHz raw counter farkından ekler. WLS/APB gecikmesi böylece faz ölçümünün içine girmez; yalnızca kontrol komutunun gecikmesi olarak loop transfer fonksiyonunda kalır. Karşılaştırma amacıyla `untagged APB-now` modeli eski GPS referansını APB yazıldığı anda geçerli kabul eder. Bunun sonucu compute/APB gecikmesine yakın milisaniyelik PPS faz hatasıdır. PI bunu oscillator hatasından ayıramaz. ## PI modeli PI, raw 125 MHz sayacı değiştirmez. Ayrı GPS time accumulator'ın rate word'ünü ayarlar: ```text integrator += Ki * phase_error * update_period rate_command = integrator + Kp * phase_error ``` Varsayılan katsayılar ikinci dereceden düşük bant genişlikli bir loop için: ```text natural frequency = 0.035 Hz damping = 0.9 maximum slew = 20 ppm ``` Bunlar Q2.46 donanım katsayılarının ilk çalışma değerleridir. Karttan clock-bias serisi ve oscillator drift ölçüldükten sonra Allan deviation/phase-noise davranışına göre yeniden ayarlanmalıdır. ## C kodu analizi sırasında görülen önemli noktalar 1. `leastSquaresSTD()` artık aynı başarılı çözümün `x/y/z/b` vektörünü çağırana çıkarıyor; PPS yalnız bu çağrıdaki `b` değerini kullanıyor. 2. `normVect(xVec)` C'de yalnız ilk üç elemanı okuyor. Dolayısıyla convergence kararı XYZ update'e göre veriliyor; son clock update ayrıca kontrol edilmiyor. Python model bu davranışı aynen taklit eder ve CSV'ye `final_clock_update_m` yazar. PPS uygulamasından önce gerçek loglarda bunun dağılımı incelenmelidir. 3. Pseudorange her epoch'ta `minimum` ile yeniden normalize edildiği için RF counter'ın mutlak fazı WLS observation'da iptal olur. RF frequency error ise uyduların arrival-time farklarını ölçeklediği için tamamen iptal olmaz. 4. PPS tarafı array'in ilk elemanını referans kabul etmiyor; minimum corrected ABS kanalının TOW'u ve aynı nav-solve olayındaki C125 capture'ı birlikte taşınıyor. 5. `POSTPONE_TOW=0.160`, hardware'ın mevcut subframe'i doğrulamak için takip eden subframe'den 8 bit daha beklemesinden oluşan sabit readout gecikmesidir. Uydu konum/saat epoch'u buna göre 160 ms ileri alınır. Bu değer signal flight time veya WLS receiver clock bias ile birleştirilmemelidir. Mevcut `satpos()` zaten kullanım anında bir kez ekler; PPS peripheral tekrar eklemez. 6. 125 MHz timestamp `ABS_SAMPLE` ve `REM_CODE_PHASE` ile aynı hardware nav-solve eventinde per-channel bank'a latch ediliyor. ISR yalnız önceden yakalanmış değeri okuyor; interrupt/WLS gecikmesi epoch'a karışmıyor. ## Sınırlar - Satellite ephemeris orbitleri gerçek almanac dosyasından alınmıyor; gerçekçi ECEF/azimuth/elevation geometrisi sentetik kuruluyor. - Multipath ve atmosfer residual'ları elevation-dependent Gaussian modeldir. - 16.368 ve 125 MHz clock'larda ortak ve bağımsız drift bileşenleri vardır; gerçek kart spektrumu ölçülünce bunlar değiştirilmelidir. - PPS edge sonucu 125 MHz için 8 ns grid'e quantize edilir. Bu, ölçüm doğruluğunun otomatik olarak 8 ns olduğu anlamına gelmez.