Skocz do zawartości
Zaloguj się, aby obserwować  
Mr_cin

[C] Sterowanie serwami za pomocą ATmega8

Pomocna odpowiedź

Witam wszystkich, jestem nowy na forum.

Mój problem wygląda tak: zacząłem pisać skrypt do sterowania dwoma serwami w robocie. Zdefiniowałem stany serwa, tzn ruch do przodu, do tyłu i stop, oraz wykrycie przeszkody przez czujnik. Mam też zaimplementowany pwm programowy (przerobiony kod nie mojego autorstwa). Wszystko działa jak należy do momentu gdy chcę napisać właściwy algorytm poruszania.

To jest część kodu, która potrzebuje przyjrzenia się:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define serwo_prawe_tyl PORTD|=~0b00100000
#define serwo_prawe_przod PORTD|=~0b01000000
#define serwo_prawe_stop PORTD|=~0b00000000

#define serwo_lewe_tyl PORTB|=~0b01000000
#define serwo_lewe_przod PORTB|=~0b10000000
#define serwo_lewe_stop PORTB|=~0b00000000

#define czujnik_lewy (!(PINC & 0b00100000))
#define czujnik_prawy (!(PINC & 0b00010000))

int main(void)
{

DDRD=0b11111111;
DDRB=0b11111111;

DDRC=0b00000000;
PORTC=0b11111111;

      while(1)
   {		
			serwo_lewe_przod;
			serwo_prawe_przod;

               if (czujnik_lewy)
			{			
               serwo_lewe_przod;
			serwo_prawe_tyl;			
               _delay_ms(50);
		    serwo_lewe_stop;
			serwo_prawe_stop;	
               _delay_ms(50);
               serwo_lewe_przod;
			serwo_prawe_przod;

			}				
   }	
 return 0;
}
}

Ten kod w praktyce zachowuje się tak: lewy czujnik wykrywa przeszkodę, robot obraca się chwilę w miejscu (jak czołg, tak miało być) po czym zatrzymuje się i całkowicie zamiera (tak nie miało być). Długo się z tym męczyłem i dziwiłem się dlaczego kod przestaje się wykonywać po dojściu do instrukcji z zatrzymaniem serw. Robot po wykryciu przeszkody ma obrócić się o jakiś kąt, po czym iść dalej prosto. Z góry dzięki za pomoc i wskazówki!

Udostępnij ten post


Link to post
Share on other sites

Operacje na portach zdefiniowane na początku "dostawiają" mnóstwo jedynek na port D. Przykładowo, dla sytuacji gdy PORTD = 0b00000000 wykonanie operacji zdefiniowanej tym:

#define serwo_prawe_tyl PORTD|=~0b00100000

spowoduje, że w wyniku dostaniesz PORTD = 0b11011111 - i to (być może) jest OK, jeśli zero jest dla Twoich układów sterujących stanem aktywnym (tylko dlaczego nie inicjujesz zawartości rejestrów PORTD i PORTB na 0xFF). Ale już wykonanie następnego:

#define serwo_prawe_przod PORTD|=~0b01000000

ustawi wszystkie bity portu D w stan 1, ponieważ:

0b11011111 | 0b10111111 daje w wyniku 0b11111111 😐

Mając wyzerowany jakiś bit na porcie nie jesteś w stanie w jednej operacji (pomijając przypadki szczególne) ustawić go w stan 1 i wyzerować inny bit. W najprostszym przypadku, gdy nie masz nic innego podłączonego do portu, po prostu używaj operacji postawienia, np:

#define serwo_prawe_stop PORTD=~0b00000000

czyli '=' zamiast operatora '|='.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Trochę dziwne jest to sterowanie serwem, już tak próbowałem i nigdy mi się to nie udawało. PWM w atmega8 jest sprzętowy, więc robienie programowo mija się z celem.

Kilka miesięcy temu pisałem artykuł na mojej stronie www o sterowaniu serwami, może okazać się pomocny.

http://www.robotyka.net.pl/sterowanie-serwomechanizmem/

Odradzam trochę stosowanie tego binarnego zapisu, jak by to zapisać w szesnastkowym to łatwiej się czyta i mniejsza szansa na pomyłki 🙂

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Mr-cin, a Ty naprawdę sterujesz serwami - takimi co to potrzebują sygnału PPM 🤯 ?Czy tylko tak nazywasz swoje napędy zrobione z silniczków i jakichś mostków? - ja tak to sobie założyłem, bo dwa sygnały na jeden napęd raczej wskazuje na dwukierunkowe sterowanie zwykłym silnikiem. Takie statyczne sygnały na portach to serwa raczej nie poruszą chyba, że jakoś je poprzerabiałeś. Ale wtedy to już serwem nie można tego nazywać.

Udostępnij ten post


Link to post
Share on other sites

Trochę dziwne jest to sterowanie serwem, już tak próbowałem i nigdy mi się to nie udawało. PWM w atmega8 jest sprzętowy, więc robienie programowo mija się z celem.

Odradzam trochę stosowanie tego binarnego zapisu, jak by to zapisać w szesnastkowym to łatwiej się czyta i mniejsza szansa na pomyłki

PWM uzyskałem z pomocą kodu z forum, który ktoś udostępnił, a użyłem go bo akurat tak mi pasowało, dla mnie sprzętowy czy programowy są bez różnicy, oba działają tak samo i nie wymagają żadnych zewnętrznych oscylatorów itd.

A binarny zapis pokazuje mi stan wyjść/wejść jakby bezpośrednio, jakbym diody zapalone widział 🙂.

Mr-cin, a Ty naprawdę sterujesz serwami - takimi co to potrzebują sygnału PPM ?Czy tylko tak nazywasz swoje napędy zrobione z silniczków i jakichś mostków? - ja tak to sobie założyłem, bo dwa sygnały na jeden napęd raczej wskazuje na dwukierunkowe sterowanie zwykłym silnikiem. Takie statyczne sygnały na portach to serwa raczej nie poruszą chyba, że jakoś je poprzerabiałeś. Ale wtedy to już serwem nie można tego nazywać.

Napisałem w pierwszym poście, że tylko z tą częścią kodu jest coś nie tak, z tą którą pokazałem. Do sterowania serwami używam mostka l293d i wejść input i enable (pwm), ale nie w tym problem.

Postaram się jak najszybciej sprawdzić czy problem tkwi w tych maskach bitowych, jeśli nie to będziemy dochodzić dalej, jeśli będziecie chcieli oczywiście 🙂.

A póki co czekam na inne propozycje 🙂.

Udostępnij ten post


Link to post
Share on other sites

Propozycje czego? 🤯 Przecież wskazanie przyczyny kaszanki na portach dostałeś na talerzu.

Poza tym zdaje się mówimy innym językiem.

Serwo to układ sterowania ustawiający pewną wielkość na zadaną wartość. Wielkość tę dostaje z zewnątrz, posiada wewnętrzną pętlę sprzeżęnia zwrotnego i w sposób ciągły próbuje zminimalizować błąd nastawy. W naszych warunkach serwo sterowane jest zwykle sygnałem PPM (nie PWM i nie statycznymi sygnałami LEWO-STOP-PRAWO) niosącym "analogową" informację o żądanym położeniu orczyka a pętla sprzężenia zwrotnego zamyka sie przez potencjometr - czujnik położenia. To JEST serwo. Ty - jak zrozumiałem - masz dwa sygnały statyczne do każdego silnika mówiące o kierunku ruchu i gdzieś, czego nie pokazałeś, generację PWM odpowiedzialną za szybkość. Jeżeli nie masz gdzieś sprzężenia zwrotnego od położenia wału silnika (znów czegoś nie pokazałeś?), to to NIE jest serwonapęd. Może tak to u Ciebie wygląda, ma plastikową obudowę i kiedyś serwem modelarskim było ale teraz, po przeróbkach NIE jest. Mostek służy u Ciebie do sterowania silnikami, nie "serwami".

Jeśli oczekujesz porad, czytaj odpowiedzi i staraj się je zrozumieć. Nikt nie ma czasu pisać tego samego po wielokroć. Skoro Paweł napisał:

"Trochę dziwne jest to sterowanie serwem, już tak próbowałem i nigdy mi się to nie udawało"

to zastanów się co to znaczy. Bo za chwilę dostajesz pytanie:

"Mr-cin, a Ty naprawdę sterujesz serwami - takimi co to potrzebują sygnału PPM ?

Czy tylko tak nazywasz swoje napędy zrobione z silniczków i jakichś mostków?"

i nie raczysz na nie odpowiedzieć.

Wniosek: Albo nie rozumiesz tego co czytasz (kiepsko) albo nie rozumiesz tego co robisz (jeszcze gorzej). To jak jest?

Udostępnij ten post


Link to post
Share on other sites

Faktycznie, zapomniałem dodać, że to przerobione serwa, więc nie są to już serwa tylko silniki z przekładnią. Dopiero teraz przeczytałem jeszcze raz Wasze posty i dopiero teraz rozumiem o co Wam chodziło 🙂. Ale to z pośpiechu, i braku czasu. Przepraszam za zamieszanie i dziękuję za pomoc.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...