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

Jak zmienić program na AVR, by enkoder reagował na impulsy +5V zamiast GND?

bikemc 23 Sty 2008 14:28 7275 34
Najlepsze odpowiedzi

Jak w Bascomie obsłużyć enkoder, aby AVR reagował na impulsy +5 V zamiast na zwarcie do masy?

Nie da się tego zrobić samym poleceniem `Encoder()`, bo w Bascomie działa ono tylko na stan niski, więc enkoder trzeba podłączyć do masy albo odwrócić sygnał sprzętowo [#4726930] Jeśli masz impulsy +5 V, najprościej wstawić tranzystor jako inwerter i dopiero wtedy podać sygnał na wejście AVR [#4743523] Drugą opcją jest całkowite pominięcie `Encoder()` i obsługa enkodera samemu na przerwaniach, zamiast polegać na tej funkcji [#4726930][#4769610]
Wygenerowane przez model językowy.
  • #1 4726152
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Witam,
    Mam taki problem: licznik impulsów na AVRze nie działa. Zauważyłem jednak że wszystko się liczy gdy zamiast impulsów +5V dochodzą impulsy zwarcia do masy czyli daję na PINB.0 sygnał GND i już tam się liczy. Co mam zmienić w programie by reagował nie na masę tylko na +5V? :(

    Pozdrawiam

    oto mój kod w Bascomie:

    '-----------------------------------------------------------------------------------------
    
    'name                     : encoder.bas
    
    'copyright                : (c) 1995-2005, MCS Electronics
    
    'purpose                  : demonstration of encoder function
    
    'micro                    : Mega128
    
    'suited for demo          : yes
    
    'commercial addon needed  : no
    
    'An encoder has 2 outputs and a ground
    
    'We connect the outputs to pinb.0 and pinb.1
    
    'You may choose different pins as long as they are at the same PORT
    
    'The pins must be configured to work as input pins
    
    'This function works for all PIN registers
    
    '-----------------------------------------------------------------------------------------
    
    
    
    
    $regfile = "m128def.dat"                                    ' specify the used micro
    
    $crystal = 4000000                                          ' used crystal frequency
    
    $baud = 19200                                               ' use baud rate
    
    $hwstack = 32                                               ' default use 32 for the hardware stack
    
    $swstack = 10                                               ' default use 10 for the SW stack
    
    $framesize = 40                                             ' default use 40 for the frame space
    
    
          Dim A As Byte
    Dim Message As String * 16
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2       'konfiguracja linii mikrokontrolera‚ do których dołączono wyświetlacz LCD
    
    
    
    Print "Encoder test"
    
    Dim B As Integer
    Dim C As Integer
    
    'we have dimmed a byte because we need to maintain the state of the encoder
    
    
    
    
    Portb = &B11                                                ' activate pull up registers
    
    
    
    
    Do
    
       B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
    
       '                                               ^--- 1 means wait for change which blocks programflow
    
       '                               ^--------^---------- labels which are called
    
       '              ^-------^---------------------------- port PINs
    
       Print B
    
      Waitms 10
    
    
    Loop
    
    End
    
    
    
    
    'so while you can choose PINB0 and PINB7,they must be both member of PINB
    
    'this works on all PIN registers
    
    
    
    
    Links:
    
    C = C + 1
      Print C
       Initlcd
    Cls
    Cursor Off
    Lcd C
    Lowerline
    Lcd C
    
    Print C
    
    Return
    
    
    
    
    Rechts:
        C = C - 1
      Print C
      Initlcd
    Cls
    Cursor Off
    Lcd C
    Lowerline
    Lcd C
    
    Print C
    
    Return
    
    
    End


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #2 4726930
    sitec
    Poziom 13  
    Posty: 135
    Ocena: 5
    Polecenie Encoder(...) w bascomie działa tylko na stan niski. Rzecz oczywista do enkodera dołanczasz mase a nie +5V

    Dodano po 3 [minuty]:

    A jeżeli chcesz korzystać z +5 V musisz pominąć polecenie Encoder() i samemu obsłużyć enkoder. Myślę że łatwiej będzie dostosować się do polecenia encoder i podłączyć sie do masy
  • #3 4731165
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Więc co proponujesz? może wykorzystać zanegowane wyjścia z enkodera?
    pozdrawiam
  • #4 4743435
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Co proponujecie by impuls był z masy??
  • #5 4743523
    GreG$
    Poziom 13  
    Posty: 73
    Ocena: 6
    bikemc napisał:
    Co proponujecie by impuls był z masy??


    najprościej to dać tranzystor na wejście i odwrócić logikę sygnału :)
  • #6 4745167
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Greg fajnie, ale tak prościej?:) jaki tranzystor jak podłączyć i jak zmienić logikę?:)

    Pozdrawiam
  • #7 4746399
    GreG$
    Poziom 13  
    Posty: 73
    Ocena: 6
    bikemc napisał:
    [...] jaki tranzystor jak podłączyć [...]


    narysuj mi jaki tam jest układ wejściowy tego impulsu.
  • #8 4747041
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    rany teraz to jest na porzadku dziennym ze ludzie (mlodzi najczesciej) potrafia (juz pomijam w jakim jezyku) zaprogramowac nowoczesny procesor a nie moga sobie poradzic z prosata elektronika eh co za czasy...

    daj np BC548, do bazy przez rezystorek np 1k oczywiscie wejscie enkodera, emiter polacz z masa a kolektor przez rezystor 10k-47k z plusem. Wejscie procka dolacz do kolektora i juz masz zanegowany sygnal. Ewentua;lnie mozesz wlaczyc wewnetrzne pulupy w AVRku i zrezygnowac z tego drugiego rezystora.

    pytanie tylko po co tak robic skoro ten enkoder jak mniemam jest mechaniczny i pewnie mu to ryba czy idzie przez niego masa czy zasilanie.
  • #9 4749039
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Wyjście enkodera to Pull up, dzwoniłem pytałem do dystrybutora, powiedział że sygnał wyjściowy jest to impuls o amplitudzie napięcia zasilania. Jest jeszcze wyjście z enkodera: A zanegowany i B zanegowany. Pomogą te wyjścia??

    Pozdrawiam
  • #10 4750276
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    kurde ale zamotales teraz. To jest enkoder czysto mechaniczny czy podlacza sie do niego zasilanie (masa i zasilanie) i ma jakis uklad elektroniczny w sobie ? i co to wlasciwie znaczy "Wyjście enkodera to Pull up" ?
  • #11 4750444
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Jest to enkoder inkrementalny. Napięcie zasilania 10-30V, wyjście to Tzw PUll up, czyli wyjściem jest impuls prostokątny o amplitudzie równej napięciu zasilania
  • #12 4750521
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    no dobra ale AVRka nie zsilasz chyba 10V prawda? to i tak trzebaby przynajmniej jakos podzielic ten sygnal z wyjscia. jak rozumiem sa dwa wyjscia przesuniete w fazie o 90 stopni? Teoretycznie daloby rade dolaczyc zwykly dzielnik rezystorowy (np 2 rezystorki po 10k dla zasilania procka 5V o ile rezystancja wyjsciowa tego enkodera nie jest zbyt duza, jezeli jest to trzeba ja uwzglednic). Dol dzielnika oczywiscie do masy, gora do wyjscia enkodera. Niewiem czy dobrze to rozumiem - na wyjsciu jest albo +10V albo wisi w powietrzu? wtedy rozwiazanie z dzielnikiem ma jak najbardziej sens bo dolny rezystor w momencie kiedy wyjscie enkodera "wisi" sciagnie wejscie procka w dol.

    jezeli jest odmiennie niz opisalem to znaczy na wyjsciu jest normalny sygnal prostokatny +10V-0V To to rozwiazanie tez zadziala w sumie. Trzeba tylko odpowiednio dobrac rezystorki.
  • #13 4766846
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Tak, AVR ma zasilanie 5V, Enkoder mogę zasilić np 24V. Enkoder ma wyjście A i B - odwrócone o 90 stopni. Wyjście z dzielnika napięcie 5V gdzie mam podać? na wejście enkodera? Tak właśnie mi nie działa. Musiałbym mieć układ który, kiedy przychodzi impuls dodatni, musi powodować pojawienie się masy na wejściu AVR. Dalej nie wiem co zrobić:(
  • #14 4767737
    Xaveri
    Poziom 17  
    Posty: 460
    Pomógł: 13
    Ocena: 77
    Nie możesz zamiast korzystać z polecenia encoder podłączyć go do przerwania i ustawić, żeby przerwanie następowało przy zboczu narastającym?
  • #15 4769173
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Fajnie, ale jak to zrobić w Bascomie?:(
  • #16 4769414
    sitec
    Poziom 13  
    Posty: 135
    Ocena: 5
    Mi to encoder wogóle nie chodził przy zastosowaniu polecenia z bascoma (encoder)...

    Rozwiązałem ten problem używająć przerwania:

    Getecounter: 'Wywołane przez przerwanie zboczem opadającym
    Waitms 4
    If Pind.2 = 0 Then
    If Pinb.4 = 0 Then Decr Ecounter Else Incr Ecounter
    End If
    Return
  • #17 4769444
    Xaveri
    Poziom 17  
    Posty: 460
    Pomógł: 13
    Ocena: 77
    Niech kolega poszuka polskiego helpa do bascoma - super sprawa. Potem tylko F1 i temat przerwań...
  • #18 4769536
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Getecounter: 'Wywołane przez przerwanie zboczem opadającym
    Waitms 4
    If Pind.2 = 0 Then
    If Pinb.4 = 0 Then Decr Ecounter Else Incr Ecounter
    End If
    Return

    nie ma takiej funkcji jak gatecounter oraz ecouner

    :(
  • #19 4769610
    sitec
    Poziom 13  
    Posty: 135
    Ocena: 5
    Ecounter zmienna typu np byte
    Ecounter mozesz sobie nazwać jak chcesz E, B, C, D

    Getecounter:
    Return

    jest to procedura a raczej funkcja, też sobie możesz nazwać jak chcesz.

    USTAWIENIA przerwań:



    Config Int0 = Falling : Enable Int0 : On Int0 Getencoder
  • #20 4770521
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Występuje błąd że nie ma takiego formatu Ecounter. I jak program ma działaś skoro jeden impuls - kanał A idzie na PIND.0 a drugi idzie na kanał B PIND.1 Jak ma odejmować i dodawać?

    Dodano po 17 [minuty]:

    ale zaobaczyłem że mój wcześniejszy kod był zły, gdyż zamiast wpisać PIND.0 dla INT wpisałem PINB.0, niewiem jak to się ma tam wgłębiej w programie... podłączyłem jeden kanał razie i muszę jeszcze zrobić optoizolację na 2 gi kanał.
  • #21 4770636
    sitec
    Poziom 13  
    Posty: 135
    Ocena: 5
    Widzę że dalej nie rozumiesz.
    Ecounter jest to zmienna którą musisz zadeklarować tak
    Dim Ecounter As Byte


    Dalej. Wiesz jak wyglądają przebiegi z poszczególnych nóżek enkodera.

    Jak zmienić program na AVR, by enkoder reagował na impulsy +5V zamiast GND?

    Jak widać są przesunięte względem siebie

    Jeżeli wykonasz obrót np w prawo to na nóżce A wystąpi stan niski i nastąpi przerwanie w którym jest sprawdzane stan na nóżce B na którym zależnie od kierunku ruchu występuje stan niski.

    To rozwiązanie jest poprawne, ponieważ sam go stosuje i działa poprawnie
  • #22 4854556
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Sitec a jak zrobić by wykonać jakąś procedurę, kiedy pojawi się obrót w prawo, a następnie powrócić dalej do głównego programu?

    Dodano po 30 [minuty]:

    Czy ktoś potrafi mi pomóc jak skonfigurować port INT0 i INT1 (PINB) aby po podaniu +5V układ traktował go jak impuls? Wykorzystuję funkcję encoder, która działa tylko po podaniu masy do PINB, a mnie interesuje +5V. Bardzo proszę o pomoc:(
  • #23 4876437
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Problem rozwiązany. Wykorzystałem funkcje Enkoder. Natomiast przy szybszym kręceniu, następuje widoczne ominięcie części impulsu. Skacze tylko wynik +1 nic wiecej. Co radzicie??
  • #24 4877028
    rusala
    Poziom 22  
    Posty: 475
    Pomógł: 44
    Ocena: 6
    radze zrobic to w C
  • #26 4877566
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Na postach ludzie piszą, że ich atmega działa z 3 enkoderami, steruje silnikiem dc i program był zrobiony w bascomie. Więc nie sądze że to wina prędkości działania bascoma:(
  • #28 4879231
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Freddie Chopin, co ma oznaczać - "albo uzyj funkcji bascoma do_magick(), ktora robi to co wlasnie jest potrzebne" ??
  • #29 4882441
    bikemc
    Poziom 13  
    Posty: 137
    Ocena: 2
    Czy ktoś z Was ma program obsługi enkodera w C ++ AVR Studio 4 ??
  • #30 20008452
    darex120
    Poziom 18  
    Posty: 1106
    Pomógł: 1
    Ocena: 61
    Witam , mam pytanie co bym musiał zrobić aby zamiast mikrowyłącznika dać enkoder

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z licznikiem impulsów enkodera inkrementalnego podłączonego do mikrokontrolera AVR (Mega128) zasilanego 5V, gdzie program w Bascomie reaguje tylko na impulsy podłączone do masy (stan niski), a nie na impulsy +5V (stan wysoki). Standardowa funkcja Encoder() w Bascomie działa tylko na sygnał aktywny niskim poziomem, co wymusza podłączenie enkodera do masy. Proponowano rozwiązania sprzętowe, takie jak zastosowanie tranzystora (np. BC548) do odwrócenia logiki sygnału, wykorzystanie dzielnika napięciowego do obniżenia napięcia z wyjścia enkodera (zasilanego 10-30V) do poziomu 5V kompatybilnego z AVR, oraz użycie przerwań z detekcją zbocza narastającego zamiast funkcji Encoder(). Wskazano, że enkoder mechaniczny ma wyjścia A i B przesunięte fazowo o 90°, co pozwala na określenie kierunku obrotu przez analizę stanów na pinach przerwań. Przykładowy kod w Bascomie z obsługą przerwań i inkrementacją/dekrementacją licznika został podany. Zwrócono uwagę na konieczność deklaracji zmiennych i poprawne przypisanie pinów przerwań. Wskazano, że funkcja Encoder() w Bascomie nie obsługuje sygnału aktywnego wysokim poziomem, dlatego lepszym rozwiązaniem jest samodzielna obsługa enkodera przez przerwania. W końcowej części dyskusji pojawiły się pytania o implementację w C++ (AVR Studio 4) oraz o programowanie enkodera jako zamiennika mikrowyłącznika, z sugestią użycia przerwań PCINT lub polling timerem.
Wygenerowane przez model językowy.
REKLAMA