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

[attiny2313][BASCOM] Sterownik silnika krokowego

09 Lut 2010 21:47 11888 20
  • Poziom 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.


    Code:
    $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
  • Sklep HeluKabel
  • Poziom 12  
    Dlaczego tylko jedna ? Jaka jest maksymalna liczba?
  • Pomocny post
    Poziom 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 .
  • Poziom 10  
    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
  • Sklep HeluKabel
  • Poziom 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.
    Code:



    '###################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
  • Poziom 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



    Code:

    ' 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
  • Poziom 11  
    ~~~pio~~~ napisał:
    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.
    Code:



    '###################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?
  • Poziom 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
  • Poziom 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...
  • Poziom 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ć ?
  • Poziom 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.
  • Poziom 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.
  • Poziom 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?
  • Poziom 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.
  • Poziom 10  
    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
  • Poziom 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ą?
  • Poziom 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?
  • Poziom 36  
    altar3 napisał:
    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