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.
Uwaga: ORE czyścić sekwencją 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

ElementWartości startoweZastosowanieUwagi
RC na RX (szereg R + C do GND)R=22–68 Ω, C=100–330 pFTłumienie HF, wygładzanie zboczyDobierz do baudrate; dla 115200: R=33 Ω, C=150 pF
Ferryt na RX/TXimp. 100–600 Ω @100 MHzSzpilki falownikaUmieść blisko złącza, krótkie ścieżki
Dławik wspólny (CMC)100–300 Ω @100 MHzTryb wspólny na wiązceSkuteczny dla długich przewodów
Rezystor szeregowy TX10–33 ΩTerminacja źródłaZmniejsza odbicia na MISO-likes
TVS unidirectional3.3–5 V, low-capESD/SurgeDobierz do poziomu interfejsu
Opto/izolator cyfrowy—Separacja galwanicznaOpcjonalnie przy wspólnej masie z napędem

Złącze ── CMC ── Ferryt ── R(33Ω) ──┬── RX MCU
                                   └─ C(150pF) → GND
Praktyka: Dla 9600–57600 bps dopuszczalne większe C (do 330 pF). Powyżej 115200 bps trzymaj stałą czasową RC < ~1/10 okresu bitu.

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);
Uwaga: Nie zapisuj 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

KryteriumCelPo 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 ms0.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.

ObserwacjaNajpierw sprawdzićPorównanie kontrolne
ORE rośnie po starcie PWMczas ISR, prowadzenie RX, masaten sam test bez aktywnego napędu
FE występuje losowo w całym cyklubaudrate, zbocza, poziomy logicznekrótszy przewód lub inny baudrate
CRC rośnie bez FE/OREramkowanie, długość payloadu, buforlog surowych bajtów przed parserem
DMA zatrzymuje się po pojedynczym błędzieobsługę wyjątków i restart strumienialicznik NDTR oraz stan EN po zdarzeniu
Błędy idą razem z PVD/BORzasilanie logikilog 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.