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

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

01 Mar 2014 16:59 12684 65
  • 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.
  • Relpol przekaźniki
  • VIP Zasłużony dla elektroda
    A co ma do tego ATmega ?
  • 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
  • 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.
  • 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.
  • Relpol przekaźniki
  • 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 ;)
  • 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.
  • Poziom 43  
    morswin89 napisał:
    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?

    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).

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

    Sam PWM może i się zmienia, ale sygnał wyjściowy jako różnica napięć na obydwu wyjściach mostka H nie zmieni się gwałtownie.
    Tak więc działać by to działało.

    Ja jednak bym tego nie stosował ze względu na niesymetrię sterowania obu stron mostka.
    I zasilał obie strony mostka przebiegami sinusoidalnymi (tzn. PWMamni modulowanymi przebiegami sinusoidalnymi) w przeciwfazie.
    Czyli tak jak wyżej narysował Tomasz Gumny.
    Robiłem już falownik który tego używał i działało to dobrze.
  • Poziom 27  
    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.
  • Poziom 43  
    Tomasz Gumny napisał:
    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.

    Nie wyklucza. Trzeba tylko zastosować odpowiednie kondensatory.
  • 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: basic4gl
    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?
  • Poziom 43  
    Ja stosuję tablicę 1024 próbek (wartości też są od -1024...1024) i moim zdaniem daje to dobre efekty.
    Wiele tablic to chyba złe rozwiązanie bo nie można płynnie zmieniać częstotliwości (bez kombinowania).
  • Poziom 27  
    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.
  • Poziom 43  
    Tomasz Gumny napisał:
    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.

    Próbek jest 1024 ale to nie znaczy że używam wszystkich. Może mój błąd że nie sprecyzowałem.
    Prosty algorytm oblicza próbkę którą potrzebuje (tzn. jej numer/index). Przy małych f trafia więc kilka razy w tą samą próbkę pod rząd. Przy dużych f trafia z co którąś próbkę niektóre pomijając.

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

    No jak zwał tak zwał. Ja to co opisałem wyżej nazwał bym właśnie generowaniem wprost z tablicy. Bo same próbki są wprost z tablicy. A że indexy oblicza już jakiś bardziej zaawansowany algorytm to inna sprawa :D
    Choć można oczywiście też powiedzieć że to nie jest wprost z tablicy.
    Nie mniej jednak u mnie, na ATMega8, taktowanym z 16MHz, z jedną tablicą 1024 próbki, i PWMem 20kHz, miałem płynne przestrajanie od 0Hz do 200Hz. Krok przestrajania przyjąłem 0,1Hz.
    Ewentualny brak płynności mógł być jedynie z powodu tego że przy wyższych f brana była tylko co któraś próbka z tablicy (bo szybciej się nie dało, jak zresztą sam policzyłeś).
    Z tym że był by to brak płynności generowanego przebiegu, a nie brak płynności samego przestrajania. W moim rozwiązaniu w sumie nawet nie ma odgórnego ograniczenia rozdzielczości przestrajania. Ja sobie przyjąłem 0,1Hz ale można i 100 razy mniej przyjąć.
    Oczywiście w małym okresie czasu będzie pewien jitter w przebiegu (związany z tym że próbki są brane albo pod rząd albo co któraś), ale w dłuższym okresie faktycznie można uzyskać średnią f przebiegu przestrajaną z rozdzielczością o np. 0,001Hz.
    Można też minimalnie udoskonalić program aby przy obliczonym indexie np. 101,3 brał nie próbkę 101, ale 30% z próbki 102 i 70% z próbki 101. Płynność przebiegu to wtedy już marzenie by była.
  • 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
    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
  • Poziom 43  
    W takim razie nie twórz tablic (i nie używaj tablic stworzonych wcześniej, czyli statycznych) tylko licz sinusa na żywo.
    Code:

    counter += period;
    if (counter >= 2_pi)
         counter = counter - 2_pi;

    TCF0.CCABUF = roundf(sinf(counter) * amplitude) + 2048;    //Żeby zakres był od 2048 w obie strony

    Oczywiście to tylko przykład. Pasuje to jakoś zoptymalizować i dostosować do konkretnego przypadku.
  • Specjalista - Mikrokontrolery
    Ten sinus liczony w przerwaniu na Xmega to miał być żart, prawda?
  • Poziom 43  
    Nie. To miał być wysokopoziomowy przykład.
    Napisałem przecież że trzeba to zoptymalizować.
    Kilka postów wcześniej jest przecież przykład (mój) jak uzyskać płynne przestrajanie częstotliwości przy użyciu jednej tablicy (o regulacji amplitudy nie mówię, bo jak to zrobić to chyba oczywiste jest).
    Jak nie dotarło to dałem wzór na floatach, z informacją że trzeba to zoptymalizować samemu.
    No ale dobra, podam kod jak to wygląda u mnie.
    Od razu z tą amplitudą.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wielkość tablicy trzeba tak dobrać żeby dla najwyższej zakładanej częstotliwości mieć co najmniej z kilkanaście próbek na okres.
    I to jest właśnie ten zoptymalizowany sinus (już nie liczony tylko stablicowany).
    Nie jest jednak bezpośrednio wykorzystywany (co jeden index), lecz jedynie wykorzystywany do określenia sinusa w danym punkcie okresu.
    Jako parametr (index) jest bowiem podawany punkt okresu który się przemieszcza o więcej niż 1. To jeszcze bardziej można udoskonalić ale to wyjaśnię jak ktoś poprosi. Póki nie ma zainteresowania to siedzę cicho :D
  • Moderator Mikrokontrolery Projektowanie
    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.
  • 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.
  • Moderator Mikrokontrolery Projektowanie
    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.
  • 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
    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
  • Poziom 43  
    Wiking18 napisał:

    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 to dość proste:
    PER = 32000 / f[Hz]
    albo:
    PER = 320000 / f[dHz]

    Wiking18 napisał:

    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

    No i tutaj postanowiłem się jednak wtrącić.
    Wcześniej tmf wspomniał że nie ma sensu liczyć tych samych wartości w kółko. Niby racja, choć mi jakoś by nie przeszkadzało że procesor to liczy. A niech liczy skoro nie ma nic innego do roboty. No ale to by nic nie wnosiło do tematu to nic nie pisałem.
    Ale teraz pomyślałem że ma to jednak pewne zalety praktyczne (to poprzednie liczenie w kółko, bo to już teraz nie będzie liczenie w kółko).
    No bo jak chcesz zmieniać amplitudę płynnie, i w dodatku małymi kroczkami (czyli będzie ich dużo skoro są małe) to się robi problem.
    Bo w wersji z przeliczeniem tablicy jest fajnie jak amplituda jest stała. Raz przeliczysz tablicę i działa.
    A tu przy każdej zmianie amplitudy musisz na nowo przeliczać całą tablicę.
    A jak zmian amplitudy będzie dużo (więcej niż próbek na okres sinusa) to się okazuje że liczenia jest więcej niż przy niezależnym liczeniu każdej próbki w przerwaniu.
    Ale to nie wszystko.
    Jest jeszcze coś takiego jak algorytm Bus Ripple Canceler. W falownikach zasilanych z sieci się to stosuje. Ale w falowniku na napięcie stałe jak z jednego źródła są zasilane dwa falowniki to też się przydaje.
    I to działa tak że się mierzy chwilowe napięcie zasilania i mnoży zakładaną wartość PWMa przez odwrotność tego napięcia. I dopiero wynik wystawia do rejestru PWMa.
    I tu zupełnie nie ma sensu za każdym razem przeliczać tablicy.
    Bo dana próbka napięcia obowiązuje tylko dla danej próbki PWMa. Dla nowej próbki PWMa będzie i tak nowa próbka napięcia więc i tak trzeba nowe przeliczenie.
    Po drugie wynik trzeba znać od razu, nie można więc czekać aż program znowu trafi na dane miejsce w tablicy.
    Więc siłą rzeczy nie można do tego użyć tablicy tylko trzeba liczyć na bieżąco.
    Różne inne algorytmy też wymagają liczenia na bieżąco (np. FOC).
    Ale zrobisz jak zechcesz.
  • 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)
  • Poziom 43  
    ATMega8 przy kwarcu 16MHz liczyła to spokojnie przy PWMie 40kHz (w znaczeniu że przerwanie i liczenie też było z częstotliwością 40kHz).
    Zużycie procka było nie większe jak kilkanaście %. Obliczenia 16-bitowe.
    Na ATXMega było by tylko lepiej.
    Poza tym chcesz tylko liczyć amplitudę a nie jak ja cały przebieg.
    Wiem że te kilkanaście % to może dużo, ale to jest stabilne.
    Lepsze średnie ale równomierne zużycie procka, niż małe ale z czasowo wyskakującymi okresami gdzie nagle trzeba przeliczyć 1024 próbki. To dopiero może przyblokować program.
    A na UARTa by to nie wpływało specjalnie (tzn. to moje rozwiązanie).
  • Moderator Mikrokontrolery Projektowanie
    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.