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.

Enkoder, silnik DC, PWM, mikrokontroler

Joystick 28 Sie 2009 18:52 3000 3
  • #1 28 Sie 2009 18:52
    Joystick
    Poziom 9  

    Witam,
    Forum wybrałem po przeczytaniu:
    "Mikroprocesorowe sterowniki, czujniki, mikromechanika, pneumatyka, mechanika precyzyjna."
    do większości pasuje, stąd temat się znalazł tutaj.
    Do rzeczy:



    Sprzęt, który posiadam:
    Zestaw AVT 3500 w którym siedzi sobie AVR 90S2313
    Enkoder optyczny HEDS-9140 500 CPR
    Silnik DC 24 V
    Prowadnica zamieszczona na śrubie o skoku 1 mm
    Jeśli każdy obrót silnika to 1 mm, a enkoder rozpoznaje 1/500 obrotu, to enkoder rozpoznaje 1/500 mm tj 2 um

    Zamysł docelowy jest następujący:
    Użytkownik wprowadza wartość liczbową, o jaki dystans chce przemieścić prowadnicę. Każdy obrót wału silnika odpowiada jednemu milimetrowi przesunięcia.
    Prędkość obrotowa silnika będzie sterowana przez PWM z mikrokontrolera. Dystans jaki użytkownik wpisał zostaje zamieniony na ilość impulsów. Na przykład 17,52 mm to 8760 impulsów.
    Ustalam sobie, że silnik na początku obraca się z maksymalną szybkością, za pomocą enkodera odlicza ile impulsów zostało mu do przebycia. Kiedy zostanie mu na przykład 5000 impulsów to zacznie odrobinę zwalniając, później poniżej 2000 impulsów znowu zwolni, tak, że finalnie na ostatnie 20 impulsów będzie ledwo się obracał i zatrzyma się gdy wartość spadnie do 0.
    Piszę w BASCOMie, jedyna moja wiedza ogranicza się do książki Piotra Góreckiego „Mikrokontrolery dla początkujących”
    Wszystko to opisałem właściwie umiem wykonać, ale pozostaje mi jeden drobny problem.
    Enkoder gdy się obraca, domyślnie po prostu zwiększa licznik Timer0. Więc mogę sobie odczytywać wartość tego timera. W jaki sposób zrealizować taką funkcję, żeby mikrokontroler przy okazji każdego nowego impulsu na zboczu opadającym wykonał jakąś operację?
    Ja bym chciał, żeby po każdym impulsie enkodera wartość zmiennej, która przechowuje moje 8760 impulsów się zmniejszyła o 1. Później w programie mógłbym badać ile w danej chwili wynosi moja zmienna i w zależności od niej ustalał bym prędkość silnika.
    Mam nadzieję, że wszystko opisałem dostatecznie skrupulatnie, bardzo proszę o pomoc.

    Poniżej zamieszczam kod. W moim układzie mam uln2003a (akurat miałem zlutowane pod ręką) więc maksymalna prędkośc obrotowa to pwm1a = 0, natomiast dla pwm1a = 255 silnik stoi.


    Code:
    Dim dystans as long   ‘tu przechowuje ilość impulsów
    
    Dim ruszyl as bit   ‘boolowska zmienna która mowi czy silnik się obraca czy nie
    Ruszyl = 0      ‘domyslnie stoi w miejscu
    Dystans = 20000   ‘byle jaka wartosc

    If pind.0 = 0 then gosub start      ‘uruchamiamy silnik
    If pind.1 = 0 then Dystans = Dystans-1   ‘zamiast tego guzika właśnie przydał by się impuls enkodera
    If ruszyl = 1 then gosub sprawdz   ‘jeśli silnik się obraca

    Sprawdz:            ‘system spowalniania na kolejnych etapach
    If dystans <10000 then pwm1a = 105   
    If dystans <5000 then pwm1a = 155
    If dystans <4000 then pwm1a = 180
    If dystans <3000 then pwm1a = 205
    If dystans <1000 then pwm1a = 235
    If dystans <500 then pwm1a = 240
    If dystans <100 then pwm1a = 245

    If dystans <5 then          ‘ po osiągnięciu tej wartości
    pwm1a = 255            ‘silnik się zatrzymuje
    ruszyl = 0            ‘przyrywam bezsensowne wchodzenie do „sprawdź”
    end if

    Return


    Start:               ‘mało ambitne rozpędzanie silnika, to akurat niezbyt istotne
    Pwm1a = 255
    Waitms 3
    Pwm1a = 200
    Waitms 3
    Pwm1a = 150
    Waitms 3
    Pwm1a = 100
    Waitms 3
    Pwm1a = 50
    Waitms 3
    Pwm1a = 0
    Ruszyl = 1
    Return

    0 3
  • #2 28 Sie 2009 19:22
    kasjo
    Poziom 25  

    Wprawdzie nigdy nie pisałem w bacomie ale może mój post Ci troszkę naprowadzi.
    Możesz wykorzystać przerwanie zewnętrzne. Można je ustawić na zbocze narastające lub opadające. Z enkodera masz 2 prostokątne sygnały. Jeden sygnał podłączasz pod wejście przerwania a drugi pod zwykły port. W obsłudze przerwania wystarczy teraz sprawdzać co pojawia się na "zwykłym" porcie i w zależności czy jest "1" czy "0" zwiększasz lub zmniejszasz licznik impulsów.

    0
  • #3 29 Sie 2009 10:53
    Joystick
    Poziom 9  

    W oparciu o poniższy link:
    Link


    zmienilem swój kod do takiej postaci:



    Code:

    A Alias Pind.2      'wyjscie enkoddera wchodzi na pind.2
    Config A = Input    'configi
    Dim Dystans As Long ' ilosc impulsow do przejechania
    Dim Ruszyl As Bit   ' czy ruszylem z miejsca
    Ruszyl = 0          ' domyslnie nie ruszylem


    Config Int0 = Falling       'chyba opadajace zbocza
    On Int0 Akanal      'jak bedzie przerwanie to idz do Akanal


    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
    'Config Timer0 = Counter , Edge = Rising    ' nie bedzie raczej potrzebne
    Cls
    Wait 1
       Cls
       Pwm1a = 200      'poczatkowa predkosc (przed nacisnieciem guzika)
    '     Timer0 = 0

    '     Start Timer0
         Dystans = 15000       'byle jaka wartosc

    Enable Int0
    Enable Interrupts

         Do
    If Pind.0 = 0 Then Gosub Start
    If Ruszyl = 1 Then Gosub Sprawdz
    If Pind.1 = 0 Then Dystans = Dystans - 25


    Waitms 30
    Cls                                     'czyść wyświetlacz
    Lcd Pwm1a
    Lowerline
    Lcd Dystans                                                 

    Loop                                                       
    End

    Akanal:
    Decr Dystans
    Return

    Sprawdz:
    If Dystans < 10000 And Pwm1a < 105 Then Gosub Zwolnij

    If Dystans < 5000 And Pwm1a < 155 Then Gosub Zwolnij
    If Dystans < 4000 And Pwm1a < 180 Then Gosub Zwolnij
    If Dystans < 3000 And Pwm1a < 205 Then Gosub Zwolnij
    If Dystans < 1000 And Pwm1a < 235 Then Gosub Zwolnij
    If Dystans < 500 And Pwm1a < 240 Then Gosub Zwolnij
    If Dystans < 100 And Pwm1a < 245 Then Gosub Zwolnij
    If dystans <5 then
    pwm1a = 255
    Ruszyl = 0
    end if

    Return

    Zwolnij:
    Incr Pwm1a
    Waitms 1
    Return


    Start:
    If Dystans > 10000 Then
    Pwm1a = 0
    Ruszyl = 1
    End If
    Return






    Moj program nadal nie reaguje na obracanie enkoderem.
    moze ktos z was jest w stanie wyłapać jakiś błąd?

    0
  • #4 30 Sie 2009 16:52
    bogdan_p
    Poziom 39  

    proponuje na początek zostaw PWM i warunki z nim związane a zajmij się uruchomieniem samego enkodera , skorzystaj z tego projektu http://www.mcselec.com/index.php?option=com_content&task=view&id=79&Itemid=57 nie musisz stosować bramek kształtujących impulsy ponieważ wszystko masz już w enkoderze wykorzystaj kanały A / B http://www.dynacitytech.com/Download/HEDS-9140.pdf , oczywiście przeliczniki będziesz musiał sobie dobrać ,zainteresuj się również tym tematem https://www.elektroda.pl/rtvforum/viewtopic.php?t=427387&highlight=bascom+enkoder&sid= jak tą część będziesz miał uruchomioną dopisz sobie warunki dla PWM

    1
  Szukaj w 5mln produktów