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

STM32f429 - SPWM - sygnał nośny

16 Sie 2016 07:49 1956 24
  • Poziom 6  
    Cześć!

    Ostatnimi czasy zagłębiam wiedzę na temat SPWM-a. Otóż chciałbym zrobić sterownik (na podstawie STM32f429) do płytki ewaluacyjnej STEVAL-IHM023v3 - do tego jeszcze daleka droga :( Ale na czym polega mój problem? O ile rozumiem idea działania SPWM-a, o tyle mam problem z sygnałem nośnym (trójkątnym). Jak wygenerować taki sygnał? Mógłbym ktoś podpowiedzieć jak powinno to wyglądać w praktyce?
  • Poziom 25  
    Jeśli chcesz wygenerować trójkątny sygnał na STM32f429 to skorzystaj z wewnętrznych przetworników DAC.
  • Poziom 6  
    Piotrus_999, dokładnie o to mi chodzi. Zatem mogę skorzystać z timera z którego generuje PWM-a? Rozumiem, że ustawiam go w modzie center-aligned mode (up/down), tak?
  • Użytkownik usunął konto  
  • Poziom 6  
    Rozumiem. A to masz na myśli jakiś konkretny problem? Zatem jeżeli to będzie ten sam timer, to generowany sygnał trójkątny będzie miał taką samą częstotliwość jak generowany PWM, czy tak to powinno wyglądać? Idąc dalej wygeneruje sinusa, którego będę porównywać z aktualną wartością tego timera i gdy owe wartości będą równe wtedy powinienem je wpisać jak wypełnienie PWM-a, dobrze to rozumiem?
  • Pomocny post
    Poziom 43  
    Ten przebieg trójkątny to będzie po prostu zawartość licznika Timera. Więc nie trzeba go jakoś specjalnie generować. On się sam wygeneruje po odpowiednim skonfigurowaniu Timera.

    nikpawel napisał:
    Idąc dalej wygeneruje sinusa, którego będę porównywać z aktualną wartością tego timera i gdy owe wartości będą równe wtedy powinienem je wpisać jak wypełnienie PWM-a, dobrze to rozumiem?

    Nie. Wartość powinieneś wpisać na początku. A porównywaniem zajmie się sprzętowo wyjście Timera.
  • Użytkownik usunął konto  
  • Poziom 43  
    Ale ja pisałem tylko o przebiegu trójkątnym. On jest niezmienny.
  • Użytkownik usunął konto  
  • Poziom 43  
    Myślę że nie ma problemu. A nawet jak jest to rozwiązuje go Timer sprzętowo.
    Chodzi o to że na rym rysunku są znacznie przesadzone proporcje częstotliwości przebiegów.
    Na półokres sinusa jest tylko 6 okresów PWMa. A tak się raczej nie robi.
    Zwykle się daje minimum ze 32. I to jest minimum minimów.
    Ja w falowniku nawet na zwykłym ATMega8 miałem zdaje się 1024 okresów PWMa na okres przebiegu wyjściowego.
    W takim przypadku przebieg sinusa praktycznie stoi z punktu widzenia przebiegu trójkątnego.

    Ale nawet jak proporcje będą jak na rysunku, to problemu nie będzie bo porównywaniem zajmuje się sprzęt Timera.
    Może wyjaśnij jaki tu widzisz problem bo nie rozumiem co masz na myśli.
  • Użytkownik usunął konto  
  • Poziom 43  
    Mi chodziło ogólnie o przypadek gdy generowaniem przebiegów zajmuje się Timer a więc nawet gdybyśmy chcieli się zająć tymi niesymetriami to nie było by jak tego zrobić (bo sprzęt nie ma takiej opcji). No chyba że za pomocą ciągłego wpisywania wartości do rejestrów porównawczych Timera (ale to już nie jest rozwiązanie w pełni sprzętowe).
  • Użytkownik usunął konto  
  • Poziom 6  
    Może od razu też powiem, że częstotliwość timera zamierzam ustawić na 10 kHz. Chciałem się jeszcze dopytać o jedną rzecz, której może nie do końca zrozumiałem. Czyli do rejestru (w moim wypadku jest to CCR1 - capture/compare register 1) wpisuje zmienną, która realizuje taką funkcje:
    U(a)=M×[cos(δ)]
    gdzie:
    M - współczynnik głębokości modulacji
    δ=2Π×f×Δt
    Przez co zmieniając częstotliwość funkcji U(a) (np. poprzez potencjometr) wpływam na wypełnienie danego kanału, tak?
  • Użytkownik usunął konto  
  • Poziom 43  
    Jeżeli to ma być do zwykłego silnika indukcyjnego, czyli gdy częstotliwość wyjściowa raczej nie przekroczy 200Hz, to wystarczy jedna wartość na oba boki trójkąta sygnału referencyjnego.
  • Poziom 6  
    Chodzi o to co zaznaczyłem na Twoim obrazku, tak?
    STM32f429 - SPWM - sygnał nośny

    A mógłbyś mnie naprowadzić/podpowiedzieć jak w praktyce wylicza się ten punkt w którym oba sygnały się przetną? Czyli wynika z tego, że moja funkcja U(a) (o której wcześniej wspominałem) wymaga jeszcze korekcji?
    W takim razie z tego co piszesz, to wystarczy jak wyliczę ten jeden punkt, ponieważ częstotliwość sygnału nośnego będzie wynosiła 10kHz, natomiast częstotliwość sinusa będzie maksymalnie 50 Hz - gdzieś dokopałem się do informacji, że częstotliwość sygnału modulującego powinna wynosić tyle co oczekiwana częstotliwość sinusa na wyjściu. Mógłbyś się również odnieść do tej informacji? Czy faktycznie tak powinno być?
  • Poziom 43  
    nikpawel napisał:
    gdzieś dokopałem się do informacji, że częstotliwość sygnału modulującego powinna wynosić tyle co oczekiwana częstotliwość sinusa na wyjściu. Mógłbyś się również odnieść do tej informacji? Czy faktycznie tak powinno być?

    W przypadku PWMa, na pewno tak nie powinno być.
    Więc ta informacja pewnie brzmiała inaczej niż napisałeś.
    Napisz gdzie to wyczytałeś.
  • Użytkownik usunął konto  
  • Poziom 6  
    Rozumiem, że (na podstawie obrazka, pozwoliłem sobie znowu użyczyć):
    STM32f429 - SPWM - sygnał nośny
    Gdy timer "doliczy" do wartości x (czerwona kropka) i wtedy Sm (funkcja U(a)) również będzie równa x, to ten wynik funkcji U(a) wpisuje do tablicy tak?

    Zastanawia mnie również to co napisałeś o tablicy:
    1) Dlaczego akurat 200 elementów? Z czego to wynika?
    2) Dlaczego w przypadku 10 kHz i 50 Hz? Nie wystarczy jak wypełnię tablicę wartościami mojej funkcji U(a) i będę je wstawiać w odpowiedniej chwili? Tak jak to przedstawiłem w opisie pod obrazkiem (tylko oczywiście będę sczytywał wartość z tablicy).

    Jak coś, to sorry za moje pewnie głupie pytania ale poruszam temat pierwszy raz:(
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 6  
    Piotrus_999 napisał:
    To matematyka - policz sobie ile masz punktów przecięcia w jednym okresie sinusiody. (10e3 / 50)(...)

    He, zabawne, bo tak właśnie wczoraj to liczyłem i mi wychodził inny wynik...:D Może pod wieczór co innego myślałem, a co innego klikałem :P

    Co do osi X, to użyje podstawy czasu, jaka wyjdzie mi z taktowani Timera1, natomiast oś Y myślałem wyskalować do wartości 350, bądź jej wielokrotności - ponieważ zakładam, że napięcie Udc=350V. Myślę, że powinno być to pomocne przy współczynniku głębokości modulacji. Co o tym sądzisz?

    A mógłbyś coś powiedzieć na temat tego pytania:
    nikpawel napisał:
    2) Dlaczego w przypadku 10 kHz i 50 Hz? Nie wystarczy jak wypełnię tablicę wartościami mojej funkcji U(a) (czyli tylko dla 50 Hz, czy tam dla innej częstotliwości jaką będzie miała w danym momencie ta funkcja) i będę je wstawiać w odpowiedniej chwili? Tak jak to przedstawiłem w opisie pod obrazkiem (tylko oczywiście będę sczytywał wartość z tablicy).
  • Użytkownik usunął konto  
  • Poziom 10  
    A która wersje spwm korzytasz? Bo zeby zminimalizwoac harmoniczne fajnym algorytmem jes svm (space vector modulation) , szczegolnie jezeli bedziesz korzystal z wektorowego sterownia czy to Foc czy Dtc. W przypadku tego algorytmu zmienia sie ksztalt nosnej , ale to juz zalezy czy chcesz w ukladzie otwartym sterowac jaki typ silnika. X
    Co do prawda ja takie algorytm implementowalem dla tms320f28335 ale zasada generacji jest podobna , konfigurujesz timer symetryczny, a w kazdym kroku algorytmu, wyzwalane jest adc do pomiarow pradow , nastepnie algorytm przeprowadza transformacje parka , porownuje to z zadany pradem w osi q, proporcjonalnej do momentem elektromagnetyczneg, uzyskujac tym samym uchyb, ktory trafia na reg PI z ograniczeniem i najlepiej ukladem anti-windup. Wypracowany sygnal ma charakter napiecia , ktory trafia na modulator wektorowy, a ten wyznacza wartosci ref dla comparatorow pwm. Jakbys byl zainteresowany to odezwij sie na priv moge podeslac Tobie materialy.