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.

Sterowanie silnika krokowego (step,dir) za pomoca AVR

karol1010 02 Lut 2010 20:03 11321 38
  • #31 02 Lut 2010 20:03
    janbernat
    Poziom 38  

    No, prace nieco "meandrują".
    Ponieważ normalny przyniesiony z firmy sterownik musiałem zamontować w firmowym ploterze- bo kolega skończył część mechaniczną- to zacząłem robić sterowanie do małego "doświadczalnego" silnika sterowanego przez L6219 na ATMega168.
    Oczywiście "po bożemu" w przerwaniu.
    To się gdzieś pęta na EL.
    Algorytm podany przez whitetom oczywiście słuszny.
    I co oczywiste wymaga znajomości końcowej ilości kroków.
    Jedyne co bym uprościł to czas narastania i opadania zrobić taki sam.
    Polega to na skracaniu jakiegoś licznika programowego- ale to będę robił powoli bo po godzinach.
    A tu kod:

    Code:

    'Program do sterowania małych silników krokowych za pomocą ATMega8 i układu L6219 lub LB1845
    'sterowanie ćwierćrokowe, zasilanie 30V
    'set i reset zastosowałem w celach poglądowych- można- a nawet należy zastąpić to np.PortB=&B00001100 itp.

    $regfile "m168def.dat"
    $crystal = 4915200
    Config Lcd = 20 * 4           '16 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Ddrb = &HFF
    sei

    Config Timer0 = Timer , Prescale = 8       ' teraz da ok. 0.417us- ale może skrócić
    Enable Ovf0
    On Ovf0 Step_delay
    Config Portd = Input
    Set Portd.2
    'Config Pind.4 = Output
    'Config Debounce = 1800

    Dim Kier As Byte
    Dim Temp0 As Byte
    Dim Opoznienie_odczytu As Byte
    Dim Stan As Byte
    Dim Kroki As Word
    Dim Liczba_powtorzen As Byte
    Dim Kat As Single
    Dim Liczniczek As Byte

    Liczniczek = 0

    Ph1 Alias Portb.0             'kierunek przepływu prądu w uzwojeniu Ph1
    Ph2 Alias Portb.1             'kierunek przepływu prądu w uzwojeniu Ph2
    I01 Alias Portb.2             'napięcie dostarczane do uzwojeń- 1 , 2/3 lub 1/3 Imax
    I11 Alias Portb.3
    I02 Alias Portb.4
    I12 Alias Portb.5
    '(
    Reset Ph1
    Reset I01                     ' na początek ustawiamy krok 0
    Reset I11
    Set I02
    Set I12
    Reset Ph2
    ')
    Dim Next_step As Byte
    Next_step = 0
    Dim Flaga As Byte
    Flaga = 0
    Dim Liczba_krokow As Word
    Liczba_krokow = 0
    Kier = 0
    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "ustal kierunek "



    Do
       'Lcd "tu jestem"
       If Flaga = 1 Then          'gdy jest przerwanie od Timer0- co 237us
         If Pind.2 = 0 Then       'i jest wciśnięty przycisk PIND.2- ustawianie kierunku jednym przyciskiem
             Incr Opoznienie_odczytu       'no bo przycisk ma drgania dłużej niż 237us- niech zwiększy




                                            'to sprawdzanie powtórne do 17ms

             If Opoznienie_odczytu >= 70 Then       'dajmy mu na wygaszenie drgań 17ms

                If Temp0 = 0 Then ' i jest zezwolenie na zmianę stanu
                   Gosub Ustawianie
                   Temp0 = 1      ' zablokuj zezwolenie na zmianę stanu
                End If

                Opoznienie_odczytu = 0       'Jak już ustawił kierunek to pozwolimy mu liczyć od początku-
                                              'po powtórnym naciśnięciu PIND.2
              End If

          Else
             Temp0 = 0            'zezwalaj na zmiany
             Opoznienie_odczytu = 0
          End If

          If Kier = 1 Then
             Gosub Kier_prawo
          End If

          If Kier = 2 Or Kier = 0 Then
             Gosub Kier_stop
          End If

          If Kier = 3 Then
             Gosub Kier_lewo
          End If

          Flaga = 0
          'Toggle Portd.4       'to jest tylko do pomiaru

       End If

       'If Pind.3 = 0 Then
          Debounce Pind.3 , 0 , Ustaw_liczba_krokow
          'Debounce Pind.4 , 0 , Kier_prawo

       'End If
       'Lowerline
       'Lcd Liczba_krokow

    Loop
    End


    Step_delay:                   'ten timer określa szybkość z jaką kręci się silnik- teraz ok0.25ms/ impuls
       Timer0 = 60                '110     'no to skracamy- ten silnik się jeszcze kręci- ale na jakimś innym moze to trzeba zmienić
                         'tu jest ok.237us obliczone a 248us zmierzone- procesor jednak coś wolno liczy
       Flaga = 1
          Incr Next_step          'sterowanie 1/8 kroku- 16 stanów
             If Next_step >= 16 Then
                Next_step = 0
          End If

    Return


    Ustawianie:

          Select Case Kier
             Case 0
               Locate 1 , 1
               Lcd "kierunek- lewo " ; Kier
             Case 1
               Locate 1 , 1
               Lcd "kierunek- stop " ; Kier
             Case 2
               Locate 1 , 1
               Lcd "kierunek- praw " ; Kier
             Case 3
               Locate 1 , 1
               Lcd "kierunek- stop " ; Kier

           End Select

        Incr Kier
         If Kier >= 4 Then
           Kier = 0
         End If


    Return


    Kier_prawo:                   'Sterowanie układu L6219 lub LB1845- w przypadku sterowania STEP, DIR ten fragment należy uprościć
       'Incr Liczba_krokow
    'For Liczba_powtorzen = 0 To 100
     For Kroki = 0 To Liczba_krokow
        Select Case Next_step

             Case 0
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
             Case 1
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 2
                Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 3
                Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 4
                Set Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 5
                Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 6
                Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 7
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 8
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
             Case 9
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 10
                Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 11
                Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 12
                Reset Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
             Case 13
                Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 14
                Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 15
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02


          End Select
     Next
    'Next

    Return

    Kier_lewo:                    ' j.w.
      'Incr Liczba_krokow

          Select Case Next_step

             Case 0
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
             Case 1
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 2
                Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 3
                Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 4
                Set Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
             Case 5
                Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 6
                Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 7
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 8
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
             Case 9
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 10
                Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 11
                Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 12
                Reset Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 13
                Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 14
                Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 15
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02


          End Select

    Return

    Kier_stop:                    'stop ma zachować aktualne położenie wirnika
    'Stan = Portb

    Return

    Ustaw_liczba_krokow:          'Tu jest ustawianie- czas bez znaczenia i wszystkie paskudy typu wait czy debouce dozwolone

    Cls
    Lcd "liczba krokow"
    Do
      If Pind.5 = 0 Then
        Waitms 20
          If Pind.5 = 0 Then
            'Incr Liczniczek

              If Liczba_krokow < 16000 Then
                'Liczba_krokow = Liczba_krokow + Liczniczek
                Incr Liczba_krokow
               'If Liczniczek = 255 Then
                  'Liczniczek = 0
               'End If
                Kat = Liczba_krokow * 0.028125
              End If

              If Liczba_krokow >= 16000 Then
                Liczba_krokow = 16000
              End If
            Lowerline
            'Locate 2 , 2
            Lcd " ->  " ; Liczba_krokow ; "      "
            Thirdline
            Lcd "Kat " ; Kat ; "        "


          End If
      End If

      If Pind.6 = 0 Then
        Waitms 20
          If Pind.6 = 0 Then
           'Incr Liczniczek
            'Liczba_krokow = Liczba_krokow - Liczniczek
            If Liczba_krokow > 0 Then

              Decr Liczba_krokow
                'If Liczniczek = 255 Then
                  'Liczniczek = 0
                'End If
              Kat = Liczba_krokow * 0.028125

            End If

              If Liczba_krokow <= 0 Then
                Liczba_krokow = 0
              End If
            Lowerline
            'Locate 2 , 2
            Lcd " <- " ; Liczba_krokow ; "       "
            Thirdline
            Lcd "Kat " ; Kat ; "        "

          End If
      End If

    Debounce Pind.4 , 0 , Kier_prawo       ' to tylko dla sprawdzenia
    Loop

    Return

    '(
    Text = Str(liczba_krokow)
    Text = Format(text , "     ")
    Locate 1 , 1
    Lcd Text
    ')

    To skracanie liczników to muszę zrobić w ustawianiu- bo palec się męczy przy trrzymaniu przycisku.
    Ale podobnie można by zrobić rampę w głównej pętli.
    Program jest niedokończony- działa ale ma działać lepiej.

  • #32 02 Lut 2010 21:13
    karol1010
    Poziom 21  

    No spoko :) no ale co sadzisz o tym 555? da rade?

  • #33 02 Lut 2010 21:55
    janbernat
    Poziom 38  

    No sam zrobiłem generator do sterowania silników na 555.
    Trzeba jakoś sprawdzić połączenia kabli zanim się zacznie z programem.
    Zrobić, jakoś sprawdzić na oscyloskopie i i kręcić potencjometrem żeby przyspieszyć.
    No i sprawdza się do testów.
    Ale dzisiaj właśnie- co za zbieg okoliczności- bo sprawa się obudziła- zacząłem sterować tymi silnikami w ploterze za pomocą półprofesjonanego programu.
    Poezja- ma domyślną rampę- przyspieszenia, wykrywanie krańcówek itp.
    Żadnego zrywania kroków, warczenia itp.
    Ten program co dałem można mocno uprościć jeśli masz sterowanie STEP DIR ENABLE.
    Albo tylko STEP DIR.
    Rampy tam jeszcze nie ma.
    Taki atom to pewnie by zrobił w parę minut- ale ja to się jeszcze namęczę.

  • #34 03 Lut 2010 08:34
    karol1010
    Poziom 21  

    No działa na 555 pytanie jak go z prockiem dogadać tak żeby jechał te 122kroki i ani więcej ani mniej..

    Mam taka mysl:

    zakładamy ze rozpędzanie trwa ok 20 kroków i hamowanie 20krokow.

    procek załącza generator 555 i szybki licznik , ma zrobić 100 kroków kiedy na liczniku jest juz wiecej niz 80 kroków zwalnia generator i ten wykonuje jeszcze te ok 20krokow , ale licznik liczy dalej i jak jest przy 100kroku odcina generator całkowicie ucinając delikatnie końcówkę rampy.

    Co wy na to ? mysle ze pewnie by dzialalo tylko ze samo zliczanie przez atmege jest "proste" ale jak zrobić wykrycie tych 20 kroków do końca???

    Jak ten bidny procek sie w czasie wyrobi... oto pytanie

    Dodano po 2 [minuty]:

    Nie wiem jak zrobić to najprościej wydaje mi się ze właśnie tak.

  • #35 03 Lut 2010 19:46
    janbernat
    Poziom 38  

    Pomysł może być -ale:
    20 kroków może być mało.
    Potrzebne jest ustalenie Vmax- po podzieleniu przez liczbę kroków od startu do Vmax dostaniemy nachylenie rampy.
    Zawsze potrzebna jest nam znajomość docelowej ilości kroków aby ustalić od którego momentu silnik ma zacząć hamować.
    Doczepianie do tego 555 jest możliwe ale bardzo utrudni program- od tego jest procesor aby generował nam określoną ilośc impulsów.
    Ma mieć zaprogramowaną ilość kroków a nie liczyć impulsy zewnętrzne.
    To jest głowna zaleta silników krokowych- praca w otwartej pętli- bez sprawdzania położenia.
    P.S.
    Jaki zamierzasz użyć procesor?

  • #36 03 Lut 2010 20:16
    karol1010
    Poziom 21  

    procek juz jest i pracuje ATMEGA128 + grafik LCD 264x128.

    20 krokow to tylko przykładowa wartość.


    maszyna juz działała ale jednak zdecydowałem się na "rampe"

    3silniki krokowe i do tego 1700linii kodu.

    no ale za bardzo szarpało :)

  • #37 03 Lut 2010 21:40
    janbernat
    Poziom 38  

    No to tylko pogratulować- 1700 linii kodu!
    Akurat dzisiaj udało mi się wstępnie odpalić ploter w firmie.
    1500x1500mm- duże i sztywne mechaniczne bydlę.
    Projekt stary- sprzed kilku lat- ale ostatnio został udoskonalony mechanicznie i dostałem zadanie- uruchomić elektronicznie i programowo.
    Parę lat temu zaczął tworzyć program do tego mój przyjaciel- na ATMega8515 z zewnętrznym RAM ładowanym paczkami programu przez RS.
    Nawet zaczęło to działać.
    Ale zorientowałem się że zaprogramowanie wycięcia czegoś więcej niż kółko to będzie za długo trwało.
    No to spróbowałem programu MACH.
    Świetnie chodzi przez chwilę.
    Jak komputer zaczyna coś robić "w tle" to wszystko się sypie.
    Zaczyna "szarpać"
    Wiedziałem że potrzebny jest zewnętrzny sterownik- bufor- który odczytuje pakiet danych z komputera- to był ten sterownik na ATMega8515- no ale i program do sterowania na komputerze.
    Doszedłem do wniosku że prędzej umrę niż samemu z niewielką pomocą przyjaciół coś takiego zrobię po godzinach raz na tydzień.
    Kupiłem sterownik- dane przez USB i do niego program- można to ściągnąć za darmo bo bez sterownika sprzętowego to można sobie tylko potrenować.
    Zaczyna mi się podobać.
    P.S.
    Ale Ty zrobiłeś te 1700 linii kodu z wykorzystaniem waitms?
    Ja bym jednak najpierw się zastanowił.
    Czasy w sterowaniu silników krokowych są krytyczne.
    A ATMega128 nie mam.

  • #38 04 Lut 2010 04:15
    karol1010
    Poziom 21  

    No waitms...;/ teraz jeszcze wywalilem klawiature i wstawilem touch-panel.

    to jeszcze przeżyje..tylko ta rampa.

  • #39 04 Lut 2010 20:57
    janbernat
    Poziom 38  

    Okropnego mi zabiłeś ćwieka z tą rampą.
    Myślałem- działa- później się zrobi.
    Na razie zrobiłem ustawianie ilości kroków- coraz szybciej- im dłużej klawisz jest naciśnięty.
    Rampa ma chyba podobną zasadę.
    Bo czas między krokami ustawiłem w Timer0 na sztywno- na max.
    I w dodatku tym samym timerem ustawiam opóźnienie odczytu klawiszy.
    Muszę chyba użyć timer2 do rampy.
    Praca wolno posuwa się...