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

FS90R - Jak sterować kątem obrotu w C?

Bluzman 20 Maj 2020 11:58 1407 10
REKLAMA
  • #1 18706026
    Bluzman
    Poziom 4  
    Witam
    Zapewne wszyscy znają servo FS90R 360 stopni. Nie wiem jak napisać konfigurację w C żeby przesunał się o np. 45 stopni kiedy ustawiony jest na "wyjściowym kącie" 90 (to będzie chyba w tym serwo 1,5 - wyłączony). Po ustawieniu np. 1.2 sevo zaczyna się kręcić w jedną stronę - 360, jak silniczek.
    Tak ustawiam/obliczam kierunek ruchu np. F_CPU / preskaler (8 000 000/64) = 125 kHz a więc 125 * 1.2 = 150 i to jest wartość, którą wprowadzam do OCR ale to jest raczej prędkość i kierunek ruchu. Chcę żeby servo ma się tylko przesunęło o daną ilość stopni w danym kierunku i zatrzymać się. To trzeba obliczyć jakoś czas w jakim ma się obracać?
  • REKLAMA
  • Pomocny post
    #2 18706086
    kamyczek
    Poziom 38  
    Serwo do robotów działa inaczej niż serwo modelarskie jemu nadajesz kierunek i prędkość obrotów , serwo do modeli wychyla się proporcjonalnie do szerokości impulsu 0d 1 do 2ms w neutrum czyli po środku ma 1,5ms. Ważne jest to że serwo musi otrzymać 1 impuls co 40-50ms bo jak bedzie taki impuls dostawało raz po razie nie będzie działało prawidłowo . Z serw do modeli serwa podwoziowe obracają się w zakresie 180 stopni . są również serwa "cyfrowe" które pozwalają w niektórych wariantach programować określony zakres ruchu ,charakterystykę , czy też prędkość ruchu za pomocą dedykowanego programatora .
  • REKLAMA
  • #3 18709850
    Konto nie istnieje
    Poziom 1  
  • #4 18717962
    Bluzman
    Poziom 4  
    Mam takie 2 serwa i postanowiłem wykorzystać je jako silniczki do pojazdu z czujnikiem odbiciowym. Napisałem taki kod
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powalczyłem trochę żeby 2 serwa obracały się z taką samą prędkością. Tutaj nie wpisałem tych wartości, trochę się różniły. Kiedy włączam serwa działają, czujnik wykrywa coś = obracają w przeciwnym kierunku. Czujnik znów przechodzi w stan wysoki = nie ma "przeszkody" to jedno kręci się bardzo wolno, drugie szybko. Wiem, że Fast PWM nie jest dobrym rozwiązaniem dla silników ale do końca nie wiem jak zmienić ten kod dla PWM poprawnego fazowo i czy poprawny fazowo 8bit lepiej zastosować. Tutaj napisałem dla 16bit timera, Fast PWM 8bit. Jeżeli będzie dla PWM Phase Correct to prędkości serw nie będą głupiały? Byłbym wdzięczny za korektę kodu i pomoc w wybraniu konkretnego trybu PWM. No i jak obliczać w takiej konfiguracji wtedy wartości dla ustawień prędkości serwa. Teraz to było 8000 000 / 64 = 125 i 125 * 1.5ms = 187,5 czyli serwo jest na STOPie.
  • #5 18719619
    Bluzman
    Poziom 4  
    Chyba tryb PWM, Phase Correct nie jest dla tych serv. Zmieniłem poniższy kod i serva przy ICR1 = 4999 zaczynają drgać aż podskakują na biurku, przy waratości 2000 już nie ale w żadnym wypadku nie da się kontrolować kierunku obrotów ani szybkości.

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


    Jeżeli ktoś ma jakiś pomysł to proszę o pomoc.
  • #6 18721900
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 18727546
    Bluzman
    Poziom 4  
    emarcus napisał:
    Przy tym taktowaniu (8MHz) o wiele wygodniej byłoby zastosować prescaler = 8, gdzie 1 click timera to 1 microsekunda, i zamiast 1.5 milisec dla serva masz 1500 microsec.

    Użyłem preskalera 8, rozumiem że wyliczoną wartość w tym przykładzie, która wynosi 1500 microsec należy wpisać do OCR1A lub OCR1A?

    Pośpieszyłem się i wstawiłem poprzednio niedopracowany kod, tutaj jest poprawiony, co i tak niewiele zmieniło. Można powiedzieć, że jeszcze dziwniej się serva zachowują. Jak czujnik zmienia kolejny raz stany wysoki/niski to za każdym razem zachowują się inaczej, jedno stoi, kręcą się każde w inną stronę i różną prędkością.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jakbyś obliczył takie wartości? Mówię tu o wzorach z liczbami, procesie steep by steep.
    Ja mam taki system nauki, że uczę się na przykładach, analizując przykładowy proces, zagadnienie (na zasadzie "jak to jest zrobione" właśnie krok po kroku). Później do wzoru podstawiam swoje dane, sprawdzam w praktyce i taki datasheet staje się zrozumiały. Bo dokumentacje jak dla mnie to są przydatne do zastosowań praktycznych może w 50%, jak sam napisałeś jakieś diagramy itp. są uogólnione, nie ma zbyt wielu konkretów. Setki stron opisów w tym przypadku 331, które można było opisać na 100 stronach. Może od d..y strony to jest ale nic na to nie poradzę.
  • #8 18732254
    Konto nie istnieje
    Poziom 1  
  • #9 18738396
    Bluzman
    Poziom 4  
    No dobrze, załóżmy że to rozumiem. Nie chcę być upierdliwy ale już chciałbym rozwiać wątpliwości co do tego obliczania. Sugerując się diagramem i umieszczonymi tam wzorami. Czyli:
    OCR1A/OCR1B = TOP - (1/2 czasu impulsu)

    9250 = 10000 - 750us
    to nam daje STOP (1500 us)
    (po wpisaniu takiej wartości serwa obracają się bardzo wolno w lewo, dopiero jak się wpisze do COR1A/OCR1B 10000 zatrzymują się)

    Jeżeli bym chciał żeby serwo obracało się zgodnie z ruchem wskazówek zegara maksymalną prędkością to powinna to być wartość = 9500
    10000 - 500 us = 9500
    Po wpisaniu tego wyniku obracają się wolno bardzo odwrotnie do ruchu wskazówek zegara.

    Mam tu taką stronkę, chodzi w niej jedynie o tabelkę gdzie są podane w ms prędkości i kierunki obracania się serwa. Inne serwa zapewne mają podobne czasy ale to znalazłem dla tego konkretnego modelu.
    https://www.firialabs.com/blogs/lab-notes/con...rotation-servos-with-python-and-the-micro-bit
    Pytanie jest wciąż to samo - co jest źle?

    PS
    Co do translatora googlowego to bym się spierał bo przy takim języku "technicznym" jak w ds przetłumaczenie tekstu w nim jest równoznaczne z Kali boleć brzuch. W większości przypadków wprowadza w błąd i zamęt w głowie jedynie.
  • REKLAMA
  • #10 18739156
    Konto nie istnieje
    Poziom 1  
  • #11 18740041
    Bluzman
    Poziom 4  
    emarcus napisał:
    Czy przeprowadziłeś procedurę " nulling' dla tych serv?

    Masz na myśli kalibrację położenia mechanizmu np. dla 1.5ms - STOP? W tym serwie regulację wykonuję się potencjometrem. Tak, robiłem to właśnie dla takiego położenia.

    emarcus napisał:
    I drugie pytanie: czy na pewno taktowanie processora jest 8MHz?

    Jest 8MHz na 100% Wcześniej sprawdzałem i teraz jeszcze.
REKLAMA