FreeRTOS + STM32H7 ile Endüstriyel Sensör Füzyonu: Kestirimci Bakım
Sistem Donanımı
| Bileşen | Seçim | Açıklama |
|---|---|---|
| MCU | STM32H7B3I (480MHz, Cortex-M7) | Çift FPU + DMA2D |
| İvmeölçer | ADXL357 × 3 (3-eksen) | ±40g, SPI 10MHz, 4000 Hz örnekleme |
| OS | FreeRTOS v10.5.1 | Preemptive, tickless mode |
| Haberleşme | RS-485 Modbus RTU | Endüstriyel ortam |
| Güç | 24V DC → 3.3V LDO | ADC referans gürültüsü minimize |
FreeRTOS Görev Mimarisi
// FreeRTOSConfig.h kritik ayarlar
#define configTICK_RATE_HZ 1000
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (5 << 4)
#define configUSE_TICKLESS_IDLE 1
// Görev öncelikleri
#define SENSOR_TASK_PRIORITY 5 // SPI DMA ISR
#define FFT_TASK_PRIORITY 4 // 1024-pt FFT, 250ms
#define ANOMALY_TASK_PRIORITY 3 // Eşik karşılaştırma
#define COMMS_TASK_PRIORITY 2 // Modbus RTU
Kritik tasarım: SensorTask NVIC priority 4 ile çalışır — configMAX_SYSCALL_INTERRUPT_PRIORITY (5) eşiğinin altında. taskENTER_CRITICAL() bloklarından etkilenmez.
IRQ yapılandırma detayları: STM32'de IRQ Gecikme Ölçümü
DMA ile Kesintisiz 4kHz Örnekleme
void SensorTask_Init(void) {
// Circular DMA — CPU müdahalesi yok
HAL_SPI_Receive_DMA(&hspi1, (uint8_t*)sensorBuffer, BUFFER_SIZE);
}
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(xSensorDataReady, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
FFT Tabanlı Anomali Tespiti
ARM CMSIS-DSP ile 1024 noktalı FFT (250ms periyot):
void FFTTask(void *pvParameters) {
arm_rfft_fast_instance_f32 fftInstance;
arm_rfft_fast_init_f32(&fftInstance, 1024);
for (;;) {
xSemaphoreTake(xSensorDataReady, portMAX_DELAY);
arm_rfft_fast_f32(&fftInstance, inputBuf, outputBuf, 0);
arm_cmplx_mag_f32(outputBuf, magnitudeBuf, 512);
// Rulman karakteristik frekansları
float bpfi_energy = magnitudeBuf[BPFI_BIN]; // 147.3 Hz
if (bpfi_energy > ALARM_THRESHOLD)
xQueueSend(xAnomalyQueue, &bpfi_energy, 0);
}
}
Normal spektrumdan %15 sapma → sarı alarm; %35 sapma → acil durdurma.
Doğrulama Sonuçları (90 Gün)
| Metrik | Değer |
|---|---|
| Tespit edilen kritik arıza | 3 (önceden) |
| Ortalama uyarı öncülüğü | 72 saat |
| Yanlış alarm oranı | 0.4/gün |
| Sensor görev zamanlaması jitter | <50µs |
| Downtime tasarrufu | ~180 saat |
