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.

Program #c do enkodera absolutngo

pasionat 21 Lut 2014 17:25 1779 13
  • #1 21 Lut 2014 17:25
    pasionat
    Poziom 9  

    Witam,

    Wykonuję projekt enkodera absolutnego z tarczą na której jest kod grey'a.
    Zrobiłem i wykonał schemat płytkę PCB, w którym użyłem mikrokontroler atmega8.
    I teraz zamierzam zrobić program który będzie wyświetlał z komputerze prędkość obrotową,
    kierunek obrotów i kąt obrotu. Atmegę połączyłem do USB za pomocą układu FT232.


    Czy ktos może miał do styczność z programem do podobnego projektu?

    0 13
  • #3 21 Lut 2014 18:41
    pasionat
    Poziom 9  

    Dzięki za zainteresowanie.
    Bramka Schmitta w ty przypadku na wyjściu na dawać stan "0" 0 woltów i stan "1". Stabilizuje one sygnały wejściowe.
    Wcześniej zrobiłem ten układ bez większego nie mając większego doświadczenia i dopiero później doszedłem do wniosku że mogło by się obejść bez niej.

    W tym przypadku po przejściu przez przerzutniki Schmitta sygnały będą zanegowane.

    Nie wiedziałem o tym że w pinach są zastosowane te przerzutniki.
    Z każdym projektem zdobywa się coraz większa wiedze i doświadczenie ;)

    Długość przewodów to ok 20 cm.

    0
  • #4 21 Lut 2014 20:09
    atom1477
    Poziom 43  

    Ja też jestem ciekaw

    dondu napisał:
    Jak ma działać bramka, która wyjściem podłączona jest do transoptora?

    0
  • #5 21 Lut 2014 20:46
    pasionat
    Poziom 9  

    Faktycznie powinna być odwrotnie

    0
  • #6 21 Lut 2014 21:46
    dondu
    Moderator Mikrokontrolery Projektowanie

    pasionat napisał:
    W tym przypadku po przejściu przez przerzutniki Schmitta sygnały będą zanegowane.

    Czy są zanegowane, czy też nie po prostu uwzględnia się odpowiednio w programie.

    0
  • Pomocny post
    #7 24 Lut 2014 15:15
    Paweł Es.
    Pomocny dla użytkowników

    W kwestii formalnej, ten kod się nazywa kodem Gray'a (od nazwiska Franka Gray'a 1887-1969, pracownika laboratoriów Bella, który go opracował)

    Co do samego problemu, to

    - prędkość obrotową wyliczysz z jednego kanału mierząc ilość impulsów w jednostce czasu lub mierząc czas trwania jednego okresu i przeliczając to na obroty (wiadomo ile masz impulsów na jeden obrót), którą metodę wybierzesz zależy od zakresu prędkości jakie chcesz mierzyć i założonego obciążenia procesora zliczaniem tych impulsów czy pomiarem czasu.

    - do rozróżnienia kierunku obrotu potrzebne są informacje z dwóch kanałów (najlepiej tych zmieniających się z największą częstotliwością) gdzie analizujesz następstwa stanów (czyli musisz przy każdej zmianie stanu wejść porównać stan aktualny z poprzednim).
    Można też zapamiętywać stan jednego wejścia z impulsatora w momencie np. zmiany z 0 na 1 drugiego wejścia. Zapamiętany stan będzie zależny od kierunku następstw zboczy (najlepiej to sobie rozrysować).

    - do rozróżnienia kąta potrzebujesz po prostu dekodować wszystkie 4 kanały (np. adresując kodem 4 bitowym, tablicę 16 elementową z zapisanymi kątami.

    Oczywiście odczytany kąt tu będzie zapętlał się do przedziału 0-359°

    W programie będziesz musiał użyć:

    - obsługi USART (przesył danych do komputera)
    - przerwań zewnętrznych (wykrycie zmiany położenia kodera)
    - przerwań zegarowych (pomiar czasu impulsów)

    Musisz rozważyć czy mikroprocesor ma wysyłać dane w sposób ciągły (możliwe zatkanie łącza) czy też mierzyć sobie parametry ruchu kodera i podawać je na żądanie z komputera.

    0
  • #8 07 Mar 2014 19:15
    pasionat
    Poziom 9  

    Dziękuje za opisanie jak to powinno wyglądać.
    Z braku czasu dopiero niedawno wróciłem do wykonywanie tego enkodera, napisałem program do obsługi usart,
    wgrałem do atmegi i sprawdziłem programem Realterm czy komunikacja jest poprawna
    ale z na ekranie pojawiają się same zera, sprawdzałem różne opcje, i stanąłem w miejscu.
    niżej przedstawiam kod programu:

    Kod: jezyk_programowania
    Zaloguj się, aby zobaczyć kod

    niżej pokazuje rysunek z programu realterm:

    Program #c do enkodera absolutngo

    0
  • #9 07 Mar 2014 19:31
    BlueDraco
    Specjalista - Mikrokontrolery

    switch () jest rozczulający. Wystarczyłoby odizolowań przypadki specjalne, a kiedy nie zachodzą - trasmitować wartość odczytaną z portu, zapisaną wcześniej do zmiennej.

    0
  • #10 07 Mar 2014 19:54
    pasionat
    Poziom 9  

    Ale czy to będzie miało wpływ na to że będzie się poprawnie wyświetlało w komputerze? Próbowałem wysyłać różne znaki i cały za każdym razem 0 się pojawiają.

    0
  • #11 07 Mar 2014 21:40
    gaskoin
    Poziom 38  

    Nie, ale przynajmniej kod się będzie dało przeczytać i będzie mniej podatny na błędy. Jako pomagacz na forum wolałbym przeczytać 3 linijki kodu a nie 1000

    0
  • Pomocny post
    #12 07 Mar 2014 21:55
    BlueDraco
    Specjalista - Mikrokontrolery

    Przez UART nie możesz przesyłać danych bez żadnych przerw - musisz co jakiś czas odczekać. W TWoim przypadku sensownie byłoby czekać do zmiany położenia enkodera i transmitować nową daną po wykryciu zmiany. Przy zmianach położenia możesz mieć wahnięcia podobnie jak przy drganiu styków przycisków - wypadałoby to programowo odkłócić.

    Poza tym zwróć uwagę na wartość, jaką może dawać wyrażenie PIND >> 2 - Raczej nie będzie to wartość z zakresu 0..15.

    0
  • #13 08 Mar 2014 00:24
    pasionat
    Poziom 9  

    Póki co udało mi się uporać z komunikacją z komputerem. :)
    Zmieniłem wartości rejestru URSEL na 1
    UCSRC = (1<<URSEL)|(3<<UCSZ0)

    0
  • #14 18 Mar 2014 14:39
    pasionat
    Poziom 9  

    W końcu udało mi się wykonać enkoder. Dziękuje za pomocą i uwagi:)

    0
  Szukaj w 5mln produktów