# Implementacja interfejsu CAN w STM32 do sterowania napędami elektrycznymi: przewodnik techniczny
Szyna CAN pozostaje standardem de facto dla komunikacji w systemach embedded z rygorystycznymi wymaganiami odporności na awarie. W przeciwieństwie do popularnych UART/I2C, CAN zapewnia różniczkową transmisję danych z sprzętowym przetwarzaniem kolizji poprzez nieinwazyjny arbitraż. W projektach opartych na STM32G431RB (jak w zestawie IHM03) kluczowe jest uwzględnienie cech warstwy fizycznej i kanałowej przy projektowaniu sterowników.
Kluczowe parametry techniczne wpływające na implementację:
- Prędkość transmisji: Od 125 kbit/s (Low-Speed) do 1 Mbit/s (High-Speed)
- Topologia sieci: Liniowa z terminatorami 120 Ω na końcach
- Format ramki: Standard (11-bitowy ID) lub Extended (29-bitowy)
- Bit stuffing: Automatyczne wstawianie bitów przy sekwencji z 5 identycznych
Wbudowane kontrolery CAN w STM32 (bxCAN) obsługują wszystkie tryby pracy, ale wymagają precyzyjnego ustawienia parametrów czasowych (SJW, BS1, BS2). Błąd w obliczeniu prescalera baud rate doprowadzi do utraty synchronizacji przy wysokim obciążeniu szyny.
Projektowanie interfejsu CAN dla STM32 Motor Control
Modyfikacja projektu PMSM Control
Do integracji CAN w istniejący projekt sterowania napędem było potrzebne:
- Dodać do projektu bibliotekę CAN ze STM32CubeMX
- Skonfigurować taktowanie peryferii CAN poprzez RCC
- Zaimplementować bufor pierścieniowy do odbioru/wysyłki wiadomości
- Zsynchronizować przetwarzanie ramek CAN z głównym cyklem sterowania silnikiem
Krytyczny moment — podział czasu między przetwarzaniem PWM a CAN. Przy użyciu FreeRTOS utworzono oddzielne zadanie o priorytecie wyższym niż zadanie sterowania silnikiem, ale niższym niż przerwań bezpieczeństwa.
Struktura bazy danych CAN
Opracowano strukturę podobną do DBC do zarządzania wiadomościami:
typedef struct {
uint32_t id;
uint8_t dlc;
void (*handler)(uint8_t*);
} can_msg_t;
const can_msg_t can_db[] = {
{0x123, 8, handle_motor_status},
{0x246, 4, handle_control_cmd},
// ... inne wiadomości
};
Każda wiadomość jest powiązana z konkretną funkcją obsługi poprzez tabelę dyspozytornią. Umożliwiło to uniknięcie monolitycznego switch-case i uprościło dodawanie nowych typów ramek.
Praktyczna implementacja i testowanie
Debugowanie warstwy fizycznej
Podczas pierwszych testów obserwowano błędy CRC spowodowane:
- Nieprawidłowym umiejscowieniem terminatorów (zainstalowane tylko na jednym końcu)
- Przekroczeniem długości szyny (ponad 40 m przy prędkości 1 Mbit/s)
- Użyciem nieekranowanej skrętki
Rozwiązanie:
- Instalacja terminatorów 120 Ω na obu końcach linii
- Obniżenie prędkości do 500 kbit/s dla długości 60 m
- Zastosowanie ekranowanego kabla o impedancji 120 Ω
Analiza oscyloskopowa potwierdziła poprawność sygnałów różniczkowych (CAN_H=3.5V, CAN_L=1.5V w stanie dominującym).
Testowanie pod obciążeniem
Przeprowadzono testy stresowe przy 80% obciążeniu szyny:
- Maksymalna przepustowość: 700 kbit/s (teoretyczny limit dla ramek 8-bajtowych — 750 kbit/s)
- Opóźnienie przetwarzania ramki: < 100 µs
- Współczynnik błędów: 0 przy długości szyny do 30 m
Krytyczny błąd wystąpił przy jednoczesnej transmisji 3 wiadomości o wysokim priorytecie (niskim ID). Rozwiązano to poprzez konfigurację filtrów CAN_RX, dzieląc wiadomości na banki filtracji.
Co ważne
- Timingi szyny: Precyzyjne obliczenia BS1/BS2 są krytyczne dla stabilnej pracy na wysokich prędkościach
- Arbitraż priorytetów: Niskie ID mają przewagę — planuj hierarchię wiadomości z wyprzedzeniem
- Obsługa błędów: Zaimplementuj mechanizm restartu kontrolera CAN po osiągnięciu stanu error passive
- EMC: Ekranowanie kabla i uziemienie ekranu na obu końcach jest obowiązkowe w warunkach przemysłowych
- Testowanie: Używaj analizatorów CAN (np. PCAN-USB) do weryfikacji protokołu
Integracja interfejsu CAN w projekt sterowania napędem elektrycznym na STM32 wymaga głębokiego zrozumienia zarówno cech sprzętowych peryferii, jak i specyfiki protokołu. Udana implementacja otwiera drogę do tworzenia rozproszonych systemów sterowania z możliwością późniejszej integracji z platformami IoT i analizą AI.
— Editorial Team
Brak komentarzy.