Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterownik silnika krokowego na Attiny2313, (EMC2)

Tomek12_86 28 Lut 2010 10:41 12124 37
  • #31
    janbernat
    Poziom 38  
    Nie znam C- odróżniam tylko czy coś jest napisane w C czy nie.
    Nie wiem gdzie w Twoim programie jest odpowiednik "rotate".
    Czy do odbioru impulsów STEP używasz rejestru UDR?
  • #32
    M. S.
    Poziom 34  
    Toż to BASCOM!

    Code:
    '$sim
    
    $regfile = "ATtiny2313.dat"
    $crystal = 20000000

    $hwstack = 64
    $swstack = 16
    $framesize = 32

    Enable Interrupts
    Config Int1 = Falling
    Enable Int1                                                 'włączenie przerwania
    On Int1 Imp

    Config Timer1 = Timer , Prescale = 64
    Enable Timer1                                               'włączenie przerwania
    On Timer1 Wylacz
    Stop Timer1

    Config Timer0 = Timer , Prescale = 1024
    Enable Timer0                                               'włączenie przerwania
    On Timer0 Migaj
    Start Timer0


    Config Portb.0 = Output : Portb.0 = 1
    Config Portb.1 = Output : Portb.1 = 1
    Config Portb.2 = Output : Portb.2 = 1
    Config Portb.3 = Output : Portb.3 = 1


    Config Portd.6 = Output : Portd.6 = 1 : Wy Alias Portd.6    'Wyjscie

    Config Portd.0 = Input : Portd.0 = 1 : Res Alias Pind.0     'Reset
    Config Portd.1 = Input : Portd.1 = 1 : Sstop Alias Pind.1   'Stop/Start
    Config Pind.5 = Input : Portd.5 = 1 : Lewo Alias Pind.5     'Do klawiatury
    Config Pind.4 = Input : Portd.4 = 1 : Prawo Alias Pind.4    'Do klawiatury
    Config Pind.3 = Input : Portd.3 = 1                         ': INT1 Imp Alias Pind.3      'Do kompa
    Config Pinb.4 = Input : Portb.4 = 1 : Kierunek Alias Pinb.4 'Do kompa

    Dim Faza As Byte
    Dim Kier As Bit
    Dim Ststo As Bit
    Dim _imp As Byte
    Dim Licznik As Long
    Dim Miganie As Bit
    Dim Miganie1 As Byte
    Dim Dom As Word
    Dim X As Word

    Faza = &B10000000
    Ststo = 0                                                   'zmien

    Do


    '**** STAN PRZYCISKÓW STERUJĄCYCH ****
    Debounce Sstop , 0 , Start_stop , Sub
    Debounce Res , 0 , Zeruj , Sub

    '**** ODBIÓR DANYCH Z KOMPUTERA ****
    If Ststo = 1 Then                                           'JEŚLI JEST ZEZWOLENIE NA PRACĘ
       If _imp > 1 Then Set Wy                                  'SYGNALIZACJA GUBIENIA IMPULSÓW
       If _imp > 0 Then                                         'JEŚLI IMPULS
          Kier = Kierunek                                       'SPRAWDŹ KIERUNEK
          Gosub Steruj                                          'STERUJ SILNIK
          _imp = 0                                              'ZERUJ WSKAŹNIK IMPULSU
       End If
    Else
    Wy = Miganie
    End If


    '**** STEROWANIE PRZYCISKAMI PRAWO ****
    If Prawo = 0 And Lewo = 1 Then
          Timer0 = 0
          Miganie1 = 0
          Miganie = 0
          Reset Wy
      Kier = 1
      Waitms 25
      If Prawo = 0 And Lewo = 1 Then
         Gosub Steruj
         Waitms 250
      End If
      While Prawo = 0 And Lewo = 1
         Gosub Steruj
      Wend

    End If


    '**** STEROWANIE PRZYCISKAMI lEWO ****
    If Lewo = 0 And Prawo = 1 Then
          Timer0 = 0
          Miganie1 = 0
          Miganie = 0
          Reset Wy
      Kier = 0
      Waitms 25
      If Lewo = 0 And Prawo = 1 Then
         Gosub Steruj
         Waitms 250
      End If
      While Lewo = 0 And Prawo = 1
         Gosub Steruj
      Wend

    End If                                                      'Zmien

    Loop
    End

    Migaj:
    Incr Miganie1
    If Miganie1 = 29 Then
       Miganie1 = 0
       Toggle Miganie
    End If
    Return

    Imp:
    Incr _imp                                                   'ZWIEKSZ WSKAŹNIK IMPULSU
    Return

    Start_stop:
    Timer0 = 0
    Miganie1 = 0
    Miganie = 0
    Reset Wy
    Toggle Ststo
       If Ststo = 0 Then
          Start Timer0

       Else
          Stop Timer0
       End If                                                   'PRZEŁACZ ZEZWOLENIE NA PRACĘ
    Return

    Dozero:

    Kier = 1
    For X = 1 To 6000                                           'Podniesienie o 3cm.
    Gosub Steruj
    Next X

    Do : Loop Until Res = 0
    Waitms 250                                                  'Oczekiwanie na krótkie przyciśnęcie res
    Do : Loop Until Res = 1

    Do
       If Licznik < 0 Then
          Kier = 1                                              'Sprowadź do poz "0"
          Gosub Steruj
       End If
       If Licznik > 0 Then
          Kier = 0
          Gosub Steruj
       End If
    Loop Until Licznik = 0 Or Res = 0                           'Zatrzymaj  po wciśnięciu Reset
    Return

    Wylacz:
     Stop Timer1
     Portb = &B00001111                                         'PO CZASIE WYŁACZ ZASILANIE SILNIKA
    Return

    Zeruj:
    Disable Int0
    Stop Timer0
    Timer0 = 0
    Miganie1 = 0
    Miganie = 0
    Reset Wy

    Dom = 0

    Do
     Waitms 5
     Incr Dom
     If Dom = 200 Then
     Set Wy : Waitms 500 : Reset Wy
     End If
    Loop Until Dom = 500 Or Res = 1

    If Dom >= 400 Then Gosub Dozero
    If Dom >= 200 And Dom < 400 Then Licznik = 0
    If Ststo = 0 Then Start Timer0
    Enable Int1
    Return

    Steruj:
    If Kier = 1 Then
       Incr Licznik
       Rotate Faza , Left : Gosub Silnik        ' TU JEST ROTATE
       Rotate Faza , Left : Gosub Silnik
    Else
       Decr Licznik
       Rotate Faza , Right : Gosub Silnik
       Rotate Faza , Right : Gosub Silnik
    End If
    Timer1 = 0
    Start Timer1
    Return

    Silnik:
    Select Case Faza
       Case &B00000001 : Portb = &B00001100
       Case &B00000010 : Portb = &B00001101
       Case &B00000100 : Portb = &B00001001
       Case &B00001000 : Portb = &B00001011
       Case &B00010000 : Portb = &B00000011
       Case &B00100000 : Portb = &B00000111
       Case &B01000000 : Portb = &B00000110
       Case &B10000000 : Portb = &B00001110
    End Select
    Waitus 700
    Return
  • Pomocny post
    #33
    janbernat
    Poziom 38  
    Kurcze, otworzyłem nie tego rar-a.
    Dlaczego dajesz dwa razy rotate?
    Po co te 700us opóźnienia?
    Mach chyba ma posuwy ręczne- to dodatkowe sterowanie to dla wygody?
    A co do przerwań zewnętrznych- na pewno dobre.
    Ale ja jestem "skąpiradło" i zawsze mi szkoda- bo może się później przyda.
    Dlatego do sprawdzania stanu zrobiłem programowy przerzutnik T i zamiast flagi dałem temp_0 i temp_1.
    Sygnał sterujący to nie przycisk więc żadnych drgań nie powinno być.
    No i z tego wszystkiego muszę przerobić mój poprzedni program do sterowania L6219
    skoro już wiem jak użyć bufora z krążącą 1.
  • #34
    Tomek12_86
    Poziom 15  
    Sprawdziłem i wszystko działa bez problemu a działanie jest takie samo jak w poprzednim przypadku. No ale na pewno to rozwiązanie daje pewność sterowania silnikiem. Co do zasilania też myślałem o źródle prądowym myślę że do moich zastosowań - czysto edukacyjnych i domowych ten sposób wystarczy w zupełności... Założeniem tej całej konstrukcji miała być jak najniższa cena i prostota wykonania, dlatego zdecydowałem się na kombinacje z prockiem żeby było taniej:)
    W założeniach początkowych myślałem aby zaaplikować sterowanie trzema silnikami do jakiegoś jednego większego procka typu Atmega32, ale widzę że jest to trudna sztuka i synchronizacja tych impulsów była by raczej nie możliwa do zrobienia... Ale 3 Attiny kosztują tyle co jedna Atmega więc darujmy sobie kombinacje :)
    Jeszcze raz dzięki za pomoc wszystkim którzy się zainteresowali tym tematem.
    Pozdro.
    Tomek12_86.
  • #35
    M. S.
    Poziom 34  
    Cytat:
    Dlaczego dajesz dwa razy rotate?

    Pisałem już, że sterownik za jednym razem robi półkrok i dopełnia do pełnego kroku, aby pozostawić silnik w stabilnej pozycji. Mam śruby o skoku 1mm więc i tak dokładność pozycjonowania = 0,005mm. co mi wystarcza.
    Cytat:
    Po co te 700us opóźnienia?

    To jest czas w którym silnik wykonuje półkrok. Jest dobrany doświadczalnie tak aby wirnik nie zrywał "synchronizacji" z polem magnetycznym, a silnik kręcił się najszybciej jak można. Oczywiście jest tam zapas.
    Cytat:
    Mach chyba ma posuwy ręczne

    Ja nie stwierdziłem. Nawet gdyby miał to korzystanie z ręcznego sterowania podczas ustalania "0" jest dużo wygodniejsze niż klikanie myszą.
    Cytat:
    się później przyda

    Pamięć 2313 jest już pełna więc nic się nie przyda.
  • #36
    Tomek12_86
    Poziom 15  
    Witam.

    Odnawiam temat ponieważ mam problem z uruchomieniem gotowego sterownika...
    Wersja na płytce testowej działała bez zarzutu, a po złożeniu na gotowej płytce za nic nie moge uruchomić tego sterownika, nie reaguje wcale na sygnał STEP podawany z komputera jak i zwieranie ręczne...
    Prosze kogoś o przeanalizowanie i spojrzenie trzeźwym okiem na schemat i projekt płytki i wskazanie jakiegoś błędu, ponieważ patrze cały czas na to i nie moge nic dostrzec... A wiadomo, że najprostrze błędy najtrudniej wykryć.

    Pozdrawiam Tomek12_86.
  • #37
    M. S.
    Poziom 34  
    Schemat bez programu nic nie da.
    Żeby silnik miał możliwość zadziałać na wejście 3 podać stan wysoki. To takie wejście ENABLE. Pozostawione w powietrzu powoduje brak masy na emiterach tranzystorów sterujących.
  • #38
    Tomek12_86
    Poziom 15  
    Nie wiem czy kolega spojrzał na temat chociaż pobieżnie, jesli tak to powinien doczytać, że program którego używam jest kilka postów wyżej... A co do enable to oczywiście wiem że musi byc tam napięcie - sam projektowałem tą płytkę... teraz zwarte jest akurat na stałe tak jak i źródło prądowe na LM aby wykluczyć chociaż te dwa powody niemożności działania.
    Czekam na jakąś podpowiedź:)