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

Sterowanie serwem FS90R przez PWM w Atmega88A - jak uruchomić?

Bluzman 19 Sie 2020 20:01 2190 40
  • #1 18878700
    Bluzman
    Poziom 4  
    Witam. Tak jak w temacie używam kontrolera Atmega88A i serwa 360 stopni FS90R. Już umieściłem jakiś czas temu temat o tym serwie tylko innym problemem. Po nieudanych próbach postanowiłem wrócić do poznania sterowania PWM w Atmedze, tym razem od samego początku. Początkujący i już zaawansowani koledzy pewnie znają https://forbot.pl/blog/wszystko-co-musisz-wiedziec-aby-uruchomic-pwm-id5021 Na nim postanowiłem się wzorować żeby najprościej uruchomić PWM. Napisałem praktycznie taki sam kod tylko dla jednego kanału:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Problem już się pojawił na tym etapie, jeszcze bez kodu w pętli głównej - przy wartości 0 dla OCR1A serwo się obraca a przy 255 nie. Powinno być chyba odwrotnie? Dodam jeszcze, że od ok. wartości 160 zaczyna zwalniać a od 195 już powoli obraca się w drugą stronę.
    Proszę o pomoc bo nie wiem czego się czepić.
  • #2 18879983
    Konto nie istnieje
    Poziom 1  
  • #3 18880785
    Bluzman
    Poziom 4  
    Skorzystałem z wzoru do obliczenia 50Hz dla trybu Fast PWM gdzie TOP to ICR1. Przekształcony wzór z dokumentacji Atmega88 na stronie 119. Czyli:
    8 000 000 Hz/ Preskaler 8bit = 1 000 000 Hz
    1 000 000 Hz / 50Hz = 20 000 -> wartość dla ICR1

    Dalej ten prosty kod, żeby opanować na początek dość płynne regulowanie obrotami i kierunkiem
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W zasadzie nic się nie zmieniło, pod różnymi wartościami OCR1A serwo głupieje a wyższych niż np. 5000 w ogóle nie rozumie. Nie będę już tutaj opisywał w którą stronę się obraca i z jaką prędkością przy różnych wartościach bo to chyba nic nie wniesie. Z ciekawości spróbowałem jeszcze innych trybów z możliwością określenia ICR1 jak "PWM, Phase Correct" i "PWM, Phase and Frequency Correct".
    Zmieniałem "Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at TOP " na "Set OC1A/OC1B on Compare Match, clear OC1A/OC1B at TOP" też nic nie daje.
  • #4 18881359
    kaczodp
    Poziom 14  
    Sterowanie serwem nie zrealizujesz prosto na timerze 16 bit a co dopiero 8 bit. Najwygodniejszy jest 32 bit ale takiego w AVR nie ma. Musisz najpierw wygenerować impuls dla serwa po czym gdy timer skończy pracę, w przerwaniu, zmienić preskaler i ustawić generowanie pauzy 20ms. Po wygenerowaniu pauzy przerwanie, zmiana preskalera i generowanie impulsu. Na timerze 32-bit jest prościej ustawiasz PWM i to wszystko.
  • #5 18881441
    Bluzman
    Poziom 4  
    kaczodp napisał:
    Sterowanie serwem nie zrealizujesz prosto na timerze 16 bit a co dopiero 8 bit.

    Masz na myśli serwo takie jak ja mam czy wszystkie? Sterowanie serwami 180stopni ludzie robią na AVR z zasadą taką jaką próbuję zastosować i działa wszystko, bez kombinacji. FS90R jest znane ale faktycznie mało o tym w internecie jeżeli chodzi o pracę z kontrolerami AVR .
  • #6 18881504
    tmf
    VIP Zasłużony dla elektroda
    kaczodp napisał:
    Sterowanie serwem nie zrealizujesz prosto na timerze 16 bit a co dopiero 8 bit.

    A niby dlaczego nie?
    kaczodp napisał:
    Na timerze 32-bit jest prościej ustawiasz PWM i to wszystko.

    Czyli dokładnie tak samo jak na timerze 16-bitowym, lub 8-bi5towym jeśli mamy odpowiednią kombinację preskalera i zegara taktującego.
    kaczodp napisał:
    Najwygodniejszy jest 32 bit ale takiego w AVR nie ma.

    Co oczywiście nie jest prawdą. M88A co prawda nmie ma, ale niektóre inne mają. Tyle, że tu 16-bitowy timer wystarcza, a 8-bitowy wystarcza jeśli się najpierw projektuje a potem wykonuje.
  • #7 18881592
    kaczodp
    Poziom 14  
    Bluzman napisał:
    Masz na myśli serwo takie jak ja mam czy wszystkie?

    Wszystkie.

    tmf napisał:
    Czyli dokładnie tak samo jak na timerze 16-bitowym, lub 8-bi5towym jeśli mamy odpowiednią kombinację preskalera i zegara taktującego.

    W 32-bit nie muszę przełączać preskalera aby wygenerować pauze 20ms. Presklaer ustawiam na 1 i zmieniam tylko PWM. W 8 bit trzeba koniecznie przełaczać preskalera, w 16-bit, jak nie jest wymagana duża precyzja mozna nie przełączać, jak ma być duża, tak jak w przypadku 8-bit, trzeba przełączać.
  • #8 18881640
    Konto nie istnieje
    Poziom 1  
  • #9 18881793
    kaczodp
    Poziom 14  
    atom1477 napisał:
    Nie trzeba przełączać preskalera.
    Wystarczy wpisywać wypełnienie PWMa = 0 w momentach gdy ma być przerwa.

    Jak by nie realizować tej przerwy, trzeba kombinować w przerwaniu. Po co kombinować, jak można użyć trybu 16-bit o ile dokładność nie jest priorytetem?
  • #10 18881811
    Konto nie istnieje
    Poziom 1  
  • #11 18881831
    kaczodp
    Poziom 14  
    atom1477 napisał:
    Zmiana wypełnienia w przerwaniu jest standardową praktyką przy wykorzystywaniu PWMa.

    AVR ma bufor, który dba o to aby nową wartość PWM wpisać w odpowiednim momencie więc nie można mówić o tym, że to standardowa praktyka tak samo jak nie można twierdzić, że zmiana innych parametrów niż wypełnieni jest niestandardową praktyką.

    Za to, ustawianie PWM na 0 nie jest dobrą praktyką aby uzyskać stabilny poziom niski, bo będzie generowana krótka szpilka na wyjściu PWM. Miałem ten kłopot i aby się pozbyć szpilki trzeba w przerwaniu wyłączać PWM. Dużo zabawy, a wszystko może zacząć źle działać jak wtrącą się inne częste przerwania, np od UART. Zamiast kombinować lepiej skorzystać z możliwości sprzętowych niż pchać się w potencjalne kłopoty przykładowo serwo wariuje gdy po Wi-Fi przez ESP-UART wysyłane są informacje albo BT czy USB.
  • #12 18881883
    Konto nie istnieje
    Poziom 1  
  • #13 18881979
    Bluzman
    Poziom 4  
    Widzę że zrobiła się huczna dyskusja;) Zabrnęła jednak w rzeczy które obecnie przerastają moją wiedzę. Czy któryś z kolegów może napisać na "sucho" przykładowy kod, modyfikując mój który podałem z komentarzami? Wtedy postaram się przeanalizować go z notą aplikacyjną kontrolera i zrozumieć, bo to jest najważniejsze.
  • #14 18881996
    Konto nie istnieje
    Poziom 1  
  • #15 18882095
    Bluzman
    Poziom 4  
    Nie mam oscyloskopu niestety.
  • #16 18882116
    Konto nie istnieje
    Poziom 1  
  • #17 18882226
    slx
    Poziom 19  
    Twój program z postu #3 wydaje się być poprawny.
    Wartości jakie wpisujesz do OCR1 (czas w us) powinny być w okolicach 1500 +- 500 - tak z grubsza, te powinny zaakceptować różne serwa. Te 5000 o których wspomniałeś to raczej przesada. Jak to zasilasz, bo w tym może być problem.
    Tu masz mój program, działający:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    sprawdzony w boju: https://drive.google.com/drive/folders/0B9TUL6sskxm0NWl5MzBSWTlYa3c
  • #18 18883677
    Bluzman
    Poziom 4  
    slx napisał:
    Wartości jakie wpisujesz do OCR1 (czas w us) powinny być w okolicach 1500 +- 500 - tak z grubsza, te powinny zaakceptować różne serwa. Te 5000 o których wspomniałeś to raczej przesada. Jak to zasilasz, bo w tym może być problem.

    W tej chwili czekam na przetwornicę 3.3/5V więc obecnie zasilam 2x akumulator 3,3V w szeregu podłączony do stabilizatora 7805 1A/5V na wyjściu. Nie sprawdzę wcześniej zastosowania 50-1500 praktycznego w OCR1A niż za 3 dni. Coś mi mówi że niewiele to wniesie.
    Postaram się też zmontować coś zamiast oscyloskopu jak atom1477 zasugerował.
  • #20 18884703
    Konto nie istnieje
    Poziom 1  
  • #21 18887618
    Bluzman
    Poziom 4  
    emarcus napisał:
    Nie słuchaj tego "COŚ" bo to jest jednym twoim zasadniczym problemem.
    Dalej, servo nie potrzebuje stabilizowanego napięcia. możesz go zasilać nap. 4.8 do 6 V.
    Voltage regulator 7805 nie jest regulatorem/stabilizatorem typu LDO, a zatem potrzebuje nadwyżki napięciowej 3V czyli minimum 8Volt, a ty masz tylko 6.6V.
    Owszem processor winien być zasilany stabilizowanym napięciem z odpowiednio zaimplementowaną filtracją.
    Jeżeli masz zamiar wykorzystywać ADC processora, to będzie wymagać przyłożenia więcej uwagi do filtracji zasilania.

    Sugerujesz oddzielne źródło zasilania dla serwa? Mam przetwornicę atnelowską z możliwością 3,3V/5V, myślałem że tym zasilę qc i jednocześnie serwo. Nie mierzyłem jeszcze jaką nadwyżkę ona daje. Mogę użyć jeszcze jako oddzielne zasilanie zasilacza do raspi, tam jest chyba 8V. Procesor ma filtrację elektrolitem 4,7uF + jakiś ceramiczny. Można zastosować większą pojemność.
    btw. oscyloskop na kompie w sumie to nie jest taki głupi pomysł moim zdaniem. Dodatkowo pokaże wizualnie co wypluwa qc z tego PWMu, chociażby dla spokojności i pewności.
  • #22 18887628
    Konto nie istnieje
    Poziom 1  
  • #23 18887753
    Bluzman
    Poziom 4  
    Możesz wyskrobać schemat tej sondy do podłączenia (to tak się chyba nazywa)? Dla liniowego wejścia można podać chyba 2V dla mikrofonowego jakieś mV są. Dobrze by było też z potencjometrami jakimiś żeby napięcie manualnie sobie ustawić?
  • #24 18887930
    Konto nie istnieje
    Poziom 1  
  • #25 18888196
    Bluzman
    Poziom 4  
    Napotkałem się na kilka szkół schematów, nie sprowadza się to do 2 rezystorów tylko.
  • #26 18888249
    Konto nie istnieje
    Poziom 1  
  • #28 18888711
    Konto nie istnieje
    Poziom 1  
  • #29 18890237
    Bluzman
    Poziom 4  
    btw. przygotowuję do podłączenia wszystko. Kabelki, mini-jack, dzielnik bla bla... Tylko zapytam się jeszcze jaki polecacie program-oscyloskop? gdyby miał Wiem że to nie zastąpi prawdziwego oscyloskopu. Nawet gdyby miał być płatny, to niech będzie coś konkretnego. WinScope w najnowszej wersji jest już chyba płatny ale ok, VisualAnalyser nie może ustawić dokładnie np. czasu 20ms, można suwakiem ustawiać ale nie precyzyjnie. Jeszcze nie znam go do bo tylko popatrzyłem z ciekawości. Soundcard Oscilloscope ma zakres czasów 1-m - 10m trochę mało.
  • #30 18890585
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

Dyskusja dotyczy sterowania serwem FS90R za pomocą PWM na kontrolerze Atmega88A. Użytkownik poszukuje pomocy w uruchomieniu PWM, bazując na przykładach z dokumentacji. Odpowiedzi koncentrują się na zasadach generowania impulsów dla serw, w tym czasach trwania sygnałów dla różnych pozycji oraz częstotliwości sygnału. Uczestnicy podkreślają znaczenie odpowiednich wartości OCR1A dla uzyskania płynnej regulacji obrotów oraz wskazują na problemy z synchronizacją przy użyciu dwóch serw. Pojawiają się sugestie dotyczące zasilania serw, użycia oscyloskopu do analizy sygnałów oraz rozważania alternatywnych rozwiązań, takich jak silniki krokowe dla lepszej precyzji. Użytkownik zadaje pytania o różne tryby PWM i ich wpływ na działanie serw.
Podsumowanie wygenerowane przez model językowy.
REKLAMA