Sterowanie silnika krokowego
Sterowanie silnika krokowego
Witam,
jestem bardzo początkujący w LV i jako pierwszą aplikację chcę zrobić sterowanie do silnika krokowego. Mam następujące urządzenia: karta advantech USB 4702 oraz sterownik silnika SSK-B02.
Sterownik ten posiada 3 sygnały sterujące: DIR - kierunek obrotu (stan wysoki-zgodnie z ruchem zegara, stan niski-przeciwnie do zegara), CLK - taktowanie, max 10kHz oraz ENABLE-stan wysoki załączenie silnika.
Całość ma wyglądać tak: z wejścia AI czytam napięcie(z czujnika wagowego), jeśli napięcie (waga) jest mniejsze niż parametr (ciężar zadany), obróć silnik o 120' (ponieważ silnik ma 200kroków muszę wygenerować 67 imp na CLK z prędkością którą można regulować).
Jest jeszcze jeden problem, ponieważ pełny obrót to 360' a silnik ma 200kroków muszę pilnować, żeby każdy obrót zatrzymywał się w tych samych punktach czyli zaczynamy od pozycji startowej, 67kroków, 67kroków, 66kroków (suma daje 200) i znów 67, 67, 66 itd.
Będę bardzo wdzięczy za wszelką pomoc w tym temacie. pzd
jestem bardzo początkujący w LV i jako pierwszą aplikację chcę zrobić sterowanie do silnika krokowego. Mam następujące urządzenia: karta advantech USB 4702 oraz sterownik silnika SSK-B02.
Sterownik ten posiada 3 sygnały sterujące: DIR - kierunek obrotu (stan wysoki-zgodnie z ruchem zegara, stan niski-przeciwnie do zegara), CLK - taktowanie, max 10kHz oraz ENABLE-stan wysoki załączenie silnika.
Całość ma wyglądać tak: z wejścia AI czytam napięcie(z czujnika wagowego), jeśli napięcie (waga) jest mniejsze niż parametr (ciężar zadany), obróć silnik o 120' (ponieważ silnik ma 200kroków muszę wygenerować 67 imp na CLK z prędkością którą można regulować).
Jest jeszcze jeden problem, ponieważ pełny obrót to 360' a silnik ma 200kroków muszę pilnować, żeby każdy obrót zatrzymywał się w tych samych punktach czyli zaczynamy od pozycji startowej, 67kroków, 67kroków, 66kroków (suma daje 200) i znów 67, 67, 66 itd.
Będę bardzo wdzięczy za wszelką pomoc w tym temacie. pzd
4050ml A Rh+, a Ty?
- Pitol
- Moderator
- Posty: 987
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Sterowanie silnika krokowego
napisałeś jaki sprzęt masz i co chcesz za jego pomocą osiągnąć... ale brakuje jednego: z czym masz problem?
polecam okienko Szukaj... w prawym górnym rogu. Jak wstukasz silnik krokowy to coś znajdziesz... to samo w google...

polecam okienko Szukaj... w prawym górnym rogu. Jak wstukasz silnik krokowy to coś znajdziesz... to samo w google...
Re: Sterowanie silnika krokowego
Problem polega na tym, że nie wiem jakich elementów muszę użyć, czy i co ma być w pętli loop, czy stosować blok sekwencji w pętli itd. Czy mam zbudować swoją wersję i n podstawie tego niedziałającego VI będziemy analizować błędy? Zaznaczam, że jest to mój pierwszy kontakt z LV i szukajki już używałem (podkład teoretyczny mam) jednak teoria i praktyka nie zawsze leżą obok siebie
4050ml A Rh+, a Ty?
- fajfi
- Posty: 185
- Rejestracja: 28 sty 2004 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Wrocław
Re: Sterowanie silnika krokowego
Rozumiem, że pytanie brzmi: jak z poziomu LV sterować tym silnikiem?
Ja zrobiłem to tak (nie wiem czy jest to rozwiązanie najelegantsze):
Najważniejsza jest funkcja "Out port.vi"
Ale po kolei.
U mnie sterowanie idzie z portu LPT.
CLK podłączyłem do pinu 2. Dir do pinu3, zaś to co nazywasz enable do pinu 4.
Do pętli while wrzucam ów 'out port.vi' i opóźnienie 'wait'.
Do 'out port' podpinam adres czyli 378 (to wartość szesnastkowa), zaś do dugiego wejścia "write value" podaję na przemian 6 i 7 jeśli jeśli ma się kręcić zgodnie ze wskazówkami zegara, zaś na przemian 4 i 5, gdy przeciwnie.
Pozostaje tylko podać jakiś warunek kończący tę pętlę czyli np. liczbę kroków.
Czy o to chodziło?
Podsyłam przykładowego vi-aja.
Pozdrawiam
Fajfi
P.S. To zadziała tylko dla jednej sekwencji obrotów.
Aby działało wiele razy trzeba to wrzucić w jakąś nadrzędną pętlę.
Ja zrobiłem to tak (nie wiem czy jest to rozwiązanie najelegantsze):
Najważniejsza jest funkcja "Out port.vi"
Ale po kolei.
U mnie sterowanie idzie z portu LPT.
CLK podłączyłem do pinu 2. Dir do pinu3, zaś to co nazywasz enable do pinu 4.
Do pętli while wrzucam ów 'out port.vi' i opóźnienie 'wait'.
Do 'out port' podpinam adres czyli 378 (to wartość szesnastkowa), zaś do dugiego wejścia "write value" podaję na przemian 6 i 7 jeśli jeśli ma się kręcić zgodnie ze wskazówkami zegara, zaś na przemian 4 i 5, gdy przeciwnie.
Pozostaje tylko podać jakiś warunek kończący tę pętlę czyli np. liczbę kroków.
Czy o to chodziło?
Podsyłam przykładowego vi-aja.
Pozdrawiam
Fajfi
P.S. To zadziała tylko dla jednej sekwencji obrotów.
Aby działało wiele razy trzeba to wrzucić w jakąś nadrzędną pętlę.
- Załączniki
-
- silnik-obroty.vi
- (14.69 KiB) Pobrany 628 razy
Re: Sterowanie silnika krokowego
No nie tak do końca. Nie wiem skąd masz 6 i 7 lub 4 i 5 dla kierunku. Ogólnie wygląda to tak:
silnik pracuje na osi urządzenia odmierzającego precyzyjnie porcje. Ma się obrócić o ok 120' jeśli wynik ważenia będzie niższy od zadanej wagi. Do dyspozycji mam kartę I/O i sterownik silnika.
niech
DO.0 to ENABLE
DO.1 to DIR
DO.2 to CLK
AI.0 to pomiar wagi.
ENABLE ustawiam na "1" aby zasilić cewki. DIR ustawiam na "1" aby kręcić się w prawo (CW). To może być na zwykłych przełącznikach. Jeśli teraz na CLK pojawi się impuls to silnik obróci się o jeden krok.
W moim przypadku musi to być 67 impulsów żeby przestawić silnik o ok 120' czyli pisząc to np w delphi byłoby to tak:
ENABLE := 1;
DIR := 1;
i := 0;
while 1 do
begin
i := i+1;
if ( WAGA < parametr) then
if i<3 then //generuj 67 impulsów na wyjście CLK
else // generuj 66 impulsów, i:=0;
Sleep( 100);
end;
dla mnie to proste pisząc ale trudne rysując
silnik pracuje na osi urządzenia odmierzającego precyzyjnie porcje. Ma się obrócić o ok 120' jeśli wynik ważenia będzie niższy od zadanej wagi. Do dyspozycji mam kartę I/O i sterownik silnika.
niech
DO.0 to ENABLE
DO.1 to DIR
DO.2 to CLK
AI.0 to pomiar wagi.
ENABLE ustawiam na "1" aby zasilić cewki. DIR ustawiam na "1" aby kręcić się w prawo (CW). To może być na zwykłych przełącznikach. Jeśli teraz na CLK pojawi się impuls to silnik obróci się o jeden krok.
W moim przypadku musi to być 67 impulsów żeby przestawić silnik o ok 120' czyli pisząc to np w delphi byłoby to tak:
ENABLE := 1;
DIR := 1;
i := 0;
while 1 do
begin
i := i+1;
if ( WAGA < parametr) then
if i<3 then //generuj 67 impulsów na wyjście CLK
else // generuj 66 impulsów, i:=0;
Sleep( 100);
end;
dla mnie to proste pisząc ale trudne rysując

4050ml A Rh+, a Ty?
- fajfi
- Posty: 185
- Rejestracja: 28 sty 2004 00:00
- Wersja środowiska: LabVIEW 2010
- Lokalizacja: Wrocław
Re: Sterowanie silnika krokowego
Ok.
Mój sterownik jest podpięty do portu LPT.
Szczegóły obsługi tego portu znajdziesz w przykładach (find examples - wpisujesz LPT), ale idea jest prosta:
Jeśli na "out port.vi" wyślesz 1, to wystawisz stan wysoki na pin 2, jak wyślesz 2, to podniesiesz pin 3
4 podniesie pin 4,
8 podniesie pin 5
16 podniesie pin 6
32 podniesie pin 7
64 podniesie pin 8
128 podniesie pin 9.
Piny 2 do 9, to tzw. piny danych.
CLK mam podpięte pod pin 2, DIR pod pin 3, a ENABLE pod pin 4.
Jeśli chcę aby silnik wykonał krok zgodnie z ruchami wskazówek zegara, to muszę:
- podnieść pin na którym jest ENABLE czyli 4, pin;
- podnieść pin na którym jest DIR, czyli 3
- wystawić stan wysoki na CLK czyli pin 2,
czyli na wejście "out port.vi" podaję 1+2+4 czyli 7.
Po wykonaniu kroku na CLK podaję 0, co daje sumę 6. Podanie kolejnej siódemki spowoduje wykonanie następnego kroku stąd naprzemienna sekwencja 7;6.
W przypadku obrotów w kierunku przeciwnym pin na którym jest DIR, czyli pin 3 powinien być w stanie 0, co daje sumę 5 w momencie kroku i 4 w momencie oczekiwania na kolejny impuls.
Prędkość obrotów zależy od opóźnienia między kolejnymi wykonaniami pętli.
Gdy program wykona wszystkie kroki, wówczas na "out port.vi" podaję 0, co gasi wszystkie piny.
To jest tylko sterowanie silnikiem. Aby sprzęgnąć to z wynikami ważenia musisz dorobić jakiś "case", który uruchomi pokazaną przeze mnie pętlę.
Do tego powinieneś mieć opanowane "dogadywanie się" z kartą I/O z poziomu labview - w tym niestety nie pomogę
Pozdrawiam
Fajfi
Mój sterownik jest podpięty do portu LPT.
Szczegóły obsługi tego portu znajdziesz w przykładach (find examples - wpisujesz LPT), ale idea jest prosta:
Jeśli na "out port.vi" wyślesz 1, to wystawisz stan wysoki na pin 2, jak wyślesz 2, to podniesiesz pin 3
4 podniesie pin 4,
8 podniesie pin 5
16 podniesie pin 6
32 podniesie pin 7
64 podniesie pin 8
128 podniesie pin 9.
Piny 2 do 9, to tzw. piny danych.
CLK mam podpięte pod pin 2, DIR pod pin 3, a ENABLE pod pin 4.
Jeśli chcę aby silnik wykonał krok zgodnie z ruchami wskazówek zegara, to muszę:
- podnieść pin na którym jest ENABLE czyli 4, pin;
- podnieść pin na którym jest DIR, czyli 3
- wystawić stan wysoki na CLK czyli pin 2,
czyli na wejście "out port.vi" podaję 1+2+4 czyli 7.
Po wykonaniu kroku na CLK podaję 0, co daje sumę 6. Podanie kolejnej siódemki spowoduje wykonanie następnego kroku stąd naprzemienna sekwencja 7;6.
W przypadku obrotów w kierunku przeciwnym pin na którym jest DIR, czyli pin 3 powinien być w stanie 0, co daje sumę 5 w momencie kroku i 4 w momencie oczekiwania na kolejny impuls.
Prędkość obrotów zależy od opóźnienia między kolejnymi wykonaniami pętli.
Gdy program wykona wszystkie kroki, wówczas na "out port.vi" podaję 0, co gasi wszystkie piny.
To jest tylko sterowanie silnikiem. Aby sprzęgnąć to z wynikami ważenia musisz dorobić jakiś "case", który uruchomi pokazaną przeze mnie pętlę.
Do tego powinieneś mieć opanowane "dogadywanie się" z kartą I/O z poziomu labview - w tym niestety nie pomogę

Pozdrawiam
Fajfi
Re: Sterowanie silnika krokowego
Zaczyna się weekend więc będę miał trochę więcej czasu żeby przygorować moją wersję VI tej aplikacji. Kartę będę miał na dniach więc fizycznie jeszcze nie testowałem komunikacji karty z LV ale zakładam, że nie tu będzie problem. Do aplikacji w miejscu AI zastosuję knob dla płynnego zadawania wagi lub napięcia (nie będzie trzeba przeliczać) bo sygnał z czujnika podaję na wzmacniacz i mam dostać 0-5V na wejściu karty co będzie odpowiadało 0-50kg (oczywiście w przybliżeniu bo wagę muszę kalibrować dla zera i zakresu żeby uzyskać charakterystykę przeliczeniową kg = f(V) ).
Wyjście też obecnie może być jako LED, potem sobie to dopasuję do karty.
Wieczorem powinienem mieć moją pierwszą aplikację VI z propozycją rozwiązania.
Dzięki za wyjaśnienia, spoko pomyślane Twoje sterowanie. Zmyliło mnie to, że ja potrzebuję 67kroków i Ty podajesz naprzemiennie 6 i 7 (ale już wszystko jasne).
Wyjście też obecnie może być jako LED, potem sobie to dopasuję do karty.
Wieczorem powinienem mieć moją pierwszą aplikację VI z propozycją rozwiązania.
Dzięki za wyjaśnienia, spoko pomyślane Twoje sterowanie. Zmyliło mnie to, że ja potrzebuję 67kroków i Ty podajesz naprzemiennie 6 i 7 (ale już wszystko jasne).
4050ml A Rh+, a Ty?
Re: Sterowanie silnika krokowego
Załączam mój pierwszy VI. Obecnie moim celem jest zrobienie generatora CLK którego częstotliwość zmieniam zadając obr/sek (0 - 10) które pomnożone przez 200kroków/obrót dają ilość impulsów na sekundę. Dodatkowo chcę mieć możliwość ręcznie zadać impuls dla pojedynczego kroku. Jak połączyć generator z diodą (wyjściem DO)?
- Załączniki
-
- SILNIK 1.vi
- (11.07 KiB) Pobrany 500 razy
4050ml A Rh+, a Ty?
Re: Sterowanie silnika krokowego
W załączniku najnowsza wersja mojego VI w wersji LV8.5.
Obecnie jest tak: prędkość silnika [obr/sek] ustawia częstotliwość impulsów na CLK_K. CLK to dioda odpowiadająca wyjściu karty advantech,
Silnik ma się obracać co 120' (67imp) sprawdzić warunek (waga<parametr), jeśli tak to zrób skok o 120' (67imp), warunek, jeśli waga<setpoint skok o 120' (66imp). Po trzech skokach muszę znaleźć się w pozycji startowej dlatego muszę na CLK podawać kolejno 67imp, 67imp 66imp żeby suma dała 200kroków.
Ponieważ silnik może się obracać w zakresie 0 - 3000 obr/min zrobiłem generator impulsów do regulacji częstotliwości impulsów.
Niezależnie od prędkości silnika jest sterowanie dawkami czyli ile skoków o 120' ma się wykonać w czasie 1 sekundy.
Są 3 pozycje w których silnik musi się zatrzymać i dla każdej pozycji następuje otwarcie elektrozaworu odpowiedzialnego za dozowanie kolejnej dawki do akumulatora.
Zrobiłem duże postępy od wczoraj
ale VI się robi coraz bardziej zaawansowane.
Obecnie chcę uzyskać prawidłowe działanie diody CLK, która mi nie chce migać
przełącza się CLK_K.
Jak zrobić generator 10 kHz? Wygląda na to, że to co zrobiłem może max 1kHz bo mam wait 1ms. Można ustawić mniejsze czasy? A może jest możliwość w waveform przerobić tak, żeby wygenerować impulsy taktujące CLK na wyjście DO?
Obecnie jest tak: prędkość silnika [obr/sek] ustawia częstotliwość impulsów na CLK_K. CLK to dioda odpowiadająca wyjściu karty advantech,
Silnik ma się obracać co 120' (67imp) sprawdzić warunek (waga<parametr), jeśli tak to zrób skok o 120' (67imp), warunek, jeśli waga<setpoint skok o 120' (66imp). Po trzech skokach muszę znaleźć się w pozycji startowej dlatego muszę na CLK podawać kolejno 67imp, 67imp 66imp żeby suma dała 200kroków.
Ponieważ silnik może się obracać w zakresie 0 - 3000 obr/min zrobiłem generator impulsów do regulacji częstotliwości impulsów.
Niezależnie od prędkości silnika jest sterowanie dawkami czyli ile skoków o 120' ma się wykonać w czasie 1 sekundy.
Są 3 pozycje w których silnik musi się zatrzymać i dla każdej pozycji następuje otwarcie elektrozaworu odpowiedzialnego za dozowanie kolejnej dawki do akumulatora.
Zrobiłem duże postępy od wczoraj

Obecnie chcę uzyskać prawidłowe działanie diody CLK, która mi nie chce migać

Jak zrobić generator 10 kHz? Wygląda na to, że to co zrobiłem może max 1kHz bo mam wait 1ms. Można ustawić mniejsze czasy? A może jest możliwość w waveform przerobić tak, żeby wygenerować impulsy taktujące CLK na wyjście DO?
- Załączniki
-
- SILNIK 1.vi
- LV_8.5
- (25.56 KiB) Pobrany 544 razy
4050ml A Rh+, a Ty?
Re: Sterowanie silnika krokowego
Przeszukałem bloki dostępne dla karty USB4702 i jest tam coś co może załatwić generowanie pulsu na wyjściu DO więc ten temat będę obrabiał na dedykowanych blokach (choć jeszcze nie wiem jak).
Teraz pracuję nad rozwiązaniem problemu ze zmiennymi ilościami kroków na pojedynczy przeskok pozcji dla silnika.
Teraz pracuję nad rozwiązaniem problemu ze zmiennymi ilościami kroków na pojedynczy przeskok pozcji dla silnika.
4050ml A Rh+, a Ty?