Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Serwonapęd - silnik DC, Atmega32, PWM, PID, Enkoder

VolKhen 02 Cze 2013 15:27 58416 143
  • #121 02 Cze 2013 15:27
    Hoptymista
    Poziom 13  

    Super, że działa. Jakie dalsze plany?

  • #122 02 Cze 2013 15:32
    VolKhen
    Poziom 13  

    Zbudować minifrezarkę na silnikach DC :)

  • #123 04 Cze 2013 10:30
    VolKhen
    Poziom 13  

    Mój serwomechanizm bardzo mnie zaskoczył. Otóż okazało się, że PID oscyluje wokół wartości 1023 / 2 a nie jak było wcześniej wokół zera. Prawdę mówiąc to zadziałało przez jakiś przypadek ;) Stało się to od momentu gdy zacząłem sterować końcówkę mocy dwoma przebiegami PWM (odwrotnymi). W tej chwili rozszyfrowałem zasadę działania i wygląda na to, że składowa całkująca kompensuje to "przesunięcie" i ma wartość cały czas zbliżoną do 500 a pozostałe dwa człony odpowiadają za sterowanie. Co ciekawe polaryzacja sygnałów PWM zmienia się gdy wartość jest poniżej 511,5 lub powyżej. Najlepsze jest to, że takiej funkcjonalności nigdzie nie mogę znaleźć w nocie katalogowej. Poniżej konfiguracja PWM oraz funkcja od ustawiania PWM.

    Konfiguracja Timera1

    Code:
    // Timer1 jako fast PWM
    
    TCCR1A = 0xB3;                // Konfiguracja z CodeVision
    TCCR1B = 0x09;
    TCNT1H = 0x00;
    TCNT1L = 0x00;
    ICR1H  = 0x00;
    ICR1L  = 0x00;
    OCR1AH = 0x00;
    OCR1AL = 0x00;
    OCR1BH = 0x00;
    OCR1BL = 0x00;


    Najlepsze jest to, że te zmienne od kierunku nie są w ogóle potrzebne i serwo działa również bez tego tak jakby Timer sam w sobie zmieniał polaryzację przebiegów PWM wokół wartości 511,5. Czyli połowy maksymalnej 1023.
    Code:
    void setPWM(float amps)
    
    {
      static float lpf = 0.0;
     
      //lpf = (0.8 * lpf) + (0.2 * amps);    // Filtr LPF - nieużywany
      lpf = amps;

      if(stat.dir == stat.dirLast)
      {
        // Wpisanie wart. PWM do rejestru porównującego
        OCR1A = abs(lpf);                           
        OCR1B = abs(lpf);
      }
      else
      {
        // Wyłączenie silnika na jedną pętlę po zmianie kierunku
        OCR1A = 0;               
       OCR1B = 0;
      }
      stat.dirLast = stat.dir;
    }


    Jak ktoś to rozumie, to chętnie usłyszę wyjaśnienie bo wykres Fast PWM z noty katalogowej wg mnie tego nie wyjaśnia.

    Jeszcze jedno. Gdy wyłączę człon całkujący (Igain = 0) to serwo zatrzymuje się na 52 lub -52 kroku enkodera, czyli człon P wyrównał aby serwo stało w miejscu. Przy wzmocnieniu Pgain = 10 wyjście wynosi wtedy 520... czyli silnik stoi.

  • #124 04 Cze 2013 23:55
    VolKhen
    Poziom 13  

    To co pisałem nie było do końca prawdą, prawdziwa zasada działania jest inna. Odkryta przez przypadek, ale działa świetnie :) Jutro opiszę to dokładnie.

  • #125 05 Cze 2013 20:53
    VolKhen
    Poziom 13  

    Chyba i tak nie ma tutaj nikogo kto mógłby pomóc albo kogo by to interesowało.

  • #126 05 Cze 2013 21:03
    Hoptymista
    Poziom 13  

    Ja jestem bardzo zainteresowany tym sterowaniem ale na C się nie znam dlatego się nie wypowiadam.

  • #127 05 Cze 2013 21:16
    noel200
    Poziom 22  

    VolKhen napisał:
    Chyba i tak nie ma tutaj nikogo ... kogo by to interesowało.

    To nie tak. Nie każdego to fascynuje tak bardzo jak ciebie i nie wszyscy się na tym znają i są w temacie jak ty. Ostatnich kilka twoich postów przeczytałem i jak do tej pory wszystko było w miarę jasne, tak temat zrobił się już dla mnie za głęboki.
    Poza tym jest jeszcze jedna ciekawa sprawa. Mianowicie ktoś kto potrzebuje serwa nie zawsze wie, albo nawet chce wiedzieć jak to działa. Ja na przykład zrobiłem jedną frezarkę (o ile można to tak nazwać), będę robić drugą już zdecydowanie konkretniejszą i wprawdzie nie zamierzam użyć serw i dokładnie poznałem zasadę działania sterowników silników krokowych to nie potrzebuję wiedzieć jak sterownik serwa działa. Do samego zbudowania maszyny i późniejszej jej eksploatacji potrzeba wchłonąć tyle wiedzy, że jeszcze tak gruntowna wiedza z budowy i działania sterownika serwa jest zbędna. Z resztą czasu strasznie brak.
    Nie każdy chce poznać anatomię krowy jak chce się napić mleka.
    Niemniej jednak twój wkład i opis pracy jaką tu wykonujesz jest ogromny i wręcz nieoceniony.

  • #128 05 Cze 2013 21:18
    RalfPi86
    Poziom 12  

    ja sobie czytam, ale kiedyś napisałem coś o nastawach regulatorów i przeszło bez echa.. jak nie chce nikt korzystać to siedzę cicho :P

  • #129 06 Cze 2013 08:24
    VolKhen
    Poziom 13  

    OK, w takim razie napiszę swoje przemyślenia... ;)

    Zrozumiałem dlaczego i jak działa moje serwo po zmianach w kodzie, które przyniosły niespodziewane i dobre efekty.

    Od czego by tu zacząć...

    Może od tego, że wypełnienia PWM od 0 do 60% były bezużyteczne przy sterowaniu gdyż silnik po prostu nie reagował na przyłożone napięcie. Dopiero powyżej wypełnienia 60% dostawał kopa. I to naprawdę nagłego. Tak jakby siła przyrastała wykładniczo do wypełnienia.

    Jak wiadomo głównym czynnikiem odpowiedzi regulatora PID jest akcja proporcjonalna. Gdy błąd jest mały odpowiedź również jest mała i błąd nie jest kasowany - dlatego potrzebujemy członu całkującego. Taka charakterystyka powodowała, że serwo w okolicy punktu zadanego było "miękkie" a gdy dochodziło do owych 60% to nagle przesuwając silnik napotykało się jakby ścianę - nagły duży opór silnika. Takie rozluźnienie w okolicach punktu zadanego było usuwane przez akcję całkującą jednak ta nieliniowość siły była mocno wyczuwalna. Mam nadzieję, że opisuję to w miarę jasno.

    Po zmianach w kodzie programu serwa, które wprowadziłem i opisywałem jakiś czas temu okazało się, że miękkość serwa wokoło punktu zadanego zniknęła. Co ciekawe odkryłem dziwne zachowanie serwa gdyż wartość PIDa zatrzymywała się i oscylowała wokół wartości 512 a nie jak było wcześniej wokół 0. Winę za to brała akcja całkująca, która miała wartość około 512. Z tego powodu przy włączeniu serwa zawsze było szarpnięcie, którego wtedy nie potrafiłem zrozumieć. Gdy wyłączałym akcję całkującą to serwo zatrzymywało się na 52 kroku przy wzmocnieniu P = 10 mimo punktu zadanego w 0. Wyglądało to tak jakby punktem równowagi było wyjście PIDa około 520 czyli wypełnienie równe około 50%. Było to dla mnie sporym zaskoczeniem. Przy takim sterowaniu końcówka mocy na L298 była zupełnie zimna po wielu testach i zabawach z napędem. Wcześniej przed tą zmianą bardzo mocno się grzała. Nie rozumiejąc dlaczego mój serwonapęd działa tak dobrze ;) zacząłem dochodzić o co w tym chodzi. Okazało się, że funkcje, które ustalały kierunek pracy serwa w oprogramowaniu są bezużyteczne a silnik samoistnie zatrzymuje się w miejscu przy wypełnieniu 50%. Wróćmy tutaj do tego, że wypełnienia od 0 do powiedzmy 50% były bezużyteczne gdyż silnik w ogóle nie reagował na takie napięcie. Zakładając oczywiście, że napięcie wahało się pomiędzy, 0 a U zasilania. Wtedy sterowanie odbywało się za pomocą jednego przebiegu PWM. Teraz mam dwa odwrotne przebiegi podane na mostek H nazwijmy to na przeciwległe po skosie tranzystory.

    W tym momencie tak wygląda przebieg na silniku w stanie spoczynku.
    [C] Serwonapęd - silnik DC, Atmega32, PWM, PID, Enkoder





    Tym razem napięcie w + i - znosi się i silnik stoi w miejscu. Końcówka mocy nie grzeje się, silnik mimo pozostawienia na 4h również nie zagrzał się nawet w najmniejszym stopniu. Pobierany prąd jest bardzo mały. Właśnie? Dlaczego? Czyż silnik nie powinien walczyć ze sobą? co prawda przy częstotliwości 15kHz jakikolwiek ruch w prawo lewo zgodnie z napięciem jest niemożliwy.

    OK, więc mamy wypełnienie 50% i silnik stoi. Już wiecie dlaczego zniknęła nazwijmy to ta strefa miękkości wokół pozycji zadanej? Bo w ten sposób wycięliśmy wartości wyjściowe PIDa, zależnego od członu proporcjonalnego proporcjonalnie do błędu (jak sama nazwa wskazuje ;) ), które wynosiły od 0 do 50%. Poprzednio silnik w wartościach PIDa od -500 do +500 był bezwładny - nie reagował. Teraz stoimy w miejscu 50%, więc wypełnienie 0% oznacza pełną moc powiedzmy w prawo a 100% pełną moc w lewo. Jednocześnie PID oscyluje od 0 do 1023 (równowaga w 511), a nie jak było wcześniej od -1023 do +1023 (równowaga w 0). W tej chwili w ogóle nie ma efektu miękkości silnika wokół pozycji zadanej, ponieważ akcja proporcjonalna od razu wchodzi w zakres działania silnika.
    Poniżej rysunek poglądowy, na czerwono jak wcześniej działało serwo, siła wolno przyrastała wokół punktu zadanego po czym nagle mocno rosła. Na zielono jak to działa teraz:
    [C] Serwonapęd - silnik DC, Atmega32, PWM, PID, Enkoder

    Mam nadzieję, że jest to zrozumiałe.

    Czy takie podejście do tematu jest w jakikolwiek sposób błędne? Testy pokazują, że działanie jest ok.
    Widzicie jakieś złe strony takiego sterowania?

    Czy moje rozumowanie jest prawidłowe?

  • #130 06 Cze 2013 08:29
    RalfPi86
    Poziom 12  

    napisz proszę - sprzężenie masz od pozycji?
    Tzn. błędem w Twoim algo. jest błąd pozycji?

  • #132 06 Cze 2013 08:32
    RalfPi86
    Poziom 12  

    hmm - czytałeś o sterowaniu kaskadowym? Czy nadal się go boisz ;) ?
    Tak na poważenie to kaskada, która de facto jest bardzo prosta, zapewnia na 100% lepsza jakość regulacji - nie wczytywałem się we wszystko co napisałeś, bo mam full swojej roboty teraz, ale generalnie miękkość, o której piszesz, wynika pewnie własnie z braku kaskady (poszukaj może pod hasłem FOC albo sterowanie zorientowane polowo).

  • #133 06 Cze 2013 08:35
    VolKhen
    Poziom 13  

    Chyba nadal się go boję :) Chętnie bym to zrobił, ale prawdę mówiąc termin oddania pracy mgr mam do 30 czerwca (ostateczny) a układ działa dobrze, więc nie będę już kombinował. Chciałem tylko skonsultować zasadę działania. Teraz zostały mi już tylko przetestować urządzenie, opisać testy, zrobić wykresy i gotowe :)

  • #134 06 Cze 2013 08:37
    RalfPi86
    Poziom 12  

    Słuchaj - w mojej opinii zrobiłeś super rzecz - naprawdę jest to porządna podbudowa do dalszej pracy - nie ma co szaleć - jeżeli jesteś zadowolony z pracy tego układu - spinaj wszystko w całość, opisuj.. i startuj o jakąś nagrodę! Poważnie :)

    Jak będziesz miał ochotę to napisz do mnie kiedyś na privie to postaram się podzielić wiedzą i doświadczeniem.
    Pozdrowienia!

  • #135 06 Cze 2013 09:42
    noel200
    Poziom 22  

    Mam kilka spostrzeżeń. Opory w działaniu urządzeń mechanicznych zawsze jakieś są. Tak samo u ciebie, dlatego zapewne od wypełnienia powyżej 50% silnik zaczyna działać.
    Najprostszym rozwiązaniem byłoby wprowadzenie offsetu, a następnie regulacja prądu w zależności od uchybu, czyli używanie wartości od 50% wzwyż. Wykluczenie całkowicie wartości poniżej 50%. Jednak przy zmianach oporów mechanicznych układ bez ingerencji w kod będzie pracował niepoprawnie. Innym rozwiązaniem jest zastosowanie algorytmu, który będzie zwiększał prąd w zależności od uchybu nie w sposób liniowy, a wykładniczy. Do tego jeszcze jakiś offset i powinno działać ładnie.
    Napisałeś, że w ustalonej pozycji "na postoju" pomimo podawania napięcia o przemiennym kierunku i wypełnieniu 50% nic się nie grzeje. Częstotliwość z jaką zmieniasz kierunek to 15KHz, więc indukcyjność uzwojeń jest za duża, żeby prąd liczyć z prawa ohma. Jeśli chcesz zobaczyć jaki prąd tam płynie to musisz użyć prądowej sondy oscyloskopowej. Z resztą przy przemiennym prądzie o takiej częstotliwości inercja wirnika jest za duża, żeby się w ogóle ruszył. Podawanie tego przebiegu na postoju w przypadku ustalonej pozycji i uchybu 0 jest czystym marnowaniem prądu i wg mnie nie ma większego sensu.

  • #136 06 Cze 2013 11:49
    VolKhen
    Poziom 13  

    Dziś zmierzę ile prądu pobiera zasilacz, którym to zasilam z włączonym silnikiem i bez włączonego silnika (Enable na 1 i 0) i zobaczymy różnicę. Wydaje mi się, że prąd przy takiej częstotliwości nie zdąży narosnąć w żadną ze stron, więc jest znikomy. Zobaczymy.

  • #137 06 Cze 2013 19:12
    VolKhen
    Poziom 13  

    Końcówka mocy w stanie spoczynku pobiera 50mA wraz z częścią logiczną, gdy odciągam silnik na bok to maksymalnie zaobserwowałem 1,5A.

  • #140 06 Cze 2013 22:58
    noel200
    Poziom 22  

    Więc wg mnie wcale nie tak dużo. Prąd przy tej częstotliwości nie zdąży narastać. Takie jest moje wyjaśnienie tego zjawiska.
    A wyłącz prąd całkiem przy uchybie 0 i zobacz jak wtedy silnik będzie chodzić.
    I może w zależności od uchybu zrób wykładnicze narastanie prądu, o ile jeszcze tego nie masz. Nie znam się na C za bardzo.

    A jeszcze jedna sprawa tak na boku...
    Praca inżynierska jest po to żeby pokazać, że się rozumie, że się człowiek nauczył czegoś i żeby pokazać, że jest się w stanie coś zbudować i dokładnie się temat zgłębiło ( tak ogólnie).
    Ale praca magisterska to nie powielanie i kopiowanie. Jak budujemy urządzenie to musi budowa mieć sens. Należy udowodnić, że zaistniała konieczność budowy, gdyż takiego urządzenia nie ma. Nie istnieje. Dlatego je budujemy, bo choć podobne do innych to jednak niepowtarzalne. A co w twoim sterowniku będzie innego niż we wszystkich innych? Bo budować stanowisko dydaktyczne na sterowniku własnej konstrukcji to można na inż. To za mało na mgr . Można przecież zbudować na gotowym sterowniku komercyjnym. Ja na mgr zrobiłem bramę automatyczną, która się sama komunikuje z systemem alarmowym domu, wcześniej już zainstalowanym. Komercyjnego urządzenia takiego nie znalazłem.

  • #141 07 Cze 2013 08:01
    RalfPi86
    Poziom 12  

    Masz sporo racji noel.. ale ja widzę różne, różne magisterki - nie róbmy takiej wielkiej nauki!!! Bo się okaże, że za 3 lata nikt nie będzie się bronił, a nowych doktorów będzie 3 w całym kraju!
    Nie ma co się oszukiwać -
    "zrobiłem bramę automatyczną, która się sama komunikuje z systemem alarmowym domu, wcześniej już zainstalowanym. Komercyjnego urządzenia takiego nie znalazłem. "
    A ja Cię zaręczam, że jest takie rozwiązanie... Może nie w Polsce, ale w USA, Japonii, albo innych Chinach czy Turcji...
    Także VolKhen "szacun" - praca wygląda sympatycznie!

  • #142 07 Cze 2013 09:19
    noel200
    Poziom 22  

    Jakie są teraz prace to ja sobie doskonale z tego zdaję sprawę. Chodziło mi bardziej o to co na to promotor i czy przypadkiem ktoś na obronie nie zada tak oczywistego pytania jak "dlaczego pan to zbudował? Przecież są takie gotowe produkty w całkiem przyzwoitych cenach i działające dobrze z gwarancją do tego."

    RalfPi86 napisał:
    A ja Cię zaręczam, że jest takie rozwiązanie...

    Widać za słabo szukałem :P
    Wracając jednak do tematu to mi się praca również bardzo podoba i podziwiem ilość włożonej pracy. Oby nie było gorszych magisterek, bylibyśmy wspaniałym krajem:)

  • #143 07 Cze 2013 18:30
    VolKhen
    Poziom 13  

    Mam nadzieję, że jak przeczytacie już gotową pracę to również będzie się podobać... ;) Jeszcze troszkę testów i ostatnie poprawki i można słać do promotora.

  • #144 07 Gru 2013 17:34
    VolKhen
    Poziom 13  

    Witam wszystkich po przerwie.
    Wrzucam tutaj moją pracę mgr gdyż wiele osób pytało o nią w wiadomościach prywatnych. Po zainteresowaniu dotyczącym pracy inż. widzę, że na pewno informacje zawarte w pracy mgr, która jest rozwinięciem pierwotnego serwonapędu, przydadzą się wielu osobom. Dla początkujących znów będzie to kompedium wiedzy, dla zaawansowanych pewnie nic ciekawego.

    Serwonapęd można zastosować z dowolnym silnikiem prądu stałego i enkoderem w dowolnym urządzeniu.

    Chciałbym jeszcze raz podziękować wszystkim za dobre rady podczas pisania pracy mgr.

    Link



    Link


    Plik arkusza kalkulacyjnego, który jest w załączniku służył mi do wykreślania trajektorii i odpowiedzi regulatora PID. Obliczenia PID były wykonywane w arkuszu oprócz członu I.

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo