Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

kamil94goldman 14 Jan 2018 13:56 3189 15
Altium Designer Computer Controls
  • #1
    kamil94goldman
    Level 3  
    Witam, chciałbym się zapytać, czy taki sposób implementacji/algorytmu sterowania mikrokontrolerem falownika do silnika indukcyjnego 3 fazowego, przy najprostszym sterowaniu skalarnym U/f = const., bez prędkościowego sprzężenia zwrotnego jest poprawny?
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego
    Założenia:
    - Wykorzystuje STM32F103

    - Częstotliwość falownika będzie zmieniana w zakresie od 1 Hz do 50 Hz.

    - Wykorzystuje timer zaawansowany (TIM1/8) z trzema wyjściami komplementarnymi, wraz z czasami martwymi. Komparacyjna metoda PWM (zrealizowana oczywiście w sposób programowy), czyli PWM (licznik) liczy symetrycznie w górę i w dół. Częstotliwość fali nośnej, czyli częstotliwość PWM równa się 6 kHz i jest stała. Wartości dodatnie odtwarzanego napięcia fazowego, są dla wypełnienia od 51 % do 100%, wartości ujemne napięcia fazowego są dla wypełnienia od 0 % do 49 %, a wypełnienie 50 % równa się wartości zero napięcia fazowego. Wartość wypełnienia, odpowiadająca niejako chwilowemu napięciu fazowemu jest obliczana, jako stosunek wartości chwilowej zadanego napięcia fazowego (fala modulująca), do wartości napięcia zasilającego falownik i odpowiednio przeskalowana.

    - W tablicy definiuje wartości sinusa (samego sinusa) np. dla częstotliwości 50 Hz. PWM chodzi z stałą częstotliwością. Kolejne elementy sinusa podawane są w przerwaniu (np. od jakiegoś timera) i mnożone przez wartość szczytową napięcia fazowego. Zmieniając okres tych przerwań zmieniam częstotliwość pierwszej harmonicznej napięcia. Czyli gdy zmniejszam częstotliwość poniżej 50 Hz, to okres przerwań wydłużam. Czy w tych przerwaniach można zrealizować algorytm regulacji u/f = const i może on wyglądać tak jak poniżej?


    1. WEJŚCIE W PRZERWANIE TIMERA

    2. Odczytywana jest częstotliwość zadana i przeliczana na odpowiedni okres przerwań tego timera.

    3. Następnie wyliczana jest wartość skuteczna napięcia, dla zapewnienia stałego strumienia, tak żeby stosunek u/f był stały.

    4. Mając wymaganą wartość napięcia skutecznego do utrzymania stałego strumienia, obliczana jest jej wartość szczytowa. Pobierana jest kolejna wartość sinusa, z zadeklarowanej wcześniej tablicy (w każdym przerwaniu pobierana jest tylko jedna wartość sinusa i następnie numer tablicy jest inkrementowany o jeden). Pobrana wartość sinusa jest mnożona, przez napięcie szczytowe, w wyniku czego otrzymujemy wartość chwilową potrzebnego napięcia fazowego (fali modulującej).

    5. Wyliczone napięcie chwilowe dzielę, przez napięcie zasilające i następnie, przez przeskalowanie ustalany jest współczynnik wypełnienia, tak jak wyżej zostało napisane czyli: Wartości dodatnie odtwarzanego napięcia fazowego, są dla wypełnienia od 51 % do 100%, wartości ujemne napięcia, są dla wypełnienia od 0 % do 49 %, a wypełnienie 50 % równa się wartości zero napięcia.

    6. Dla sinusów przesuniętych o 120 oraz -120 stopni również wyliczam, tak jak wyżej współczynnik wypełnienia

    7. Przeliczone, przeskalowane współczynniki wypełnienia są wpisywane do rejestrów CCRx

    8. KONIEC PRZERWANIA

    Czy taki algorytm/implementacja jest poprawna, a może można to zrealizować w lepszy sposób?
  • Altium Designer Computer Controls
  • Helpful post
    #2
    Anonymous
    Level 1  
  • #3
    kamil94goldman
    Level 3  
    Ok rozumiem.

    W jednym z tematów na forum znalazłem:

    felekfala wrote:
    Są rożne sposoby, najprostszym jest:
    PWM chodzi z stałą częstotliwością, kolejne elementy z tablicy sinusa podawane są w przerwaniu do rejestrów PWM co jakiś okres czasu, zmieniając ten okres zmieniasz częstotliwość pierwszej harmonicznej napięcia. Inny sposób to stały okres wpisywania do rejestrów PWM wypełnienia, poprzez np skokową zmianę elementów z tablicy, lub mając szybki procesor wyliczanie wartości online.


    Czyli masz na myśli ten sposób zaznaczony pogrubionym tekstem, czyli można by to liczyć chyba tak:

    Przy założeniach, że:
    - sinusy są zdefiniowane dla f = 50 Hz
    - częstotliwość nośna (częstotliwość PWM) = 6 kHz

    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    Zastanawia mnie jeszcze:

    1. Jeżeli chcę regulować częstotliwość od 1 Hz do 50 Hz, to lepiej zdefiniować tablice sinusów dla 50 Hz, czy dla 1 Hz?
    Dla 50 Hz, przy częstotliwości nośnej 6 kHz, będzie 120 elementów sinusa, czyli przy ustawianiu częstotliwości napięcia mniejszych od 50 Hz impulsy będą się powtarzać.
    Dla 1 Hz, przy częstotliwości nośnej 6 kHz, będzie 6000 elementów sinusa, czyli przy ustawianiu częstotliwości napięcia większych od 1 Hz impulsy będą pomijane, przez skokowe indeksowanie.
    Wydaje mi się, że chyba lepiej definiować dla 1 Hz, bo chyba napięcie (wartości chwilowe napięcia) będą lepiej odwzorowane?

    2. Przy takiej realizacji, czyli przez wpisywanie wartości synchronicznie z PWMem, dokładność (rozdzielczość) nastawy częstotliwości napięcia będzie około 1 Hz. Ostatnio na laboratorium na zajęciach obsługiwałem falownik do silnika 3f, który realizował u/f = const i miał możliwość nastawy częstotliwości napięcia co 0,1 Hz. W jaki sposób można by zrealizować tak dużą rozdzielczość?
  • Altium Designer Computer Controls
  • Helpful post
    #4
    Anonymous
    Level 1  
  • #5
    kamil94goldman
    Level 3  
    1. Czyli jeżeli dobrze rozumiem, to można zrealizować to w taki sposób:
    (oczywiście lepiej było by zadeklarować elementy sinusa dla np. 0,1 Hz)
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego
    W sumie aż za proste, ale wydaje mi się, że działa poprawnie?

    2. Nie rozumiem tylko z jakiego powodu liczba elementów musi być wielokrotnością dwójki a dzielnik musi być potęgą dwójki.
  • Helpful post
    #6
    Anonymous
    Level 1  
  • Helpful post
    #7
    Anonymous
    Level 1  
  • #8
    kamil94goldman
    Level 3  
    atom1477 wrote:

    U mnie kod z przerwania wygląda tak:
    Code: c
    Log in, to see the code


    A w programie głównym:
    Code: c
    Log in, to see the code


    Czy dobrze liczę, że dla f = 50 Hz kolejne elementy tablicy wynoszą: 2, 5, 7, 10, 12, 15 ?

    Nie mogę zrozumieć jak to się dzieje, że przez przesunięcie bitów o sześć pozycji w prawo otrzymujesz najpierw krok przypadający na jeden cykl PWM a następnie go przeskalowujesz. Czy mógł byś przybliżyć mi jak to działa?

    Dodano po 24 [minuty]:

    Chyba te trzy linijki obliczające krok oznaczają to samo co pisałem w wcześniejszym poście:

    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    Tylko czemu zamiast dzielić przesuwasz bity w prawo i jak to jest wyskalowane nie rozumiem ;)
  • #9
    Anonymous
    Level 1  
  • #10
    kamil94goldman
    Level 3  
    Ok, rozumiem.

    atom1477 wrote:
    Code: c
    Log in, to see the code

    Tutaj masz już obliczone poszczególne chwilowe napięcia fazowe i chyba jakoś przeskalowane

    atom1477 wrote:
    Później jest już taka oczywista część:
    Code: c
    Log in, to see the code

    Następnie chyba powinno się podzielić napięcie chwilowe przez napięcie zasilające falownik i przez przeskalowanie ustalany powinien być współczynnik wypełnienia tak, że: Wartości dodatnie odtwarzanego napięcia fazowego, są dla wypełnienia od 51 % do 100%, wartości ujemne napięcia, są dla wypełnienia od 0 % do 49 %, a wypełnienie 50 % równa się wartości zero napięcia.
    Co jest w zmiennej PWM_1_2? nie mogę zrozumieć co tu się dzieje ;)
  • #11
    Anonymous
    Level 1  
  • #12
    kamil94goldman
    Level 3  
    Witam,

    Niedawno zmontowałem mój układ falownika. Do sterowania tranzystorami wykorzystałem układ IRS23364 - układ drivera mostka trójfazowego z deadtime, ograniczeniem prądowym z wbudowanym komparatorem itd... Wykonałem układ obwodu mocy jak na schemacie poniżej. Dodatkowo przewidziałem miejsce na dwa przetworniki LEM LTS 6-NP, żeby w przyszłości zrealizować sterowanie wektorowe silnika.

    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    Płytkę obwodu mocy wykonałem przez firmę drukowane.pl. Sygnały sterujące na razie dołączam z płytki nucleo z mikrokontrolerem stm32f103.
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    Tak jak już było pisane wcześniej jako modulator zastosowałem timer zaawansowany TIM1 z wyjściami komplementarnymi. Tutaj załączam konfigurację TIM1 może się komuś przyda:
    Code: c
    Log in, to see the code

    Funkcję regulacji zrealizowałem w przerwaniach od TIM1 podobnie jak napisał atom1477 - bardzo dziękuję za udostępnienie kodu, bardzo fajne jest to indeksowanie z tablicą będącą potęgą dwójki ;) Oto funkcja regulacji:
    Code: c
    Log in, to see the code

    Ponieważ przy sterowaniu skalanym nie ma się kontroli w stanach dynamicznych również zrealizowałem zadajnik częstotliwości w przerwaniach od innego timera:
    Code: c
    Log in, to see the code

    Oraz zmienne:
    Code: c
    Log in, to see the code

    W razie przekroczenia nadmiernego prądu wykrywanego przez komparator w układzie IRS23364 wyjście fault jest zwierane do masy, co wykorzystałem do realizacji wykrywania awarii przez mikrokontroler z wykorzystaniem funkcji break, która wyłącza wszystkie tranzystory i wówczas silnik będzie hamowany wybiegiem.

    Zadeklarowałem tablicę sinusa o 2048 wartościach dla całego okresu tzn. dla połówki dodatniego sinusa oraz ujemnego. Częstotliwość modulatora PWM nastawiłem na 4kHz, co oznacza, że tablica została zadeklarowana dla częstotliwości napięcia równej 1,95 Hz.

    Generalnie cały program regulacji działa bardzo ładnie, na razie sygnałów sterujących z mikrokontorlera jeszcze nie testowałem z obwodem mocy. Na początku zamierzam przetestować układ z trójfazowym obciążeniem rezystancyjnym, żeby zobaczyć czy napięcia międzyfazowe wyglądają tak jak powinny. Na razie testowałem program w taki sposób, że do wyprowadzeń mikrokontrolera (wyprowadzeń timera TIM1) podłączałem oscyloskop i wszystko działa bardzo ładnie. Na oscyloskopie można zauważyć płynnie zmieniające się napięcie (wypełnienie) wraz z częstotliwością. Poniżej mały screen dla ustawionej częstotliwości napięcia równej 50 Hz:
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    Lecz przed uruchomieniem obwodu mocy mam takie dwa pytania:
    1. Układ drivera IRS23364 ma dead time lecz zastanawiam się na jaki czas ustawić dead time generowane przez TIM1? Dead time w układzie IRS23364 wynosi typowo 275 ns. Zastanawiam się czy można oszacować jaki powinien być czas dead time ? na pewno ma tutaj znaczenie czas wyłączania tranzystora, ale w sumie czy coś jeszcze w moim układzie ma na to znaczenie?

    2. Przy częstotliwości 50 Hz napięcia sieciowego będzie już występowała mała nadmodulacja, którą już trochę nawet widać na oscylogramie zamieszczonym powyżej. Tranzystory są sterowane przez układ bootstrapujący, czyli kondensator bootstrapujący jest ładowany, gdy przewodzi dolny tranzystor. Więc zastanawiam się czy przy nadmodulacji wystarczy energii zgromadzonej w kondensatorze bootstrapującym do zasilania jego bramki? Czy da się to jakoś łatwo określić, czy po prostu muszę szukać not aplikacyjnych przedstawiających obliczanie układu bootstrapujących od IR? Na wyjściach VS zastosowałem rezystory o rezystancji 2 ohm, które zabezpieczają układ IRS23364 przed pojawieniem się ujemnych szpilek napięcia. Więc ten rezystor też spowoduje spowolnienie ładowania się kondensatora bootstrapującego.
  • #13
    Anonymous
    Level 1  
  • #14
    kamil94goldman
    Level 3  
    Ale podczas nadmodulacji w jednej gałęzi falownika będzie występowało przez pewien czas wypełnienie 100% więc czy nie ma to znaczenia dla układów bootstrap?
  • #15
    Anonymous
    Level 1  
  • #16
    kamil94goldman
    Level 3  
    Mam pytanie co do zdjętych przebiegów napięcia na bramce - przebieg żółty oraz przebieg napięcia kolektor-emiter - przebieg niebieski. Falownik zasiliłem na razie napięciem 17 V, a jako obciążenie wykorzystałem trójfazowe obciążenie rezystancyjne.

    Obserwując przebiegi na bramce oraz między kolektorem a emiterem jednego z dolnych tranzystorów mostka trójfazowego pojawiają się trzy różne sytuacje. Nie mogę za bardzo wszystkiego zinterpretować. Czas dead time mam ustawiony na 1,5 us.

    1. Sytuacja pierwsza przy wyłączaniu. Napięcie bramki (przebieg żółty) zanika, pojawia się czas 1,5 us (dead time) podczas trwania czasu martwego wyłączone są dwa tranzystory w jednej gałęzi mostka, więc podczas trwania czasu martwego napięcie między kolektorem a emiterem wynosi 1/2 napięcia zasilania. Gdy czas martwy się kończy załącza się górny tranzystor i całe napięcie odkłada się na dolnym tranzystorze.
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    2. Kolejny przypadek przy wyłączaniu to napięcie bramki (przebieg żółty) zanika, a napięcie kolektor-emiter pojawia się od razu. W sumie nie wiem jak to interpretować. Czy tutaj pojawia się napięcie to napięcie kolektor emiter chyba od innej gałęzi falownika przez obciążenie rezystancyjne? Bo powinien tutaj być jeszcze dead time, więc górny tranzystor nie może jeszcze przewodzić.
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

    3. Ostatni przypadek pojawia się zawsze gdy mam ustawioną zerową częstotliwość, czyli załączane są równocześnie trzy górne tranzystory albo trzy dolne. Czy w takiej sytuacji nie powinny przebiegi przy wyłączaniu wyglądać jak w pierwszym przypadku?
    [STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego