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

STM32f4-DISCOVERY - Enkoder - znaczny błąd w odczycie

charlieee 21 Wrz 2015 19:50 828 19
  • #1 21 Wrz 2015 19:50
    charlieee
    Poziom 9  

    Witam,
    próbuję odczytać liczbę impulsów z enkodera, ale niestety liczby pojawiające się na ekranie są nieadekwatne do obrotów. Enkoder wysyła 20impulsów/obrót, u mnie jest czasem 13 czasem 16 a czasem 7. Jak przekręcę go jeden raz ( jeden "skok") to często nie odnotowuje tego, czasem pokazuje 2 impulsy, ogólnie w cały świat.

    Oto mój kod:

    GPIO

    Code:
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    
       
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;   
        GPIO_Init(GPIOA,&GPIO_InitStruct);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2);


    TIM:

    Code:
     TIM_TimeBaseStructure.TIM_Prescaler = 0 ;
    
        TIM_TimeBaseStructure.TIM_Period = 65535;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
       
        TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0x00);

        TIM_Cmd(TIM2,ENABLE);



    W mainie odczytuję rejestr CCR za pomocą funkcji TIM_GetCapture1();

    Mam nadzieję, że pomożecie mi odnaleźć jakiś błąd w tym kodzie, bo już siedzę nad tym sporo, próbuję różnych konfiguracji GPIO, ale to chyba nie w tym rzecz

    0 19
  • Pomocny post
    #2 21 Wrz 2015 20:38
    BlueDraco
    Specjalista - Mikrokontrolery

    Jak masz podłączony enkoder? Dlaczego włączasz pulldown?

    0
  • #3 21 Wrz 2015 20:47
    charlieee
    Poziom 9  

    Podłączam do PA5 i do masy. Bez pulldowna odczyty szaleją

    0
  • Pomocny post
    #4 21 Wrz 2015 20:49
    BlueDraco
    Specjalista - Mikrokontrolery

    Czyli w stanie rozwartym masz na wejściu 0, a w stanie zwartym dla odmiany też 0.

    0
  • #5 21 Wrz 2015 21:00
    charlieee
    Poziom 9  

    Może to źle rozumiem, myślałem, że w stanie rozwartym bez impulsu od enkodera jest 0, ale jak enkoder wysyła impuls to pojawia się 1 wtedy.

    0
  • #7 21 Wrz 2015 21:32
    charlieee
    Poziom 9  

    Enkoder jest podłączony prawidłowo. Zmieniłem na pullup, teraz wychwytuje wszystkie impulsy, ale z różną inkrementacją, zwykle CCR wzrasta o 1, ale czasem o 2 , 3 lub 4. Czy to są drgania styków, czy chodzi o coś innego?

    0
  • Pomocny post
    #8 21 Wrz 2015 21:41
    BlueDraco
    Specjalista - Mikrokontrolery

    No teraz to już są przyzwoite drgania styków. ;)

    0
  • Pomocny post
    #9 22 Wrz 2015 09:10
    JarekC
    Poziom 27  

    Co to za enkoder że podłączasz tylko jedną linię?

    Typowy enkoder ma dwa wyjścia A i B podające sygnał w kodzie Gray'a, do poprawnego rozpoznawania ilości impulsów i kierunku potrzebne są obydwie linie.

    JarekC

    0
  • Pomocny post
    #10 22 Wrz 2015 09:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    BlueDraco napisał:
    No teraz to już są przyzwoite drgania styków. ;)


    Tyle, że przy enkoderze drgania styków nie powinny mieć znaczenia - drgania spowodują zliczanie +/-1, jak się ustabilizują to i wynik się ustabilizuje i przeskoczy prawidłowo o jeden. Czyli albo znowu źle podłączony enkoder (linie A i B), lub timer nie pracuje w trybie enkodera kwadraturowego tylko po prostu zlicza śmieci z wejścia, a nie sygnał z enkodera.

    0
  • #11 22 Wrz 2015 12:15
    charlieee
    Poziom 9  

    @JarekC używam jednego kanału bo zliczam tylko ilość impulsów, 2 kanały są z tego co wiem potrzebne do określania kierunku obrotu

    @tmf Nie używam trybu enkodera, chciałem aby enkoder był zewnętrznym sygnałem taktującym licznik.

    Code:
     TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0x00);
    

    Czy to jest błędne rozumowanie, czy jednak da się w ten sposób to zrobić i coś źle mam?

    0
  • Pomocny post
    #12 22 Wrz 2015 13:20
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jeśli enkoder działą tylko jako sygnał taktujący licznik to masz problem o którym pisze kol. BlueDraco, czyli drganie styku. Dodaj na wejściu filtr RC. Zakładam, że MCU ma na wejściu przerzutnik schmitta.

    0
  • #13 22 Wrz 2015 13:54
    charlieee
    Poziom 9  

    @tmf Tak, gdy włączam tryb enkodera pokazuje mi naprzemiennie 0 i 1.

    Dziwna sprawa, bo jak robię ten sam projekt, ale z TIM3, to w trybie zewnętrznego licznika jest podobnie, a w trybie enkodera od razu po przekręceniu pokazują się wartości zbliżone do max. wartości przepełnienia timera.

    Spróbuje z tym filtrem.Jeżeli chodzi o wybór kondensatora i opornika, to czym mam się kierować?
    pozdrawiam

    0
  • Pomocny post
    #14 22 Wrz 2015 16:17
    tmf
    Moderator Mikrokontrolery Projektowanie

    Stałą czasową. Im dłuższa tym lepiej, lecz musi być znacznie krótsza niż minimalny odstęp pomiędzy impulsami z enkodera. A wartości timera zbliżone do max mogą wynikać z odjęcia od zera, czyli następuje niedopełnienie.

    0
  • Pomocny post
    #15 22 Wrz 2015 17:38
    adamusx
    Poziom 27  

    Dla enkoderów ze stykami mechanicznymi, jeśli nie podłączasz go do uC za pomocą prostego filtru RC, wykorzystywanie timera czy przerwań to ślepa uliczka.

    Z racji, że takie enkodery nie generują impulsów o dużej częstotliwości, to najlepiej zrealizować odczyt programowo, np. cyklicznie w systicku sprawdzać czy mamy stan wysoki przez minimalny czas i wówczas inkrementować jakąś zmienną.

    Pozdrawiam

    0
  • #16 22 Wrz 2015 20:01
    tmf
    Moderator Mikrokontrolery Projektowanie

    adamusx napisał:
    Dla enkoderów ze stykami mechanicznymi, jeśli nie podłączasz go do uC za pomocą prostego filtru RC, wykorzystywanie timera czy przerwań to ślepa uliczka.

    Z racji, że takie enkodery nie generują impulsów o dużej częstotliwości, to najlepiej zrealizować odczyt programowo, np. cyklicznie w systicku sprawdzać czy mamy stan wysoki przez minimalny czas i wówczas inkrementować jakąś zmienną.

    Pozdrawiam


    Dlaczego tak uważasz? Po to właśnie timery są wyposażone w dekoder kwadraturowy. Drganie styków w tym przypadku zazwyczaj jest bez znaczenia, finalnie timer będzie miał właściwą wartość, dodatkowo niektóre MCU są wyposażone na takich wejściach w filtr cyfrowy. Więc łączenie enkodera wprost z timerem jest jak najbardziej właściwe.

    0
  • #17 22 Wrz 2015 20:01
    BlueDraco
    Specjalista - Mikrokontrolery

    Albo użyj timera w tybie enkodera z włączoną filtracją, albo testuj stan enkodera programowo z częstotliwością np. 100 Hz w przerwaniu timera (SysTick lub dowolnego innego, którego i tak używasz). Nie potrzebujesz żadnych RC, jeśli to samo można osiągnąć tylko przez odpowiednie programowanie.

    0
  • Pomocny post
    #18 22 Wrz 2015 22:07
    adamusx
    Poziom 27  

    tmf napisał:
    adamusx napisał:
    Dla enkoderów ze stykami mechanicznymi, jeśli nie podłączasz go do uC za pomocą prostego filtru RC, wykorzystywanie timera czy przerwań to ślepa uliczka.

    Z racji, że takie enkodery nie generują impulsów o dużej częstotliwości, to najlepiej zrealizować odczyt programowo, np. cyklicznie w systicku sprawdzać czy mamy stan wysoki przez minimalny czas i wówczas inkrementować jakąś zmienną.

    Pozdrawiam


    Dlaczego tak uważasz? Po to właśnie timery są wyposażone w dekoder kwadraturowy. Drganie styków w tym przypadku zazwyczaj jest bez znaczenia, finalnie timer będzie miał właściwą wartość, dodatkowo niektóre MCU są wyposażone na takich wejściach w filtr cyfrowy. Więc łączenie enkodera wprost z timerem jest jak najbardziej właściwe.


    To tylko moje wnioski wyniesione z doświadczeń z enkoderami optycznymi/mechanicznymi:).
    Na co dzień stosuje tryb zliczania kwadratury przez timer i oczywiście sprawdza się to w STM bardzo dobrze, ale do mechanicznych enkoderów (szczególnie prostych pokręteł) nie mam zaufania - nie można zakładać, że oba kanały nie zmienią się w tym samym czasie (szczególnie jak się styki wyrobią )
    Filtracja sprzętowa enkoderów w STM32 niewiele zmienia, bo maks można ustawić 32 próbki, co dla zegana 72 Mhz i tak daje dużą częstotliwość próbkowania.

    0
  • #19 22 Wrz 2015 22:12
    tmf
    Moderator Mikrokontrolery Projektowanie

    IMHO konstrukcja mechaniczna enkodera wyklucza jednoczesną zmianę obu sygnałów A i B. A jeśli założymy uszkodzenie enkodera to inne sposoby filtracji też zawiodą - po prostu trzeba będzie go wymienić na sprawny.

    0
  • #20 22 Wrz 2015 23:50
    charlieee
    Poziom 9  

    Dziękuję wszystkim za pomoc, jutro pojadę po kondensatory spróbuje z tym filtrem RC i w razie jakichkolwiek problemów będę jeszcze pisał :)

    0