Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[attiny2313][BASCOM] Sterownik silnika krokowego

Damianryba 09 Feb 2010 21:47 12698 20
  • #1
    Damianryba
    Level 12  
    Witam !
    Napisałem prosty sterownik silnika krokowego który odbiera impulsy Dir i Step i odpowiednio steruje silnikiem. Jednak przy kompilacji wyskakuje błąd nie wiem jak go usunąć. Nie wiem także czy ten program będzie działał. Proszę o sprawdzenie go i ewentualnie wytłumaczenia na czym polega błąd.


    $regfile = "attiny2313.dat"
    $crystal = 10000000
    
    Config Portb = Output                                       'port b jako wyście  (silnik)
    Config Portd = Input                                        'port d jako wyjście (z kompa i klawisze)
    
    
    Portb = &B00000001
    Portd = &B00000000
    
    
    
    
    
    
    
    Do
    
    Do
    Loop Until Portd.5 = 0
    
    
    Do
    Loop Until Portd.5 = 1
    
    
                                                                        'obroty lewo
      If Portd.5 = 1 And Portd.4 = 1 Then
       If Portb.0 = 1 Then Portb.1 = 1
       Waitms 5
       Portb.0 = 0
       Else
       If Portb.1 = 1 Then Portb.2 = 1
       Waitms 5
       Portb.1 = 0
       Else
       If Portb.2 = 1 Then Portb.3 = 1
       Waitms 5
       Portb.2 = 0
       Else
       If Portb.3 = 1 Then Portb.0 = 1
       Waitms 5
       Portb.3 = 0
       End If
    
      Else
    
       If Portd.5 = 1 And Portd.4 = 0 Then                      'obroty prawo
        If Portb.0 = 1 Then Portb.3 = 1
        Waitms 5
        Portb.0 = 0
        Else
        If Portb.1 = 1 Then Portb.0 = 1
        Waitms 5
        Portb.1 = 0
        Else
        If Portb.2 = 1 Then Portb.1 = 1
        Waitms 5
        Portb.2 = 0
        Else
        If Portb.3 = 1 Then Portb.2 = 1
        Waitms 5
        Portb.3 = 0
        End If
    
      End If
    
    
    
     If Portd.2 = 1 Then                                        'obsuga klawisza lewego
     Waitms 5
     If Portd.2 = 1 Then
       If Portb.0 = 1 Then Portb.1 = 1
       Waitms 5
       Portb.0 = 0
       Else
       If Portb.1 = 1 Then Portb.2 = 1
       Waitms 5
       Portb.1 = 0
       Else
       If Portb.2 = 1 Then Portb.3 = 1
       Waitms 5
       Portb.2 = 0
       Else
       If Portb.3 = 1 Then Portb.0 = 1
       Waitms 5
       Portb.3 = 0
       End If
    
      Else
                                                                         'obsługa klawisza prawego
      If Portd.3 = 1 Then
      Waitms 5
      If Portd.3 = 1 Then
        If Portb.0 = 1 Then Portb.3 = 1
        Waitms 5
        Portb.0 = 0
        Else
        If Portb.1 = 1 Then Portb.0 = 1
        Waitms 5
        Portb.1 = 0
        Else
        If Portb.2 = 1 Then Portb.1 = 1
        Waitms 5
        Portb.2 = 0
        Else
        If Portb.3 = 1 Then Portb.2 = 1
        Waitms 5
        Portb.3 = 0
        End If
    
      End If
    Loop



    portb. 0 1 2 3 - do tranzystorów sterujących silnikiem

    Portd.5 - step
    Portd.4 - dir
    Portd.3 - klawisz ręcznego przesuwu
    Portd.2 - klawisz ręcznego przesuwu
  • #2
    marco47
    Level 41  
    Nie będzie działał bo za dużo jest Do
    Powinna być tylko jedna pętla Do..Loop
  • #3
    Damianryba
    Level 12  
    Dlaczego tylko jedna ? Jaka jest maksymalna liczba?
  • Helpful post
    #4
    marco47
    Level 41  
    Nie ma maksymalnej liczby tylko możliwości piszącego program .
    Jeżeli to są początki przygody z Bascom'em to pozostań przy jednej pętli Do..Loop .
    A jeżeli nie kompiluje to zaremuj wszystko co w pętli i dopiero krok po kroku dodawaj nowe linie kodu tworzące logiczną całość , cały czas kompilując ( sprawdzając poprawność kodu ) . Nigdy nie pisz programu w całości , bo nigdy nie dojdziesz gdzie masz błąd .
  • #5
    Jarek1988
    Level 11  
    Czy mógłbyś posłać schemat połączenie mikroprocesora przez tranzystory (jakie tranzystory używasz) z tym silnikiem krokowym (na jakie napięcie masz ten silnik) ?

    Z góry dziękuje
  • #7
    ~~~pio~~~
    Level 15  
    Przedstawiam program obsługi silnika krokowego w Baskomie dla atmegi8 , jest to zmodyfikowany program z książki M. Wiazani. Program działa tak (obsługa trzema przyciskami): Wyświetla się komunikat na LCD ilość obrotów potem jak prędkość a na końcu jaki kierunek (prawo,lewo) . Myślę ze ten program komuś się przyda.
    
    
    
    '###################PROGRAM OBSLUGI SILNIKA KROKOWEGO BY JP#############################
    ' ###############################Atmega8_Bascom########################################
    
    
                                                                'Dyrektywy
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
    
    $crystal = 8000000                                          'informuje kompilator
                                                                 'o częstotliwości oscylatora
                                                                 'taktującego mikrokontroler
    
    
                                                       'Konfiguracja LCD
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
                                                        'Konfiguracja we/wy
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    
    
    Set Portd.0                                                 'podciagniecie wejsc
     Set Portd.1
     Set Portd.2
    
    
    Config Debounce = 20                                        'ustawienie opuźnienia
                                                                  'eliminaca drgan
    
    Cursor Off                                                  'Wylaczenie kursora
    
    
    
     '*****************************Procedury**********************************
       Declare Sub Mainprogram
       Declare Sub Foursteps_l
       Declare Sub Foursteps_p
       Declare Sub Ddelay
    
    
     '****************************Zmienne************************************
    
       Dim R As Word
       Dim 4steps As Byte
       Dim Rotations As Word
       Dim Czas As Byte
       Dim X As Byte
    
      '************Ustawinie zmiennych i zresetowanie portów*****************
    
       Czas = 1
       Rotations = 1
       4steps = 12
    
       Reset Portd.3
        Reset Portd.4
         Reset Portd.5
          Reset Portd.6
    
    
       '#############################Program#####################################
    
       Sub Mainprogram                                          'ustawinie obrotów
       Cls
       Lcd "Obroty:" ; Rotations
       Do
                Debounce Pind.0 , 0 , Decrturns , Sub
                Debounce Pind.1 , 0 , Incrturns , Sub
                Debounce Pind.2 , 0 , Czass , Sub
       Loop
       End Sub
    
    
                               'procedura obrotu silnika cztery kroki ,lewe obroty
       Sub Foursteps_l
       Set Portd.3 : Reset Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Set Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Reset Portd.4 : Set Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Reset Portd.4 : Reset Portd.5 : Set Portd.6
       Call Ddelay
       End Sub
    
    
                                'procedura obrotu silnika cztery kroki ,prawe obroty
    
    
       Sub Foursteps_p
       Reset Portd.3 : Reset Portd.4 : Reset Portd.5 : Set Portd.6
       Call Ddelay
       Reset Portd.3 : Reset Portd.4 : Set Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Set Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       Set Portd.3 : Reset Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       End Sub
    
    
    
    
       Sub Ddelay                                               'procedura predkosci
       Waitms Czas
       End Sub
    
    
      '*****************************PODPROGRAMY********************************
    
    
            Czass:                                              'Ustawiwnie predkosci
        Cls
        Lcd "Ilosc Obrotow "
        Lcd Rotations
        Lowerline
        Lcd "Predkosc"
    
        Do
                Debounce Pind.0 , 0 , Decrczas , Sub
                Debounce Pind.1 , 0 , Incrczas , Sub
                Debounce Pind.2 , 0 , Wybierz_kierunek , Sub
    
    
        Loop
       Return
    
       Wybierz_kierunek:                                        'ustawienie kierunku
       Cls
       Lcd "Wybierz Kierunek"
        Lowerline
        Lcd "Lewo s1 Prawo s2"
    
       Do
    
              Debounce Pind.1 , 0 , Kierunek_p , Sub
                Debounce Pind.0 , 0 , Kierunek_l , Sub
    
    
             Loop
    
             Return
    
    
      Kierunek_l:                                               'Lewo
       Cls
       Lcd "Wait"
       Wait 2
       Cls
       Lcd "Working...Lewe"
       For R = 1 To Rotations
       For X = 1 To 4steps
          Call Foursteps_l
             Next X
             Locate 2 , 4
             Lcd R
             Locate 2 , 6
             Lcd "obroty"
          Next R
    
        Reset Portd.3
        Reset Portd.4
         Reset Portd.5
          Reset Portd.6
       Cls
       Call Mainprogram
       Return
    
    
    
         Kierunek_p:                                            'Prawo
       Cls
       Lcd "Wait"
       Wait 2
       Cls
       Lcd "Working...Prawe"
       For R = 1 To Rotations
       For X = 1 To 4steps
          Call Foursteps_p
             Next X
             Locate 2 , 4
             Lcd R
              Locate 2 , 6
             Lcd "obroty"
          Next R
    
        Reset Portd.3
        Reset Portd.4
         Reset Portd.5
          Reset Portd.6
       Cls
       Call Mainprogram
       Return
    
    
    
      Decrturns:                                              ' zmniejszenie obrotów
    
      Decr Rotations
             If Rotations = 0 Then
             Rotations = 1
             End If
    
      Locate 1 , 8
      Lcd "   "
      Locate 1 , 8
      Lcd Rotations
      Waitms 50
      Return
    
      Incrturns:                                                'zwiekszenie obrotów
      Incr Rotations
                If Rotations = 65536 Then
                Rotations = 65535
                End If
    
      Locate 1 , 8
      Lcd "   "
      Locate 1 , 8
      Lcd Rotations
      Waitms 50
      Return
    
    
    
    
    
      Decrczas:                                                 'zmniejszenie predkosci
    
      Decr Czas
        If Czas = 0 Then
             Czas = 1
             End If
    
      Locate 2 , 10
      Lcd "   "
      Locate 2 , 10
      Lcd Czas
       Locate 2 , 13
       Lcd "ms"
      Return
                                                              'zwiekszenie predkosci
    
    
      Incrczas:
    
      Incr Czas
         If Czas = 255 Then
             Czas = 254
             End If
    
    
          Locate 2 , 10
      Lcd "   "
      Locate 2 , 10
      Lcd Czas
         Locate 2 , 13
        Lcd "ms"
      Return
    
  • #8
    Sebastian.R
    Level 20  
    A ja napisałem program sterownika dwóch silników krokowych na jednym Attiny2313 i powiem że chodzi to pięknie :) . Jest możliwość wybrania 4 prędkości obrotowych , oprócz tego oba koła mogą kręcić się w tą samą stronę (w tył lub w przód) , albo też pojedyncze kółko (też do wyboru kierunek) . Za pomocą 2 + 4 przycisków



    
    ' Sterowanie silnikami krokowymi czołgu
    'Fusebity :    CKSEL3..0 = "0011",
     '               SUT1..0 = "11"
     '               CKDIV8  = "1"
    
    $crystal = 4000000                                          'Deklaracja częstotliwości kwarcu
    $regfile "attiny2313.dat"                                   'Deklaracja modelu procesora
    Config Portb = Output                                       'Konfiguracja portu B (wszystkie linie jako wyjścia)
    Portb = &B00000000                                          'Stan początkowy portu B (wszystkie linie w stanie niskim)
    Config Portd = Input                                        'Konfiguracja Portu D (wszystkie linie jako wejścia)
    Portd = &B1111111                                           'Stan początkowy linii portu D (wszystkie linie w stanie wysokim)
    
    Dim I As Byte                                               'Definicja zmiennej bajtowej licznika kroków
    Dim Czas As Byte                                            'Definicja zmiennej bajtowej czasu opóźnienia pomiędzy krokami
    Declare Sub L_wprawo
    Declare Sub L_wlewo
    Declare Sub P_wprawo
    Declare Sub P_wlewo
    Declare Sub W_przod
    Declare Sub W_tyl
    
    
    Declare Sub Opoznienie                                      'Deklaracja procedury opóźniającej kolejne kroki
    
    Czas = 1                                                    'Startowa wartość zmiennej czas
    
    Do                                                          'Początek pętli nieskończonej
    
    If Pind.2 = 0 And Pind.3 = 1 And Pind.4 = 1 And Pind.5 = 1 Then L_wprawo       'Badanie stanu pinu wejściowego (kierunek obrotu)
    If Pind.3 = 0 And Pind.2 = 1 And Pind.4 = 1 And Pind.5 = 1 Then L_wlewo
    If Pind.4 = 0 And Pind.2 = 1 And Pind.3 = 1 And Pind.5 = 1 Then P_wprawo
    If Pind.5 = 0 And Pind.2 = 1 And Pind.3 = 1 And Pind.4 = 1 Then P_wlewo
    If Pind.2 = 0 And Pind.3 = 1 And Pind.4 = 0 And Pind.5 = 1 Then W_przod
    If Pind.2 = 1 And Pind.3 = 0 And Pind.4 = 1 And Pind.5 = 0 Then W_tyl
    If Pind.2 = 1 And Pind.3 = 1 And Pind.4 = 1 And Pind.5 = 1 Then Portb = &B00000000       'Jeśli oba w stanie niskim silnik nie pracuje
    
    
    If Pind.0 = 0 And Pind.1 = 0 Then Czas = 6
    If Pind.1 = 0 And Pind.0 = 1 Then Czas = 12
    If Pind.1 = 1 And Pind.0 = 0 Then Czas = 24                 'Badanie stanu pinu wejściowego (prędkość obrotu na podstawie przypisanego opóźnienia)                                 'Badanie stanu pinu wejściowego (prędkość obrotu na podstawie przypisanego opóźnienia)
    If Pind.0 = 1 And Pind.1 = 1 Then Czas = 36                 'Badanie pinu odpowiedzialnego za hamulec
    
    Loop                                                        'Koniec pętli nieskończonej
    
    Sub L_wprawo :                                              'procedura generowania sekwencji obracającej w prawo
    For I = 0 To 3                                              'liczymy w pęli skończonej od 0 do 7
    Portb = Lookup(i , Sekwencja_1)                             'w każdym stanie licznika przypisujemy do portu sekwencję z tabeli danych
    Call Opoznienie                                             'Wywołujemy procedurę opóźnienie
    Next                                                        'Następny krok
    End Sub                                                     'koniec procedury
    
    Sub L_wlewo :
    For I = 0 To 3
    Portb = Lookup(i , Sekwencja_2)
    Call Opoznienie
    Next
    End Sub
    
    Sub P_wprawo :                                              'procedura generowania sekwencji obracającej w prawo
    For I = 0 To 3                                              'liczymy w pęli skończonej od 0 do 7
    Portb = Lookup(i , Sekwencja_3)                             'w każdym stanie licznika przypisujemy do portu sekwencję z tabeli danych
    Call Opoznienie                                             'Wywołujemy procedurę opuźnienie
    Next                                                        'Następny krok
    End Sub                                                     'koniec procedury
    
    Sub P_wlewo :
    For I = 0 To 3
    Portb = Lookup(i , Sekwencja_4)
    Call Opoznienie
    Next
    End Sub
    
    Sub W_przod :
    For I = 0 To 3
    Portb = Lookup(i , Sekwencja_5)
    Call Opoznienie
    Next
    End Sub
    
    Sub W_tyl :
    For I = 0 To 3
    Portb = Lookup(i , Sekwencja_6)
    Call Opoznienie
    Next
    End Sub
    
    
    
    
    Sub Opoznienie :                                            'procedura opuźnienie
    Waitms Czas
    End Sub
    
    Sekwencja_1:                                                'Dane do sekwencji obracającej w prawo
    Data &B11000000 , &B01100000 , &B00110000 , &B10010000
    Sekwencja_2:                                                'Dane do sekwencji obracającej w lewo
    Data &B10010000 , &B00110000 , &B01100000 , &B11000000
    Sekwencja_3:                                                'Dane do sekwencji obracającej w prawo
    Data &B00001100 , &B00000110 , &B00000011 , &B00001001
    Sekwencja_4:                                                'Dane do sekwencji obracającej w lewo
    Data &B00001001 , &B00000011 , &B00000110 , &B00001100
    Sekwencja_5:                                                'Dane do sekwencji obracającej oba w przód
    Data &B11001100 , &B01100110 , &B00110011 , &B10011001
    Sekwencja_6:                                                'Dane do sekwencji obracającej  oba w tył
    Data &B10011001 , &B00110011 , &B01100110 , &B11001100
    

    Oparłem się o kod ze strony portalnaukowy.republika.pl
  • #9
    hanibal0
    Level 11  
    ~~~pio~~~ wrote:
    Przedstawiam program obsługi silnika krokowego w Baskomie dla atmegi8 , jest to zmodyfikowany program z książki M. Wiazani. Program działa tak (obsługa trzema przyciskami): Wyświetla się komunikat na LCD ilość obrotów potem jak prędkość a na końcu jaki kierunek (prawo,lewo) . Myślę ze ten program komuś się przyda.
    
    
    
    '###################PROGRAM OBSLUGI SILNIKA KROKOWEGO BY JP#############################
    ' ###############################Atmega8_Bascom########################################
    
    
                                                                'Dyrektywy
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
    
    $crystal = 8000000                                          'informuje kompilator
                                                                 'o częstotliwości oscylatora
                                                                 'taktującego mikrokontroler
    
    
                                                       'Konfiguracja LCD
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
                                                        'Konfiguracja we/wy
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    
    
    Set Portd.0                                                 'podciagniecie wejsc
     Set Portd.1
     Set Portd.2
    
    
    Config Debounce = 20                                        'ustawienie opuźnienia
                                                                  'eliminaca drgan
    
    Cursor Off                                                  'Wylaczenie kursora
    
    
    
     '*****************************Procedury**********************************
       Declare Sub Mainprogram
       Declare Sub Foursteps_l
       Declare Sub Foursteps_p
       Declare Sub Ddelay
    
    
     '****************************Zmienne************************************
    
       Dim R As Word
       Dim 4steps As Byte
       Dim Rotations As Word
       Dim Czas As Byte
       Dim X As Byte
    
      '************Ustawinie zmiennych i zresetowanie portów*****************
    
       Czas = 1
       Rotations = 1
       4steps = 12
    
       Reset Portd.3
        Reset Portd.4
         Reset Portd.5
          Reset Portd.6
    
    
       '#############################Program#####################################
    
       Sub Mainprogram                                          'ustawinie obrotów
       Cls
       Lcd "Obroty:" ; Rotations
       Do
                Debounce Pind.0 , 0 , Decrturns , Sub
                Debounce Pind.1 , 0 , Incrturns , Sub
                Debounce Pind.2 , 0 , Czass , Sub
       Loop
       End Sub
    
    
                               'procedura obrotu silnika cztery kroki ,lewe obroty
       Sub Foursteps_l
       Set Portd.3 : Reset Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Set Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Reset Portd.4 : Set Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Reset Portd.4 : Reset Portd.5 : Set Portd.6
       Call Ddelay
       End Sub
    
    
                                'procedura obrotu silnika cztery kroki ,prawe obroty
    
    
       Sub Foursteps_p
       Reset Portd.3 : Reset Portd.4 : Reset Portd.5 : Set Portd.6
       Call Ddelay
       Reset Portd.3 : Reset Portd.4 : Set Portd.5 : Reset Portd.6
       Call Ddelay
       Reset Portd.3 : Set Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       Set Portd.3 : Reset Portd.4 : Reset Portd.5 : Reset Portd.6
       Call Ddelay
       End Sub
    
    
    
    
       Sub Ddelay                                               'procedura predkosci
       Waitms Czas
       End Sub
    
    
      '*****************************PODPROGRAMY********************************
    
    
            Czass:                                              'Ustawiwnie predkosci
        Cls
        Lcd "Ilosc Obrotow "
        Lcd Rotations
        Lowerline
        Lcd "Predkosc"
    
        Do
                Debounce Pind.0 , 0 , Decrczas , Sub
                Debounce Pind.1 , 0 , Incrczas , Sub
                Debounce Pind.2 , 0 , Wybierz_kierunek , Sub
    
    
        Loop
       Return
    
       Wybierz_kierunek:                                        'ustawienie kierunku
       Cls
       Lcd "Wybierz Kierunek"
        Lowerline
        Lcd "Lewo s1 Prawo s2"
    
       Do
    
              Debounce Pind.1 , 0 , Kierunek_p , Sub
                Debounce Pind.0 , 0 , Kierunek_l , Sub
    
    
             Loop
    
             Return
    
    
      Kierunek_l:                                               'Lewo
       Cls
       Lcd "Wait"
       Wait 2
       Cls
       Lcd "Working...Lewe"
       For R = 1 To Rotations
       For X = 1 To 4steps
          Call Foursteps_l
             Next X
             Locate 2 , 4
             Lcd R
             Locate 2 , 6
             Lcd "obroty"
          Next R
    
        Reset Portd.3
        Reset Portd.4
         Reset Portd.5
          Reset Portd.6
       Cls
       Call Mainprogram
       Return
    
    
    
         Kierunek_p:                                            'Prawo
       Cls
       Lcd "Wait"
       Wait 2
       Cls
       Lcd "Working...Prawe"
       For R = 1 To Rotations
       For X = 1 To 4steps
          Call Foursteps_p
             Next X
             Locate 2 , 4
             Lcd R
              Locate 2 , 6
             Lcd "obroty"
          Next R
    
        Reset Portd.3
        Reset Portd.4
         Reset Portd.5
          Reset Portd.6
       Cls
       Call Mainprogram
       Return
    
    
    
      Decrturns:                                              ' zmniejszenie obrotów
    
      Decr Rotations
             If Rotations = 0 Then
             Rotations = 1
             End If
    
      Locate 1 , 8
      Lcd "   "
      Locate 1 , 8
      Lcd Rotations
      Waitms 50
      Return
    
      Incrturns:                                                'zwiekszenie obrotów
      Incr Rotations
                If Rotations = 65536 Then
                Rotations = 65535
                End If
    
      Locate 1 , 8
      Lcd "   "
      Locate 1 , 8
      Lcd Rotations
      Waitms 50
      Return
    
    
    
    
    
      Decrczas:                                                 'zmniejszenie predkosci
    
      Decr Czas
        If Czas = 0 Then
             Czas = 1
             End If
    
      Locate 2 , 10
      Lcd "   "
      Locate 2 , 10
      Lcd Czas
       Locate 2 , 13
       Lcd "ms"
      Return
                                                              'zwiekszenie predkosci
    
    
      Incrczas:
    
      Incr Czas
         If Czas = 255 Then
             Czas = 254
             End If
    
    
          Locate 2 , 10
      Lcd "   "
      Locate 2 , 10
      Lcd Czas
         Locate 2 , 13
        Lcd "ms"
      Return
    


    mógłbyś zamieścić schemat podłączenia silnika? nie rozumiem dlaczego są 4 wyjścia, do których powinien być podłączony silnik?
  • #10
    gregoorr
    Level 17  
    [/quote]

    mógłbyś zamieścić schemat podłączenia silnika? nie rozumiem dlaczego są 4 wyjścia, do których powinien być podłączony silnik?[/quote]

    Wszystko jest bardzo prościutkie, wystarczy tylko zrozumieć zasadę działania. Jest dużo materiału w necie, wystarczy poszukać. AVT wypuściło nawijarkę do cewek na silnikach krokowych. W artykule opisano sposób sterowania silnikiem, jest też i schemat:
    Nawijarka
  • #12
    hanibal0
    Level 11  
    powiem szczerze ze nie mam dużego doświadczenia z mikrokontrolerami i obecnie nie dysponuję czasem aby się zagłębiać ale potrzebuję wykonać pewien sterownik i zastanawiam się czy jest to w ogóle możliwe. Zatem program miałby sterować silnikiem 230V, to akurat nie problem, chodzi o to że sterownik ma kontrolować pracę wyciągarki i praca ma się odbywać za pomocą 3 przycisków (góra, stop, dół). Niby nic skomplikowanego ale problem w tym, że praca ma się odbywać w kilku opcjach i co najtrudniejsze sterownik musi wykorzystywać wewnętrzny timer lub licznik procesora. Konkretnie chodzi o to aby móc programować sterownik na bieżąco i szybko, tzn. ja to rozumiem tak:
    uruchamiam programowanie, wykonuję ręcznie jeden cykl góra i dół i wpisuję do pamięci, następnie naciśnięcie przycisku dół, powoduje opuszczenie wyciągarki na zadaną wysokość i zatrzymanie wyciągarki, kolejne wciśnięcie klawisza "góra" powoduje wciągnięcie na zadaną wysokość, itd.
    oczywiście zakładam że wciśnięcie i trzymanie klawisza "góra" lub "dół" spowoduje pracę ręczną wyciągarki, a użycie timera lub licznika uruchamiane będzie krótkim wciśnięcie klawisza.
    czy jest taka możliwość aby programować licznik lub timer w gotowym układzie za pomocą zmiennych?

    trochę to zagmatwałem ale mam nadzieję że ktoś zrozumie o co mi chodzi...
  • #13
    Sebastian.R
    Level 20  
    silnik 230V ? heh ... my tu mówimy o silnikach krokowych.

    Aby móc sterować silnikiem jednofazowym potrzeba przemiennika częstotliwości (sinusoidalnej). Można wtedy zmieniać jego prędkość obrotową ale na pewno nie da się go puścić w drugą stronę.
    Dlatego Ty potrzebujesz silnika krokowego i to z przekładnią. Takie silniki są zdeczka większe niż te nad którymi my tutaj się "rozczulamy".
    Jasne że z napieciem rzędu 40V na uzwojenie da się sterować poprzez "klucze" MOSFET ale sama konstrukcja będzie "słusznych" rozmiarów skoro chcesz zrobić wciągarkę "góra-dół" nie dość że programowalną to jeszcze ze mienną prędkością podnoszenia/opuszczania (weź 100kg nagle zatrzymaj przy opuszczaniu :) ).
    Zależy od mocy silnika i od udżwigu sprawa może podpadać pod UDT (Urząd Dozoru Technicznego).
    Jaki ciężar chcesz tym dźwiagać ?
  • #14
    hanibal0
    Level 11  
    przede wszystkim dzięki za zainteresowanie, trochę nie jasno się wypowiedziałem, może powinienem to napisać w innym dziale ale nie chcę specjalnie zakładać wątku. Więc sprawa wygląda tak: wyciągarkę już mam, jest to typowa wciągarka budowlana, zasilana na 230V, udźwig 200kg, ma ona pilota (na kablu), którym się operuje, z tym że pilot pozwala tylko na pracę góra i dół a przyciski trzeba trzymać przez cały czas opuszczania i podnoszenia. No i właśnie w tym problem że trzymanie przycisku to strata czasu bo w tym momencie można zrobić coś innego. Chcę dorobić taki sterownik, który pozwoli na zapamiętanie odległości opuszczania i podnoszenia i pozwoli jednym wciśnięciem uruchomić opuszczanie lub podnoszenie do zadanego położenia. Winda jest montowana na różnych wysokościach, ale zazwyczaj kiedy jest już zamontowana to na dłuższy czas, dlatego potrzebuję mieć możliwość programowania odległości opuszczania z pilota. Kwestia rozmiarów to raczej nie problem bo całą elektronikę zasilania jestem w stanie zrobić w puszce 10cm na 10cm i to mi wystarcza.

    Na różnych prędkościach mi nie zależy, wystarczy że będzie uruchamiał tą prędkość która jest teraz, a zatrzymanie 100kg nie stanowi problemu, bo w dół winda zazwyczaj jedzie z obciążeniem 5kg a prędkość silnika jest wolna więc nie powinno być problemu chociażby dlatego że sterując pilotem można to zrobić puszczając po prostu przycisk i winda staje.
  • #15
    janbernat
    Level 38  
    hannibal0- to jest tak specjalnie zrobione żebyś cały czas trzymał przycisk.
    Taka wciągarka nie ma zabezpieczeń.
    Pewnie tylko dlatego UDT dopuścił ją do sprzedaży że cały czas ktoś to musi kontrolować.
    Jak coś komuś spuści na głowę to będzie kogo pociągnąć za odpowiedzialność.
    Jak będzie zaprogramowana- to trzeba bariery foto stawiać dookoła.
  • #16
    hanibal0
    Level 11  
    janbernat jak najbardziej cię rozumiem, jednak nie poruszam tu kwestii bezpieczeństwa, większość czasu sam operuję to windą więc zdaję sobie sprawę z zagrożeń, jednak też nie jestem bezmyślnym człowiekiem i teren wokół windy zawsze mam zabezpieczony na całej linii, na dole zawsze są tablice ostrzegawcze i bariery dla osób postronnych, jednak wypadki zawsze chodzą po ludziach i chociażbyśmy nie wiem co robili to i tak wypadki będą zdarzały się na budowach ale nie o tym tu mówimy.
    Moje pytanie brzmiało czy da się coś takiego zrobić wykorzystując atiny lub atmega, stosując wewnętrzny timer albo licznik?
  • #17
    janbernat
    Level 38  
    Da się- ale nie tak prosto.
    Timer można wykorzystać do sterowania czasem wł/wył ale nie pozycją wciągarki.
    Pozycja będzie zależała od długości nawiniętej/rozwiniętej liny.
    Jeśli lina nawija się na bęben w kilku warstwach to nawet nie od liczby obrotów.
    Można to sobie wyobrazić tak:
    Po ustawieniu wciągarki na budowie wchodzimy w tryb ustawiania.
    Kalibrujemy na pozycji gruntu.
    Wciskamy przycisk "w górę" a Timer mierzy czas i zapamiętuje.
    I tak co piętro.
    Potem przechodzimy w tryb wykonaj i po naciśnieciu jakiegoś przycisku wciągarka pracuje określony czas.
    Oczywiście w tej metodzie nie ma żadnych zabezpieczeń.
    Gdy jesteśmy na poziomie gruntu i wciśniemy "w dół" to lina będzie się odwijać- bo skąd ma wiedzieć że jest na poziomie 0.
  • #18
    krolik3200
    Level 11  
    Witam

    Zamiast sie bawić w sterowanie które i tak nie bedzie precyzyjne na procku AVR

    z wyjatkiem sytuacji w której dołaczyłbys układ CPLD do podawania impulsów wtedy bedzie miało to jakiś sens , polecam Ci moj sterownik silników krokowych

    na układzie allegro A3979 (2.5A , 30V) ze stepem do 1/16. Proste sterowanie płytka mała z wentylatorem wszystko w cenie 30 zł a nie w sklepie bys zapłacił ponad dwa razy tyle .

    pozdrawiam
  • #19
    hanibal0
    Level 11  
    krolik3200 o jakim sterowniku mówisz, sprzedajesz gotowe czy masz schematy? no i przede wszystkim jak ten sterownik działa, czy ma możliwość sterowania już gotową wciągarką?
  • #20
    altar3
    Level 12  
    witam
    ja poszukuje sterownika silnika krokowego sterowanego impulsatorem, ma działać tak że jak impulsator kręci się w lewo to silnik też się kręci w lewo jak impulsator się zatrzyma to silnik zrobi to samo no i oczywiście w prawo to samo, czyli silnik kręci się wtedy co impulsator i w tą samą stronę.
    ma ktoś może schemat czegoś takiego?
  • #21
    emarcus
    Level 38  
    altar3 wrote:
    witam
    ja poszukuje sterownika silnika krokowego sterowanego impulsatorem, ma działać tak że jak impulsator kręci się w lewo to silnik też się kręci w lewo jak impulsator się zatrzyma to silnik zrobi to samo no i oczywiście w prawo to samo, czyli silnik kręci się wtedy co impulsator i w tą samą stronę.
    ma ktoś może schemat czegoś takiego?


    Takiego czegoś nie odwzorujesz dokładnie zadną prostą metodą nawet stosując układ podany/zareklamowany przez krolik3200.
    Po pierwsze: musiałbyś dysponować silnikiem bipolarnym. Układ(driver) A3979 umozliwia sterowanie silnikam bipolarnymi małej mocy, w relatywnie łatwy sposób. Wystarczy w zasadzie podać sygnał kierunku i serię impulsów dającą obrót o jeden krok/impuls. Z czestotliwości sterowania i charakterystyki silnika krokowego otrzymasz prędkośc obr. wałka silnika, która w zaden sposób nie będzie reprezentowała obrotów impulsatora. Owszem możesz użyc impulsator do sterowania wielkości kąta obrotu takiego silnika (lewo lub orawo) ale wtedy liczysz ilośc impulsów z impulsatora/encodera i odpowiednio przeliczasz (przydatny uC) impulsy na ilośc kroków dla silnika. Rozpoznany kierunek obrotu impulsatora w łatwy sposób uC 'zamieni' na odpowiedni sygnał wejściowy do drivera. Konieczne dostateczne oprogramowanie uC i mimo to te akcje nie zawsze muszą pokryć sie w czasie .
    Jeżeli dysponujesz siknikiem unipolarnym to ten driver nie nadaje sie do podłączenia, chyba że zechcesz go 'przerobić'/użyc jako bipolarny. Nie każdy unipolarny na taka adaptacje sie nadaje. Jeżeli wyprowadzenia środkow cewek A i B są zwarte to takiej możliwości adaptacji nie ma, ponadto wiąże sie to ze znacznymi stratami momentu obrotowego.
    Jeżeli chcesz tylko kręcić w lewo lub prawo silnikiem krokowym bipolarnym i masz do tego sterownik wyżej wspomniany to na dobrą sprawe nie potrzebny ci jest impulsator ani uC. Kierunek obrotu wybierzesz przełącznikiem, a do pulsowania wystarczy w zupełności sygnał z generatora zbudowanego na timerze 555.
    Jeżeli w ostateczności masz silnik unipolarny (najczesciej spotykany 5 przewodów) to zastosujesz całkowicie odmienny sposób jego sterowana (o wiele prostszy). Prawie w kazdym tygodniu jest tu taki temat dyskutowany. Poszukaj kilka postów wstecz i znajdziesz różne przykłady schematów i oprogramowania a co najważniejsze to dyskusja na temat trudnosci z jakimi ludzie sie spotykaja realizując ten temat.

    e marcus