EMI a błędy USART w obecności falownika: diagnostyka i korekty
/analizy/emi-usart-falownik-agd • STM32F1/F4 • UART z DMA • środowisko z falownikiem (0.5–5 MHz)
1. Zakres i cel
Minimalizacja ORE/FE/NE i DMA-locków UART w urządzeniach z falownikiem. Zakres: filtracja wejść, topologie RC/LC, ferryty, ustawienia DMA/IDLE, priorytety NVIC oraz praktyki prowadzenia mas i wiązek.
2. Objawy i sygnatury
2.1 Telemetria
[11:03.218] USART1: ORE=1 FE=0 NE=1 | DMA rx_half=64 rx_full=64 (brak progresu) [11:03.222] IDLE=1 → ramka: len=37 crc=bad [11:03.226] EMI: inverter pwm=18 kHz, burst 1.2 µs, duty 60%
2.2 Wzorce
- Skok ORE przy zboczach prądu silnika i przełączaniu mostka.
- NE podczas długich wiązek lub wspólnej masy z torem mocy.
- CRC mismatch w kaskadzie po pojedynczym błędzie bitu.
SR → DR. Błędna kolejność zwiększa częstość powtórzeń.3. Logi i zrzuty rejestrów
USARTx_SR=0x0C20 (ORE=1, NE=1, RXNE=0); DMA_CNDTRx=0 (EN=1) RCC_CSR: BORRSTF=1 (zapad VCC przy rozruchu); PVD: EVENT=1 (prog=2.9 V) SCB_CFSR/HFSR=0 (brak faultów); SysTick jitter RMS=2.7 ms
Korelacja ORE/NE z zapadami i burstami EMI wskazuje na konieczność filtracji wejścia RX oraz stabilizacji zasilania.
4. Filtracja sprzętowa linii UART
| Element | Wartości startowe | Zastosowanie | Uwagi |
|---|---|---|---|
| RC na RX (szereg R + C do GND) | R=22–68 Ω, C=100–330 pF | Tłumienie HF, wygładzanie zboczy | Dobierz do baudrate; dla 115200: R=33 Ω, C=150 pF |
| Ferryt na RX/TX | imp. 100–600 Ω @100 MHz | Szpilki falownika | Umieść blisko złącza, krótkie ścieżki |
| Dławik wspólny (CMC) | 100–300 Ω @100 MHz | Tryb wspólny na wiązce | Skuteczny dla długich przewodów |
| Rezystor szeregowy TX | 10–33 Ω | Terminacja źródła | Zmniejsza odbicia na MISO-likes |
| TVS unidirectional | 3.3–5 V, low-cap | ESD/Surge | Dobierz do poziomu interfejsu |
| Opto/izolator cyfrowy | — | Separacja galwaniczna | Opcjonalnie przy wspólnej masie z napędem |
Złącze ── CMC ── Ferryt ── R(33Ω) ──┬── RX MCU
└─ C(150pF) → GND
5. Ustawienia DMA/IDLE i ISR
// Włącz IDLE do detekcji końca ramki (STM32F1/F4)
USARTx->CR1 |= USART_CR1_IDLEIE; // przerwanie IDLE
// RX przez DMA z podwójnym buforem (F4)
DMAx_Streamy->CR |= DMA_SxCR_MINC | DMA_SxCR_CIRC | DMA_SxCR_DBM;
// ISR: ORE/NE — kolejność SR→DR; IDLE — zamroź długość ramki
void USARTx_IRQHandler(void){
uint32_t sr = USARTx->SR; (void)sr;
if(sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE)){
volatile uint32_t dr = USARTx->DR; (void)dr; // SR→DR
usart_err_event(sr);
}
if(sr & USART_SR_IDLE){
volatile uint32_t dr = USARTx->DR; (void)dr; // skasuj IDLE
frame_close_dma_snapshot(); // policz bajty
}
}
// Snapshot DMA (F4; analogicznie F1 z CNDTR)
static inline uint16_t dma_rx_count(void){
uint16_t ndtr = DMAx_Streamy->NDTR;
return BUF_LEN - ndtr; // odebrane bajty w aktywnym banku
}
// Sekcje krytyczne (BASEPRI) — krótko < 10 µs uint32_t b = __get_BASEPRI(); __set_BASEPRI(0x30); // ... zamiana wskaźników, reset NDTR poza EN=1 na F1 ... __DSB(); __ISB(); __set_BASEPRI(b);
CNDTR/NDTR przy EN=1 (F1/F4). Na F4 użyj DBM i HT/TC, na F1 przepnij bezpiecznie po zatrzymaniu kanału.6. Okablowanie, masy i prowadzenie
- Skręć RX z GND, TX z GND; długość wiązki ≤30–50 cm dla 115200 bps.
- Separuj wiązki UART od torów mocy >30 mm; krzyżuj pod kątem prostym, nie równolegle.
- Jeden punkt masy logicznej; unikaj pętli. Ewentualnie izolacja galwaniczna.
- Trasy na PCB: keep-out wokół RX; ground guard po obu stronach ścieżki.
- Zasilanie MCU: dodatkowa pojemność 1000–2200 µF na 12 V + lokalne 100 nF/1 µF przy MCU.
7. Kryteria akceptacji
| Kryterium | Cel | Po korektach |
|---|---|---|
| ORE/NE na 10⁵ ramek | <0.5% | 0.15–0.30% |
| DMA lock (UART) na 10⁵ ramek | <0.2% | 0.05–0.12% |
| CRC mismatch | <3% | 1.0–2.2% |
| Jitter kick IWDG (RMS) | <1.5 ms | 0.8–1.1 ms |
8. Uwagi serwisowe
Rejestruj histogram błędów (ORE/FE/NE, IDLE) i parametry falownika. Czyść flagi po starcie, loguj RCC_CSR, utrzymuj spójność priorytetów NVIC z profilami komunikacja/pomiary. Dla długich wiązek rozważ RS-485 z transceiverem izolowanym. Szczegółowe informacje podumowujące tematykę falowników.
9. Jak odróżnić EMI od błędu programu
CRC, ORE, FE i timeout nie wskazują automatycznie jednej przyczyny. Użyteczna diagnostyka polega na sprawdzeniu, czy błąd zmienia częstość wraz z pracą falownika, obciążeniem, prowadzeniem przewodu lub ustawieniem przerwań. Jeżeli błąd pojawia się również przy zatrzymanym napędzie i nie reaguje na zmianę prowadzenia linii, większy priorytet ma analiza buforów, długości ramek i obsługi DMA. Jeżeli natomiast seria błędów skupia się wokół startu PWM albo zmian obciążenia, warto porównywać warstwę fizyczną i zasilanie.
| Obserwacja | Najpierw sprawdzić | Porównanie kontrolne |
|---|---|---|
| ORE rośnie po starcie PWM | czas ISR, prowadzenie RX, masa | ten sam test bez aktywnego napędu |
| FE występuje losowo w całym cyklu | baudrate, zbocza, poziomy logiczne | krótszy przewód lub inny baudrate |
| CRC rośnie bez FE/ORE | ramkowanie, długość payloadu, bufor | log surowych bajtów przed parserem |
| DMA zatrzymuje się po pojedynczym błędzie | obsługę wyjątków i restart strumienia | licznik NDTR oraz stan EN po zdarzeniu |
| Błędy idą razem z PVD/BOR | zasilanie logiki | log VCC i RCC_CSR w tym samym oknie czasu |
10. Test A/B dla linii UART
W jednej serii należy zmieniać tylko jeden element: wartość R, pojemność C, sposób prowadzenia przewodu, priorytet ISR albo konfigurację DMA. Przed zmianą zapisuje się liczbę ramek, błędów ORE/FE/NE, CRC i timeoutów. Po zmianie powtarza się ten sam scenariusz obciążenia. Wynik bez wspólnego mianownika w liczbie ramek może wyglądać lepiej tylko dlatego, że próba była krótsza.
Przy filtrze RC przydatne jest odniesienie stałej czasowej do czasu pojedynczego bitu. Zbyt duża stała czasowa może tłumić zakłócenia, ale jednocześnie spowalniać zbocze użytecznego sygnału. Kalkulator RC i LC pokazuje jednocześnie τ, częstotliwość graniczną i udział τ w czasie bitu dla wskazanego baudrate.
Pełną serię dobrze zamknąć jednym rekordem: konfiguracja, liczba ramek, błędy na typ, stan PWM, obciążenie, długość przewodu i wynik końcowy. Taki zapis pozwala po kilku próbach zobaczyć, czy poprawa dotyczy rzeczywiście komunikacji, czy tylko jednego objawu. W przypadku niejednoznacznego problemu można przejść przez checklistę diagnostyczną falownika.