Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32] Algorytm sterowania mikrokontrolerem silnika indukcyjnego 3 fazowego

14 Sty 2018 13:56 2430 15
  • Poziom 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?
  • Computer ControlsComputer Controls
  • Pomocny post
    Poziom 43  
    Strasznie skomplikowałeś tak prostą rzecz.
    Nie trzeba wyliczać napięć skutecznych i z nich napięć szczytowych. Stosunek tych napięć jest stały, więc można to przeskalować i od razu wszystko obliczać na napięciach szczytowych.
    Z kolei zamiast ustalania okresu przerwań Timera można wykorzystać przerwania do Timera PWMa.
    PWM i tak nie jest w stanie wiernie odtwarzać współczynnika wypełnienia jeżeli ten współczynnik się zmienia. Albo będzie generował podwójne impulsy na okres PWMa (ale PWMy z STMów chyba nawet tego nie potrafią), albo przy ustawieniu buforowania zapisu będzie aktualizował wartość PWMa dopiero co każdy cykl PWMa.
    Dużo lepiej więc wpisywane wartości robić synchronicznie z PWMem.
    To oczywiście wymaga przerobienia funkcji przeliczającej wartości sinusa (bo przeskoki nie będą co 1 index lecz co zmienną ilość indexów), ale nie jest to tak trudne jak się może wydawać.
    Ja mam taki kod i on się mieści w mniej niż 10 linijkach.
  • Poziom 3  
    Ok rozumiem.

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

    felekfala napisał:
    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ść?
  • Pomocny post
    Poziom 43  
    1. Najlepiej zdefiniować tablicę o dużej ilości elementów i o ilości będącej wielokrotnością dwójki. Np. 8192 elementów. To odpowiada mniej więcej wartości 1Hz z Twojego przykładu (chodzi mi o to że to jest mała wartość, mniejsza niż 50Hz).
    2. Wcale nie. Może być dowolna. U mnie się dało i 1/1000Hz.
    Po prostu trzeba wyliczać indexy w locie. Ty założyłeś że tablica jest dla 1Hz więc pobierając wartości co określony indeks uzyskasz wartości będącą wielokrotnością 1Hz.
    A można inaczej. Wyliczać indeks. Wtedy przeskok nie będzie stały. Nie będzie musiał wynosić np. 4.
    Może być 4,4,4,4,4,4,4,4,4,3, co da częstotliwość jakieś 4,1Hz.
    Do wyliczania wystarczy bardzo prosty kod. Po prostu musi wyliczać indeks z interpolacją. Zamiast wyliczać 1, 2, 3, niech wylicza 100, 200, 300. Wtedy nie ma problemu z uzyskaniem wartości np. 101, 202, 303. Co oczywiście później musi być skalowane w dół do całkowitych indeksów 1, 2, 3. Pozwala jednak zrealizować przeskok np. o 101, czyli o indeks 1,01.
    Zamiast mnożnika/dzielnika 100 lepiej przyjąć 128 czy inny będący potęgą dwójki.
  • Computer ControlsComputer Controls
  • Poziom 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.
  • Computer ControlsComputer Controls
  • Pomocny post
    Poziom 1  
  • Pomocny post
    Poziom 43  
    Dodam tylko że użycie metody którą opisałem nie wymaga zmieniania tablicy w locie jak to zrobił Marek_Skalski.
    U mnie kod z przerwania wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Angle2 to taka zmienna licząca z dużą precyzją. Angle2_Step to oczywiście krok przypadający na jeden cykl PWMa. Jest on obliczany w programie głównym.
    Angle2_2 to przeskalowana zmienna Angle2. Przeskalowana w dół żeby miała tyle wartości ile elementów ma tablica sinusów.
    Później są pobierane 3 wartości sinusów.
    Vm to napięcie szczytowe też obliczane z programie głównym.

    Później jest już taka oczywista część:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    A w programie głównym:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I deklaracja zmiennych:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Akurat zmienne od Angle2 do V mogą być statyczne w przerwaniu. Tutaj mam globalne bo coś z nimi chyba jeszcze robiłem.
  • Poziom 3  
    atom1477 napisał:

    U mnie kod z przerwania wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    A w programie głównym:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    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 ;)
  • Poziom 43  
    kamil94goldman napisał:
    Czy dobrze liczę, że dla f = 50 Hz kolejne elementy tablicy wynoszą: 2, 5, 7, 10, 12, 15 ?

    Tak.

    kamil94goldman napisał:
    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

    To to samo tylko inne wartości. Ty dzielisz przez 100 a ja przez 64.

    kamil94goldman napisał:
    Tylko czemu zamiast dzielić przesuwasz bity w prawo i jak to jest wyskalowane nie rozumiem ;)

    Przesuwanie bitów w prawo to właśnie dzielenie.

    kamil94goldman napisał:
    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.

    Nie przeskalowuję go później.
    To właśnie przesuwanie bitów jest tym skalowaniem.
    Dzięki temu skalowaniu można uzyskać wartości przykładowo jak te które policzyłeś, czyli 2, 5, 7, 10, 12, 15.
    Przeskok jest jak widać o 2, 3, 2, 3, 2, 3 (i gdzieś tam dużo dalej będzie dwa razy po 3 pod rząd).
    Zwiększając od razu indeks tablicy nie dało by się tego uzyskać. Wtedy można by zwiększać o 1 (1, 1, 1, 1, 1), o 2 (2, 2, 2, 2, 2), o 3 (3, 3, 3, 3, 3), czyli można by uzyskać tylko całkowite wielokrotności.
    Zwiększając zmienną większą 64 razy zwiększamy tak jakby indeks wraz z jego częścią ułamkową.
    Czyli zwiększając zmienną o 1 zwiększamy indeks 0.015625. Żeby indeks wzrastał o 1 trzeba zmienną zwiększać o 64. Zwiększając zmienną o 65 zwiększamy indeks tak jak by o 1.015625.
    Dzięki temu po (1, 1, 1, 1, 1) nie występuje od razu (2, 2, 2, 2, 2), tylko (1.015625, 1.015625, 1.015625, 1.015625, 1.015625).
    Czyli zanim dojdziemy do (2, 2, 2, 2, 2) to jest jeszcze po drodze 64 pozycji pośrednich.
    Czyli rozdzielczość ustalania częstotliwości jest 4 razy większa.
  • Poziom 3  
    Ok, rozumiem.

    atom1477 napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

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

    atom1477 napisał:
    Później jest już taka oczywista część:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    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 ;)
  • Poziom 43  
    To wszystko już tam jest.
    2816 to taki współczynnik przeliczeniowy który można uznać za wartość napięcia zasilającego.
    PWM_1_2 to wartość PWM_1/2, czyli połowa zakresu PWMa. Dla PWMa 12 bitowego o 8192 wartościach, jest to wartość 4096.
    Dodanie tej wartości do wartości U, V i W przesunie wartości wypełniania do wartości o jakich piszesz (0 do 50%, wartości ujemne do 0...49% a dodatnie do 51...100%).
  • Poziom 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:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    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:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ponieważ przy sterowaniu skalanym nie ma się kontroli w stanach dynamicznych również zrealizowałem zadajnik częstotliwości w przerwaniach od innego timera:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Oraz zmienne:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    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.
  • Poziom 43  
    2. "Nadmodulacja" nie ma nic do rzeczy w sprawie zasilania układów przez bootstrap.
  • Poziom 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?
  • Poziom 43  
    Myślałem że Ci chodzi o modulację tętnieniami napięcia sieci.
    Wypełnienie PWMa równe 100% oczywiście będzie szkodliwe. Ale po prostu nie należy dopuszczać do takiego wypełnienia i to rozwiązuje problem. Takie wypełnienie nie ma zresztą sensu. Trzeba mieć jakiś zapas żeby zaimplementować na przykład kompensację tętnień napięcia na kondensatorze filtrującym napięcie zasilające.
  • Poziom 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