Skocz do zawartości

[C] Problem ze sterowaniem serw


Pomocna odpowiedź

Napisano

Witam.

Posiadam serwa: 1201MG, 1501MG, 6001HB i 1711MG (wszystkie Power HD).

Problem wygląda tak, że serwo 6001HB działa mi poprawnie z poniższym kodem, ale 1201 i 1501 w ogóle się nie ruszają (w dłoni czuję, że coś tam drga, ale mogę tymi serwami kręcić, więc nawet nie są zablokowane). Natomiast 1711 zachowuje się conajmniej dziwnie - nieważne, jakie wartości będzie mieć OCR1A, ono cały czas kręci się poza zakresem, tj. najpierw idzie do samego końca, z chęcią szło by dalej, potem wraca, zatrzymuje się po przebyciu około 45 stopni. I tak w kółko.

Kombinuję z tym PWM już od kilku dni i nie mam pojęcia, co może być nie tak, tym bardziej, że jedno serwo działa, a są sterowane niby na tej samej zasadzie.

#define F_CPU 8000000UL

int main(void)
{
TCCR1A |= (1<<WGM11) | (1<<COM1A1) | (1<<COM1A0);
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11);

ICR1 = 19999;

DDRB |= (1<<5);

while(1) {
	OCR1A = ICR1 - 1800;
	_delay_ms(1000);
	OCR1A = ICR1 - 1000;
	_delay_ms(1000);
}
}

Kontroler to AtMega128, działa na wew. oscylatorze na 8MHz.

Pozdrawiam.

spojrzałem do noty ATmegi128 i porównałem Twoje ustawienia z tabelkami. Zgodnie z tym co widzę:

-taktowanie procesora 8MHz,
-masz prescaler 8,
-używasz trybu FAST PWM z wartością TOP równą ICR1,
-wartość TOP to 1999.

Czyli z równania

Fclk / ( N * (1+TOP) ) gdzie

Fclk -taktowanie procesora,
N - prescaler,
TOP = ICR1

wychodzi częstotliwość sprzętowego generowania sygnału pwm równa 500 Hz. W przypadku serwomechanizmów modelarskich stosuje się częstotliwości około 50 Hz. Mogę się oczywiście mylić i to nie tu leży błąd.

Timer wygląda dobrze, przecież okres wynosi 20000 więc częstotliwość to jednak 50Hz. Ja też bym szukał w zasilaniu, w przypadkowych resetach procesora podczas startu lub ruchu mocnego serwa itp. Trzeba zobaczyć schemat połączeń albo chociaż opis - w szczególności systemu zasilania. Z czego płytka procesora, z czego serwo itp. Jeżeli okaże się, że np. wszystko jedzie z kabelka USB, to mamy problem rozwiązany.

Warto jeszcze sprawdzić fusebity odpowiadające za 8MHz albo dla pewności pomrugać diodą z programowymi opóźnieniami = 1000ms, to jest niezły test rzeczywistego taktowania CPU.

  • Lubię! 1
Timer wygląda dobrze, przecież okres wynosi 20000 więc częstotliwość to jednak 50Hz. Ja też bym szukał w zasilaniu, w przypadkowych resetach procesora podczas startu lub ruchu mocnego serwa itp. Trzeba zobaczyć schemat połączeń albo chociaż opis - w szczególności systemu zasilania. Z czego płytka procesora, z czego serwo itp. Jeżeli okaże się, że np. wszystko jedzie z kabelka USB, to mamy problem rozwiązany.

Warto jeszcze sprawdzić fusebity odpowiadające za 8MHz albo dla pewności pomrugać diodą z programowymi opóźnieniami = 1000ms, to jest niezły test rzeczywistego taktowania CPU.

Fusebity są ok (z 5x sprawdzałem 😃 ). Jeśli chodzi o układ, to wszystko jest na płytce stykowej, zasilane z LiPo za pośrednictwem stabilizatora liniowego 5V, 1A. Ten się trochę grzał, ale przyjąłem, że to dlatego, że przepływa przez niego prąd już w okolicach 1A, a nie spalił się, więc serwo nie wyciska > 1A. Może faktycznie to jest wąskim gardłem, dlatego słabsze serwo działa, a mocne nie, ale tu znowu wracamy do serwa 1711 - słabe, a nie działa (przynajmniej poprawnie) 😉

Mam też równolegle podłączoną diodę do sygnału PWM i ona zachowuje się normalnie, tj. świeci jaśniej i mniej jaśniej. Także reset procka bym raczej wykluczył.

Pozdrawiam.

Mamy winowajców: stabilizator 1A i płytka stykowa

Przy momencie około 12kg serwo będzie pobierało dużo większy prąd niż 1A. Niestety nie znalazłem nigdzie deklaracji producenta. Najlepiej będzie jak wymienisz stabilizator.

Jeśli masz dostęp do zasilacza stabilizowanego na minimum 5A to podepnij swoje serwo i wtedy pomierz prądy jakie tam płyną. Ciekawym doświadczeniem będzie też podpięcie sondy prądowej oscyloskopu i zobaczenie co się dzieje z prądem przy starcie Twojego serwa.

Nie wiem jak podajesz zasilanie, ale płytka stykowa nie nadaje się do pracy przy wyższych prądach.

  • Lubię! 1

Stabilizator grzeje się od każdego prądu, nie musi to być 1A. Oczywiście im więcej prądu tym bardziej. Przekraczając 1A nie spalasz go, tylko scalak zmniejsza swoje napięcie wyjściowe. Jeżeli serwo podczas startu lub pracy bierze tyle lub więcej, 5V spada i procesor się resetuje (np. w ciągu 1ms, bo tyle trwa szpilka prądu) po czym podejmuje pracę i PPM jest niby wciąż generowany. Umieść w programie opóźnienie zaraz po starcie np. 1 sekundowe a dopiero po tym czasie zaczynaj generować PPM. Wtedy każdy reset będzie widoczny jak przerwa w impulsach i łatwo to dostrzeżesz. Masz włączony BOD? Na jakim poziomie napięcia?

Płytka stykowa jest dobra co najwyżej do zapalania diodek, ale nie zasilania silników. Podłącz masę serwa wprost do minusa akumulatora bez pośrednictwa styków. Czy możesz dać osobne stabilizatory na procesor i na serwa? Wspólne zasilanie silników/serw i logiki cyfrowej to proszenie się o kłopoty. To w połączeniu z płytką stykową daje już mieszankę wybuchową..

EDIT: Pisaliśmy razem 🙂

  • Pomogłeś! 1

Wtrącę coś jeszcze nt. grzania się stabilizatora napięcia. Będzie się on grzał nawet przy małym prądzie, ale i tak wszystko zależy od mocy jaka na nim jest tracona.

P = U * I

Zakładając, że zasilasz z akumulatora 12VDC i za stabilizatorem chcesz uzyskać np. 5VDC, to mamy 7V spadku napięcia i jeszcze przepuścisz przez niego 1A to moc wynosi P = 7V * 1A = 7W. Standardowa obudowa TO-220 rozprasza chyba ok. 1,5W. Za długo wtedy nie pożyje taki stabilizator 😋

  • Lubię! 1

Czyli byłem w grubym błędzie, myśląc, że złożę wstępnie układ na płytce stykowej, a do tego, że serwo nie pobiera dużo prądu 😥

Na stabilizatorze mam założony radiator, a grzał się tak, że jak zasilanie było włączone kilka minut, to dmuchałem/wyłączałem na chwilę. Zasilane było z akumulatora 11,1V. Co do 1A na stabilizatorze, to byłem pewny, że jeśli ten prąd przekroczę, to stabilizator się uszkodzi nieodwracalnie, a nie że tylko spadnie napięcie wyjściowe. Z założenia zasilanie dla serw i dla logiki będzie osobno (z jednego akumulatora).

BOD mam wyłączony. Przyznam, że dopiero teraz się dowiedziałem, że coś takiego istnieje.

Generalnie podłączyłem serwo bezpośrednio do akumulatora, PWM i działa 😅 Sam wpadłbym pewnie na to za miesiąc, jeśli w ogóle. Wielkie dzięki panowie 😉

Pozdrawiam.

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