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.

[Atmega8][C/AVR Studio] Niepoprawne zliczanie impulsów impulsatora.

Mariojas 13 Wrz 2011 15:27 3651 14
  • #1 13 Wrz 2011 15:27
    Mariojas
    Poziom 17  

    Witam
    Mam problem ze złym zliczaniem impulsów podawanych z impulsatora.

    Zbudowałem impulsator z wykorzystaniem silnika krokowego wg tego projektu:
    https://www.elektroda.pl/rtvforum/viewtopic.ph...kowy&sid=35184fc996bbc48eaf01d99c5d10c5be

    Ogólna praca tego układu polega na wystawianiu stanu niskiego po wykryciu "kroku" silnika na pewien czas na jednym z dwóch wyjść (obroty lewe lub prawe).

    Następnie podłaczyłem go do mikrokontrolera Atmega8, poprzez wejścia INT0 i INT1. Impulsy lewo/prawo zliczam wykorzystając przerwania.

    Sam impulsator działa bez zarzutu (przynajmniej tak mi się wydaje). Problem jest taki, że mikroprocesor zlicza zbyt szybko oraz nierównomiernie impulsy. Aby nie komplikować sprawy sposób dojścia do tego wytłumaczę w ten sposób:
    Posiadam dwie diody LED podłaczone do wyprowadzeń uC. Jedna odpowiada za sygnalizowanie prostoliniowego narastania liczby impulsów. Po prostu zapala się gdy liczba impulsów jest parzysta, a gaśnie gdy nieparzysta. Druga dioda ma się zapalić po okreslonej liczbie impulsów. Wynik jest taki, że pierwsza dioda nie miga równomiernie (pomimo stałej predkości impulsatora), czasem sie zawiesza, a druga dioda zdecydowanie za szybko się zapala.

    Zmierzyłem dwoma sposobami działanie impulsatora. Na wyjściu umieściłem diodę LED i zakręciłem równomiernie silnikiem krokowym. Dostałem równomierne miganie diody. Drugi sposób to zdjęcie przebiegu oscyloskopem. Jako, że oscyloskopu nie mam to posłużyłem się wersją testową programu Zelscope. Program umożliwia zdejmowanie przebiegów na wejściu karty dźwiękowej.

    Układ podłączyłem w taki sposób:
    [Atmega8][C/AVR Studio] Niepoprawne zliczanie impulsów impulsatora.

    Otrzymałem następujący przebieg:
    [Atmega8][C/AVR Studio] Niepoprawne zliczanie impulsów impulsatora.

    Impulsator połączyłem bezpośrednio pod posrty INT0 oraz INT1. Próbowałem zastosować rezystory pull-down 10k, ale nie przyniosło to żadnych efektów.

    Kod obsługi przerwań:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Użycie makr ISR nic nie zmienia.

    Proszę o pomoc, bo już rozkładam powoli ręce przy tym.

    Pozdrawiam,
    Mariojas

    0 14
  • #2 13 Wrz 2011 15:42
    63404
    Użytkownik usunął konto  
  • #3 13 Wrz 2011 16:07
    janbernat
    Poziom 38  

    Może spróbuj vollatile.
    No bo teraz dystans to jest chyba zmienna lokalna.

    0
  • #4 13 Wrz 2011 16:12
    Mariojas
    Poziom 17  

    Wydaje mi się, że nie ma sensu rysować schematu, ponieważ tak jak mówiłem - podłączyłem impulsator bezpośrednio pod nóżki uC. Wyprowadzenia mikroprocesora impulsatora bezpośrednio, czyli bez żadnych rezystorów szeregowych, pull-down, pull-up, podłączyłem pod wejścia PD2 oraz PD3.

    Dodano po 4 [minuty]:

    janbernat napisał:
    Może spróbuj vollatile.
    No bo teraz dystans to jest chyba zmienna lokalna.

    Zapomniałem dopisać co to za zmienna ;)

    globalna z prefixem volatile. Dokładnie taka deklaracja:

    volatile uint16_t dystans = 0;

    0
  • #5 13 Wrz 2011 16:20
    janbernat
    Poziom 38  

    No to jeszcze amplituda sygnału z silnika.
    Na Twoim "mierniku" jest chyba 0.4V.
    Pamiętam że parę miesięcy temu się tym bawiłem i robiłem jakiś kondycjoner na wzmacniaczach operacyjnych.
    No i trzeba uważać- jak silnik na 12V i dobrze nim zakręcisz to możesz dostać 50V napięcia.

    0
  • #6 13 Wrz 2011 16:23
    Mariojas
    Poziom 17  

    To nie napiecie silnika tylko napięcie logiczne z mikroprocesora. Ten oscyloskop przekłamuje i to dużo, chciałem jedynie sprawdzić czy nie ma czegoś w stylu drgania styków, czy na pewno jest prostokąt.

    0
  • #7 13 Wrz 2011 16:53
    janbernat
    Poziom 38  

    No to podłącz oscyloskop do wejść procesora.

    0
  • #8 13 Wrz 2011 17:16
    Mariojas
    Poziom 17  

    janbernat napisał:
    No to podłącz oscyloskop do wejść procesora.

    Widzę, że nie określiłem jasno co mierzyłem...

    Przebieg zdjęty z wyjścia impulsatora, czyli z wyjścia mikroprocesora obsługującego silnik krokowy.

    0
  • #9 13 Wrz 2011 18:29
    janbernat
    Poziom 38  

    No to cierpliwie...
    Czy na wejścia INT0 i INT1 podawane jest napięcie z silnika krokowego?
    Jeśli tak to czy jest podawane bezpośrednio czy poprzez jakiś wzmacniacz/bufor itp?

    0
  • #10 13 Wrz 2011 18:32
    Mariojas
    Poziom 17  

    Mariojas napisał:
    Zbudowałem impulsator z wykorzystaniem silnika krokowego wg tego projektu:
    https://www.elektroda.pl/rtvforum/viewtopic.ph...+krokowy&sid=35184fc996bbc48eaf01d99c5d10c5be

    Wjścia tego "czegoś" podłaczam bezpośrednio do atmegi8 na porty int 0 / 1, atmega ta ma za zadanie zliczyć impulsy podane przez to "coś".

    Widzę, że muszę to w ten sposób pisać, bo inaczej sie nie dogadamy.

    0
  • #11 13 Wrz 2011 20:51
    rs07
    Poziom 20  

    Witaj Mariojas
    Też kiedyś miałem podobny problem ze zliczaniem impulsów. Impulsy pochodziły od czujnika optycznego na podczerwień. Problem rozwiązałem wstawiając w przerwaniu małe opóźnienie. W moim przypadku silnik obracał się wolno więc opóźnienie wynosiło 3 ms.

    0
  • #12 13 Wrz 2011 21:28
    63404
    Użytkownik usunął konto  
  • #13 14 Wrz 2011 12:30
    Mariojas
    Poziom 17  

    Wprowadzenie opóźnień jest raczej delikatnie mówiąc nie eleganckie. Układ impulsatora, z linku który podałem powinien podawać prawidłowe impulsy logiczne, bez zjawiska drgania styków, bo z tego co wiem, to attiny nie ma na wyjściach przekaźników do ustawiania stanów :)

    Wydaje mi się, że problem leży w połączeniu (zakłócenia itp.) lub konfiguracji procesora. Ale jestem samoukiem, to też brakuje mi wiedzy na ten temat. I głównie dlatego piszę do Was z prośbą o pomoc.

    Dodano po 33 [minuty]:

    Coś dla tych, którzy nie wiedzą co mam podłaczone pod mikroprocesor.
    Tak jak na schemacie, nie ma rezystorów miedzy impulsatorem a atmegą:
    [Atmega8][C/AVR Studio] Niepoprawne zliczanie impulsów impulsatora.

    0
  • Pomocny post
    #14 14 Wrz 2011 17:39
    mareksordyl
    Poziom 11  

    to ja też coś od siebie dołożę
    spróbuj wszystko zapisać w postaci liczbowe tj nie baw się w przesunięcia bitów i takie tam tylko na sztywno w pisz co masz wpisać do rejestrów,
    wnioskuje ze używasz darmowego kompilatora spróbuj wyłączyć optymalizacje kodu,
    ewentualnie spróbuj dopisać w obsłudze przerwania czy to wejście faktycznie ma stan niski.
    Swego czasu pisałem obsługę enkodera i w moim wypadku obsługa przerwania była taka

    Code:


    SIGNAL(SIG_INTERRUPT0)
    {
    //pausa;

    if (bit_is_set(PIND,PD2)!=bit_is_set(PIND,PD0))
    {
    g_x--;
    }
    else

    {
    g_x++;
    }

    }

    ale to była obsługa enkodera a ty masz impulsator

    0
  • #15 15 Wrz 2011 13:32
    Mariojas
    Poziom 17  

    mareksordyl napisał:
    ewentualnie spróbuj dopisać w obsłudze przerwania czy to wejście faktycznie ma stan niski.

    i to jest chyba nasz zwycięzca :)

    zmieniłem lekko kod na coś w tym stylu:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    I procesor zlicza impulsy poprawnie. Dioda miga już równomiernie, a także zmienia częstotliwość wraz ze zmiana predkosci obrotowej silnika. A zapalanie drugiej diody wg stopera jest praktycznie takie samo w obie strony :) Jak na razie na sucho sukces.

    0
  Szukaj w 5mln produktów