logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

Mariojas 13 Wrz 2011 15:27 4143 14
  • #1 9923070
    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/topic1888379.html

    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 / 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
  • #2 9923118
    Konto nie istnieje
    Konto nie istnieje  
  • #3 9923207
    janbernat
    Poziom 38  
    Może spróbuj vollatile.
    No bo teraz dystans to jest chyba zmienna lokalna.
  • #4 9923208
    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;
  • #5 9923239
    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.
  • #6 9923246
    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.
  • #7 9923356
    janbernat
    Poziom 38  
    No to podłącz oscyloskop do wejść procesora.
  • #8 9923461
    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.
  • #9 9923686
    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?
  • #10 9923699
    Mariojas
    Poziom 17  
    Mariojas napisał:
    Zbudowałem impulsator z wykorzystaniem silnika krokowego wg tego projektu:
    https://www.elektroda.pl/rtvforum/topic1888379.html

    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.
  • #11 9924251
    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.
  • #12 9924429
    Konto nie istnieje
    Konto nie istnieje  
  • #13 9925905
    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.
  • Pomocny post
    #14 9926841
    mareksordyl
    Poziom 12  
    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
    
    
    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
  • #15 9929512
    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 / 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.
REKLAMA