YER TEST İSTASYONU · GERÇEK KABUL KAYITLARI

TUĞRUL

STM32F446RE üzerinde sıfırdan, register seviyesinde yazılmış sabit-kanat uçuş kontrol firmware'i — HAL yok, RTOS yok, float yok. Bu sayfa bir broşür değil: panellerin çoğu, 2026-07-03 donanım kabul günündeki gerçek UART kayıtlarını tarayıcıda yeniden oynatır.

~560×JİRO DRIFT AZALMASI
100 msFAILSAFE · SPEC-BİREBİR
CANLI WATCHDOG RESET
0UYARI · 9,5 kB İMAJ

Kural basit: GERÇEK KAYIT etiketi taşıyan her şey logdan gelir; simülasyon yalnız SİM etiketli aynada vardır. Ölçülmemiş hiçbir şey ölçülmüş gibi gösterilmez.

TUĞRUL

F446RE · REGISTER-LEVEL FC · YER İSTASYONU
IMG 9492 B · WARN 0
WHO_AM_I 0x75
FS ARMED
KAYIT COM6 · 2026-07-03

UART Konsolu — Failsafe Canlı Kabulü

GERÇEK KAYIT
t=380s
FAILSAFE
ARMED
WHO_AM_I
0x75
YAŞ (age)
0 ms
DURUŞ R/P
— / —
A
1500 µs
E
1500 µs
T
1000 µs
Bu panel simülasyon değildir: 2026-07-03 kabul testinin ham UART kaydını oynatır. SDO jumper'ı fiziksel olarak çekildi; failsafe son sağlıklı örnekten tam +100 ms sonra girdi (t=394.250 s), sensör t=405'te geri geldi ve init oldu — ama kilit tasarım gereği KIRILMADI.

Drift Laboratuvarı — Kalibrasyonun Kanıtı

GERÇEK KAYIT
Salt-jiro açı integrali, kart masada SABİT. Kalibrasyonsuz: pitch +2,38°/s tırmanıyor; roll −6,26°/s biasla çoktan −2000° tavanına doymuş (kesikli çizgi). Kalibrasyon sonrası (boot'ta N=1000 örnek): 24 saniyede toplam −0,24° → ≈−0,011°/s. Aynı entegratör, aynı sensör — tek fark boot kalibrasyonu. Tekrarlanabilirlik (loglardaki boot'lar): x/y ±2 LSB, z ±6 LSB — en kötüsü ≈0,05°/s.

Aritmetik Aynası — Complementary Filter

SİM
Gerçek eğim (adım girişi)30°
Jiro bias (kalibrasyonsuz)−6.26°/s
Filtre α (÷1024)1004
Bu panel SİMÜLASYONDUR — ölçüm değil. Ama aritmetik, firmware'in birebir aynası: aynı tamsayı yol, aynı işaret-duyarlı yarı-uzağa yuvarlama (div_round), float yok. Firmware'deki matematik masada Python host-mirror ile 6/6 doğrulandı; buradaki JS de aynı deseni izler. Kesikli çizgi = salt-jiro (bias'ı entegre eder, kayar); düz çizgi = complementary filter (accel referansına yaslanır, kaymaz).

IWDG Watchdog — Kasıtlı Kilitlenme Turu

GERÇEK KAYIT
DÖNGÜ 0 / 3 reset cause:
TEST_HANG imajı (derleme kapılı — make TEST_HANG=1, yayına asla girmez): t=10 s'de ana döngü kasıtlı sonsuz döngüye sokulur, IWDG ≤1 s'de reset atar, açılışta RCC_CSR'den neden okunur: "reset cause: IWDG watchdog". Kayıtta üç tam döngü var. Reviewer'ın RM0390 yakalaması olmasaydı (0xCCCC ilk adım olmalı) bu mekanizma masada çalışıp sahada ilk soğuk boot'ta sonsuza dek kilitlenebilirdi.

Mimari — 1 kHz Kontrol Tıkı

HARİTA
SysTick 1ms84 MHz PLL · 2 WSclock.c SPI1 + IMU656k cfg / 10.5M dataspi.c · mpu9250.c GYROCALboot N=1000 @1kHzgyrocal.c ATTITUDEint-only comp.filterattitude.c FAILSAFE100ms · latchfailsafe.c PWM 50HzTIM3 A/E/Tpwm.c UART2 115200 · non-blocking ring IWDG 500ms · RCC_CSR cause
Bir bloğa tıkla — o birimin tek cümlelik savunması ve kanıt bağı burada görünür.
M5 eki (yazılım ✓ / donanım ▢): tek-eksen roll→aileron P stabilizasyon yazıcısı ATTITUDE'dan sonra, FAILSAFE'ten (fs_tick) ÖNCE komut verir — böylece failsafe latch'i her tıkta son PWM yazarı olarak stabilizasyonu ezer (ordering invariant). Yazıldı + reviewer-CLEAN + derlendi (9648 B); canlı yön/scope kanıtı ▢ BEKLİYOR.

Saha Hikâyeleri — Süreç Hatayı Nasıl Yakaladı

4 VAKA

① Klon Sensör — WHO_AM_I=0x75

SORUN"MPU-9250" etiketli modül kimlik olarak 0x75 döndürdü — geçerli aile kimliği değil; üstelik 0x75 aynı zamanda WHO_AM_I register'ının ADRESİ. Adres yankılayan bozuk bir bus da aynı cevabı üretirdi.
ÇÖZÜMDiskriminatör-kapılı kabul: PWR_MGMT_1 reset değeri (0x01) ayrıca okunur — adres yankısı bu ikinci kapıyı geçemez. Log asla çıplak "OK" demez: "OK (clone die)".
DERSUcuz modülde klon normaldir; mühendislik "çalışıyor işte" değil, "hangi kanıtla kabul ettim"dir. Nominal ölçek sabitleri bu yüzden ~%3 toleransla raporlanır.
if (id==0x75 && pm1==0x01) → OK (clone die) else if (id==0x75) → UNEXPECTED_ID /* address-echo trap */

② Boot-Latch Kusuru — "Kayıp Korunur, Yokluk Değil"

SORUNFailsafe boot'ta silahlanıyordu; sensör bring-up ~1 s sürer. 100 ms'lik zaman aşımı her açılışta sensör doğmadan doluyor, kart kaçınılmaz FAILSAFE'e kilitleniyordu.
TEŞHİSSeri port da o an kilitliydi (Windows usbser) — kör uçuş. GDB ile karta bağlanıp çekirdek yaşıyor mu, ring buffer boşalmış mı, fs_state ile mpu_ready çelişiyor mu karttan okundu: iki ayrı arıza ayrıştırıldı.
ÇÖZÜMİlke değişti: bekçi ilk BAŞARILI örnekle silahlanır. Hiç canlanmamış sensör zaten güvenli PWM varsayılanlarıyla örtülü — failsafe kaybı korur, yokluğu değil.
DERSZaman aşımı tasarımı boot sıralamasından bağımsız düşünülemez. Ve debug omurgası lüks değil: seri sustuğunda tek tanık GDB'ydi.

③ Reviewer'ın RM0390 Yakalaması — IWDG Anahtar Sırası

SORUNSpec'te IWDG başlatma sırası yanlış yazılmıştı (0xCCCC en sonda). Referans kılavuza göre 0xCCCC İLK adım olmalı — hem watchdog'u başlatır hem LSI osilatörünü zorla açar.
RİSKSinsi sınıf: eldeki kartta muhtemelen çalışırdı (LSI başka yoldan açık olabilir), sahada ilk soğuk boot'ta sonsuza dek kilitlenirdi. Masada yeşil, sahada ölü.
ÇÖZÜMİç döngünün ground-truth kuralı: reviewer koda değil REFERANS KILAVUZA karşı denetler. MAJOR bulgu, üretimden önce düzeltildi; canlı 3× reset döngüsüyle kanıtlandı.
DERS"Çalışıyor" ile "doğru" farklı şeyler. Datasheet'e karşı düşmanca okuma, donanım projelerinde test kadar değerli.

④ NRST Jumper'ı — OpenOCD'nin Tek Cümlelik İpucu

SORUNİlk donanım gününde flash imkânsızdı: çekirdek algılanıyor ama sürekli "external reset" altında görünüyordu.
TEŞHİSEn son değişen şey neydi? Kablolama. Nucleo başlığında RESET deliği 3V3'ün hemen yanında — sensörün besleme jumper'ı bir delik kayıp NRST'ye takılmış, sensör beslenmeye çalışırken reset hattını aşağı çekiyordu.
ÇÖZÜMJumper 3V3'e taşındı; akış anında düzeldi. Kablolama notuna "her deliğin yanındaki yazıyı tek tek doğrula" maddesi kalıcı olarak girdi.
DERSAraç hatası gibi görünen şey çoğu zaman fiziksel dünyanın tek-değişken sorusudur: "en son neye dokundun?"

Kanıt Matrisi — Her İddianın Katmanı

DÜRÜSTLÜK DUVARI
İddiaÖlçümKatman
84 MHz PLL + 2 flash wait-stateBoot banner + read-back sıralaması; panik yolu hiç tetiklenmedi✓ LOG-DÜZEYİ
Jiro bias kalibrasyonu (N=1000 @ 1 kHz)Bias −820/312/63 LSB (en kötü eksen −6,26°/s) → artık drift ≈−0,011°/s (~560×); boot'lar arası x/y ±2, z ±6 LSB✓ LOG-DÜZEYİ
Failsafe: 100 ms, kilitliSon sağlıklı örnekten tam +100 ms sonra giriş (t=394.250 s); sensör dönüşünde kilit KIRILMADI; PWM güvenli 1500/1500/1000 µs✓ LOG-DÜZEYİ
IWDG watchdog (nominal 500 ms)3 tam kilitlenme→reset döngüsü canlı; neden RCC_CSR'den okunup loglandı✓ LOG-DÜZEYİ
Duruş statik gürültüsü ve 90° testiR ±0,03° / P ±0,07°; ters montaj doğru raporlandı (≈−178,9°); 90° testi −89,5°±0,2° — ELDE, jig'siz◐ ÖN-KANIT
Stabilizasyon: tek-eksen roll→aileron P iskeletireviewer-CLEAN, derlendi (9648 B); komut fs_tick ÖNCESİ yazılır — failsafe latch son PWM yazarı kalır. Canlı yön + scope kanıtı henüz YOK▢ KANIT BEKLİYOR
PWM dalga şekli + kontrol döngüsü jitter'ıKod + log düzeyinde iddia; osiloskop yakalaması henüz YOK▢ KANIT BEKLİYOR
Jig'li resmi doğruluk tablosu (0°/45°/90°)Düzenek bekliyor; eldeki sayılar bilinçli olarak resmi tabloya YAZILMADI▢ KANIT BEKLİYOR
Gerçek uçuşKAPSAM DIŞI — bu proje masada ölçülmüş uçuş kontrol yazılımıdır, uçan İHA değil; bu sınır anlatının parçasıdır— KAPSAM DIŞI
Her sayı 2026-07-03 tarihli ham kabul loglarından; loglar ve kaynak kod repoda. github.com/demirakin/tugrul-fc Araç zinciri: arm-none-eabi-gcc · Makefile · OpenOCD/SWD · GDB · Tera Term