logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega] SPWM - falownik - prośba o wyjaśnienie

morswin89 01 Mar 2014 16:59 14811 65
  • #1 13358817
    morswin89
    Poziom 23  
    Witam

    Moje pytania jak i schematy są czysto teoretyczne i przykładowe ponieważ chodzi mi tylko i zrozumienie i poznanie samej zasady działania, sterowania i generowania sygnałów.

    Poglądowy schemat:
    [atmega] SPWM - falownik - prośba o wyjaśnienie

    2 wejścia sterujące IN1 i IN2 oraz wejście SD wyłączające cały mostek.

    Jeżeli dobrze rozumiem to na wejście IN1 należy podać przebieg PWM o "wyglądzie" jak na wykresie:

    [atmega] SPWM - falownik - prośba o wyjaśnienie

    a na wejście IN2 taki sam sygnał ale o przeciwnej fazie?

    Dobrze kombinuje, jeżeli źle to prosiłbym i poprawienie i wyjaśnienie co i jak.
  • #4 13361184
    And!
    Admin grupy Projektowanie
    Sterowanie "mocą" to coś co zawsze mnie omijało,
    dlatego chętnie się dowiem na żywym przykładzie jak to powinno być realizowane.

    Niepokoji mnie ten nagła zmiana współczynnika PWM na 180°,
    czy to dobra praktyka aby sygnał sterujący zmieniał się tak gwałtownie ?

    Co do atmega, najlepiej będzie tutaj wykorzystać timer z dwoma wyjściami PWM,
    dzięki czemu będzie można sprzętowo generować sygnały wymagane przez sterownik.

    Rozumiem że VDD to będzie 300-400V natomiast przez T1-T4 będą płynęły spore prądy.

    Dwie sprawy:
    -jakie elementy pasywne (filtry) będą tutaj potrzebne
    -czy warto zastosować tu pomiar prądu/napięcia wyjściowego w celach diagnostyki/zabezpieczenia
  • #5 13361442
    morswin89
    Poziom 23  
    Z tego co znalazłem i jeżeli dobrze rozumiem to co pokazałem na swoim wykresie to modulacja bipolarna SPWM.

    [atmega] SPWM - falownik - prośba o wyjaśnienie

    Cytat:
    Rozumiem że VDD to będzie 300-400V natomiast przez T1-T4 będą płynęły spore prądy.

    Dwie sprawy:
    -jakie elementy pasywne (filtry) będą tutaj potrzebne
    -czy warto zastosować tu pomiar prądu/napięcia wyjściowego w celach diagnostyki/zabezpieczenia


    Tak do VDD musi być podpięte napięcie rzędu 325VDC
    Filtry i układy pomiaru prądu i napięcia to sprawa na później ale jak najbardziej można je zastosować w celu np ochrony mostka przed spaleniem.

    Ważna jest jeszcze sprawa zachowaniu warunku U/f = const

    Na razie chodzi mi o zrozumienie samej idei sterowania mostkiem a później reszta.
  • #6 13361497
    And!
    Admin grupy Projektowanie
    Ok czyli wsp. wypełnienia na wykresie czarnobiałym to amplituda na wykresie niebieskim.

    Nie widzę na wykresie czarnobiałym nagłego skoku wypełnienia przy $$\pi$$

    morswin89 napisał:

    Ważna jest jeszcze sprawa zachowaniu warunku U/f = const

    Czyli aby zachować sensowną gradację przyda się timer 16b.

    Chętnie zobaczę próby uruchomieniowe prototypu,
    myślę że warto będzie opublikować wyniki w DIY.
  • #8 13361588
    bestler
    Admin DIY, Automatyka
    Bardzo dobrze. Właśnie tak to działa.

    Na wejściu IN1 i IN2 podawane są sygnały o teoretycznym wyglądzie takim jak widać:

    [atmega] SPWM - falownik - prośba o wyjaśnienie
    (pozwoliłem sobie wykorzystać kolegi rysunek)
    z tym, że chyba nie spotkałem się jeszcze z modulacją unipolarną a przynajmniej nie w falownikach. Zawsze do tego celu stosuje się modulację z dolnego rysunku czyli bipolarną. Górny rysunek to wg mnie wykres już za mostkiem. Jeśli zastosujemy odpowiedni filtr to po scałkowaniu otrzymamy sinusoidę.
    W tym konkretnym przypadku zastosowane są dwa drivery IR21.. i dlatego mamy dwa wejściowe sygnały IN1 oraz IN2, które musimy zasilić sygnałami w przeciwnych fazach. W praktyce najczęściej do pełnego pełnego mostka (jednofazowego) stosuje się albo pojedynczy driver, który obsługuje 4 tranzystory lub jeszcze inaczej - transformator ferrytowy, który ma jedno uzwojenie PRI i 4 uzwojenia SEC, które to z kolei podłączone jest niemalże bezpośrednio do każdego tranzystora. Rozwiązanie z transformatorem stosuje się w przypadku tranzystorów unipolarnych, które mają minimalnie krótkie czasy przełączania i nie wymagają tzw dead time, czyli odstępu pomiędzy impulsami przełączającymi gałęzie (zachęcam do głębszej lektury tematu).

    Drivery IR (i nie tylko, bo są różne) mają za zadanie utworzyć właśnie dead time na odpowiednim poziomie tak aby tranzystory w przeciwnych gałęziach nie były NIGDY wyzwolone jednocześnie. Dodatkową funkcją driverów jest wg ustalenie odpowiedniego poziomu napięcia w zakresie 13 - 18V (takie napięcie jest wymagane do prawidłowego działania IGBT) oraz oraz jak najkrótszy czas narastania impulsu tak aby czas niepełnego wysterowania IGBT był jak najkrótszy a co za tym idzie moc wydzielana na tranzystorach jak najmniejsza.

    Częstotliwość PWM w falownikach najczęściej zamyka się w przedziale 50-100kHz.

    Ten niebieski wykres z pierwszego postu wg też jest niepoprawny, choćby dlatego, że ma nieopisane osie ;)
  • #9 13362197
    morswin89
    Poziom 23  
    Kolego bestler mógłbyś dorysować do tego wykresu 2 cześć bo nie mogę zrozumieć jak ma "przełączyć" się na generowanie 2 połówki sinusoidy.

    [atmega] SPWM - falownik - prośba o wyjaśnienie

    Przyjąłem że PWM będzie 10 bitowy czyli maksymalna wartość wpisana do rejestru to 1024.

    O reszcie rzeczy o których pisałeś jak najbardziej zdaję sobie sprawę i dlatego zastosowanie gotowych driverów do mosfetów zapewni odpowiednie sterowanie i szybkość przełączania oraz czasy martwe.
  • #11 13364893
    Konto nie istnieje
    Poziom 1  
  • #12 13365015
    Tomasz Gumny
    Poziom 28  
    atom1477 napisał:
    W tym przypadku na drugi PWM pasowało by podawać sygnał prostokątny 50Hz (tzn. PWM ale o wypełnieniu 0 albo 100%, i ta zmiana z 0 na 100% i z powrotem z częstotliwością 50Hz).
    Działało by to i ma zaletę że jedna połówka mostka nie pracuje przy dużej częstotliwości (PWM niby jest ale ma 0 albo 100% więc nie ma strat przełączania).
    Takie rozwiązanie ma również wadę - długi czas załączenia górnych tranzystorów wyklucza zasilanie ich driverów bootstrapem.
  • #13 13375607
    Konto nie istnieje
    Poziom 1  
  • #15 13433852
    morswin89
    Poziom 23  
    Witam

    Coś tam podziałałem i udało mi się uzyskać coś co przypomina sinusoidę :)

    [atmega] SPWM - falownik - prośba o wyjaśnienie

    Kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    W tablicy 1 okres przebiegi sin. Jaka przyjąć ilość próbek aby uzyskiwany przebieg był zadowalający oraz aby zachować U/f = const lepiej przeliczać sobie wartości z jednej tablicy czy przygotować kilka (kilkanaście tablic) dla różnych częstotliwości?
  • #16 13434679
    Konto nie istnieje
    Poziom 1  
  • #17 13434888
    Tomasz Gumny
    Poziom 28  
    1024 próbki dla fmax=60Hz wymagałyby częstotliwości PWM ponad 60kHz. Uzyskanie 11-bitowej rozdzielczości wymagałoby zegara 125MHz. Obawiam się, że dla ATmega32 to nieco za dużo.
    ATmega32 nie ma "sprzętowego" dzielenia", więc nie wyliczysz amplitudy na bieżąco. Zatem trzeba skorzystać z tablic, ale przy powyższych założeniach i kroku 0.5Hz potrzebne byłoby ~240KB pamięci.
    Przy generowaniu przebiegu wprost z tablicy trudno jest uzyskać mały krok przy wyższych częstotliwościach wyjściowych.
  • #18 13435582
    Konto nie istnieje
    Poziom 1  
  • #19 14196988
    Wiking18
    Poziom 14  
    Witam
    Ja również staram się zrozumieć jak działa tworzenie sinusa za pomocą PWM.
    używam Xmega 128A3U

    z pomocą książki i kodu TMF udało mi się osiągnąć coś takiego
    [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie

    Używam rozdzielczości 4095 (0xFFF) (częstotliwość taktowania 32 Mhz)

    Schody pojawiają się jak chcę osiągnąć płynne sterowanie częstotliwością no i jednocześnie amplitudą.
    Nie wiem jak za to się zabrać tworzenie kilku tablic nie ma sensu.

    dla częstotliwości 44 Hz mam jakieś 180 próbek dla 50 Hz pasowało by dać około 156 próbek dla 1 Hz było by to 7813 próbek. Na 1 Hz przypada mi

    Dla przykładu dla 20 Hz powinienem mieć 391 próbek gdzie największa próbka powinna mieć wartość 20*81,92 =1638

    Jak to pisać wszystko za pomocą wzoru tak aby nie tworzyć 50 czy 100 tablic.

    fragment kodu odpowiedzialny za umieszczenie próbek z tablicy w( tablicy znajduje się 180 próbek)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod jest zaczerpnięty z przykładów TMF z książki AVR praktyczne projekty.

    czy mógłby mnie ktoś nakierować na dobry tor?
    Pozdrawiam Damian
  • #20 14199327
    Konto nie istnieje
    Poziom 1  
  • #21 14199349
    BlueDraco
    Specjalista - Mikrokontrolery
    Ten sinus liczony w przerwaniu na Xmega to miał być żart, prawda?
  • #22 14200181
    Konto nie istnieje
    Poziom 1  
  • #23 14200545
    tmf
    VIP Zasłużony dla elektroda
    Wiking18 - zauważ, że f przebiegu zależy od tego jak szybko ładujesz kolejne próbki. W tym przykładzie tempo ładowania jest stałe i zależy od f timera/rozdzielczość PWM. Ale przecież próbki można ładować rzadziej, dzięki czemu otrzymany przebieg zmieni okres. W innych przykładach, chyba jest to pokazane. Drugi timer może np. wyzwalać DMA, które przerzuca próbki do timera generującego PWM. To załatwia zmianę częstotliwości. Zmianę amplitudy można załatwić zmieniając wartość próbek, np. dzieląc je, lub (co jest szybsze) mnożąc je przez zadaną wartość. Powiedzmy, że stablicowane wartości sinusa mają 16bitów/próbkę, dla pełnej amplitudy mnożysz je razy 65536 i bierzesz najbardziej znaczące 16 bitów wyniku, dla mniejszych amplitud mnoższy razy liczbę <0..65536>. Jeśli wykorzystasz DMA do generowania przebiegu, co jest wygodne, najprościej jest w RAM utworzyć nową tablicę z przeliczonych wartości tablicy referencyjnej. Dzięki temu obliczenia są jednorazowe, a cały przebieg generowany jest sprzętowo i praktycznie nie obciąża MCU.
  • #24 14203271
    Wiking18
    Poziom 14  
    Witam dziękuję wszystkim za odpowiedź.
    Dobrym pomysłem jak na moje możliwości wydaje się być sposób TMF.
    Jednak nie wiem czy dobrze zrozumiałem.

    Mam użyć drugiego licznika który będzie sobie zliczał do liczby x i jak ją osiągnie to wrzuca mi do TCF0.CCABUF dane z tablicy pod indexsem y po czym zwiększa index y o 1.
    Rozumiem że to przy liczniku 0 lub 1 (nie wiem jaka jest minimalna wartość) mam maksymalną częstotliwość to jest:
    32Mhz/200(próbek)/3200(rozdzielczość) daje mi 50 Hz Zwiększając licznik zmniejszam częstotliwość. no i przy zmniejszonej częstotliwości zmniejszam amplitudę. dzieląc sobie dane z tablicy.
    Rozumiem że licznik ma generować przerwanie tylko czy dzielenie lub mnożenie ma być wykonywanie w przerwaniu?

    Spróbuje napisać program i podzielę się wynikami może coś z tego wyniknie.
    Jeszcze raz dziękuję za pomoc.
  • #25 14203444
    tmf
    VIP Zasłużony dla elektroda
    Mniej więcej tak jak piszesz, przy czym oczywiście zwiększając częstotliwość nie musisz zmieniać amplitudy. Jeśli ją chcesz zmieniać to trzeba przeliczyć wartości tablicy i tą nową zastosować jako matrycę do PWM. Nie ma sensu w przerwaniu za każdym razem liczyć tch samych wartości.
  • #26 14206314
    Wiking18
    Poziom 14  
    Witam
    Po żmudnych testach uruchomienia DMA w taki sposób aby działało z drugiego licznika coś udało mi się osiągnąć chociaż wyniki mnie zaskakują.
    [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie [atmega] SPWM - falownik - prośba o wyjaśnienie

    wklejam cały kod proszę o sugestie chodzi mi głównie o timery i DMA reszta jest tylko żeby testować program. Nie sugerujcie się opisami z boku bo często są to niezmienione pozostałości poprzedniego kodu który już kilkanaście razy zmieniałem a tego nie maiłem jeszcze siły zmienić.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziwi mnie jak to jest możliwe uzyskanie większej częstotliwości niż 50 Hz nie mogę zrozumieć czemu tak się zachowuje program co prawda nie jest to niepożądane wręcz przeciwnie miło że tak to działa ale chciałbym zrozumieć dlaczego.
    Mam 200 próbek przy rozdzielczości 3200 co daje 50hz przy 32Mhz taktowania licznika pwm.
    Chodzi mi o to że DMA wysyła mi dane do Bufora który i tak jest ładowany dopiero po przepełnieniu czy jakoś tak więc mimo że wysyłam prubki częściej bo ustawiam sobie inny timer np na PER 512 to DMA wysyła próbki co 512 taktów ale zapisuje je do bufora który i tak nie załaduje tego aż nie upłynie jego liczba PER w tym przypadku 3200 dobrze rozumuje? Więc dlaczego mogę uzyskać takie duże częstotliwości i to nie takiej złej jakości na oscylogramach widać zarys gdyż układ mam na płytce stykowej duża część oscylogramu to szumy i piki które się zewsząd pojawiają.

    Mam pytanie jeszcze do DMA nie udało mi się poprawnie wyzwalać DMA poprzez zrównanie licznika TCC0 mimo że zboku jest napisane Zdarzeniem wyzwalającym jest event match dla CCA to jest to pozostałość z innego zapisu, być może źle go skonfigurowałem nie wiem musiałem użyć przepełnienia licznika co i tak nie chciało zadziałać, dobrze że pewien autor książki napisał "małym druczkiem" że trzeba użyć triku z przerwaniem wtedy zadziała. Wyzwolenie DMA zadziała.
    Mimo wszystko czy można jakoś zoptymalizować kod ? być może coś włączam bez potrzeby.

    Moje następne pytanie z kolei jak ustawić sobie zmianę per aby przekładało się to na liniową zmianę częstotliwości.
    np 3200 mam około 50 Hz 6400 około 25Hz, PER na 14883 daje jakieś 11Hz, a PER 64745 daje 2.14Hz..
    częstotliwość maleje 2 razy po zwiększeniu per razy 2 jak by to zapisać dla jakiegoś progu wyrażonego w x HZ lub 0.x HZ abym można było zwiększać częstotliwość liniowo.
    No i jeżeli chodzi o amplitudę to mam taki pomysł ale nie wiem czy dobry.
    Aby zmienić sobie zmienna odpowiedzialna za częstotliwość ale zanim zmienna ta zostanie wysłana do PER przeliczyć tablice wzorcową pomnożyć lub podzielić i zapisać do tablicy buforowej z której jest odczyt DMA dopiero po przeliczeniu tablicy ustawić per. Nie wiem czy tak to powinno wyglądać. Chodzi o to aby DMA nie wysłało innej tablicy do innej częstotliwości w przypadku zmian 1 hz nie będzie to miało pewnie znaczenia ale w przypadku różnicy 20-30 hz mogło by to uszkodzić silnik. Pozdrawiam
  • #27 14206434
    Konto nie istnieje
    Poziom 1  
  • #28 14206972
    Wiking18
    Poziom 14  
    Co do tego liczenia F to się zakręciłem jak świński ogon :D

    Zacząłem liczyć nie wiadomo co a zapomniałem o podstawie czyli:

    32Mhz / liczba próbek / ilość herców = PER

    w przypadku mojej tablicy 200 próbek jest to

    PER= 32000000/200/F[Hz]
    czyli
    PER=160000/ F[Hz]

    czyli dla 36Hz jest to jakieś PER=4444 a dla 75Hz PER=2133
    Obecnie udało mi się wycisnąć jakieś 820Hz przy względnej jakości czyli aż nadto a jakość rewelacja nie jest ale wątpię że coś używa aż takiej częstotliwości chociaż jak zbuduje końcówkę mocy to nie omieszkam wypróbować :)

    Zostaje sprawa Amplitudy każda propozycja mile widziana.
    Ogólnie wysyłanie przez DMA bardzo mi się podoba bo dzięki temu procesor nic nie robi w zasadzie to obsługuje tylko wyświetlacz.

    Tylko jestem ciekaw jak DMA zadziała kiedy procesor zacznie korzystać z RAM czy wtedy nie będzie to miało wpływu na częstotliwość lub kształt sinusoidy.

    Co do amplitudy chodzą mi po głowie 2 rozwiązania jedno które napisałeś Atom czyli liczyć na bieżąco amplitudę to wydaje mi się dobre rozwiązanie do bardzo częstych zmian częstotliwości np. jakiś pojazd z silnikiem klatkowy lub coś w rodzaju soft startu i hamulca gdzie częstotliwość się zmienia cały czas aż do osiągnięcia zadanego limitu (podobnego natomiast przeliczenie całej tablicy było by dobre do rzadkich zmian częstotliwości) dla pogłębienie wiedzy chciałbym wy testować oba. każdy ma Wady i zalety. ( przy ciągłym liczeniu nie wiem jak by wyglądała komunikacja przez jakiś uart itp. )jestem ciekaw ile zajmie przeliczenie 200 próbek)
  • #29 14207040
    Konto nie istnieje
    Poziom 1  
  • #30 14207588
    tmf
    VIP Zasłużony dla elektroda
    Wiking18 napisał:

    Tylko jestem ciekaw jak DMA zadziała kiedy procesor zacznie korzystać z RAM czy wtedy nie będzie to miało wpływu na częstotliwość lub kształt sinusoidy.


    Dopóki DMA będzie nadążał z dostarczaniem kolejnych próbek, to nic się nie stanie. A czasu ma sporo, bo jest to czas równy okresowi PWM. Generalnie w najgorszym przypadku DMA potrzebuje 5 taktów CPU na przesłanie danych, czyli dla 32 MHz około 160 ns. Oczywiście jeśli będziesz wykorzystywał więcej kanałów DMA to w zależności od priorytetów ten czas się wydłuży, ale i tak będziesz dużo poniżej limitu.
REKLAMA