logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterowanie silnikiem krokowym z pilota

devolt 03 Lip 2009 23:04 1847 6
REKLAMA
  • #1 6736587
    devolt
    Poziom 21  
    Hej mam taki problem. Chciałbym sobie napisać prosty program do sterowania głośnością we wzmacniaczu. Silnik jaki chce zastosować to unipolarny krokowiec. Założenie jest proste naciskam przycisk na pilocie, silnik obraca się w prawo puszczam przycisk, silnik nie obraca sie i ważne brak napiecia na uzwojeniach ( wał obraca sie luźno). Napisałem juz programik, który tak działa, ale silnik nie obraca się płynnie co kilka kroków jest mała przerwa i kręci sie dalej.
    Możecie mi pomóc, ewentualnie coś podpowiedzieć może źle to napisałem.
    Siedzie juz kilka godzin i nie moge sobie z tym poradzić.

    
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    
    
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    
    Declare Sub Opoznienie1
    Declare Sub Opoznienie2
    Declare Sub Main
    Declare Sub Obroty_prawo
    Declare Sub Obroty_lewo
    
    Config Rc5 = Pind.2
    
    Dim Address As Byte , Command As Byte
    Dim Steps As Byte
    
    Enable Interrupts
    
    
    
    Reset Portb.0
    Reset Portb.1
    Reset Portb.2
    Reset Portb.3
    
    
    
    Sub Main
    Do
    
    Reset Portb.0 : Reset Portb.1 : Reset Portb.2 : Reset Portb.3
    
       Command = 255
       Getrc5(address , Command)
       Command = Command And &B01111111
    
       If Command = 16 Then
          Gosub Obroty_prawo
    
       End If
    
       If Command = 17 Then
          Gosub Obroty_lewo
    
    
       End If
    Loop
    End Sub
    
    
    
    Sub Obroty_lewo:
         Do
          Set Portb.0 : Reset Portb.1 : Reset Portb.2 : Reset Portb.3
          Call Opoznienie2
          Set Portb.0 : Set Portb.1 : Reset Portb.2 : Reset Portb.3
          Call Opoznienie2
          Reset Portb.0 : Set Portb.1 : Reset Portb.2 : Reset Portb.3
          Call Opoznienie2
          Reset Portb.0 : Set Portb.1 : Set Portb.2 : Reset Portb.3
          Call Opoznienie2
          Reset Portb.0 : Reset Portb.1 : Set Portb.2 : Reset Portb.3
          Call Opoznienie2
          Reset Portb.0 : Reset Portb.1 : Set Portb.2 : Set Portb.3
          Call Opoznienie2
          Reset Portb.0 : Reset Portb.1 : Reset Portb.2 : Set Portb.3
          Call Opoznienie2
          Set Portb.0 : Reset Portb.1 : Reset Portb.2 : Set Portb.3
          Call Opoznienie2
    
         Loop Until Command = 17
    End Sub
    
    Sub Obroty_prawo:
    
         Do
          Set Portb.0 : Reset Portb.1 : Reset Portb.2 : Set Portb.3
          Call Opoznienie1
          Reset Portb.0 : Reset Portb.1 : Reset Portb.2 : Set Portb.3
          Call Opoznienie1
          Reset Portb.0 : Reset Portb.1 : Set Portb.2 : Set Portb.3
          Call Opoznienie1
          Reset Portb.0 : Reset Portb.1 : Set Portb.2 : Reset Portb.3
          Call Opoznienie1
          Reset Portb.0 : Set Portb.1 : Set Portb.2 : Reset Portb.3
          Call Opoznienie1
          Reset Portb.0 : Set Portb.1 : Reset Portb.2 : Reset Portb.3
          Call Opoznienie1
          Set Portb.0 : Set Portb.1 : Reset Portb.2 : Reset Portb.3
          Call Opoznienie1
          Set Portb.0 : Reset Portb.1 : Reset Portb.2 : Reset Portb.3
          Call Opoznienie1
    
         Loop Until Command = 16
    End Sub
    
    
    
    
    Opoznienie1:
    Waitms 40
    Return
    
    Opoznienie2:
    Waitms 40
    Return
    
  • REKLAMA
  • #2 6736995
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 6743550
    devolt
    Poziom 21  
    a co byś proponował, jak by to można było usprawnić.
    Resetowanie portów umieściłem po to aby silnik nie miał uzwojeń pod napięciem, gdy nie pracuje. A sprawdzanie stanu rc5 w pętli głównej chyba musi być , bo ma się kręcić gdy trzymany jest przycisk.
  • #4 6743578
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 6747520
    mirley
    Poziom 17  
    Witam

    Mam nadzieje że trochę pomogę w tej kwestii. Poniżej daję kod do obsługi kodu Rc5 w przerwaniach:

    
    '************* Konfiguracja uC *****************
    '***********************************************
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Portb = &B11111111 : Portb = &B11111111
    Config Portd = &B11111011 : Portd = &B11111111
    
    On Int0 Przzew0 Nosave
    Config Int0 = Low Level
    Enable Int0
    
    Config Rc5 = Pind.2
    
    'Config Timer1 = Timer , Prescale = 64
    'Enable Timer1 : On Timer1 Prztimer1
    
    Enable Interrupts
    '********** Konfiguracja uC Koniec  ************
    
    '******************  Zmienne *******************
    '***********************************************
    Dim Komenda As Byte , Adres As Byte
    Dim Odebrano As Bit
    '*************  Zmienne Koniec  ****************
    
    '**************  Petla glowna ******************
    '***********************************************
    Do
    
      If Odebrano = 1 Then
        If Adres = 0 Then                                       'pilot o adresie 0
         
        End If
        Odebrano = 0
        Enable Int0
      End If
    
    Loop
    End
    '************ Petla glowna Koniec **************
    Przzew0:
      Disable Int0
      Enable Interrupts
      Getrc5(adres , Komenda)
      Komenda = Komenda And &B01111111
      Odebrano = 1
    Return
    


    Dalej w głownej pętli programu (w tym ifie) zamieszczasz coś co ustawia zmienne w zależności od klawisza (zmiennej Komenda). Do obsługi silnika uruchom timer1 i przerwanie ustaw tak aby wywoływało się z określoną częstotliwością z jaką będzie pracował twój silnik. Zamiast ustawiać po jednym pinie zrób w pamięci tablicę wartości ze stanami całego portu i za pomocą polecenia lookup odczytuj te wartości i potem przypisuj jednocześnie na cały port....

    W razie problemów pytaj.
  • REKLAMA
  • #6 6748844
    devolt
    Poziom 21  
    Dzięki za pomoc. A mam pytanie co do sterowania silnika z użyciem timera. Czy mam użyć timera zamiast wstawiania opóźnień. Tzn po wystąpieniu przerwania wywołuje z tablicy stan portu i wysyłam go po czym timer znowu rusza i przy kolejnym przerwaniu wysyłam kolejny krok silnika...itd
    Muszę dodać jeszcze jeden warunek który ustawi stan niski na porcie sterującym silnikiem tak by wał silnika mógł się luźno kręcić gdy nie jest sterowany z pilota.

    A no i ostatnie pytanie czy timer1 sterujący silnikiem powinien być uruchamiany tylko na czas pracy silnika czy może działać w tle caly czas ??
  • #7 6751103
    mirley
    Poziom 17  
    Ja realizowałem kiedyś program do silnika i timer chodził cały czas i ustawiał flagę co wybrany odcinek czasu. Flaga ta sprawdzana była w pętli głównej i tam była zwiększana zmienna krok, w zależności od niej odpowiedni stan na cały port został wysyłany. Nie musisz po każdym kroku startować timera od nowa. Nie ma takiej potrzeby. Nawet jeśli będzie chodził w tle cały czas to w tym przypadku najwyżej będziesz miał o jeden krok więcej lub mniej co wydaje mi się że jest bez znaczenia (poprostu pierwszy krok zostanie wykonany w przypadkowym czasie bo timer będzie cały czas sobie liczył)
REKLAMA