Skocz do zawartości

[C] Sterowanie serwomechanizmem z wykorzystaniem atmegi32


wioras

Pomocna odpowiedź

Mam problem ze sterowaniem serowmechanizmu tower pro mg90s. Chodzi mi o to, że serwomechanizm ma zbyt dużą prędkość obrotową. Wyczytałem, że aby regulować prędkość serwomechanizmu, należy zmieniać długość impulsu sterującego.

Napisałem taki program:

#include<avr/io.h>
#define F_CPU 1000000 
#include<util/delay.h>

void main()
{
int t;
int czas;
int h;
int v;

DDRB =0xFF;
DDRA =0;
PORTB=0;
	while(1)
	{
		if(bit_is_set(PINA,0))
			{
					czas=0;
					h=0;
					v=2000;
					t=1000;
					do
					{

						v=20000+czas;
						t=1000-czas;
						PORTB= 0x01;
						do{
							_delay_us(1);

							t--;

						}while(t>0);
						PORTB=0;
						do{
							_delay_us(1);
							v--;


						}while(v>0);
						czas+=5;
						h++;	
					}while(h==100);



	 		}








	}
}

Troszkę mało czytelny ten mój kod, ale mam nadzieję, że zrozumiecie o co w nim chodzi. Z góry mówię, że wolałbym to zrobić na funkcji delay niż kombinować z timerami i przerwaniami, ponieważ jeszcze nie posiadłem dostatecznej wiedzy na ten temat, a z uruchomieniem serwa trochę mi się śpieszy. Problemem jest, że serwo kręci się wolniej, lecz po pewnym czasie zaczyna zwalniać, w końcu się zatrzymuje. Ma ktoś pomysł co może być tego powodem?

Link do komentarza
Share on other sites

Hmm zatrzymuje sie pewnie dlatego, że warunek zewnętrznej pętli do while jest niespełniony. Może on powinien być h<=100, zamiast h==100. Sprawdź to.

A tak w ogóle to coś źle kombinujesz.

Długość impulsu (a właściwie wypełnienie) służy do ustawiania pozycji serwa a nie jego prędkości. Nie da się bezpośrednio sterować prędkością.

Można to zrobić np tak:

Chcesz obrócić serwo z pozycji 0 st do pozycji 100 st w czasie 10 sec. (daje to prędkość kątową 10st/sec).

Robisz więc tak:

Przesuwasz serwo o 1 stopień i czekasz 100ms. Przesuwasz serwo o kolejny stopień i czekasz kolejne 100ms. Dzięki temu uzyskujesz ruch serwa z określoną prędkością.

Jeżeli chcesz aby serwo poruszało się bardziej płynnie, to stosujesz mniejszy krok.

Link do komentarza
Share on other sites

A w jaki sposób przesunąć serwomechanizm o 1stopień? Że próbowałem zwiększyć odstęp pomiędzy impulsami z 20ms na 200 lecz chwytak nie poruszał się płynnie tylko skakał. A i pytanko: czy jeżeli chciałbym skorzystać z timera pracującego w trybie PWM to czy muszę korzystać z wyjść OC1A i OC1B? Jak zrealizować płynną zmianę współczynnika wypełnienia?

Link do komentarza
Share on other sites

Jeżeli korzystasz z Timera w trybie PWM to musisz skorzystać z jego wyjścia (OC1A, OC1B).

Aby ustawić serwo w danej pozycji musisz wygenerować odpowiedni sygnał PWM ( o odpowiednim wypełnieniu). Przesunięcie o 1 stopień to znaczy wygenerowanie sygnału o dłuższym lub krótszym wypełnieniu.

Jeżeli używasz timera w trybie PWM to wypełnienie sygnału zmieniasz poprzez zmianę wartości rejestru OCR1A lub OCR1B, zależnie z którego wyjścia korzystasz.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.