Implementacja algorytmów sterowania silnikami DC w XMC4000

Sterowanie silnikiem za pomocą mikrokontrolera z rodziny XMC4000

W poprzednim rozdziale przedstawione zostały równania, które muszą zostać obliczone przez mikrokontroler w celu sterowania pracą silnika. Ponadto, aby algorytm zaimplementować w pełnej wersji, uwzględnić należy dodatkowe wzory. W przypadku braku czujników określających pozycję wirnika, liczba obliczeń zostaje podwojona.

Pomimo, że równania są skomplikowane, mogą one zostać zaimplementowane w wielu mikrokontrolerach 16- lub 32-bitowych. Oczywistym jest, że jednostka obliczeniowa z blokiem DSP i modułem FPU do operacji na liczbach zmiennoprzecinkowych jest w stanie wykonać obliczenia łatwiej i szybciej. To z kolei pozwala na implementację bardziej skomplikowanych algorytmów (takich jak np. FOC bez czujników określających pozycję wirnika).

W takim wypadku czemu dwurdzeniowe mikrokontrolery są tak popularne w systemach sterowania silnikiem? Odpowiedź na to pytanie wynika z konieczności realizacji przez mikrokontroler większej liczby zadań niż tylko wykonywanie obliczeń na potrzeby sterowania silnikiem. Zanim jakiekolwiek obliczenia zostaną wykonane, w pierwszej kolejności muszą zostać odczytane dane, które pochodzić mogą z peryferiów takich jak porty wejścia/wyjścia, przetwornik A/C czy interfejsy komunikacyjne. Następnie, gdy obliczenia zostaną już wykonane, wyniki muszą zostać przekazane ponownie do peryferiów. Szybka synchronizacja tych czynności jest równie istotna, jak efektywne wykonywanie samych obliczeń.

Używanie mikrokontrolerów z dwoma rdzeniami jest w tym procesie pomocne. Jeden rdzeń może wykonywać obliczenia, tymczasem drugi rdzeń może odpowiadać za peryferia odczytując dane z przetwornika A/C, ustawiając wypełnienie sygnału PWM czy odczytując informacje z czujników określających pozycję wirnika. Jednakże z faktu korzystania z mikrokontrolera z dwoma rdzeniami wynikają również pewne niedogodności. Deweloper oprogramowania musi wykonać dodatkową pracę potrzebną na optymalne rozdzielenie zadań między dwa rdzenie. Więcej czasu wymaga też nauczenie się architektury mikrokontrolera, jego zestawu instrukcji oraz narzędzi projektowych. Gdy już to wszystko zostanie zrobione, okazuje się, że wiedzy tej nie da się wykorzystać dla żadnego innego mikrokontrolera oferowanego przez innego producenta.

Mimo że zadania przeznaczone dla drugiego rdzenia są zazwyczaj nieskomplikowane, są one wykonywane w czasie rzeczywistym. Używanie mikrokontrolera z jednym rdzeniem jest zatem możliwe, ale tylko w wypadku, gdy pozwala on zrealizować również w czasie rzeczywistym wszystkie zadania. Obejmować one mogą wykonywanie algorytmu sterowania silnikiem, obsługę peryferiów i realizację interfejsu użytkownika. Sprostanie temu może okazać się wyzwaniem, nawet dla mikrokontrolera z rdzeniem ARM Cortex-M4F.

Większość zadań drugiego rdzenia sprowadza się do przesyłania danych między zasobami wewnętrznymi oraz synchronizacji zdarzeń wejścia/wyjścia. Zadania te można efektywnie wykonywać za pomocą matrycy połączeń pomiędzy peryferiami.

Jako przykład rozważyć można zadanie polegające na dekodowaniu pozycji wirnika silnika poprzez przetwarzania sygnałów z enkodera kwadraturowego. Enkoder taki jest czujnikiem pozycji wirnika i generuje dwa sygnały (każdy na osobnym wyprowadzeniu) przesunięte względem siebie o 90 stopni. Za każdym razem gdy w przebiegu jednego z sygnałów wystąpi zbocze, odpowiada to wykonaniu ruchu przez wirnik. Kierunek ruchu określony jest przez przesunięcie fazy między sygnałami (+ 90 stopni, – 90 stopni). Dodatkowo w enkoderze czasem dostępne jest trzecie wyprowadzenie informujące kiedy pełen obrót został wykonany. Przykładowe przebiegi sygnałów z kodera kwadraturowego pokazano na rysunku 8.

 Rys. 8. Przebiegi sygnałów enkodera kwadraturowego (górne przebiegi: kierunek obrotu wirnika zgodny z ruchem wskazówek zegara, dolne przebiegi: kierunek obrotu wirnika przeciwny do ruchu wskazówek zegara)

Rys. 8. Przebiegi sygnałów enkodera kwadraturowego (górne przebiegi: kierunek obrotu wirnika zgodny z ruchem wskazówek zegara, dolne przebiegi: kierunek obrotu wirnika przeciwny do ruchu wskazówek zegara)

 

Na rysunku 9 pokazano jak mikrokontroler z rodziny XMC4000 posiadając tylko jeden rdzeń może w sposób efektywny przetwarzać sygnały z enkodera przy wykorzystaniu zaawansowanym peryferii. Takim peryferium jest POSIF ( Position Interface ). Skonfigurowany do działania w trybie „Quadrature Decoder mode” zasób ten może odczytywać i interpretować sygnały z enkodera. POSIF może zostać podłączony przez matrycę połączeń do jednego modułu CCU4 ( Capture Compare Unit ). Dzięki temu wartość licznika „Slice 0” modułu CCU4 wzrasta lub maleje automatycznie (w zależności od kierunku obrotu silnika) przechowując informację o aktualnej pozycji wirnika. Z kolei wartość licznika „Slice 1” modułu CCU4 odczytując sygnał IDX zwiększa się o 1 po każdym pełnym obrocie wirnika dostarczając informacji o liczbie jego obrotów. Liczniki „Slice 2” i „Slice 3” są używane do określenia prędkości wirnika. „Slice 2” zlicza liczbę zboczy, które wystąpiły w przebiegu sygnału w określonym czasie. „Slice 3” mierzy czas pomiędzy zboczami. Pozwala to mierzyć w sposób dokładny prędkość obrotu wirnika w szerokim zakresie prędkości i odbywa się to bez potrzeby rekonfiguracji zasobów przez rdzeń.

 

Rys. 9. Połączenie i konfiguracja modułów POSIF i CCU4 pozwalające na określanie pozycji i prędkości wirnika silnika za pomocą sygnałów odczytywanych z enkodera kwadraturowego

 

Przedstawiona koncepcja może zostać rozszerzona poprzez dołączenie innych peryferiów np. generatora sygnału PWM czy przetwornika A/C. Połączenie tych dwóch peryferiów pozwala zrealizować konwersję A/C wyzwalaną (synchronizowaną) za pomocą sygnału PWM bez angażowania rdzenia mikrokontrolera. Jeden z możliwych scenariuszy to wielokanałowa konwersja A/C w zdefiniowanych momentach przebiegu sygnału PWM w celu zrekonstruowania 3-fazowych przebiegów prądu. Wartość skonwertowanego przez przetwornik sygnału może być automatycznie podawana na wejścia komparatorów w celu wykrycia nieprawidłowości typu „over-current”, „over-voltage”, „under-voltage” i innych. W wyniku połączenia peryferii i ich działania bez użycia rdzenia mikrokontrolera możliwe jest zaprojektowanie i stworzenie bardziej zaawansowanego systemu sterowania silnikiem czasu rzeczywistego przy użyciu mikrokontrolera z rodziny XMC4000, niż w przypadku mikrokontrolera dwurdzeniowego.

Podsumowanie

Zaawansowane algorytmy sterowania silnikiem wymagają od mikrokontrolera wysokiej wydajności  pozwalającej na efektywne obliczenia matematyczne i realizację zadań w czasie rzeczywistym. Jednostka obliczeniowa rdzenia ARM Cortex-M4 pracująca z częstotliwością powyżej 100 MHz, wraz z blokiem DSP i modułem FPU do operacji na liczbach zmiennoprzecinkowych pozwala wykonywać obliczenia z efektywnością wymaganą w systemach kontroli silnika. Biblioteka CMSIS DSP zawiera ponadto implementacje wielu przydatnych operacji takich jak transformacje Clarka i Parka czy PID w wersji stałoprzecinkowej i zmiennoprzecinkowej. To sprawia, że algorytmy sterowania silnikiem są łatwiejsze do zaimplementowania, a ponadto mogą zostać przeniesione na inne platformy sprzętowe. Możliwość łączenia ze sobą peryferiów w celu ich współpracy pozwala na implementację zaawansowanych algorytmów sterowania silnikiem w mikrokontrolerze z rodziny XMC4000, który wyposażony jest tylko w jeden rdzeń.

Artykuł powstał na bazie tłumaczenia artykułu „ Implementing Complex Motor Control Algorithms with a Standard Processor Core ” (autor: Mike Copeland, Infineon Technologies).

O autorze