Sterowanie silników krokowych przez cnc c++

Rozmowy dotyczące oprogramowania sterującego maszynami CNC i sterowników CNC obrabiarek numerycznych

Autor tematu
sosel
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 3
Rejestracja: 17 mar 2011, 21:24
Lokalizacja: Polska

Sterowanie silników krokowych przez cnc c++

#1

Post napisał: sosel » 17 mar 2011, 21:50

Witam, przeglądając google w poszukiwaniu rozwiązania do mojego problemu, znalazłem wspaniałe forum jakim okazało się cnc.info. Jestem przekonanym, że dla was, napisanie prostego programu zajmie chwilkę, więc chciałem zaprogramować 2 silniki krokowe przez cnc control w c++. Jednak jako że jestem całkiem zielony w programowaniu portu lpt, to zacząłem od podstaw. Czyli najpierw napisałem program do sterowania 8 diod led. Wykorzystałem bibliotekę inpout32.dll - windows xp. Przy pomocy google i głowy, zrobiłem wszystko, i wszystko działa jak należy. Jednak teraz postanowiłem że pójdę na głęboką wodę, i spróbuję zaprogramować dwa silniki przez cnc control które posiadam. Jednak specjalnie nie wiem jak się za to zabrać. Nie wiem jak oddzielnie zrobić sterowanie enb, oddzielnie dir, a oddzielnie clk.
Narazie pragnę jedynie osiągnąć sterowanie 2 silników krokowych, równie kroczących.
Zapewne dla was, jest to minutka, więc byłbym niezwykle wdzięczny za zainteresowanie tematem.

Program do sterowania ledów, jesli się komuś przyda, jeśli można go przerobić aby sterował ww. silnikami:
#include <windows.h>

#include <iostream>

using namespace std;
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
int main(int argc, char *argv[]) {
HINSTANCE hLib;
oupfuncPtr OutPort;
hLib = LoadLibrary("inpout32.dll");
OutPort = (oupfuncPtr) GetProcAddress(hLib, "Out32");

OutPort(0x378,0);





FreeLibrary (hLib);

return (0);
}
Również jeśli macie jakieś pytania odnośnie mojej prośby, z przyjemnością na nie odpowiem.
Prosiłbym także, abyście nie odnosili się do googli, ani do opcji szukaj, bo szukam już o wiele zadługo na ten temat.

ps. Jeśli zły dział, to prosiłbym o przeniesienie mojego tematu. Równie dobrym miejscem okazał się dział o nazwie robotyka, jednak wybrałem ten, jako że tutaj jest więcej specjalistów od programowania.
Pozdrawiam i z góry dziękuje za pomoc.



Tagi:


ezbig
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 2103
Rejestracja: 07 lip 2006, 00:31
Lokalizacja: mazowieckie

#2

Post napisał: ezbig » 17 mar 2011, 23:02

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 :).


Autor tematu
sosel
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 3
Rejestracja: 17 mar 2011, 21:24
Lokalizacja: Polska

#3

Post napisał: sosel » 18 mar 2011, 15:20

program ten, wręcz przeciwnie, gasi wszystkie ledy.
Odpowiedzialny jest za to ten wiersz
OutPort(0x378,0);
Z ustawieniem bitów na porcie, nie ma żadnego problemu, jednak Jak powinny wyglądać ustawione bity na porcie, aby silnik kroczył, od wolniejszego/szybszego kroczenia można oczywiście użyć funkcji sleep.

Wiem, że to głupio prosić o gotowca, ale jeśli jednak ma ktoś taki najprostszy program do sterowania maszyny cnc, wraz z kodem źródłowym, lub jeśli jest takowy na forum, to byłbym wdzięczny jeśli mógłby ktoś podać link.

Dziękuję i pozdrawiam.


ezbig
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 2103
Rejestracja: 07 lip 2006, 00:31
Lokalizacja: mazowieckie

#4

Post napisał: ezbig » 18 mar 2011, 17:01

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 tematu
sosel
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 3
Rejestracja: 17 mar 2011, 21:24
Lokalizacja: Polska

#5

Post napisał: sosel » 18 mar 2011, 17:58

rozumiem operacje logiczne na bitach, w każdym, suma, iloczyn, różnica etc. o nich wiem. Jednak one będą pracowały jedynie z clk, w pętli rozumiem ? Nie dokońca rozumiem natomiast o co chodzi z tym buforem, ma to być w rodzaju tablicy ? Czy zwykłej zmiennej ? jeśli tak, to jakiego typu ? char ? bo int(liczby całkowite) mi jakoś tutaj nie pasuje.
No i jak to jakoś rozdzielić w C++ oddzielnie dir, clk, enb ? Pytanie to jest adresowane do ludzi znających się na c++. ezbig zaznaczył że nie pracował w tym języku.
Pozdro


ezbig
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 2103
Rejestracja: 07 lip 2006, 00:31
Lokalizacja: mazowieckie

#6

Post napisał: ezbig » 19 mar 2011, 04:26

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.

Awatar użytkownika

blue_17
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 1
Posty: 1715
Rejestracja: 16 kwie 2009, 07:55
Lokalizacja: Kraków/Kornatka

#7

Post napisał: blue_17 » 20 mar 2011, 21:16

Witam to kolego chyba słabo szukałeś :D poszukaj na elektrodzie

Dział programowanie i i na górze w przyklejonych są tematy sterowania LPT w rożnych językach może Ci się z stamtąd coś przyda

Pozdrawiam
"I siedzieli oni razem pod nagim DOS-em i nie wstydzili sie tego." :D

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Ogólne Dyskusje na Temat Systemów Sterowania CNC”