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.

Sterownik silnika krokowego na Attiny2313, (EMC2)

Tomek12_86 24 Lut 2010 18:28 11920 37
  • #1 24 Lut 2010 18:28
    Tomek12_86
    Poziom 15  

    Witam.

    Zbudowałem ostatnio próbną wersje sterownika silnika krokowego, po podłączeniu pod komputer z użyciem ubuntu i programu EMC2 mam problem ze sterowaniem obrotami silnika, zmienia się kierunek obrotów ale nie można płynnie sterować silnkiem. Nie jestem pewien czy oprogramowanie sterownika przeze mnie napisane będzie działać z tym programem i jak zrealizowane jest sterowanie dir, step i enable.

    Poniżej listing z programu:
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    Config Portb = Output : Portb = &B00000000
    Config Portd = Input : Portd = &B1111111
    Dim X As Integer
    Declare Sub Lewo
    Declare Sub Prawo
    Do

    'pind.2 - enable pind.1 - dir pind.0 - step

    If Pind.2 = 0 And Pind.0 = 0 And Pind.1 = 0 Then Gosub Lewo
    If Pind.2 = 0 And Pind.0 = 0 And Pind.1 = 1 Then Gosub Prawo
    If Pind.2 = 1 Then Portb = &B00000000
    Loop
    Sub Lewo:
    Incr X
    Waitms 4
    If X > 4 Then
    X = 1
    End If
    If X = 1 Then
    Portb = &B00000011
    End If
    If X = 2 Then
    Portb = &B00000110
    End If
    If X = 3 Then
    Portb = &B00001100
    End If
    If X = 4 Then
    Portb = &B00001001
    End If

    Return
    End Sub

    Sub Prawo:

    Incr X
    Waitms 4
    If X > 4 Then
    X = 1
    End If
    If X = 1 Then
    Portb = &B00001100
    End If
    If X = 2 Then
    Portb = &B00000110
    End If
    If X = 3 Then
    Portb = &B00000011
    End If
    If X = 4 Then
    Portb = &B00001001
    End If
    Return
    End Sub
    Return
    End

    Proszę o podpowiedź i sprawdzenie poprawności programu.

    Pozdrawiam Tomek12_86.

    Dodano po 1 [godziny] 7 [minuty]:

    Czy ktoś może podzielić się jakąś myślą w sprawie tego programu?

    0 29
  • #2 24 Lut 2010 19:17
    Zdzicho
    Poziom 24  

    Nie wykorzystuj instrukcji if tylko kolejne kroki pobieraj z tablicy, wtedy będziesz miał jednakowe czasy pomiędzy krokami i silnik będzie obracał się miarowo.

    0
  • #3 24 Lut 2010 19:42
    Tomek12_86
    Poziom 15  

    Hmm nie ukrywam, że jestem początkujący jeśli chodzi o programowanie. Problem polega na tym że silnik kręci się równo ale nie można sterować jego prędkością... Nie wiem jak zrealizowana jest obsługa kroku STEP, czy działa impulsowo tak jak mi sie wydaje czy liniowo? Program wydaje się pracować normalnie przy sprawdzaniu za pomocą stykania wejść do masy, przy powolnym pulsowaniu STEP silnik kręci się wolno jak zewrę na stałe kręci się maksymalna prędkością. Czy możesz pokazać jak wygląda pobieranie kroków z tablicy?

    0
  • #4 24 Lut 2010 19:50
    Zdzicho
    Poziom 24  

    Pomiędzy poszczególnymi krokami musisz sterować opóźnieniem - Waitms

    0
  • #5 24 Lut 2010 19:58
    Tomek12_86
    Poziom 15  

    Waitms jest w pętli po każdym zwiększeniu zmiennej X i zmiana jego wartości ustala maksymalną częstotliwość pracy czyli prędkości obrotowej i przy zapisanej wartości pozwala na max obroty, poniżej 4ms silnik wpada w rezonans...

    0
  • #6 24 Lut 2010 21:17
    Zdzicho
    Poziom 24  

    Ale jeśli przy instrukcji Waitms wstawisz zmienną i wartość zmiennej będziesz zmieniał to będziesz regulował szybkością obrotową silnika.
    Przy sterowaniu:
    dir, step, enable
    dir - ustala kierunek
    step - powoduje wykonanie jednego kroku, podawanie impulsów wolno-wole obroty silnika
    enable - włącza i wyłącza przepływ prądu w uzwojeniach silnika

    0
  • #7 24 Lut 2010 21:32
    Tomek12_86
    Poziom 15  

    Z tą zmienną to racja tylko sterowanie z programu EMC2 odbywa się za pomocą 3 sygnałów Enable, Dir i Step, te sygnały procek ma zamienić na konkretne kroki silnika. Wyszedłem z założenia, że sygnał Step jest impulsowy i każdy jego impuls bedzie powodował zwiększenie zmiennej X o 1 co będzie powodować zmiane stanu portów i w konsekwencji krok silnika. Teoretycznie częstotliwość pojawiania się impulsu Step na wejściu powinna odpowiadać szybkości zwiększania zmiennej X i co za tym idzie szybkości kroków... Jak pisałem zwierając cyklicznie wejście sygnału Step powoduje kolejne kroki silnika i w zależności od częstotliwości zmienia się prędkość silnka. Tyle teoria a w praktyce silnik obraca się ze stałą prędkością istnieje jeszcze możliwość błędnego podłączenia lub konfiguracji programu EMC2 ale bardziej stawiam na błąd programowy.

    Proszę o pomoc osoby które miały kontakt ze sterownikami CNC i rozwiązaniami programowymi tego problemu.

    Pozdrawiam Tomek12_86.

    0
  • #8 25 Lut 2010 00:26
    M. S.
    Poziom 34  

    Cytat:
    silnik obraca się ze stałą prędkością


    bo PC "taktuje" sterownik stałą częstotliwością. Co do prędkości to sterownik silnika nie powinien mieć nic do gadania. Może i powinien jedynie ograniczać prędkość maksymalną przy której wirnik zrywa "synchronizację" z wirującym polem magnetycznym.

    Twoje sterowanie zasilaniem cewek jest moim zdaniem wadliwe.
    Code:
    Portb = &B00000011

    Za każdym razem podajesz napięcie na dwie cewki (półkrok) i nigdy na jedną. W efekcie silnik po wyłączeniu zasilania zostanie w niestabilnej pozycji i będzie samoczynnie dążył do obrotu o pół kroku w lewo bądź pół kroku w prawo niezależnie od "woli" sterownika. (Jak nie wierzysz to pokręć wałkiem silnika, a wyczujesz gdzie wirnik zatrzymuje się najchętniej). W efekcie za każdym razem albo zgubi pół kroku, albo te pół kroku nadrobi. Przy napędzaniu tym silnikiem maszyny CNC jest to niedopuszczalne.
    Sterownik zatem powinien zadbać, aby ostatnią fazą przed wyłączeniem zasilania
    była jedna z czterech kombinacji:
    Code:
    Portb = &B00000001, lub Portb = &B00000010 lub Portb = &B00000100 lub Portb = &B00001000

    a taka w twoim programie wcale nie występuje.

    Oprogramowanie do sterowników silników w układzie unipolarnym dołączyłem do opisu mojej frezarki: https://www.elektroda.pl/rtvforum/topic1540457.html

    0
  • #9 25 Lut 2010 13:50
    Tomek12_86
    Poziom 15  

    Dzięki za odpowiedź. Co do sterowania silnikiem to jest to specjalnie zrobione tak aby zwiększyć moment obrotowy dając prąd na 2 cewki naraz...
    Ja myśle że problem leży po stronie długości impulsów z komputera i tym że sterownik przyjmuje to jako ciągłą prace a nie impulsy.

    Dodano po 2 [godziny] 43 [minuty]:

    Widziałem, że większość programów sterujących silnikami reaguje na zobocze rosnące lub opadające, a nie na stan portu Step jak u mnie... Może w tym jest problem, tylko nie wiem jak prosto dołożyć obsługę wykrywania zbocza, prosze o jakiś kawałek kodu aby reagował na zbocze narastające na Pind.0, bo tam jest sygnał Step u mnie.

    0
  • #10 25 Lut 2010 14:06
    janbernat
    Poziom 38  

    Do pracy półkrokowej porzebujesz 8 stanów na krok a masz cztery.

    0
  • #11 25 Lut 2010 14:27
    Tomek12_86
    Poziom 15  

    Ale to nie jest praca półkrokowa...
    Proszę poczytać sobie o sposobach sterowania silnikami krokowymi np. tu:
    http://www.automatykaonline.pl/poradnik/artykuly.php?id=48
    W moim przypadku nie ma to akurat znaczenia jeśli chodzi o prace silnika ponieważ chodzi bardzo płynnie i jest mocny nie gubi kroków, zależy mi na problemie sterowania prędkością za pomocą program EMC2, proszę o podpowiedź w sprawie zbocza rosnącego w Bascom.

    0
  • #12 25 Lut 2010 15:36
    janbernat
    Poziom 38  

    Na zbocze to można ustawić tylko przerwania INT0 i INT1.
    W zasadzie to może być rozwiązanie.
    Zauważ że program z komputera steruje silnikiem i program z procesora też.
    Normalnie sterowniki są tak zaprojektowane że po otrzymaniu sygnału STEP wykonują tylko część kroku 1/4, 1/8 albo przy sterowaniu mikrokrokowym jeszcze mniej.
    A Twój procesor po otrzymaniu sygnału STEP wykonuje od razu cały krok.
    Być może w sterowniku EMC2 tak jest- ale wątpię.
    Bo to program w komputerze ma sterować prędkością silnika a sterownik ma tylko podawać określony stan na silnik.
    A tak to podejrzewam że te dwa programy się "gryzą".

    0
  • #13 25 Lut 2010 17:00
    Tomek12_86
    Poziom 15  

    Hmm wpadłem na inny pomysł czytając twój post, a gdyby zmiana stanu wejścia Step powodowała zwiększenie zmiennej X powodując zmiane wartości portu i 1/4 kroku... Popraw mnie jeśli się mylę. A co do zmiany na INT0 to trochę za późno bo zrobiłem już płytkę do tego i jako wejścia używam pind.0, pind.1 i pind.2 :/

    0
  • #14 25 Lut 2010 17:55
    M. S.
    Poziom 34  

    Code:
    Silnik:
    
    Select Case Faza
       Case &B00000001 : Portb = &B00001100 ' Jeśli zero to cewka jest zasilana
       Case &B00000010 : Portb = &B00001101 ' Zmienna Faza jest obracana.
       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 'Regulacja prędkości maksymalnej
    Return


    To jest właśnie sterowanie przy użyciu półkroku. To, że cały czas zasilasz 2 cewki nie znaczy, że moment jest maksymalny bo pierwsza ciągnie w jedną stronę, a druga w drugą (wirnik staje pomiędzy nimi). Można by w tym miejscu zapytać czemu nie trzy!

    Takie sterowanie powoduje "nerwowość" silnika i drgania maszyny. Łagodniejszą pracę uzyskujesz sterując co najmniej półkrokiem przez źródło prądowe. (Stosując jednak sam uC trudniej jest uzyskać rozdzielczość większą niż półkrok).

    0
  • #15 25 Lut 2010 18:24
    Tomek12_86
    Poziom 15  

    Jak już pisałem nie używam sterowania półkrokiem, proszę jeszcze raz dokładnie przeczytać jak działa sterowanie dwoma fazami z linku podanego powyżej... a co do pytania dlaczego nie trzy - ponieważ są tylko dwa bieguny. Mój silnik chodzi na prawde bardzo równo i nie gubi kroków, teraz mam problem ze sterowaniem prędkością obrotów i rozwiązaniem programowym tego problemu.

    Pozdrawiam Tomek12_86.

    0
  • #16 25 Lut 2010 19:13
    janbernat
    Poziom 38  

    Na inny procesor i mogłem pomylić piny, ale sposób jest taki:

    Code:

    $crystal = 8000000
    $regfile = "m8def.dat"
    Config Portb = Input
    Portb = 255
    Config Portd = Output
    Dim Temp_0 As Byte
    Dim X As Byte

    Do

       If Pinb.0 = 0 Then
          If Temp_0 = 0 Then      'sprawdzenie
    '(
             gosub
    ')
             Temp_0 = 1           'zablokowanie powtórnego wykonania kroku
           End If                 'dopóki nie zmieni się stan Pin.0
        Else
          Temp_0 = 0              'jeśli stan pinb.0=1 to przy ponownym pojawieniu
        End If                    ' się stanu pinb.0=0 może wykonać sie następny STEP
    Loop


    W podprogramie ( i w całym programie) nie należy stosować wait bo całość może się rozjechać.
    Procesor powinien być niewolnikiem impulsów sterujących z EMC2.
    W podprogramie wg. mnie wykonać tylko sekwencję STEP- czyli po każdym wywołaniu ustawiamy jedną sekwencję i czekamy na następny STEP- wtedy drugą sekwencję itd.

    0
  • #17 25 Lut 2010 19:48
    Tomek12_86
    Poziom 15  

    Ok dzięki za podpowiedź spróbuje jutro coś napisać, może uda mi się zrobić to na przerwaniach... a co do wait to bez niego silnik wpada w rezonans bo za szybko zmieniają się stany na wyjściach i ogranicza to max obroty.

    0
  • #18 25 Lut 2010 19:53
    janbernat
    Poziom 38  

    W Twoim programie- tak.
    Ale jak napisałem- Twój program musi być niewolnikiem programu sterującego.

    0
  • #19 26 Lut 2010 05:42
    emarcus
    Poziom 35  

    Tomek12_86 napisał:
    Z tą zmienną to racja tylko sterowanie z programu EMC2 odbywa się za pomocą 3 sygnałów Enable, Dir i Step, te sygnały procek ma zamienić na konkretne kroki silnika.
    Proszę o pomoc osoby które miały kontakt ze sterownikami CNC i rozwiązaniami programowymi tego problemu.

    Pozdrawiam Tomek12_86.


    Bez urazy, ale ten driver przedstawiny wyzej z programen na 2313 pozwala w zasadzie 'tylko' obracac walkiem silnika - co jest dobre dla demonstracji jak taki silnik "idzie latwo uruchomic".
    Silnik nie gubi 'steps' - bo nie jest obciazony.
    Aby mozna bylo w pelni kontrolowac stepperem (pod haslem CNC) z komputera przez EMC2 majac na uwadze tylko 3 sygnaly 'Enable, Dir i Step' to: albo zastosujesz odpowiedni dedykowany driver, albo odpowiednio zmodyfikujesz swoj program dla 2313 co nie bedzie takie proste.
    Mozesz zajzec na przykladowa konfiguracje CNC ze sterowaniem EMC2 w tym DIY projekcie:
    "Sherline Lathe CNC (mill) conversion - Configuring EMC2"
    http://hobbymechatronics.com/projects/29-mechanics/11-sherline-cnc-conversion?start=5

    Zwroc uwage na zastosowanie tam kompletnego drivera dla silniika A3979 (A3977) co calkowicie upraszcza calosc oprogramowania projektu.

    e marcus

    0
  • #20 26 Lut 2010 19:53
    janbernat
    Poziom 38  

    No pewnie że sterownik specjalizowany jest lepszy- ma mikrokroki, PWM, ADC i pomiar prądu.
    Ale jakiś prosty to można zrobić.
    To musi być sterownik- slave.
    Nie może sam generować obrotów- ma czekać na zewnętrzny sygnał.
    Musiałem zlutować jakiś generator na NE555 aby to sprawdzić.

    Code:

    $crystal = 8000000
    $regfile = "m8def.dat"
    Config Portb = Input
    Portb = 255
    Config Portd = Output
    Dim Temp_0 As Byte
    Dim Temp_1 As Byte
    Dim Stan As Byte
    Dim X As Byte
    Step Alias Pinb.0
    Dir Alias Pinb.1

    Do

       If Step = 0 And Dir = 0 Then
          If Temp_0 = 0 Then      'sprawdzenie
             Incr X
                If X >= 4 Then
                   X = 0
                End If
             Gosub Prawo

             Temp_0 = 1           'zablokowanie powtórnego wykonania kroku
           End If                 'dopóki nie zmieni się stan Pin.0
        Else
          Temp_0 = 0              'jeśli stan pinb.0=1 to przy ponownym pojawieniu
        End If                    ' się stanu pinb.0=0 może wykonać sie następny STEP

       If Step = 0 And Dir = 1 Then
          If Temp_1 = 0 Then
             Incr X
                If X >= 4 Then
                   X = 0
                End If
             Gosub Lewo

             Temp_1 = 1
           End If
        Else
          Temp_1 = 0
        End If
       'End If




        Loop

    Prawo:

       Select Case X
        Case 0 : Portd = &B11111100
          Stan = 0
        Case 1 : Portd = &B11111001
          Stan = 1
        Case 2 : Portd = &B11110011
          Stan = 2
        Case 3 : Portd = &B11110110
          Stan = 3
       End Select

    Return

    Lewo:

      Select Case X
        Case 0 : Portd = &B11111100
          Stan = 0
        Case 1 : Portd = &B11110110
          Stan = 3
        Case 2 : Portd = &B11110011
          Stan = 2
        Case 3 : Portd = &B11111001
          Stan = 1
       End Select


    Return

    To jest tylko działający szkic.
    Trzeba jeszcze dodać badanie stanu "stan" po zmianie kierunku obrotów i zachowanie tego stanu przy postoju silnika.
    Aby silnik po zmianie kierunku ruszył z prawidłowej pozycji.
    Może mi się kiedyś uda.
    emarcus:
    Silnik nie gubi 'steps' - bo nie jest obciążony.
    Sprawdziłem że silnik nieobciążony łatwo gubi kroki.
    I nie osiąga max prędkości.
    Przeciążony też- ale powinien być obciążony optymalnie aby uzyskać swoją prędkość- pewnie jest to związane z tłumieniem mechanicznym.
    M.S.
    To nie jest samodzielny układ do sterowania silnikiem- to ma być sterownik sprzętowy sterowany zewnętrznymi sygnałami.
    Gdy silnik traci zasilanie- to i tak gubi pozycję.
    Trzeba wrócić do krańcówek i na nowo go spozycjonować.

    Poza tym- jak zrobić aby silnik zmienił kierunek od pozycji wskazanej przez "stan"?
    Pewnie przez ileś if.
    Bo wtedy to byłby "prawie" sterownik.

    0
  • #21 26 Lut 2010 20:41
    M. S.
    Poziom 34  

    Cytat:
    M.S.
    To nie jest samodzielny układ do sterowania silnikiem- to ma być sterownik sprzętowy sterowany zewnętrznymi sygnałami.
    Gdy silnik traci zasilanie- to i tak gubi pozycję.
    Trzeba wrócić do krańcówek i na nowo go spozycjonować.


    Trochę się nie zrozumieliśmy. Mój sterownik samoczynnie wyłącza zasilanie silnika (0 napięcia na wszystkich cewkach) kiedy na wejściu krok brak jest impulsów przez czas dłuższy niż 0,1s. (odmierzany timerem). Sam sterownik oczywiście pamięta kombinację sterowania silnikiem. Sterownik zatrzymuje silnik tylko na pełnym kroku. Żeby to zrealizować w rzeczywistości jeden impuls Krok wyzwala najpierw półkrok, a później dopełnia do kroku i tak zostaje. Zmienia się co prawda dwukrotnie rozdzielczość sterowania, ale silnik jest zimny jak trup. Dzięki temu zasilacz jest nieco mniejszy.

    P. S. Moje dywagacje rozminęły się z tym co kolega potrzebuje, bo ja wykorzystuję silnik jako unipolarny, a z tego co doczytałem kolega stara się sterować bipolarnie, czego wprost nie wyartykułował.

    0
  • #22 27 Lut 2010 11:50
    Tomek12_86
    Poziom 15  

    Wielkie dzięki za ten program zaraz zapakuje go do procka i zaczynam testy :D Dodam jeszcze pin enable aby silniki nie gotowały się na postoju.
    Do M.S. nie, to jest też sterowanie unipolarne... A co do zapamiętywania stanu to nie do końca rozumiem potrzebę jego stosowania... ponieważ wydaje mi się, że przy takim sterowaniu silnik zatrzyma się w danym miejscu i z tamtego miejsca ruszy w drugim kierunku, bo podczas sterowania z EMC2 ciągle zmienia kierunki. Chyba że się myle. A co do dokładności przy 200 krokach na obrót daje 1,8 stopnia na krok, przy przekładni śrubowej mającej 1,5 mm posuwu na obrót, daje to 0,0075mm na krok a taki luz to można powiedzieć, że jest pomijalny ponieważ nigdy w warunkach domowych nie uda sie zachować takiej dokładości maszyny, a co za tym idzie zgubienie kroku lub dwóch będzie zupełnie pomijalne w końcowym wyniku, no chyba że mamy zamiar wykonywać za pomocą takiej frezarki części do promu kosmicznego ;).

    0
  • #23 27 Lut 2010 12:13
    janbernat
    Poziom 38  

    No tak- najpierw przerób- pisałem na ATMega8 i stan portów sterujących dałem 0 bo tak mi wygodniej było diody wysterować.
    A M.S. ma rację- te błędy się sumują.
    Jak zrobisz 1000 nawrotów prawo-lewo to będzie 7.5mm błędu w najgorszym przypadku.
    Dlatego w sub dałem zmienną stan- na razie niewykorzystaną.
    Próbuję robić bufor pierścieniowy (kołowy) do badania z którego miejsca silnik ma startować po zmianie kierunku- ale na razie bez sukcesu.
    Przy prostym sterowaniu jednego lub dwu pinów dla 8 stanów to rotate się sprawdza.
    Ale lookup już nie.
    Jak by to się dało zrobić to byłby już "prawie" sterownik.Pomysł M.S aby po braku impulsów STEP przez 0.1s silnik był "disable" nie podoba mi się.
    Tak sterowany silnik można obrócić ręcznie albo przypadkiem- a co jak w jednym położeniu wrzeciono wierci przez 10s a X i Y nie dostaje impulsów?
    Sterownik scalony oczywiście rozwiązuje większość problemów.Jak on pamięta poprzednie położenie silnika- nie wiem.
    Jak to zrobić w Bascomie- próbuję.

    0
  • #24 27 Lut 2010 16:32
    Tomek12_86
    Poziom 15  

    Oczywiście już przerobiłem to do swoich potrzeb ale jest problem, po podłączeniu do silnika występuje jakieś sprzężenie albo jakieś stany nie ustalone bo silnik zaczyna drgać... może podepnę wejścia do 5V przez pare kilo to nie będzie takich cudów... a co do dokładności to faktycznie nie przemyślałem tego do końca - zwracam honor :) a i jeszcze nie wiem ale chyba jest coś pomylone w kierunku lewo bo silnik tylko drga,wydaje mi się że chyba stany wyjść powinny wyglądać tak:
    Select Case X
    Case 0 : Portd = &B11110011
    Stan = 0
    Case 1 : Portd = &B11111001
    Stan = 3
    Case 2 : Portd = &B11111100
    Stan = 2
    Case 3 : Portd = &B11110110
    Stan = 1
    End Select

    to samo co w prawo tylko w odwrotnej kolejności. Tak ustawione u mnie działa...

    Dodano po 24 [minuty]:

    Jeszcze chyba jest problem z szybkością tylko nie wiem czy procek chodzi za wolno czy za szybko... bo przy ustawieniu większej prędkości w EMC2 silnik wpada w rezonans... Miałem tak jak nie było w moim programie waitms.

    Dodano po 3 [godziny] 35 [minuty]:

    Po małych zmianach w programie i poprawnej konfiguracji programu EMC2 wszystko wskazuje, że jest całkiem dobrze :) Na razie wrzuciłem sekwencje testową (zmiana obrotów cyklicznie o daną ilość kroków) i sprawdzam dokładność i powtarzalność kroków przy różnych prędkościach, póki co po 15 min zmian obrotów przy podłączonych diodach aby obserwować stany portów, przy zmianie kierunku zatrzymuje się i rusza na tych samych miejscach co wskazuje, że prawdopodobie nie potrzebna bedzie dodatkowa zmienna do zapamiętywania pozycji...

    0
  • #25 27 Lut 2010 20:44
    janbernat
    Poziom 38  

    No tak, moja pomyłka w tym lewo.
    A żebyś się nie nudził to sprawdź wersję która zawsze po zmianie kierunku obrotów powinna startować z dobrego położenia.

    Code:

    $crystal = 8000000
    $regfile = "m8def.dat"

    Config Portb = Input
    Portb = 255
    Config Portd = Output

    Dim Temp_0 As Byte
    Dim Temp_1 As Byte
    Dim X As Byte
    X = 00000001
    Dim Stan As Byte

    Step Alias Pinb.0
    Dir Alias Pinb.1

    Do

       If Step = 0 And Dir = 0 Then
          If Temp_0 = 0 Then      'sprawdzenie
            Rotate X , Left

              If Pinb.2 = 0 Then
                Gosub Pol_kroczek
              Else
                Gosub Kroczek
              End If

            Temp_0 = 1            'zablokowanie powtórnego wykonania kroku
           End If                 'dopóki nie zmieni się stan Pin.0
        Else
          Temp_0 = 0              'jeśli stan pinb.0=1 to przy ponownym pojawieniu
        End If                    ' się stanu pinb.0=0 może wykonać sie następny STEP

       If Step = 0 And Dir = 1 Then
          If Temp_1 = 0 Then
             Rotate X , Right

               If Pinb.2 = 0 Then
                 Gosub Pol_kroczek
               Else
                 Gosub Kroczek
               End If

             Temp_1 = 1
           End If
        Else
          Temp_1 = 0
        End If

    Loop

    Kroczek:

       Select Case X
          Case 1
             Portd = &B11111100
          Case 2
             Portd = &B11111001
          Case 4
             Portd = &B11110011
          Case 8
             Portd = &B11110110
          Case 16
             Portd = &B11111100
          Case 32
             Portd = &B11111001
          Case 64
             Portd = &B11110011
          Case 128
             Portd = &B11110110
       End Select

    Return

    Pol_kroczek:

       Select Case X
          Case 1
             Portd = &B11111110
          Case 2
             Portd = &B11111100
          Case 4
             Portd = &B11111101
          Case 8
             Portd = &B11111001
          Case 16
             Portd = &B11111011
          Case 32
             Portd = &B11110011
          Case 64
             Portd = &B11110111
          Case 128
             Portd = &B11110110
       End Select



    Return


    Jak dasz zworkę do masy na pinb.2 to możesz sprawdzić jak pracuje sterowany półkrokowo.
    A nie wiem jak się konfiguruje ten sterownik EMC2.
    Ja używam CNCgraf pod windowsem- ale wiadomo- windows kosztuje a sterownik sprzętowy do tego programu też ze 2000zł.
    Ustawiam ile impulsów na obrót silnika i jaki skok śruby.
    A potem dopuszczalne prędkości i rampę.
    Jeśli w EMC2 można ustawić rampę- czyli przyspieszenie po ruszeniu z postoju albo po zmianie kierunku- to bardzo zwiększa płynność pracy i maksymalne prędkości silnika.

    0
  • #26 27 Lut 2010 22:32
    Tomek12_86
    Poziom 15  

    Oczywiście EMC2 ma możliwość ustawienia przyspieszenia a po testach stwierdziłem że nawet poprzednia wersja się nie gubi przy odpowiednich predkościach więc zostało zbudować gotowe sterowniki i zabrać się za mechanike:) Jutro potestuje nową wersję Twojego programu wielkie dzięki:D

    0
  • #27 27 Lut 2010 23:01
    janbernat
    Poziom 38  

    Nie zapominaj że ten programik wyżej to jest "prawie" sterownik.
    Główną wadą jest to że pozwala wysterować silnik tylko przy zasilaniu napięciem nominalnym- nie ma żadnego PWM.
    Ta strona z Wobitu na podstawie której próbowałeś mnie pouczyć o sterowaniu silników krokowych- "Proszę poczytać sobie o sposobach sterowania silnikami krokowymi np. tu:"
    ma swój dalszy ciąg.
    Tam można się dowiedzieć dlaczego silniki krokowe o nominalnym zasilaniu np. 2.5V zasila się przez odpowiedni układ napięciem 30-50V.
    Po prostu szybciej narasta prąd w uzwojeniu silnika i silnik dużo lepiej pracuje przy wysokich obrotach.
    Ale do tego jest potrzebny PWM i szybki przetwornik AC który to zmierzy i szybko ten prąd ograniczy.
    A w procesorku ten przetwornik AC musi mieć ze 100ms na pomiar.
    A to jest dużo za długo.
    Dlatego zanim zaczniesz budować sterownik rozejrzyj się za scalonymi sterownikami np. firmy Allegro- dużo więcej można z nich wyciągnąć niż z procesora.
    Ale to że mnie sprowokowałeś do napisania programiku do sterowania tymi silniczkami- ten drugi jest dużo lepszy- wypróbuj- to dobrze.

    0
  • #28 27 Lut 2010 23:06
    M. S.
    Poziom 34  

    Cytat:
    Rotate X , Right


    No wreszcie dobry pomysł. Z obracaną zmienną nic się nie pochrzani.

    Cytat:
    Pol_kroczek:


    A to jeszcze lepszy. Po co przechodząc przez kałużę skakać na co drugi kamień jak można swobodnie przejść kolejno po wszystkich.

    Jeszcze trochę udoskonaleń i wasz program odwzoruje mój kropka w kropkę. Proponuję impuls KROK wrzucić jeszcze na INT0 w zboczu i w przerwaniu ustawić flagę oraz sprawdzić kierunek. Później jeszcze jak potrzeba pamięć punktu 0, 0, 0, która pozwoli wrócić do położenia zerowego kiedy coś pójdzie nie tak itd.

    Cytat:
    rozejrzyj się za scalonymi sterownikami


    Pewną protezą może być zasilanie silnika ze źródła prądowego.

    0
  • #29 27 Lut 2010 23:48
    janbernat
    Poziom 38  

    To daj Swój program- a nie tak że sam muszę wymyślać- a ze mnie programista jak z koziej d... trąba.
    Ile się naszukałem.
    Protezą to jest danie opornika na górze uzwojenia- bo źródło prądowe to nie jest zbyt sprawne.
    Dlatego dają PWM zamiast żródła prądowego.
    I jak te scalone sterowniki pamiętają ostatni mikrokrok- nie wiem.
    Ale pamiętają- sprawdziłem.

    0
  • Pomocny post
    #30 28 Lut 2010 00:29
    M. S.
    Poziom 34  

    Cytat:
    To daj Swój program


    W moim pierwszym poście na końcu jest link.

    Cytat:
    Protezą to jest danie opornika na górze uzwojenia- bo źródło prądowe to nie jest zbyt sprawne.


    Opornik też nie jest sprawny, a źródło analogowe jak to źródło, jest zastępczo tylko zmienną rezystancją. Potrafi jednak łagodzić porywczą naturę silnika, a przez to maszyna nie drży jakby miała się za chwilę rozpaść.

    0