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

Sterownik silnika PMSM na STM32F4

qaz88 10 Sty 2014 16:17 18972 30
  • Sterownik silnika PMSM na STM32F4
    Witam wszystkich,

    Opisana konstrukcja jest częścią mojej pracy magisterskiej. Urządzenie ma za zadanie sterować wszelkimi silnikami PMSM wyposażonymi w enkoder inkrementalny. Zakres możliwej do ustawienia prędkości jest płynny od zera do nominalnej prędkości silnika z rozdzielczością 1 obrotu na minute.

    Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4

    Sterownik składa się z dwóch płytek. Każda ma wymiary 5x5 cm.
    Pierwsza płytka zawiera mikrokontroler, przyciski, potencjometr i odpowiednie złącza dla komunikacji. Druga natomiast posiada odseparowana optycznie część mocy.
    Zastosowane czujniki prądu to znane wszystkim układy allegro ACS712 natomiast drivery do mosfetow to IRS2186. Cały sterownik po dodaniu małego radiatora z wiatraczkiem wziętego ze starej karty graficznej stabilnie pracuje przy prądzie 20A. Większych prądów nie testowałem gdyż nie mam odpowiedniego źródła zasilania.
    Testowany silnik ma 200W mocy i napięcie nominalne 36V

    Program odpowiedzialny za sterowanie silnikiem został dla ułatwienia w całości zrobiony w matlabie za pomocą narzędzia simulink. Następnie za pomocą matlaba wygenerowany automatycznie kod C został połączony z wcześniej napisanym kodem C odpowiedzialnym za konfiguracje peryferiów i w takiej postaci wgrany na mikrokontroler. Dzięki temu można znacznie prościej modyfikować cały algorytm za pomocą jedynie przeciągania nowych bloczków w simulinku. Procesor STM32f4 jest wystarczająco wydajny aby przetwarzać cały tak napisany algorytm FOC z częstotliwością 40kHz co jest aż nadto.

    Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4

    Kontroler działa bardzo płynnie a nieobciążony silnik dochodzi do zadanej prędkości w ok 10ms. Może i można by to jeszcze przyspieszyć zmieniając parametry regulatorów PID ale osiągnięty efekt uznałem już za wystarczający. Cały sterownik będzie teraz użyty do sterowania silnikiem zamocowanym w małym pojeździe elektrycznym.

    W razie jakichkolwiek pytan czy tez uwag proszę śmiało pisać. Chętnie odpowiem na wszelkie komentarze.


    Fajne!
  • #2 10 Sty 2014 18:54
    felekfala
    Poziom 19  

    Witam,
    fajna praca, gratuluję wykonania.
    - ile impulsów na obrót ma wykorzystany przez Ciebie enkoder?
    - czy enkoder jest ze znacznikiem przejścia przez zero, który wykorzystujesz do synchronizacji ?
    - prędkość zadajesz z potencjometru umieszczonego na PCB sterującej?
    - jakie mosfety wykorzystałeś?
    - czy możesz opisać dokładnie, krok po kroku proces przeniesienia kodu z Simulinka do Keila? Czy z Simulinka masz funkcję z wejściami i wyjściami, którą uC realizuje w przerwaniu. Gdzie wejścia to np. wartości zadane, pomiary, a wyjście to współczynnik wypełnienia?
    - jaki dokładnie czas trwa wykonanie się całego fragmentu kodu dotyczącego sterowania?
    - czy możesz wrzucić przebiegi prądów, oraz napięcia w układzie alfa beta ?
    - czy masz zarejestrowane jakieś stany dynamiczne i przebiegi prądów id oraz iq ?

    W swojej pracy magisterskiej również wykonywałem projekt sterowania falownikiem z tym, że zasilający silnik indukcyjny 2,2kW.
    https://www.elektroda.pl/rtvforum/topic2408422.html

  • #3 10 Sty 2014 19:44
    qaz88
    Poziom 12  

    No dzieki. Szczerze to wlasnie Twoj projekt mnie zainspirowal do wykorzystania tego procesora w moim projektcie. Trzeba jeszcze pamietac ze sterowanie silnikiem PMSM jest prostsze od silnika asynchronicznego bo odchodzi kontrola poslizgu.
    Odpowiadajac na Twoje pytania:
    - mam 10000 impulsow na obrot
    - enkoder ma znacznik przejscia przez zero. Z racji ze nie mam u siebie obserwatora rozruch odbywa sie poprzez pobudzenie prostokatem tak samo jak w silniku BLDC. Dopiero po przejsciu przez punkt zero zalaczone jest sterowanie wektorowe. Nie mialem pomyslu jak to inaczej rozwiazac. Jak ktos zna jakies lepsze bardziej fachowe rozwiazanie to prosilbym o podpowiedz.
    - Predkoscia moge sterowac na 3 rozne sposoby
    a) potencjometrem (malo dokladnie)
    b) JTAGiem przez oprogramowanie STMStudio
    c) za pomoca wypelnienia PWM podawanego przez inny procesor
    - mam obecnie 2 rozne wersje czesci mocy.
    Pierwsza opiera sie o tranzystory IRLR8743 - do 30V z 3,1mohm RDSon
    Druga jest zrobiona na tranzystorach IRLR3110 do 100V z 14mohm RDSon - na tej wersji teoretycznie moglbym ruszyc silnik 2KW (100V i 20A) ale nie moglem znalezc silnika o takich parametrach. Koncowki mocy mozna latwo i szybko miedzy soba przelaczac.
    - dokladnie tak jak piszesz, funkcja wygenerowana przez simulinka jest wywolywana w przerwaniu od zakonczenia jednoczesnego pomiaru pradow fazowych z wszystkich trzech kanalow ADC. Na wejsciu podaje 3 prady, predkosc i pozycje wirnika a na wyjsciu mam wymagana amplitude i kat pola elektromagnetycznego. Funkcje do liczenia czasow SVM napisalem juz samemu w C bo stwierdzilem ze tak bedzie szybciej.
    - nie wiem jak to zmierzyc. Na pewno bedzie wolniej niz w przypadku kodu w calosci pisanego w C. Raz wlaczylem czestotliwosc 80kHz i algorytm wyrabial ale jak wiadomo to nie sluzy tranzystorom.
    - zdjecie przedstawiajace pomierzone prady (wykres 2) transformate Clarka (wykres 3) i Parka (wykres 1)

    Sterownik silnika PMSM na STM32F4

    - takich przebiegow jeszcze nie rejestrowalem. Zrobie na dniach i wrzuce. Moge za to pokazac odpowiedz impulsowa silnika na zadana predkosc: (500 i 1000rpm)

    Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4

    Ogolnie najwiecej problemow sprawily mi zaklocenia ktore sa znacznie bardziej odczuwalne przy tak malej odleglosci procesora od koncowki mocy. Niestety sama optoizolacja juz nie wystarczy. Wszystkie wartosci analogowe trzeba aktywnie filtrowac. We wczesnych stadium projektu bywalo tak ze procesor calkowicie sie zawieszal przy wiekszych predkosciach silnika.

  • #4 10 Sty 2014 23:13
    felekfala
    Poziom 19  

    qaz88 napisał:
    bo odchodzi kontrola poslizgu.

    Przy sterowaniu wektorowym poślizg Cię nie interesuje jeśli nie wchodzisz w sterowanie bezczujnikowe.
    qaz88 napisał:
    Nie mialem pomyslu jak to inaczej rozwiazac. Jak ktos zna jakies lepsze bardziej fachowe rozwiazanie to prosilbym o podpowiedz.

    Zamiast sygnału prostokątnego spróbuj może zadawać na starcie przebieg sinusoidalny napięcia z małą częstotliwością coś w rodzaju U/f, do momentu aż wał się obróci w miejsce "zerowe".
    qaz88 napisał:
    b) JTAGiem przez oprogramowanie STMStudio

    Jakim J-tagiem ? On-line?
    qaz88 napisał:
    - dokladnie tak jak piszesz, funkcja wygenerowana przez simulinka jest wywolywana w przerwaniu od zakonczenia jednoczesnego pomiaru pradow fazowych z wszystkich trzech kanalow ADC. Na wejsciu podaje 3 prady, predkosc i pozycje wirnika a na wyjsciu mam wymagana amplitude i kat pola elektromagnetycznego. Funkcje do liczenia czasow SVM napisalem juz samemu w C bo stwierdzilem ze tak bedzie szybciej.

    W jaki sposób wygenerowałeś kod w C? Użyłeś do tego opcji "Code generation" z zakładki Tools w Simulinku?
    qaz88 napisał:
    - nie wiem jak to zmierzyc. Na pewno bedzie wolniej niz w przypadku kodu w calosci pisanego w C. Raz wlaczylem czestotliwosc 80kHz i algorytm wyrabial ale jak wiadomo to nie sluzy tranzystorom.

    Chodzi mi o sam czas procedury wysterowania realizowanej w przerwaniu. Zmierzyć to możesz w następujący sposób.
    - po wejściu w procedurę przerwania ustawiasz "1" na jakimś pinie przy wyjściu z przerwania zerujesz pin. Mierzysz czas trwania "1".

    W jaki sposób uzyskujesz pokazane mi dane? Te przebiegi są bardzo rzadko próbkowane. Wysyłasz je po RSie do PC? Przebiegi są wyświetlane w Simulunku? On-line, off-line?
    Czy mógłbyś, wrzucić przebiegi prądu fazowego zmierzone zewnętrzną sonda pomiarową?
    Czekam też na przebiegi id oraz iq w stanie dynamicznym (skok momentu zadanego).

  • #5 11 Sty 2014 00:00
    qaz88
    Poziom 12  

    Cytat:
    Przy sterowaniu wektorowym poślizg Cię nie interesuje jeśli nie wchodzisz w sterowanie bezczujnikowe.

    Przy DTC moze tak ale nie przy sterowaniu predkoscia (podwojne sprzezenie zwrotne). Musisz przeciez znac predkosc pola aby utrzymac zadana predkosc wirnika. Widzialem kody takich sterownikow tez czujnikowych i wszystkie uwzglednialy obliczenia poslizgu. Sam nigdy sie w to nie wglebialem wiec glowy nie dam.

    Cytat:
    Zamiast sygnału prostokątnego spróbuj może zadawać na starcie przebieg sinusoidalny napięcia z małą częstotliwością coś w rodzaju U/f, do momentu aż wał się obróci w miejsce "zerowe".

    Tez o tym myslalem ale przy takim starcie mamy dosc maly moment rozruchowy. Silnik bedzie docelowo mial dosc spore obciazenie. Na obecna chwile steruje przebiegiem prostokatnym korzystajac z wbudowanych w silnik hali. Daje to duzy moment rozruchowy. Mimo wszystko sprobuje zrobic tak jak piszesz. Dzieki za rade.

    Cytat:
    Jakim J-tagiem ? On-line?

    Dokladnie tak. Do tego celu uzywam wspomnianego wczesniej STM Studio. Naprawde polecam to narzedzie do analiz i debagowania online wszystkich procesorow z rodziny STM32. Ma on coprawda swoje wady tj. wspomniany przez Ciebie bardzo ograniczony czas probkowania podgladanych zmiennych (ok 1-2ms). Jednak jakos mi to wystarcza.

    Cytat:
    W jaki sposób wygenerowałeś kod w C? Użyłeś do tego opcji "Code generation" z zakładki Tools w Simulinku?

    Tak, narzedzie do generacji kodu C jest juz wbudowane w matlaba. Najpierw ustawiasz typ procesora w zakladce Simulation-> Model Configuration Parameters a nastepnie budujesz swoj model skrotem "Ctrl + B". Kod w C zostanie w tym samym folderze w ktorym jest sam model. Nastepnie ten kod trzeba zlinkowac ze swoim kompilatorem. Najprosciej jest caly projekt wraz z matlabem wrzucic do jednego folderu by nie musiec za kazdym razem przenosic tego generowanego kodu. Jak wszystko poprawnie skonfigurujesz odkrywasz ze programowanie jest jeszcze przyjemniejsze niz bylo. Oczywiscie pod warunkiem jesli nie zalezy ci na optymalizacji kodu...

    Zrobie przebiegi i zmierze czas wykonywania takiej petli. Sam jestem ciekaw co wyjdzie. Ale nie zdziwie sie jak bede mial 2-3 krotnie dluzszy czas obliczen niz kody pisane w calosci w C

  • #6 11 Sty 2014 10:12
    felekfala
    Poziom 19  

    qaz88 napisał:
    Przy DTC moze tak ale nie przy sterowaniu predkoscia (podwojne sprzezenie zwrotne). Musisz przeciez znac predkosc pola aby utrzymac zadana predkosc wirnika. Widzialem kody takich sterownikow tez czujnikowych i wszystkie uwzglednialy obliczenia poslizgu. Sam nigdy sie w to nie wglebialem wiec glowy nie dam.

    W metodach wektorowych FOC, DTC z czujnikiem prędkości poślizg nie jest Ci do niczego potrzebny. Ważna jest znajomość położenia wektora strumienia wirnika czy stojana (w zależności od modyfikacji), stąd niezbędna jest estymacja strumienia. Orientujesz układ dq względem strumienia i dzięki temu w łatwy sposób kontrolujesz strumień i moment. Regulator prędkości jest regulatorem nadrzędnym zadającym moment elektromagnetyczny. W metodach bezczujnikowych znajomość poślizgu jest niezbędna.
    qaz88 napisał:

    Dokladnie tak. Do tego celu uzywam wspomnianego wczesniej STM Studio. Naprawde polecam to narzedzie do analiz i debagowania online wszystkich procesorow z rodziny STM32. Ma on coprawda swoje wady tj. wspomniany przez Ciebie bardzo ograniczony czas probkowania podgladanych zmiennych (ok 1-2ms). Jednak jakos mi to wystarcza.

    Używasz ST-linka czy innego Jtaga ? Chodzi mi o model.
    qaz88 napisał:
    Zrobie przebiegi i zmierze czas wykonywania takiej petli. Sam jestem ciekaw co wyjdzie. Ale nie zdziwie sie jak bede mial 2-3 krotnie dluzszy czas obliczen niz kody pisane w calosci w C

    Ciekawe, może aż takiej różnicy nie będzie. Warto sprawdzić.

    Ogólnie kawał fajnej pracy. Myślałeś o sterowaniu bezczujnikowym ?

    Spróbuje w tygodniu wygenerować jakiś kod z Simulinka, w razie czego będę Cie prosił o pomoc :).

  • #7 11 Sty 2014 10:20
    wodzinek212
    Poziom 12  

    Projekt bardzo ciekawy aczkolwiek w ręku miałem już sterownik w którym kod napisany był w C krok po kroku. Zastosowanie enkodera ze znacznikiem jest świetną sprawą przeczytałem wątek ale nie znalazłem jeszcze jednej kluczowej informacji. Zakłądając, że liczymy impulsy od odszukania znacznika wykonujemy algorytm sterowania pmsm i wszystko fajnie ale co obrót powinniśmy sprawdzić czy nie gubimy impulsu.
    Mam pytanie w jaki sposób autor fazował enkoder względem wirnika?

  • #9 12 Sty 2014 16:58
    qaz88
    Poziom 12  

    Cytat:
    Ważna jest znajomość położenia wektora strumienia wirnika czy stojana (w zależności od modyfikacji), stąd niezbędna jest estymacja strumienia.

    Nigdy sie nie zaglebialem w temat silnikow asynchronicznych ale wyglada na to ze przerobienie mojego projektu na silniki indukcyjne powinno byc proste. Wystarczy tylko dodac pare bloczkow w simulinku.

    Cytat:
    Używasz ST-linka czy innego Jtaga ? Chodzi mi o model

    Uzywam ST-linka wbudowanego w plytke Discovery czyli tzw. SWD

    Cytat:
    Spróbuje w tygodniu wygenerować jakiś kod z Simulinka
    W razie problemow chetnie pomoge. Czekam na wiadomosc na priv.

    Cytat:
    Zakłądając, że liczymy impulsy od odszukania znacznika wykonujemy algorytm sterowania pmsm i wszystko fajnie ale co obrót powinniśmy sprawdzić czy nie gubimy impulsu.

    Zgadza sie. Znacznik jest podpiety pod przerwanie zewnetrzne ktore resetuje licznik zliczajacy impulsy.

    Cytat:
    Mam pytanie w jaki sposób autor fazował enkoder względem wirnika?

    Dobre pytanie. Najpierw ustawilem w simulinku "na sztywno" trzy sinusy o niskiej czestotliwosci i przesuniete wzgledem siebie o 120 stopni. Nastepnie podpialem je poprzez SVM do silnika. Amplituda sinusow musi byc mala aby nie przegrzac silnika ale jednoczesnie na tyle duza aby silnik sie krecil. Potem zbudowalem model przenoszacy nasze sinusy na plaszczyzne zespolona i obserwowalem kat wektora ktory nastepnie porownywalem z katem pola pokazywanego przez enkoder. Dalej juz wystarczylo uwzglednic ich roznice w ostatecznym programie jako nasz punkt zero. Nie wiem czy ta metoda jest poprawna ale u mnie zadzialala.

    Cytat:
    Do wykrywania pozycji początkowej silnika nadał by się dodatkowy enkoder magnetyczny

    Bardzo dobry pomysl. Widziales kiedys takie rozwiazanie w praktyce? Minusem jest coprawda samo zwiekszenie ukladu o kolejny enkoder ktory wykorzysany jest tylko przez pare milisekund po podlaczeniu ukladu do zasilania. Z drugiej strony wierze ze w niektorych precyzyjnych i specjalistycznych maszynach taki system bylby mimo wszystko tego warty.

  • #10 12 Sty 2014 17:11
    felekfala
    Poziom 19  

    qaz88 napisał:
    Nigdy sie nie zaglebialem w temat silnikow asynchronicznych ale wyglada na to ze przerobienie mojego projektu na silniki indukcyjne powinno byc proste. Wystarczy tylko dodac pare bloczkow w simulinku.

    Tak
    qaz88 napisał:
    Bardzo dobry pomysl. Widziales kiedys takie rozwiazanie w praktyce? Minusem jest coprawda samo zwiekszenie ukladu o kolejny enkoder ktory wykorzysany jest tylko przez pare milisekund po podlaczeniu ukladu do zasilania. Z drugiej strony wierze ze w niektorych precyzyjnych i specjalistycznych maszynach taki system bylby mimo wszystko tego warty

    W układach gdzie liczy się cena, a nie jest wymagana duża precyzja lepiej wykorzystać możliwości bezczujnikowe. W układach precyzyjnych raczej stosuje się resolvery.

  • #11 14 Sty 2014 13:30
    tgaudio
    Poziom 13  

    Witam
    gratuluję udanego projektu.

    mam pytanie o ACS - posiadam 3 sztuki i zauważam duży problem w stabilnosci ich napięcia na wyjsciu przy prądzie 0 (nawet po zmianie kondensatora filtru na 470nF). W jednym napięcie wyjsciowe jest 2,503, w innym 2,485 a w winnym 2,515 przy zasilaniu pewnym napięciem 5V.
    W Atmega8 nadpróbkowywuję sygnał i mam dzięki temu 11bit ale wahania napięcia i tak wszystko psują.
    jak sobie poradziłes z tym problemem ?

    pozdrawiam

  • #12 14 Sty 2014 15:18
    qaz88
    Poziom 12  

    tgaudio -> Faktycznie mialem identyczny problem. Malo tego w moim przypadku napiecie pradu zerowego bylo rozne kazdego dnia od wlaczenia ukladu. Widac zalezy ono od temparatury otoczenia, cisniania i bog jeszcze wie czego. Poradzilem sobie w taki sposob ze po wlaczeniu zasilania przez ok. pierwsze 10ms zalaczam wszystkie trzy cewki silnika do masy i robie 1000 pomiarow kazdej fazy indywidualnie. Srednia z tego stanowi punkt pradu zerowego. Co wiecej przy kazdym pomiarze pradu zbieram 4 probki pradu trybem wstrzykiwanym (injected mode) po czym odrzucam skrajne i licze srednia z dwoch pozostalych. Zamieszczam wykres przed i po takiej filtracji w czasie rzeczywistym:
    Sterownik silnika PMSM na STM32F4
    Jak widac 3 sinusy sa troche gladsze ale dalej nie jest idealnie. Mimo wszystko dla algorytmu FOC to juz wystarcza. W przypadku potrzeby szybkiego i bezproblemowego pomiaru pradu polecam jednak LEMy.

    felekfala -> pytales sie czy zamierzam dorobic metode bezczunikowa. W sumie to niebylby duzy problem dorobic w simulinku obserwator a napewno byloby to znacznie prostsze niz pisanie go w C. Moze kiedys sie za to zabiore. Jak narazie testuje sciagnietego z internetu gotowca napisanego przez firme ST, mianowicie ST FOC Library. Sa tam zaimplementowane trzy metody znajdywania kata walu w tym metoda bezczujnikowa. Co wiecej mamy tam tez takie funkcje jak np. "field weakening" co pozwala na przejscie w druga strefe regulacji predkoscia wyzsza niz predkosc nominalna. Ogolnie wiec zapowiada sie interesujaco. Jak ruszy to dam znac o wynikach.

  • #13 14 Sty 2014 19:31
    felekfala
    Poziom 19  

    tgaudio napisał:

    mam pytanie o ACS - posiadam 3 sztuki i zauważam duży problem w stabilnosci ich napięcia na wyjsciu przy prądzie 0 (nawet po zmianie kondensatora filtru na 470nF). W jednym napięcie wyjsciowe jest 2,503, w innym 2,485 a w winnym 2,515 przy zasilaniu pewnym napięciem 5V.

    Miałem podobny problem. Poziom zera przy każdym uruchomieniu wykrywam mniej więcej tak jak zrobił to kolega qaz88. Czy ktoś jeszcze ma takie problemy? Cena LEMow jest jednak sporo wyższa. znałem takie LEMy które mogły by być praktycznie bezpośrednim zamiennikiem ACS712 (takie samo napięcie zasilania, unipolarny napięcie na wyjściu, 0A Uo = Vcc/2). :
    http://pl.farnell.com/lem/cas-15-np/przetwornik-pradu-15a-pcb/dp/1961161
    Niedługo będę też testował ACS758, ale to na wyższe napięcia i prądy.

    qaz88 napisał:
    Co wiecej przy kazdym pomiarze pradu zbieram 4 probki pradu trybem wstrzykiwanym (injected mode) po czym odrzucam skrajne i licze srednia z dwoch pozostalych. Zamieszczam wykres przed i po takiej filtracji w czasie rzeczywistym:

    Co ile wykonujesz każdy z tych pomiarów/cała serię z uśrednieniem? Taki sposób filtrowania jest podobny do filtra medianowego.
    qaz88 jak będziesz miał czas wrzucić te przebiegi i pomiary o które prosiłem oraz prądy mierzone zewnętrzną sondą. Daj znać jaką aktualnie masz okres próbkowania Tp, oraz jaki okres SVPWM.

  • #16 26 Sty 2014 15:03
    qaz88
    Poziom 12  

    felekfala -> No wiec zmierzylem wszystko i troche sie zawiodlem. Caly kod wygenerowany w Matlabie wraz z obliczeniami na liczbach zmiennoprzecinkowych i urojonych wykonuje sie przez ok 42us czyli ponad 4 razy dluzej niz u Ciebie. Zmierzona czestotliwosc SVMa to 22kHz. Prosiles o wykresy wartosci dynamicznych sterownika. Pamietaj ze u siebie steruje predkoscia a nie momentem. Pomiary wykonalem w ten sposob, ze ustawilem silnik na bardzo niskie obroty i probowalem zatrzymac wirnik kombinerkami. Malo profesjonalne podejscie ale cos juz tam widac. Na wykresach widac skoki wartosci amplitudy pradow oraz Iq i Id (screeny zrobione w STMStudio)
    Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4 Sterownik silnika PMSM na STM32F4

    Czas probkowania wynosi 3 takty zegara ADC (36Mhz). CPU jest ustawione na 144Mhz. 4 probki pradu sa pobierane podczas kazdego cyklu SVPWMa i start wykonania sekwencji pomiarow jest wylowywany czwartym kanalem PWM timera 1 w ten sposob jak pokazuje rysunek:
    Sterownik silnika PMSM na STM32F4

    Electro_FOX -> Masz racje ze Matlabowski kod nie jest kodem zoptymalizowanym. Zobacz na moje odpowiedzi powyzej, jednak moim zdaniem przy tak szybkich procesorach optymalizacja nie jest juz tak wazna jak wygoda i predkosc tworzenia, edycji samego kodu. Gdyby tak nie bylo to nikt nie uzywalby Windowsa na PC. Chcac napisac prosty kod generujacy np sinusa wole przeciagnac jeden bloczek niz tworzyc tablice wartosci (najlepiej do SRAM) i przesuwac ja w czasie mimo ze zabierze mi to 3% wiecej z wykorzystania CPU.

    gutek77 -> To bedzie maly samochod w skali 1:5 w stosunku do normalych samochodow. Napedzany dwoma silnikami PMSM aby ominac jak najwiecej elementow ruchomych (w tym dyferencjalu). W planach jest wyposazenie go w takie sytemy jak ESP i TCS a moj projekt polega pozniej na badaniu wlasciwosci dynamicznych takiego pojazdu.

  • #17 15 Lut 2014 22:31
    mrgiver
    Poziom 12  

    Witam wszystkich!

    Temat śledzę od dawna, a związane jest to z tym, że coś podobnego próbuję zdziałać.
    Mam do autora kilka pytań:
    a) rozważałeś użycie gotowego toolboksu (firmowego STM-Mat, alternatywnego Waijung Blockset) do generacji całości kodu, od A-Z, łącznie z obsługą układów we-wy z Matlaba/Simulinka?
    b) możesz podać, co to za silniczek? I ewentualnie gdzie taki można kupić?
    c) udało Ci się wykorzystać bibliotekę ST FOC ?

    Pozdrawiam i gratuluję działającego projektu!

  • #18 16 Lut 2014 08:40
    qaz88
    Poziom 12  

    Cytat:
    rozważałeś użycie gotowego toolboksu (firmowego STM-Mat, alternatywnego Waijung Blockset) do generacji całości kodu, od A-Z, łącznie z obsługą układów we-wy z Matlaba/Simulinka?

    Tak. Tyle ze jak zaczalem prace nad tym projektem byla wczesna wersja 1.0 ktora posiadala mase bledow i nie dzialala z 64-bitowym systemem operacyjnym ktory posiadam. Podobno wersja 3.0 juz nie ma tego problemu ale jeszcze jej nie testowalem. Co wiecej niektore funkcje akurat latwiej mi pisac w C. Tak jak np. generowanie odpowiednich czasow dla SVPWM czy synchroniczne czytanie napiec dla wszystkich trzech przetwornikow ADC zsynchronizowane z czwartym kanalem Timera1. Widzialem ze jest tam tez w przykladach caly gotowiec kodu do sterowania silnikami PMSM. Jesli ktos go uruchomil to niech sie pochwali, chetnie porownam wyniki.

    Cytat:
    możesz podać, co to za silniczek? I ewentualnie gdzie taki można kupić?

    W polsce z tym akurat moze byc ciezko. Ja swoje silniki kupuje w chinach jako serwa do obrabiarek CNC. Mozna je tez czasem dostac w zestawach wraz z calym sterownikiem. Sa wersje na 24, 36 i 48V. Jakby ktos bylby zainteresowany ewentualnym kupnem to zapraszam na priv.

    Cytat:
    udało Ci się wykorzystać bibliotekę ST FOC ?

    Mialem ostatnio troche przerwy ale wlasnie nad nia pracuje. Wszystko mi sie ladnie kompiluje tylko musze pobawic sie regulacja PIDow i enkodera.

  • #19 14 Maj 2014 13:07
    Michal_91
    Poziom 1  

    Witam,
    również gratuluje udanego projektu,

    mam pytanie co do driverów mosfet-ów użytych przez Ciebie : IRS2186, w innym swoim projekcie używam podobnych o oznaczeniu IRS2184. Zasada ich działania przy wysterowaniu górnych tranzystorów mostka polega na użyciu energii zgromadzonej w kondensatorze włączonym między wejścia Vs a Vb drivera. Dlatego należy ten kondensator cyklicznie ładować, co uniemożliwia osiągnięcia wypełnienia PWM 100%. Eksperymentowałem z różnymi kondensatorami i jak na razie udało mi się osiągnąć możliwość pracy ciągłej przy wypełnieniu sygnału PWM około 95-96% i to jednak jest około 5% mocy silnika zmarnowane. Jak wygląda sprawa w twoim przypadku? Jakie możesz osiągnąć maksymalne długotrwałe wypełnienie sygnału PWM? Jakiego użyłeś kondensatora lub/i jak go włączyłeś?

  • #20 09 Lip 2014 16:33
    qaz88
    Poziom 12  

    Cześć!
    Ogólnie nie polecam driverów IRS2184. Też się nimi kiedyś bawiłem bo są bardzo tanie ale w wersji podstawowej (8-nóżkowej) nie mają one możliwości regulacji dead timem. U siebie jestem w stanie wykorzystać dokładnie 99,4% wartości napięcia.
    Z drugiej strony nie możesz też powiedzieć że w twoim przypadku dane 5% mocy sie marnuje. Poprostu jest niewykorzystane ale możesz np podnieść napięcie zasilania o te 5% w góre tak aby silnik dostawał swoje znamionowe i wykorzystywał 100% swojej mocy.

  • #21 31 Gru 2014 14:19
    qaz88
    Poziom 12  

    Zmieniłem silnik na 1500W i wgrałem ostatnio biblioteke STM32 FOC library 4.0 ale za diabła nie moge znaleźć nastaw dla PID-ów. Czy ma ktoś na to jakiś sprawdzony sposób?
    Ogólnie silnik się kręci co już i tak jest dobrze ale tylko wtedy gdy nie ma żadnego obciążenia..

  • #22 02 Sty 2015 12:15
    mrgiver
    Poziom 12  

    qaz88 napisał:
    Czy ma ktoś na to jakiś sprawdzony sposób?

    Sprawdzony może nie do końca, bardziej sprawdzany.

    Pomysł nr 1:
    Code:

    tregI=10e-6; % zakładany czas regulacji prądu
    tregW=5e-3; % zakładany czas regulacji prędkości

    KP_I=log(9)/tregI*R % reg. prądu
    KI_I=log(9)/tregI*L

    KP_w =log(9)/tregW*J % reg predkosci
    KI_w = log(9)/tregW*B


    Pomysł nr 2:
    Code:

    fPWM = 16e3;
    tregI2 = 2*pi* fPWM;
    tregW2 = tregI2 / 10;

    KP_I=tregI2*L;
    KI_I=tregI2*R;

    KP_w =tregW2*J;
    KI_w = tregW2*B;


    Jest to jakiś sposób na dobranie nastaw regulatora PI, dodatkowo za pomocą dwóch parametrów (tregI, tregW) można wpływać na pracę całości - dynamikę odpowiedzi.

    Co to znaczy, że
    Cytat:
    tylko wtedy gdy nie ma żadnego obciążenia..
    ?

  • #23 12 Cze 2015 08:25
    toch88
    Poziom 10  

    Cześć czy podczas rozruchu miałeś kiedyś sytuację że silnik kołysał się, też robię pracę magisterską z tego typu silnika tylko dużo większego

    4kW, 2 pary biegunów 1500obr/min Un=3x400 In=9.5 ten silnik ma ogromna bezwładność i w momencie zadania jakiegoś wektora wał silnika zazwyczaj "przeleci" i wtedy regulator próbuje skompensować to i zadam mu kontrwektor i tak się kurcze buja...

    u mnie PWM to 10kHz korzystam z SPVM (Space Vector Modulation), Sprzężenie zwrotne z enkodera .

    Na razie chciałem przetestować układ z regulatorami prądu:
    Id=0
    Iq=wartość od 3 do 6
    Ud jest obniżone do 120V (znamionowo będzie 565 U)
    Sprzężenia standardowo Iabc->alfa-beta->dq
    i z encodera obliczona theta * liczba para biegunów trafia na transformaty parka (w przód i w tył)
    theta.


    Ew możesz opisać w jaki sposób dokonywałeś rozruchu?
    U mnie to wygląda tak:
    Zadaje wektor 100b -> co odpowiada u mnie wygenerowaniu fazy A, resetuje odczyt z Encodera (w celu zsynchronizowania się z osiami dq) po czym zadanie mu prąd w składowej Iq (odpowiadającej za moment) .




    Robiłem również próby regulatora w układzie z obciążeniem RL układ poprawnie śledził prąd, i poprawnie odtwarzał zadaną częstotliwość.

  • #24 12 Cze 2015 09:18
    qaz88
    Poziom 12  

    Z tego co opisujesz widze dwie najbardziej prawdopodobne przyczyny:
    Albo masz źle skonfigurowany enkoder (ile musz impulsów na obrót i co to właściwie za typ enkodera?)
    Albo z jakichś powodów masz słabą wydajność algorytmu FOC, weź zmierz tak jak mi polecono czas wykonywania się pojedyńczego cyklu. Bo to że SVMa masz ustawionego na 10KHz to nie ma dużego znaczenia.
    Pzdr!

  • #25 12 Cze 2015 10:45
    toch88
    Poziom 10  

    Algorytm mierzony wczoraj trwa 33us (jeszcze nie optymalizowałem, skorzystam później z biblioteki matematycznej to dużo odciąży na cos sin oraz sqrt);

    Impulsów na obrót jest 500 przy czym skonfigurowane jest jako kwadraturowy czyli 2000.


    Dzisiaj silnikiem ruszyłem okazało się przy tym bujaniu że za dużą stałą czasową ustawiłem, stąd te gibania, teraz trochę gorsza sprawa bo wypada nam synchronizmu wygląda to tak że uchyb bardzo szybko maleje do 0 na obu osiach i silnik zatrzymuje się.

    Pozdrawiam

  • #26 13 Cze 2015 14:14
    toch88
    Poziom 10  

    No dzisiaj się udało go ruszyć, problemy spowodowane był błędnym odczytem thety, w moim wykonaniu interfejs pomiędzy encoderem a procesorem wymaga dostosowania poziomów z 5V do 3V3 ale jak sie okazała sygnał był thety często resetowany, wiec doszedłem do wniosku że zakłócenia z falownika mogą przenosić się na interfejs (zbierał jak antena) po podłączeniu się do przewodu ochronnego jak ręką odjął :)

    https://youtu.be/X0Lamc4f0PA

    FOC działa poprawnie jednakże na razie puszczałem silnik z obniżonego napięcia żeby uniknąć jakiś incydentów :>

  • #27 21 Lip 2016 16:14
    kokpit11
    Poziom 11  

    Bardzo dobra praca!!!!!!
    Siedzę właśnie nad sterowaniem silnikiem BLDC i mam model matlabowski tylko nie wychodzi mi z tym generowaniem kodu ;/ czy mógłby ktoś napisać kilka słów na temat generowania kodu z Simulinka.

  • #28 21 Lip 2016 21:25
    mrgiver
    Poziom 12  

    kokpit11 napisał:
    czy mógłby ktoś napisać kilka słów na temat generowania kodu z Simulinka

    A co dokładnie potrzebujesz wiedzieć? Tzn. co masz (jaki toolboks, jaki program) i co nie wychodzi? Mogę spróbować pomóc - tylko daj więcej informacji (ewentualnie nowy temat załóż).

  • #29 22 Lip 2016 14:21
    kokpit11
    Poziom 11  

    Mam keila5 i Matlaba 2012a. Mam zrobiony algorytm sterowania silnikiem ale nie wiem jak go wyexportować do C. W matlabie jest kilka opcji ert.tlc, grt.tlc, nawet mam stm32,tlc ale nie działa w pełni z STM32Cube. Matlab nie widzi STM32CUbe.

  • #30 23 Lip 2016 01:36
    mrgiver
    Poziom 12  

    Eee, to może inaczej.
    Ja używałem czegoś, co się nazywa Waijung Blockset ( http://waijung.aimagin.com/ ) , bo oryginalny od ST był wtedy (tj. ponad rok temu) jeszcze w powijakach. Tu masz jakieś porównanie: http://kmnipe.pwr.edu.pl/files/prv/id35/wyd/pn/sim33/sim33-art14.pdf .
    Filozofia używania tego jest taka, że po konfiguracji wywołujesz polecenie matalbowskie "Build" (Ctrl+B) i się samo, automatycznie kompiluje, linkuje, flashuje (jak jest ST-Link chyba).

    Wada - Waijung Blockset jest ograniczony do STM32F4 i do jeszcze jednej rodziny (F0?)., oryginalny od ST- w tej chwili nie mam pojęcia, co oferuje - przestałe śledzić. Poza tym ten od ST miał zawsze większe wymagania co do wersji Matlaba ...

    Podejście inne, które CHYBA w tej chwili próbujesz - to wygenerować z Matlaba czysty kod C, który następnie uzupełnić o procedury inicjalizacji GPIO, ADC, Timery, SPI, etc., skompilować samemu i wgrać. Jest możliwe (ba, widziałem nawet wersję takiego postępowania z AVR-ami), ale ja nie próbowałem, nie miałem potrzeby.

    Czy takie naprowadzenie było pomocne, czy dalej coś próbować pomóc?
    Matlab samego STM32Cube`a nie będzie raczej widział.