Skocz do zawartości

Manipulator sterowany potencjometrami


Pomocna odpowiedź

Zaczekajcie aż się Dotli wypowie, bo jak chce obsługiwać serwa to mostek trzeba wywalić i problemu nie będzie - jak nie bascomowe "config servo", to zwykłe "pulseout" spełni dobrze swoją rolę.

Ja też z serwami miałem problem w bascom, ale po podpięciu kwarcu 12MHz "config servo" działało bezproblemowo (dla 3 serw). Mimo wszystko od niedawnej przesiadki wolę C 😉

A mógłbyś opisać w jaki sposób, czy poleceniem bascomowym, na jakim kwarcu itp.

Jeśli chodzi o serva to korzystałem z bascomowego polecenia:

CONFIG SERVOS =

Trzeba pamiętać że polecenie to zaprzęga do pracy timer0 więc już do niczego innego nie można go użyć.

Moja atmega8 śmiga na wewnętrznym oscylatorze 8MHz.

Nadmienię tylko że zmniejszyłem czas RELOAD. Standardowo w bascomie jest

Reload=10

ja wpisałem 8.

  • Lubię! 1

To odnośnie serw wypadałoby żebym ja coś napisał, bo obsłużyłem w Bascomie 12 😃 A jakby trzeba było więcej to chyba też dałbym radę, przy pomocy Config Servos można do 16 (a szkoda, bo bym się pokusił o 3DOF).

Po pierwsze i najważniejsze: trzeba zapewnić bardzo dobre filtrowanie napięcia (dobre nie wystarczy). Najlepiej zasilać serwa z osobnego stabilizatora (tylko nie takiego 1A 😋 ) niż procesor, bez elektrolitów przy stabilizatorze ani rusz, a ceramiczny 100nF przydałby się najlepiej przy każdym serwie (ja stosuję tylko 2x2 100nF przy stabilizatorze).

Po drugie: w książce Wiązani pisze, że do większej ilości serw dobrze jest użyć większego kwarcu. Ja mam maksymalny dla mojego procesora, 20MHz.

Po trzecie: parametr Reload. W zasadzie służy on tylko ustawieniu wartości jakie będą sterowały serwem. Ja dobierałem doświadczalnie, nie pamiętam teraz jaki, ale warto poszukać między 5 a 15, i dla wartości np. 100 znaleźć środkowe położenie. Jest to tylko dla naszej wygody.

[ Dodano: 04-11-2010, 16:50 ]

I jeszcze jedno. Podczas korzystania z Config Servos nie można (albo mnie się nie udało) wywołać przerwań wewnętrznych na timerze1 - u mnie powodowało to również przestanie podawania impulsów na serwo z timera0, przez co serwa "flaczały".

  • Lubię! 1
Po trzecie: parametr Reload. W zasadzie służy on tylko ustawieniu wartości jakie będą sterowały serwem.

Błąd, jest to czas (w mikrosekundach) pomiędzy wywołaniem kolejnych przerwań.

I jeszcze jedno. Podczas korzystania z Config Servos nie można (albo mnie się nie udało) wywołać przerwań wewnętrznych na timerze1 - u mnie powodowało to również przestanie podawania impulsów na serwo z timera0, przez co serwa "flaczały".

Raczej Ci się nie udało. Ja dla pewności właśnie wywołałem.

Błąd, jest to czas (w mikrosekundach) pomiędzy wywołaniem kolejnych przerwań.

Tak, ale błędu się nie dopatruję. Bo jak ustawisz mniejszy czas impulsu, to będziesz musiał wpisać większą wartość żeby serwo znajdowało się w tym samym miejscu. Ja napisałem jak to wygląda od strony praktycznej. Ja wpisałem Reload = 8. Działało mi i przy 10 i 12, ale te wartości przy 8 są dla mnie najwygodniejsze.

Raczej Ci się nie udało. Ja dla pewności właśnie wywołałem.

U mnie to raczej była wina programu, za dużo podprogramów i opóźnień w podprogramie przerwania. W takim razie się da.

Tak, ale błędu się nie dopatruję. Bo jak ustawisz mniejszy czas impulsu, to będziesz musiał wpisać większą wartość żeby serwo znajdowało się w tym samym miejscu.

To się zgadza, ale jak napisałem, jest błąd w tym co chciałeś przekazać. Młody użytkownik pakietu BASCOM pomyślał by Twoim tokiem,

Posiadam serwa TowerPro SG-5010 ale niestety są przerobione :/ . Zastanawiam się właśnie co by działało sprawniej serwa czy sam silnik ?. Z waszych postów zrozumiałem ze chyba lepiej zrobić to na samych serwach i tak postąpię , tutaj zrobiłem schemat . Rozumiem ze przy budowie na serwach bede musiał sterować PWM , dobrze zrozumiałem . Tutaj schemat :

Łącznie będzie 5 serwo mechanizmów

Można też napisać PWM programowe. Korzystałem kilka razy i działa naprawdę świetnie.

Ja jeszcze chciałem nawiązać do programowego PWM. Programowe PWM ma delikatnie rzecz ujmując przewagę nad sprzętowym PWM'em, ponieważ programowym PWM'em można sterować masą różnych urządzeń czy silników czy kto czym tam chce, każdy może mieć inną wartość, a ilość ograniczona jest jedynie do ilości wyprowadzeń użytego mikrokontrolera.

Jak ktoś będzie chętny to pokażę jak napisać programowy PWM. Od razu zaznaczam że to nie mój soft, tylko kolegi Mirleya.

Jak ktoś będzie chętny to pokażę jak napisać programowy PWM. Od razu zaznaczam że to nie mój soft, tylko kolegi Mirleya.

Ja bym prosił o jakiś przykład jeśli można oczywiście.. 🙂

Ja bym prosił o jakiś przykład jeśli można oczywiście..

To jest (niepełny) soft z Mirleya (mam nadzieję że Mirek nie będzie miał mi za złe). W razie co -> TUTAJ <- jest całość ze strony Mirka.

'trzeba odpowiednio skonfigurować porty

Config Timer0 = Timer , Prescale = 8 'konfiguracja timera
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts

programowe_pwm Alias Portb.0 'do portu b.0 przypisuje nazwe programowe_pwm

Dim Licznik As Byte 'zmienna do liczenia ilosci przerwan
Dim zmienna_do_pwm as byte 'wisujac odpowiednia wartosc do tej zmiennej ustalamy wypelnienie PWM

zmienna_do_pwm = 100 'tu PWM wynosil bedzie 0

Do
Loop
End

Prztimer0:
Incr Licznik
If Licznik = 100 Then Licznik = 0'to powoduje ze PWM ma wartosc miedzy 0 a 100 co daje 1% na kazda jedna czesc ze 100

If Licznik < zmienna_do_pwm Then Set programowe_pwm Else Reset programowe_pwm
' tu wstawiajac wiecej zmiennych w podobny sposob mozemy rozszerzyc ilosc PWM'ow
Return

no tak ale ja chce sterować proporcjonalnie ruchem potencjometru do ruchu serwo mechanizmu . Bardzo was proszę o sprawdzenie schematu , jeżeli będzie poprawny to w tygodniu zrobię pierwsze testy i się pochwalę

no tak ale ja chce sterować proporcjonalnie ruchem potencjometru do ruchu serwo mechanizmu

No to w czym problem? Niestety pisząc:

config servos=

deklarujesz już dzialanie timera0 więc nici z programowego PWM'a.

Jeśli procek będzie pracował Ci przy częstotliwości 8MHz i wpiszesz wartość RELOAD = 8, to efektywne działanie serwa będziesz miał w przedziale

servo(x)=30 do 155

Podziel sobie wartość ADC przez 7 i napisz to tak:

zmienna_adc=0
zmienna_adc=getadc(x)            'x to numer adc z jakiego korzystasz
zmienna_adc=zmienna_adc/7

servo(x)=zmienna_adc              'servo(x) to numer serwa jakie chcesz wysterowac

po takiej operacji powinieneś dostać na serwo wartości z wejścia ADC, ale na zakresie potrzebnym Tobie.

mały edit:

Trzeba jeszcze to dopracować bo dla ADC poniżej wartości 210 nie będzie się działo nic, więc dla prawie jednej piątej obrotu potencjometru, a jest to niedopuszczalne. Zaraz coś pomyslę.

edit2:

wystarczy napisać:

zmienna_adc=0 
zmienna_adc=getadc(x)            'x to numer adc z jakiego korzystasz 
zmienna_adc=zmienna_adc+210
zmienna_adc=zmienna_adc/7 
servo(x)=zmienna_adc              'servo(x) to numer serwa jakie chcesz wysterowac 

i dla całego zakresu potencjometru masz proporcjonalny ruch serwa.

Warto jeszcze uwzględnić, że potencjometr będzie pewnie miał większy zakres obrotu (większy kąt) niż serwo - myślę, że kalibrację trzeba by przeprowadzić metodą prób i błędów już po złożeniu całości.

Dotli, po raz ostatni Cię proszę, żebyś zadeklarował czy ostatecznie chcesz serwo, czy silnik z przekładnią! Jeśli serwo, to schemat jest zły.

Warto jeszcze uwzględnić, że potencjometr będzie pewnie miał większy zakres obrotu (większy kąt) niż serwo - myślę, że kalibrację trzeba by przeprowadzić metodą prób i błędów już po złożeniu całości.

Ale dla mojego kawałka programu nie ma to znaczenia, bo nie przypisuje on konkretnej wartości ADC do konkretnego miejsca serwa. Korzysta tylko z przetworzonej wartości pobranego napięcia. Więc czy będzie się ów potencjometr obracał o 180st. czy 270 to nie ma znaczenia. Przy większym kącie obrotu będzie dokładniej.

Chyba że chodzi o to by miejsce orczyka serwa było dokładnie w tym samym miejscu co gałka potencjometru. Wtedy to już wyższa szkoła jazdy.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...