Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32F107VCT6][C] - Impulsy enkodera w przerwaniu

28 Kwi 2013 13:35 1392 6
  • Poziom 2  
    Witam, posiadam płytkę ZL29ARM i staram sie zrealizowac odczyt predkosci obrotowej przy uzyciu enkodera wobit M590. Kierujac sie dokumentacja "reference manual" podlaczylem enkoder - kanaly A i B na piny numer 6 i 7 na porcie A, uruchomilem Timer3 w trybie enkodera i dziala - zlicza w gore, w dol. Problem polega na tym, ze program powinien udostepnic uzytkownikowi mozliwosc regulowania przedzialu czasu ,w ktorym zliczane sa impulsy (100µs , 200µs, 500µs ,1ms,2ms,5ms,10ms,20ms,50ms). W tym celu uruchomilem Timer1 , ktory zlicza okreslony przedzial czasu, dokonuje obliczen i zeruje rejetr TIM3->CNT w przerwaniu.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    przerwanie :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Enkoder podlaczony pod wiertarke pokazuje , w jedna strone okolo 32070 ,a w druga okolo 31930. Niestety kiedy w najrozniejszy sposob staram sie odjac od tej liczby 32000, aby usyskac ilosc impulsow zliczona w tym przedziale zaczynaja sie schody i wartosc na wyswietlaczu oscyluje pokazujac powiedzmy 10...5...70..13 , co nie zdarzalo sie przy wyswietlaniu samej wartosci bez operacji odejmowania. Dlaczego jedna prosta operacja wprowadza tyle zametu? Probowalem juz najrozniejszych kombinacji , uzycie dma z rejestru do zmiennej enkoder, odejmowanie w sprintf'ie , poza sprintfem itp nic nie pomoglo. Uzywalem sprintf , snsprintf. Dodam, ze tim1 jest jedynym przerwaniem jakiego uzywam, z ustawionym priorytetem 0.
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Specjalista - Mikrokontrolery
    No to może pokażesz kod który nie działa, zamiast opisywać "no generalnie nic nie działa"?

    4\/3!!
  • Specjalista - Mikrokontrolery
    A o co chodzi z tą tajemniczą wartością 0x7d00 wpisywaną do timera?
  • Poziom 2  
    Jezeli rejestr zaczalby zliczyc od 0, to przekrecenie o jedna dzialke w dol ustawiloby go na 65535, aby tego uniknac ustawiam 0x7d00 ,nie ma takiego duzego przeskoku , w tym wypadku rejestr rosnie jezeli krece w jedna strone, a maleje przy kreceniu w druga. Po odjeciu wartosci poczatkowej powinienem otrzymac +- ilosc dzialek zliczonych w przedziale.

    Dodano po 24 [minuty]:

    problemy zaczynaja sie w tym miejscu
    Kod: c
    Zaloguj się, aby zobaczyć kod


    wiertartka daje ok 70impulsow w przedziale 100µs ,czyli rejestr pokazuje 32070, kiedy odejmuje od niego 32000 nie otrzymuje 70...
  • Specjalista - Mikrokontrolery
    Czyli co otrzymujesz? Przecież to tak prosto sprawdzić:

    const uint16_t cnt = TIM3->CNT;
    const int16_t difference = cnt - 32000;
    snprintf(enkoder_char, 12, "%i,%i", difference, cnt);

    (bufor trzeba trochę powiększyć)

    4\/3!!
  • Specjalista - Mikrokontrolery
    To nie ma żadnego znaczenia, na jaką wartość go ustawisz. Jeśli już stosujesz taką metodę, to napsz po prostu TIM3->CNT = 32000,a nie "koduj" stałych w różnych systemach, bo tylko zaciemniasz program.
  • Poziom 2  
    sprawdzilem, ciekawe bo ogolnie wyglada , ze liczy dobrze, ale czasami pojawia sie dziwny odczyt powiedzmy przy wartosciach oscylujacych kolo 70 impulsow, przy wciaz krecacej wiertarce potrafi pokazac sie 70 , 70 , 70 1, 5 , 70 , 70 moze to byc spowodowane wstrzasami tj. tym , ze wiertarka "trzesie" enkoderem?