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

Podwójne próbkowanie enkodera impulsowego w Bascom - jak zwiększyć rozdzielczość?

guteczek 11 Sty 2006 16:23 4603 1
REKLAMA
  • #1 2169820
    guteczek
    Poziom 11  
    Posty: 35
    Pomógł: 1
    Witam obecnych.
    Czy ktoś z Was ma program którym można byłoby obsłużyć enkoder impulsowy tak aby dla pewności każdy impuls był próbkowany 2 razy.Zmienna licznika w programie byłaby zmniejszana lub zwiększana w zależności ok kierunku obrotów.
    Jest taka opcja w bascomie "encoder"lecz nie wiem czy jest to wystarczająco niezawodna metoda na pewny oczyt impulsatora który daje impulsy z częstotliwością ok1,5-2kHz?
    Albo podpowiedź jak wykryć programowo z którego pinu impuls przyszedł wcześniej?
    W programie chciałbym wykryć moment wejścia "ząbka" impulsatora na transoptory i moment zejścia z nich tak aby jeden "ząbek" był niejako podwójnie zliczony co zwiększyłoby mi rozdzielczość.
  • REKLAMA
  • Pomocny post
    #2 2170621
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Witam

    Pisalem kiedys program do sterowania robotem (manipulatorem ) w bascomie. Zliczal on miedzy innymi impulsy z 3 enkoderow. i wszystko ladnie chodzilo:

    Fragment kody ktory zlicza impulsy z 3 enkoderow:
    //enkoder 1
    Enk1_a Alias Pinb.0
    Enk1_b Alias Pinb.1
    //enkoder 2
    Enk2_a Alias Pinb.2
    Enk2_b Alias Pinb.3
    //enkoder 3
    Enk3_a Alias Pinb.4
    Enk3_b Alias Pinb.5

    Temp_enk_1 = Enk1_a
    Temp_enk_2 = Enk2_a
    Temp_enk_3 = Enk3_a


    Ovff0: // przerwanie od przepelnienia timera0
    Stop Timer0
    Timer0 = &H60A0 // ponowne zaladowanie timera0

    '===enkoder 1====
    If Enk1_a <> Temp_enk_1 Then // fragment sprawdzajacy sygnaly
    If Enk1_a <> Enk1_b Then // enkodera
    Incr Poz_1
    Else
    Decr Poz_1
    End If
    Temp_enk_1 = Enk1_a
    End If

    '===enkoder 2====
    If Enk2_a <> Temp_enk_2 Then
    If Enk2_a <> Enk2_b Then
    Incr Poz_2
    Else
    Decr Poz_2
    End If
    Temp_enk_2 = Enk2_a
    End If

    '===enkoder 3====
    If Enk3_a <> Temp_enk_3 Then
    If Enk3_a <> Enk3_b Then
    Incr Poz_3
    Else
    Decr Poz_3
    End If
    Temp_enk_3 = Enk3_a
    End If

    Start Timer0
    Return

    sygnaly A i B od enkoderow sa podlaczone do dowolnych pinow, tzn w tej wersji program nie wykrywa przerwania zewnetrznego od enkodera tylko dziala w petli i sprawdza stany na poszczegolnych liniach enkoderow. Przerwanie od timera 0 musi byc tak dobrane zeby czestotliwosc skoku do przerwania Ovff0 nastepowala z czestotliwoscia co najmniej 2 razy wieksza od maksymalnej czestotliwosci sygnalu wejsciowego enkodera.

    Wartosci z poszczegolnych enkoderow znajduja sie w zmiennych Poz_1 , Poz_2, Poz_3
REKLAMA