Skocz do zawartości

[C] Sterowanie serwomechanizmem z wykorzystaniem atmegi32


Pomocna odpowiedź

Napisano

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?

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.

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?

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.

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