Skocz do zawartości

Turnigy TG9 - problem z ustawieniem, dziwne czasy


Pomocna odpowiedź

Witam.

Nowy na forum, więc wypada się przywitać, choć czytam Was już od jakiegoś czasu.

Zamówiłem z Allegro serwa turnigy TG9. Mam zamiar w przyszłości wykorzystać je do robota. Jednak nie zamierzam używać mostka H, a sterować serwami poprzez PWM z mikrokontrolera. Dziś zacząłem testować owe serwa - jeszcze bez przeróbki.

Pierwsze co rzuciło mi się w oczy - standardowe czasy 1000us w jedną stronę, 1500us na środek, i 2000us w drugą stronę ustawiały mechanizm w BARDZO dziwne pozycje.

Przeprowadziłem więc sobie kalibrację. Ustawiłem timer w atmelu na 50us, wyświetlałem mnożnik timera na LCD i serwo ustawiałem guzikami na płytce testowej zwiększając mnożnik timera. To, co wyszło to masakra - 350us w jedną stronę, 1000us na środek oraz 1750us w drugą stronę, cały czas z częstotliwością 50Hz oczywiście.

Teraz moje pytanie. Czy ktoś używał tych serw nieprzerobionych, i czy faktycznie one mają tak dziwne czasy ? Na dodatek serwo zachwouje się bardzo dziwnie. W jedną stronę ustawia się bez problemów. ale po wydaniu polecenia ustawienia w drugą stronę (dłuższy impuls) przekręca się napierw o jakieś 20-30stopni w stronę PRZECIWNĄ i dopiero w odpowiednią.

Bardzo możliwe że to ja mam gdzieś buga w programie...

Gdyby znalazł się ktoś chętny do pomocy to wrzucę mój kod do sprawdzenia.

Dzięki.

Link to post
Share on other sites

Prawdopodobnie coś nie tak z programem. Może masz źle ustawione czasy/zegar.

Możesz spróbować napisać programik, który co 1s zapala/gasi diodę i sprawdzić czy będzie to dokładnie 1s. Albo lepiej dodać taką funkcje (mrugania diodą) do obecnego programu.

Link to post
Share on other sites

Więc tak. Testuję to na płytce testowej z AT89C5131 na pokładzie, robiłem na tym już kilka projektów i z timerami wszystko było ok. Kwarc to 12MHz. Kod:

/*****************************************************************
led.c                                         (mruganie diody LED)

Program powoduje mruganie diody LED dołączonej do P3_2. 
*****************************************************************/

#include "5131.h"         // zbiór definiujący rejestry procesora


WORD wartosc;
BYTE count = 0;
TH0SHORT = 0xFF;
TL0SHORT = 0xCD;  // 0xFFFF - 500(dec) = 0xFFCD; bo dla 12mhz 1 impuls to 1us, a odmierzam 500us


void main(void){


TH0= TH0SHORT;
TL0 = TL0SHORT;

TMOD = TMOD | 0x01; // Timer mode 1
TR0 = 1; // Wlaczenie timera
ET0 = 1; // Wlaczenie przerwan od timera
EA = 1; //Wlaczenie przerwan

wartosc=20;
while(1){



if(!P1_4) {
wartosc=7;} // 7 * 500 us
if(!P1_3) wartosc=20; //jw
if(!P1_2) wartosc=35; //jw


};


}

void T0_int(void) interrupt 1 using 1 {


//static BYTE stan = 0;
count+=1;
TH0 = TH0SHORT; //Jak doliczymy do 500 
TL0 = TL0SHORT;


if(count==0) 
P1_0=1; // jedynka do serwa

if(count==wartosc)
P1_0=0; // Po wartosc * 500 us zero do serwa

  if((count==400)){ // Odliczaj do 20ms
count = 0;
		   }   


}

Zdaje sobie sprawę że to dość mało popularny procesor, ba, cała rodzina rzadko jest używana, w przeciwienstwie do AVRow, ale zadna atmega nie dysponuje w tej chwili.

@2xup Dioda mruga dokladnie co sekunde. Ba, nawet na lcd zrobilem timer i dokladnie mierzy. Z reszta jakies kilka mikrosekund w ta czy w tamta nie zrobiloby roznicy.

@up Tak, nie wlaczalem dzielnika.

Link to post
Share on other sites

Masz błąd w procedurze obsługi przerwania:

count+=1;
if(count==0) P1_0=1; // jedynka do serwa
if(count==wartosc) P1_0=0; // Po wartosc * 500 us zero do serwa

if((count==400)){ // Odliczaj do 20ms
 count = 0;
}    

Problem jest taki, ze nie wykonuje się instrukcja dla count==0.

Gdy count==400, wtedy wykonuje się trzeci if, w nim ustawiasz count=0.

Po następnym przerwaniu jest count=0, ale pierwsza instrukcja zmienia na count=1. I w efekcie warunek if (count==0) nie jest spełniony.

  • Pomogłeś! 1
Link to post
Share on other sites

O kurcze, faktycznie!

Poprawiłem, wygląda to teraz tak:

 
if(count++==0) P1_7=1; // jedynka do serwa
if(count==wartosc) P1_7=0; // Po wartosc * 500 us zero do serwa

if((count==400)){ // Odliczaj do 20ms
 count = 0;
} 

I zmieniłem port z takiego z wewnętrznym pull-upem na true open drain.

Niby jest ok, ale jak zostawie podłączone serwo do uC to co chwile (20-30sekund) poprawia swoją pozycję - przesuwa się o mały kąt raz w jedną, raz w drugą stronę. No i jak już się ustawi, to 'buczy'. Anyway, wydaje mi się że to poprostu wina tych dziwnych serw, ewentualnie uC. Na gotowej płytce z innych procem powinno być OK.

Aha, jeszcze jedno. To serwo faktycznie ma takie dziwne czasy...

Pozdrawiam i dzięki za pomoc 🙂

Link to post
Share on other sites

Post pod postem, ale kilka dni juz minelo, wiec prosze Adminicje o wybaczenie 🙂

Cóż, walczę z tymi serwami wciąz. Zamiast potencjometru wlutowałem dwa rezystory, wywaliłem blokadę. I teraz wygląda to tak:

Ustawiam programem, żeby serwo stało w miejscu. Żeby serwo stanęło muszę wysłać impuls długości 2180us (ze względu na różnicę rezystancji oporników). Ale jeśli serwo popracuje 2-3 minuty, długość impulsu do zatrzymania wynosi już około 2130us, a 2180us powoduje powolny ruch silnika w jedną ze stron. Ok, ustawię te 2130us (cały czas robię wszystko 'live', czas obserwuję na LCD), i... granica wraca płynnie, przez około 1-2 minuty z powrotem do 2180us! Mechanizm wydziela dość dużo ciepła, więc może chodzi o to, że rezystory pod wpływem temperatury zmniejszają rezystancję. Jak teraz na to zaradzić ?

Użyłem rezystorów o mocy 1/8W, 100ohm.

Link to post
Share on other sites

Może rezystory 1%? Wydaje mi się, że mają one lepszą charakterystykę, również temperaturową od tych. I może daj ćwiartki.

Link to post
Share on other sites

Spróbuj podłączyć serwo do wyjścia PWM. Będziesz miał większą stabilność sygnału. Przeglądałem trochę informacji w necie i wygląda na to, że TG9 ma sterowanie jak każde inne serwo...

Link to post
Share on other sites

Jak mozna bylo sie domyslic, po podpieciu do PWM ciagle wystepuje roznica w dlugosci sygnalu jak serwo troche pochodzi.

W tej chwili nie mam zadnych 1% cwiartek, jak bede mial to sprobuje wlutowac i sprawdze...

Masakra, nie spodziewalbym sie ze taka rzecz jak temperatura bedzie miala znaczenie.

Link to post
Share on other sites

Mam wrażenie, że większe znaczenie od temperatury ma tutaj cena tego serwa, ciężko się czegoś wybitnego spodziewać "za dychę".

Proponuję poczytać komentarze na forach modelarskich (naszych i zagranicznych).

Link to post
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

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.

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