Add generic IMU fusion and PMOD IRQ verification

This commit is contained in:
2026-07-14 11:03:13 +03:00
parent e77651dac3
commit dd6569c025
35 changed files with 2680 additions and 70 deletions
+118
View File
@@ -2,6 +2,124 @@
Bu notlar GPS bare-metal yaziliminin VCU118 Rocket SoC portu ve interrupt debug sureci icin yazildi.
## Generic IMU Mimarisi (TDK ve ST)
GPS/ESKF artik dogrudan bir sensor surucusune bagli degildir. Veri yolu:
```text
TDK ICM42688 -----\
-> imu_sensor -> imu_calibration -> fusion_imu_measurement -> motion detector + ESKF
ST LSM6DSOX ------/
```
- `src/tdk_icm42688.c`: TDK ICM42688'e ozel SPI, register, interrupt ve
ham-veri donusumu.
- `src/st_lsm6dsox.c`: STEVAL-MKI217V1 uzerindeki ST LSM6DSOX'e ozel SPI,
register, foreground polling ve ham-veri donusumu.
- `src/imu_sensor.c`: ortak init/start/stop/IRQ/service/measurement arayuzu.
- `src/imu_calibration.c`: markadan bagimsiz bias, 3x3 scale/cross-axis/mounting
donusumu ve opsiyonel sicaklik katsayisi.
- `fusion_measurement.h`, motion detector ve ESKF yalniz SI birimindeki ortak
mesaji gorur; aktif sensorun markasini bilmez.
Firmware isletim sistemi kullanmaz. Yeni IMU katmani `malloc` cagirmadan sensor
kuyruklarini ve butun durumunu statik ayirir. Newlib ve formatli UART destegi
nedeniyle linker'da heap alani yine bulunur; yeni sensor kodu buna guvenmez.
Karttaki 1 MiB DTIM test icin genis tutulmustur; firmware tasarim butcesi
ilerideki 512 KiB DTIM hedefidir. `auto` build iki sensor surucusunu da icerir;
kesin sensor secimi kullanilmayan surucuyu linkten cikarir.
2026-07-13 tarihli `-Os` bare-metal link boyutlari:
| Secim | text | data | bss | Toplam DTIM image |
| --- | ---: | ---: | ---: | ---: |
| `tdk` | 67,256 | 2,496 | 205,160 | 274,912 bayt |
| `st` | 66,936 | 2,496 | 199,280 | 268,712 bayt |
| `auto` | 68,888 | 2,496 | 207,560 | 278,944 bayt |
En buyuk `auto` image 512 KiB DTIM'in yaklasik yuzde 53.2'sini kullanir; stack
ve ilerideki buffer'lar icin 245,344 bayt (yaklasik 239.6 KiB) adres alani
kalir. Linker bunun 16 KiB'ini varsayilan stack icin ayirir. 1 MiB test
konfigurasyonunda gorulen ek bosluk yeni statik buffer eklemek icin gerekce
sayilmamalidir. Host unit-test executable'i bu rakamlara dahil degildir.
`auto` konfigurasyonu ayrica `BSP_DTIM_SIZE=0x00080000` ile gercekten link
edilerek 512 KiB sinirinda dogrulanmistir.
### Bare-metal sensor secimi
Otomatik WHO_AM_I algilama varsayilandir:
```sh
make -C soc/software/gps_system IMU_SENSOR=auto
```
Otomatik secimde eslesen cihaz bulunana kadar yalniz read-only WHO_AM_I probe
yapilir. TDK ve ST build'leri acikca su sekilde secilebilir:
```sh
make -C soc/software/gps_system IMU_SENSOR=tdk \
IMU_ODR_HZ=500 IMU_ACCEL_FS_G=4 IMU_GYRO_FS_DPS=250
make -C soc/software/gps_system IMU_SENSOR=st \
IMU_ODR_HZ=104 IMU_ACCEL_FS_G=2 IMU_GYRO_FS_DPS=250
```
`IMU_SENSOR=stm`, `st` seciminin alias'idir. `IMU_ODR_HZ=0`,
`IMU_ACCEL_FS_G=0` ve `IMU_GYRO_FS_DPS=0` aktif surucunun guvenli varsayilanini
secer. Bu ozellikle `auto` icin onemlidir; TDK ve ST'nin ortak bir ODR degeri
yoktur. Desteklenen ODR'ler TDK icin 25/50/100/200/500/1000 Hz, ST icin
52/104/208 Hz'dir.
TDK veri-hazir interrupt'i ile calisir ve ana dongu `wfi` kullanir. Mevcut ST
baglantisinda interrupt pini bagli olmadigi icin ST surucusu foreground'da
ODR'nin iki kati hizda status poll eder; yeni ornekleri sensor ODR'sinde
uretir. Bu yontem fonksiyoneldir fakat CPU'nun `wfi` ile uyumasini engeller.
Uzun WLS islemi sirasinda foreground durdugu icin sensorun yeni ornekleri
overwrite olabilir. Bu nedenle interruptsiz ST yolu stationary bring-up ve log
testi icindir; hareketli fusion icin kayipsiz bir yol kabul edilmez.
Uretim baglantisinda ST INT pini eklendiginde yalniz ST backend acquisition
yontemi interrupt'a cevrilecek (alternatif olarak sensor FIFO ve sensor
timestamp'i kullanilacak); ortak arayuz ve ESKF degismeyecektir.
Sensor ODR'si ile GPS nav-solve periyodu birbirinden bagimsizdir. Her IMU ve GPS
olcumu ayni local monotonic CPU tick domaininde kendi olcum zamaniyla tasinir;
ESKF olaylari timestamp sirasinda isler. TDK interrupt timestamp'i data-ready
kenarini yakindan temsil eder. Poll edilen ST timestamp'i ise data-ready'nin
foreground'da goruldugu andir ve bir polling gecikmesi tasir. Hareketli nihai
sistemde ST INT veya FIFO timestamp kullanma gereksiniminin nedeni budur.
### Kalibrasyon ve sicaklik politikasi
Uc farkli duzeltme birbirinden ayridir:
1. Sensorun fabrika trim'i ve datasheet sensitivity degerleri sensor
surucusunde kullanilir.
2. Kalici, karta ozel bias/scale/eksen/sicaklik katsayilari ortak
`imu_calibration_t` icinde uygulanabilir. TDK ve ST ayarlari
`calibration_by_backend[]` icinde ayri profillerdir; `auto` secimi bir
sensorun kalibrasyonunu digerine uygulayamaz. Varsayilan deger identity +
sifir bias'tir; yani varsayilanda olcumu degistirmez.
3. Fusion engine acilista kart sessizken iki saniyelik ornek toplar. Anlik gyro
bias'ini, ilk roll/pitch hizalamasini ve gravity yonundeki accel kalintisini
tahmin eder. ESKF bundan sonra residual accel/gyro bias state'lerini izler.
Sicaklik GPS/IMU fusionunun calismasi icin zorunlu degildir. Kisa sureli ve
dar sicaklik araligindaki ilk testte sicaklik yalniz olculur ve mesajda
tasinir; ESKF denklemlerini etkilemez. Uzun sure, dis ortam veya sensorun
isinmasiyla bias degisimi gorulurse sicaklik katsayilari offline loglardan
cikarilip `temperature_compensation_enabled=true` ile etkinlestirilir. Katsayi
olmadan otomatik sicaklik duzeltmesi yapmak yanlis bias uretme riski tasir.
Portable kalibrasyon matematigi Linux'ta heap kullanmadan su testle dogrulanir:
```sh
make -C soc/software/gps_system/tests clean run
```
Bu test identity davranisini, bias + 3x3 donusumu, opsiyonel sicaklik
duzeltmesini ve singular matris reddini kontrol eder. Test executable'i host
icindir ve bare-metal firmware'e linklenmez.
## Donanim Adresleri ve IRQ Map
Generated DTS/RTL'e gore GPS IP adresleri: