Skocz do zawartości

Jak w programie używać dokładnych enkoderów ?


klonyyy

Pomocna odpowiedź

No właśnie jeszcze myślałem żeby zaczać od 10ms, przy niższych prędkościach i dopiero później powoli do 1ms dążyć.

Jeszcze się zastanawiam jak w takich profilerach obsługiwać ruch silnika do danego zdarzenia tzn zauważenia przeciwnika. Chyba wtedy lepiej jest to zrobić tradycyjną metodą, bo przecieżnie wiemy jaki dystans pokona robot aż zauważy oponenta.

mactro no racja się nie zrozumieliśmy 😋 Chodzi mi o to że mój licznik jak koło obraca się do przodu liczy w górę do przeładowania, z kolei gdy kręci się do tyłu liczy od aktualnej wartości w dół. I chodzi mi o to że gdy chcemy poruszyć się do tyłu ( przy rotacji czy translacji gdy zobaczę linię ) wartości enkoderów będą się zmniejszały, mimo że przebyta droga bedzie w rzeczywistośi rosła. Chcę odpiąć pin enkodera ( mam kwadraturowy) i wtedy będę miał jeden sygnał ze zboczami i licznik bedzie liczył wyłącznie w górę niezależnie od kierunku obortów.

EDIT: Mam jeszcze pytanie - czemu w liczeniu nowego PWM'a w regulatorze PD dla silnika prawego odejmuje się błąd, a dla lewego dodaje ?

Aha i jeszcze jedno - może lepiej by było napisac oddzielne PD dla każdego silnika w transalcji i rotacji ? Co o tym myślicie ?

EDIT2: Myślicie że mogę użyć zewnętrznych przerwań do odczytywania ilości impulsów enkodera ? Bo za cholere nie mogę ustawić licznika żeby liczył tylko do góry, a z liczeniem do dołu jest problem gdy licznik się przepełnia "w dół" bo przerwanie wywoła mi się na przepełnieniu, a wartość która była w rejestrze po prostu się wyczyści i nie będę mógł jej dodać.

pozdrawiam,
Piotrek

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

Ale jak to DMA - przecież i tak będzie zliczał w dół i w górę - chodzi mi o przypadek gdy :

rejestr ma załóżmy wartość 1200 i kołoa zaczyna ruch do tyłu. wartość rejestru jest zmniejszana az do 0 gdy to wywołuje się przerwanie. I ta część (1200 imp) jest tracona, bo nie wiem jak miałbym ją gdzieś zapisać... ( czekać na flagę DIR, ale to i tak nie będzie ładne rozwiązanie)

Mógłbyś szerzej opisac pomysł z DMA ?

Link do komentarza
Share on other sites

Po ustawieniu DMA operujesz na zwykłych zmiennych ze znakiem. Dostajesz zliczoną wartość do zmiennej i musisz ją tylko przeliczyć.

Link do komentarza
Share on other sites

Ok czyli to bedzie transfer mem2mem, tak ? Wogóle co by taki transfer wywoływało, bo chyba nie przepełnienie timera ? A jeśli bym robił to w przerwaniu systicka co 1ms to i tak jest bardzo prawdopodobne że stracę tę część pomiędzy przerwaniami (gdy koło zmieni ruch z do przodu na tył), czyli max 232 impulsy, jak zdarzy się to kilka razy to moge mieć niezłą rozbieżność...

Link do komentarza
Share on other sites

Transfer byłby cały czas (od startu licznika) ty tylko ty potem odbierasz w funkcji od DMA interesujące cię dane (dostajesz np. przerwanie wywołane zakończeniem transferu). Zobacz do main.c do programu na moim dropboxie (link kilka postów wyżej), a powinno ci się rozjaśnić.

Nie ma moim zdaniem sensu pchać tego w przerwanie bo wtedy faktycznie możesz stracić dane, po prostu w pętli while przetwarzasz dane.

Link do komentarza
Share on other sites

Ok spróbuję coś napisac i podeślę później wyniki. Dzięki za pomoc !

EDIT: aha jeszcze jedno - a czym to się różni od zapisu zmienna=TIMx-> CNT ? Czy mogę zwiększać zmienną z DMA o aktualną wartość licznika ? Jak to wygląda ? A może po prostu przesyłane jest po 1 impulsie ?

pozdrawiam,
Piotrek

Link do komentarza
Share on other sites

Po chwili przemyśleń stwierdzam że DMA tutaj niewiele pomoże (dostaniesz to co masz teraz tylko że trochę odciążysz procka, któremu i tak się pewnie nudzi przy tym). Jak możesz to pokaż kod odpowiedzialny za obsługę enkodera. Mam pewien pomysł, ale bez kodu trudno pomóc - wywróżyć co już napisałeś.

Link do komentarza
Share on other sites

Znaczy chyba obsługą tego nazwać nie można :

void TIM4_IRQHandler(void)
{
TIM4->SR =(uint16_t)~(TIM_SR_UIF);
//	LED_ON;
left++;
}
void TIM3_IRQHandler(void)
{
TIM3->SR =(uint16_t)~(TIM_SR_UIF);
//	LED_ON;
right++;

}

przerwania i inkrementacja zmiennych \

a tu jest jak liczę wartości dla profilerów :

	    total_right=right*38912+TIM3->CNT;
    total_left=left*38912+TIM4->CNT; 

Tak a propo dzięki za pomysł - po wyregulowaniu super sprawa, póki co tylko translacja, bo rotacja to obrót w tył jednego koła, ale już jest to coś. Polecam także napisac oddzielny regulator dla każdego silnika, a nie np dla translacji czy rotacji.

Link do komentarza
Share on other sites

Nie widzę sensu tego rzutowania, jakiego typu są zmienne right, left ?

void TIM4_IRQHandler(void)
   {
       TIM4->SR = ~TIM_SR_UIF;
   //    LED_ON;
       left++;
   }
   void TIM3_IRQHandler(void)
   {
       TIM3->SR =~TIM_SR_UIF;
   //    LED_ON;
       right++;
   }

Jak zmieniasz kierunek obrotów możesz zmienną np. left wyzerować i odejmować;

void TIM3_IRQHandler(void)
{
TIM3->SR =~TIM_SR_UIF;
if(clockwise){
	right++;
}
else{
right = 0;
right--;
}
}
  • Lubię! 1
Link do komentarza
Share on other sites

Jak zmieniasz kierunek obrotów możesz zmienną np. left wyzerować i odejmować;

No tak tylko ja nie mam przerwania na zmianę kierunku, ale to chyba mogę sobie w pętli sprawdzać za pomoca DIR'a w CR1 timerów. Czyli w sumie jak chcę już w przerwaniu liczyć tiki timera to dla obrotów w przeciwną strone robię to tak (w przerwaniu będę zwiększał right normalnie, bo w sumie to nie potrzebna mi droga całkowita tylko ta pomiędzy kolejnymi ruchami sterowanymi przez profilery):

right*38912+38912-TIMx->CNT

spróbuję, potestuję, ale chyba będzie lipa dla załóżmy CNT= 1200 - zerujemy - wywołuje się przerwanie i nagle już mam zliczone 38912 impulsów - niedobrze.

W końcu po długiej walce ustawiłem tryb zliczania zbocz rosnących w Timerze i śmiga. Szkoda że wcześniej o tym nie pomyślałem. ps19 mimo wszystko wielkie dzięki za zainteresowanie tematem.

Link do komentarza
Share on other sites

Niestety chyba będę zmuszony zrezygnować z profilerów - wszystko się tylko wydłuża, komplikuje, w sumie żadnych zalet, poza tym że można jako tako kontrolować tą przejechaną drogę, która też nigdy nie będzie dokładna. Może do micromouse jest to dobry sposób, ale w miniusmo, gdy szybko trzeba reagować na linię czy przeciwnika nie ma miejsca na opóźnienia. Także zostaję przy regulatorze PD dla prędkości.

Link do komentarza
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.

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