Znaleziono 3 wyniki

autor: ezbig
19 mar 2011, 04:26
Forum: Ogólne Dyskusje na Temat Systemów Sterowania CNC
Temat: Sterowanie silników krokowych przez cnc c++
Odpowiedzi: 6
Odsłony: 3647

To o co pytasz jest niezależne od języka programowania. Rozumiesz operacje logiczne, ale widzę że nie do końca potrafisz z nich skorzystać.

Bufor inaczej pośrednik - w tym przypadku to zmienna typu byte. Jest to potrzebne, bo jak zaczniesz operować bezpośrednio na bitach portu, to każda zmiana pojedyńczych bitów będzie widoczna zaraz po wprowadzeniu, a przy sterowaniu silnikami raczej zależy nam żeby to było wszystko razem zgrane (jedno CLK jest dla wszystkich).

Nie piszę w c++, ale język jest tu sprawą drugorzędną. Wiesz jak sterować portem, a to jest najważniejsze, teraz to już tylko zwykłe programowanie.

Ja bym to zrobił tak:

Załóżmy sobie, że piny masz przypisane na stałe, żeby na początek nie komplikować programu.

CLK - bit 0
dirX - bit 1 = 1-> +, = 0 -> -
enaX - bit 2 = 1 -> aktywny
dirY - bit 3 = 1-> +, = 0 -> -
enaY - bit 4 = 1 -> aktywny

Bufor - zmienna typu byte - przechowuje stan bufora

Robisz funkcję wektor( dX, dY ) - wektor przesunięcia. Funkcja powinna wyglądać mniej więcej tak:

Kod: Zaznacz cały

void function wektor (int dX, int dY) 
{ 

 bufor=0                            ; ustawiamy 0 lub 1 (zależy, które zbocze wyzwala sterownik) 
 if(dX>0) bufor=bufor | 2    ; (Bufor OR 2 lub można dodać 2)ustawiamy bit 1 - kier. na +
 if(dY>0) bufor=bufor | 8    ; (Bufor OR 8 lub można dodać 8) ustawiamy bit 4
 if(dX<0) dX=-dX               ; wartość bezwzględna nie wiem czy od ręki w c++ jest ABS() 
 if(dY<0) dY=-dY

 if(dX=0 and dY>0)  ; sprawdzamy czy ruch tylko w osi y
    { 
      clkX=0              ; wyłącz oś
      clkY=1              ; włącz oś y co 1 cykl zegara
      kroki=dY           ; ustaw ilość kroków
    } 
 if(dY=0 && dX>0)  ; spr. czy ruch tylko w x
    { 
      clkX=1
      clkY=0
      kroki=dX
    } 
 if(dX>dY && kroki>0)  ; sprawdzamy czy 
    { 
      clkX=1
      clkY=dX/dY          ; oblicz co ile cykli zegara ma się zmieniać y
                                ; ważne: wynik musi być całkowity
                                ; ale jeśli clkY będzie typu int to powinno być ok
      kroki=dX
    } 
 if(dY>dX && kroki>0)  
    { 
      clkX=dY/dX         ; oblicz co ile cykli zegara ma się zmieniać x
      clkY=1
      kroki=dY
    } 

cx=0
cy=0
for(a=0; a<kroki ; a++) 
 { 
     cx++
     cy++
     if(cx=clkX) 
          { 
             bufor = bufor | 4  ; ustaw bit 2 - enaX
             cx=0
          } 
           else bufor = bufor & 251  ; wyzeruj bit 2
     if(cy=clkY) 
          { 
             bufor = bufor | 16  ; ustaw bit 4 - enaY
             cy=0
          } 
           else bufor = bufor & 239  ; wyzeruj bit 4

         // tu musi być jakaś pętla opóźniająca
         // bo sygnał CLK musi być nadawany 
         // z taką częstotliwością, aby silniki
        //  mogły nadążyć (tu można też wprowadzić
        //  rampę przyspieszenia/opóźnienia) 

        bufor = bufor ^ 1  ; robimy exor 1 na buforze czyli zamieniamy bit 0 na przeciwny
        OutPort(0x378,bufor); 
        // pętla opóźniająca - w celu ustalenia stanu na CLK 
        bufor = bufor ^ 1  ; ponownie zamieniamy bit 0 na przeciwny
        OutPort(0x378,bufor); 
   } 

} 
Wszystkie zmienne użyte w programie to liczby całkowite, musisz sam je poprawnie zdeklarować. Napisałem to z palca więc trzeba to sprawdzić w praktyce i poprawić ew. błędy. W pętli opóźniającej warto dać jakąś detekcję klawiszy, bo jak wrzucisz jakiś duży wektor (lub clkX, clkY nie będą całkowite) to program się zawiesi czasowo lub całkowicie.

Na tej samej zasadzie można wysterować i więcej silników. Nie wiem tylko czy windows nie wprowadzi zakłóceń do takiego sterowania.
autor: ezbig
18 mar 2011, 17:01
Forum: Ogólne Dyskusje na Temat Systemów Sterowania CNC
Temat: Sterowanie silników krokowych przez cnc c++
Odpowiedzi: 6
Odsłony: 3647

To wiem, a czy akurat gasi, czy zapala to już kwestia podłączenia diod. Gotowca to nie wiem czy znajdziesz. Musisz sobie przyjąć jakieś założenia co do sterowania, rozbić to na funkcje, a operacje logiczne na bitach pozwolą ci sterować silnikami uniwersalnie (bez wnikania czy pracuje jeden, czy więcej). Dobrze byłoby utworzyć jakąś zmienną - bufor, do której będziesz wpisywał stany pinów dla poszczególnych sterowników, a na końcu to wszystko do portu (unikniesz braku synchronizacji).
autor: ezbig
17 mar 2011, 23:02
Forum: Ogólne Dyskusje na Temat Systemów Sterowania CNC
Temat: Sterowanie silników krokowych przez cnc c++
Odpowiedzi: 6
Odsłony: 3647

Jakoś mam takie wrażenie, że ten program nic nie robi - ew. zapala wszystkie led-y. Jaki masz problem z tymi silnikami? Skoro potrafisz zapalać poszczególne led-y, to nie rozumiem jaki masz problem z ustawianiem bitów na porcie. Najpierw ustal jakie sygnały są wymagane przez twoje sterowniki (co tam ma być na Enable, jakie stany na DIR odpowiadają kierunkom), potem poczytaj o operacjach na bitach i o funkcjach AND, OR, EXOR. Potem to już tylko zmieniasz w pętli stan na bicie odpowiedzialnym za CLK, a wcześniej ustawiasz bit który wybrałeś jako Enable oraz DIR. Ile tam razy zmienisz to CLK, tyle kroków wykonasz. Bity możesz kasować za pomocą AND, ustawiać za pomocą OR, a zmieniać na przeciwny stan za pomocą EXOR. Nie pytaj mnie jak to w C zrobić, bo na co dzień nie używam C. Operacje logiczne dostępne są w każdym języku. Poczytaj też o silnikach, krokowych, bo jak zaczniesz za szybko "nadawać" to nie pokręcisz :).

Wróć do „Sterowanie silników krokowych przez cnc c++”