Witam wszystkich po przerwie. Wrzucam tutaj moją pracę mgr gdyż wiele osób pytało o nią w wiadomościach prywatnych. Po zainteresowaniu dotyczącym pracy inż. widzę, że na pewno informacje zawarte w pracy mgr, która jest rozwinięciem pierwotnego serwonapędu, przydadzą się wielu osobom. Dla początkujących znów będzie to kompedium wiedzy, dla zaawansowanych pewnie nic ciekawego. Serwonapęd można zastosować z dowolnym silnikiem prądu stałego i enkoderem w dowolnym urządzeniu. Chciałbym jeszcze raz podziękować wszystkim za dobre rady podczas pisania pracy mgr. https://www.youtube.com/watch?v=pbICAofwSSA https://www.youtube.com/watch?v=XJ3ORRuegBI Plik arkusza kalkulacyjnego, który jest w załączniku służył mi do wykreślania trajektorii i odpowiedzi regulatora PID. Obliczenia PID były wykonywane w arkuszu oprócz członu I.
UNIWERSYTET TECHNOLOGICZNO-PRZYRODNICZY
im. Jana i Jędrzeja Śniadeckich w Bydgoszczy
WYDZIAŁ TELEKOMUNIKACJI, INFORMATYKI
I ELEKTROTECHNIKI
PRACA DYPLOMOWA MAGISTERSKA
na kierunku Elektronika
i Telekomunikacja
Ploter tnący
Pracę wykonał:
inż. Mariusz Kozłowski
Praca wykonana pod kierunkiem:
dr inż. Sławomir Bujnowski
Nr indeksu:
82796
Bydgoszcz, 2013
Uniwersytet Technologiczno – Przyrodniczy
im. Jana i Jędrzeja Śniadeckich
WYDZIAŁ TELEKOMUNIKACJI I ELEKTROTECHNIKI
KARTA PRACY DYPLOMOWEJ
Kierunek: Elektronika i telekomunikacja
Studia niestacjonarne drugiego stopnia
PRACA MAGISTERSKA nr 7/2011/2012/ E i T / ZU
Student: inż. Mariusz Kozłowski
Temat pracy: Ploter tnący
Temat pracy (w języku angielskim): CUTTING PLOTTER
Dane wyjściowe: W oparciu o dostępną literaturę i dane dostępne w internecie dokonać analizy
urządzeń. Zaproponować własne rozwiązania, oprogramować i przebadać wykonany model.
Zadania szczegółowe: Przedyskutować rozwiązania występujące w tego typu sprzęcie, opracować
własne rozwiązanie, przebadać wykonany model, ustosunkować się do uzyskanych wyników.
Miejsce przeprowadzonych prac badawczych:
Kierujący pracą: dr inż. Sławomir Bujnowski
....................................................................
(podpis)
Podpis kierownika zakładu: ..................................................
Podpis studenta: ....................................................................
Recenzent: ............................................................................
STRESZCZENIE PRACY
Celem niniejszej pracy było przedstawienie wybranych ploterów tnących oraz
zaprojektowanie własnego rozwiązania. Zostało wykonane mikroprocesorowe sterowanie
wraz z oprogramowaniem sterującym pracą silników z interfejsem komunikacyjnym
poprzez impulsy KROK/KIERUNEK. Napęd urządzenia został oparty na serwonapędach
bazujących na silnikach prądu stałego z enkoderem. Za sterowanie odpowiada regulator PID
wraz z członem sterowania przewidującego. Osiągi zaprojektowanego urządzenia, takie jak
dokładność,
prędkość
czy
przyspieszenie,
zostały
gruntownie
przebadane
oraz
przedstawione w niniejszej pracy w formie wykresów i danych liczbowych. W pracy został
również opisany kod źródłowy programu sterującego pracą silnika oraz wszystkie
komponenty użyte do zbudowania sterowania plotera tnącego. Przedstawiono rozwiązania
końcówek mocy sterujących pracą silnika zarówno w zaprojektowanym urządzeniu jak i
fabrycznych urządzeniach.
ABSTRACT OF THESIS
Aim of the M.A. thesis was to present vinyl cutting plotters and to design own
device. Microprocessor based hardware was designed with the motor control software with
STEP/DIR interface. The device drive was based on DC servomotor with encoder. Motor
control software uses PID controller and feed-forward control. Performance of designed
device, such as accuracy, speed and acceleration were tested and presented in the thesis in
form of graphs and figures. The source code of motor control software and all components
used to build vinyl cutter was described in present thesis. Power amplifiers used by vinyl
cutters manufacturers were presented also with the one used in designed device.
OŚWIADCZENIE
Ja, niżej podpisany:
Imię i nazwisko: Mariusz Kozłowski
Numer albumu: 82796
Wydział: Telekomunikacji, Informatyki i Elektrotechniki
Kierunek studiów: Elektronika i Telekomunikacja
Forma studiów: niestacjonarne
Autor pracy dyplomowej magisterskiej pt.
Ploter tnący
oświadczam, że przedstawioną do obrony pracę w całości napisałem samodzielnie i poza
niezbędnymi konsultacjami z promotorem nie zlecałem jej napisania ani nie odpisywałem żadnej jej
części od innych autorów.
Oświadczam też, że praca, której jestem autorem:
1. Nie narusza praw autorskich w rozumieniu ustawy z dnia 4 lutego 1994 roku o prawie
autorskim i prawach pokrewnych (tekst jednolity Dz. U. z 2006 Nr 90, poz. 631 ze
zmianami) oraz dóbr osobistych chronionych prawem cywilnym.
2. Nie zawiera danych i informacji, które uzyskałem/łam w sposób niedozwolony.
3. Jej treść w formie papierowej i elektronicznej jest identyczna.
Przyjmuję do wiadomości, że jeżeli przedstawione oświadczenie okaże się nieprawdziwe może
zostać stwierdzona nieważność postępowania w sprawie nadania tytułu magistra.
Jestem również świadomy odpowiedzialności wynikającej z przepisów o odpowiedzialności
dyscyplinarnej oraz z przepisów prawa cywilnego i prawa karnego.
Bydgoszcz, dnia 24 czerwca 2013 r.
…………………………………..
(czytelny podpis)
1
OŚWIADCZENIE
Ja, niżej podpisany
imię i nazwisko: Mariusz Kozłowski (nr albumu 82796)
student Uniwersytetu Technologiczno-Przyrodniczego im. Jana i Jędrzeja Śniadeckich w
Bydgoszczy/ kandydat do stopnia naukowego magistra oświadczam, że udzielam nieodpłatnie i na
czas nieokreślony Uniwersytetowi prawa do eksploatacji pracy mojego autorstwa pt.
Ploter tnący
na następujących polach:
1. wprowadzanie i przetwarzanie tekstu pracy dyplomowej w systemie sprawdzającym
oryginalność pracy. Przez przetwarzanie należy rozumieć wyłącznie porównywanie przez
system sprawdzający oryginalność treści pracy dyplomowej/doktorskiej z innymi dokumentami
oraz generowanie przez ten system raportu.
2. Dodanie pracy dyplomowej/doktorskiej do elektronicznej uczelnianej bazy prac.
3. Udostępnienie pracy dyplomowej/doktorskiej dodanej do uczelnianej elektronicznej bazy innym
szkołom wyższym, w celu wykorzystania jej tekstu do wykonania analizy porównawczej
dokonywanej za pomocą systemu sprawdzającego oryginalność prac. Uczelnia może upoważnić
inną osobę/ inny podmiot do korzystania z tej licencji.
Bydgoszcz, dnia 24 czerwca 2013 r.
.…………………………………
podpis autora pracy
2
Spis treści
Wstęp........................................................................................................................
5
1
Cel i zakres pracy....................................................................................................
6
2
Wprowadzenie........................................................................................................
8
2.1 Ploter tnący.....................................................................................................
9
2.1.1
Nóż pasywny...................................................................................... 10
2.1.2
Nóż aktywny....................................................................................... 12
2.1.3
Miękkie opuszczanie noża.................................................................. 13
2.1.4
Budowa ploterów tnących.................................................................. 14
2.1.5
Schemat blokowy................................................................................ 15
2.2 Wykorzystane mikroprocesory....................................................................... 16
2.2.1
Specyfikacja procesora ATmega32..................................................... 16
2.3 Modulacja szerokością impulsu PWM........................................................... 18
2.3.1
Realizacja PWM w układzia mikroprocesora.................................... 18
2.4 Regulator PID................................................................................................. 22
2.4.1
Człon całkujący a nawarstwienie błędu............................................. 24
2.4.2
Anti-windup........................................................................................ 25
2.5 Feed-forward – sterowanie przewidujące....................................................... 27
3
Komercyjne plotery................................................................................................ 28
3.1 Porównanie ploterów trzech producentów...................................................... 29
3.1.1
Parametry techniczne ploterów........................................................... 30
3.1.2
Przedstawienie końcówek mocy ploterów.......................................... 31
3.1.2.1
3.1.2.2
Summa D60R..................................................................... 31
3.1.2.3
4
Roland GX-24.................................................................... 31
Graphtec FC8000................................................................ 32
Konstrukcja zaprojektowane plotera................................................................... 34
4.1 Konstrukcja elektroniczna.............................................................................. 35
4.1.1
Interfejs podłączeniowy...................................................................... 36
3
4.1.2
Sterownik osi...................................................................................... 38
4.1.3
Stopień mocy...................................................................................... 39
4.2 Kontrukcja mechaniczna................................................................................ 42
4.2.1
Model.................................................................................................. 42
4.2.2
Oś X.................................................................................................... 42
4.2.3
Oś Y.................................................................................................... 44
4.3 Oprogramowanie zaprojektowane plotera...................................................... 46
4.3.1
4.3.2
Obsługa sygnału STEP/DIR............................................................... 47
4.3.3
Regulator PID..................................................................................... 47
4.3.4
Funkcje pomocnicze........................................................................... 51
4.3.5
Funkcja ustawiająca PWM................................................................. 52
4.3.6
Funkcja obsługi USART..................................................................... 52
4.3.7
Funkcja przetwarzająca rozkazy......................................................... 53
4.3.8
Funkcja main...................................................................................... 56
4.3.9
Zabezpieczenia serwonapędu............................................................. 57
4.3.10
5
Obsługa enkodera............................................................................... 46
Oprogramowanie LinuxCNC........................................................... 58
Testy zaprojektowanego plotera........................................................................... 65
5.1 Badania plotera............................................................................................... 66
5.1.1
5.1.2
6
Dokładność......................................................................................... 68
Prędkość i przyśpieszenie................................................................... 76
Podsumowanie........................................................................................................ 77
Literatura.............................................................................................................................. 79
Dodatki:
Spis rysunków...................................................................................................................... 80
Spis tabel.............................................................................................................................. 82
Zawartość nośnika CD......................................................................................................... 83
4
Wstęp
Ploter tnący, który uczyniono tematem niniejszej pracy jest urządzeniem
powszechnie używanym w branży reklamowej i kamieniarskiej. Urządzenia wyższej klasy
używają serwonapędów opartych na silnikach prądu stałego, które zapewniają odpowiednią
dokładność i prędkość. Zbudowanie urządzenia o podobnej funkcjonalności jak plotery
fabryczne było celem niniejszej pracy. Wykorzystano serwonapędy, które gwarantują osiągi
potrzebne do konstrukcji plotera. Plotery tnące, frezujące, 3D czy grawerujące są coraz
częściej budowane w warunkach domowych przez hobbystów jak również przez polskie
firmy. Zdecydowana większość tych urządzeń jest budowana w oparciu o silniki krokowe,
ponieważ jest to prostsze rozwiązanie, które jednak nie jest pozbawione wad. Główną wadą
tego rozwiązania jest praca w otwartej pętli oznaczająca brak informacji zwrotnej o
wykonanym ruchu oraz ograniczona prędkość. Główną zaletą silników prądu stałego jest
moment obrotowy niezależny od prędkości obrotowej. W odróżnieniu od silników
krokowych serwonapędy pracują w zamkniętej pętli sprzężenia zwrotnego, która gwarantuje
prawidłową pracę niezależnie od obciążenia silnika. Głównym zadaniem niniejszej pracy
było zbudowanie serwonapędu, który spełni wymagania plotera tnącego a, co za tym idzie,
będzie mógł zostać wykorzystany w różnych innych urządzeniach. Szczegółowy opis
urządzenia oraz załączony kod źródłowy programu pozwoli zrozumieć zasadę działania
plotera tnącego, a w szczególności serwonapędów wykorzystanych do jego napędu. Mam
nadzieję, że przełoży się to na popularyzację serwonapędów, szczególnie wśród hobbystów,
którzy stosują głównie silniki krokowe. Plotery tnące są bardzo rzadko konstruowane przez
hobbystów i niestety również żadna z polskich firm nie ma w swojej ofercie takiego
urządzenia.
5
Rozdział I
Cel i zakres pracy
6
Cele pracy:
1. Zaprojektowanie elektroniki sterującej plotera tnącego.
2. Wykonanie egzemplarza modelowego plotera:
•
zaprojektowanie części elektronicznej,
•
zbudowanie modelu w oparciu o ploter Summa D620,
•
testowanie i badanie zaprojektowanego plotera i porównanie go z komercyjnymi
urządzeniami.
Praca obejmuje:
1. Analizę sposobu działania plotera tnącego wyposażonego w silnik prądu stałego.
2. Analizę komercyjnych ploterów tnących.
3. Analizę oprogramowania sterującego pracą plotera LinuxCNC.
4. Realizację własnego plotera:
•
zaprojektowanie sterowania mikroprocesorowego osi X i Y wraz ze stopniem
sterującym mocy;
•
napisanie programu sterującego pracą mikroprocesorów.
5. Badania zbudowanego plotera.
6. Wnioski z pracy.
7
Rozdział II
Wprowadzenie
8
2.1
Ploter tnący
Ploter tnący to urządzenie sterowane komputerowo. Urządzenie pracuje w dwóch
osiach X (pozioma) i Y (pionowa). Istnieje również oś Z, jednak jest to pozycja narzędzia,
które jest dwustanowe – opuszczone lub uniesione.
Rysunek 2.1.1: Ploter rolkowy firmy Roland
Plotery tnące dzielimy na urządzenia rolkowe oraz płaskie. W niniejszej pracy
zostaną omówione plotery rolkowe. Zasada ich działania jest taka sama jak ploterów
płaskich jednak różnią się one sposobem przesuwu osi pionowej. W ploterach rolkowych to
materiał porusza się, natomiast w ploterach płaskich materiał spoczywa w miejscu, a brama
z narzędziem tnącym przesuwa się nad materiałem. W oczywisty sposób ogranicza to
rozmiar obszaru pracy do wielkości stołu roboczego. W przypadku ploterów rolkowych
jedynym praktycznym ograniczeniem jest szerokość plotera. Oś Y jest w praktyce
nielimitowana z uwagi na przesuwany materiał, który może nawet osiągać długość 100m.
Rysunek 2.1.2: Ploter stołowy firmy Graphtec
9
Plotery tnące napędzane są dwoma rodzajami silników. Tańsze modele dostępne na
rynku są wyposażone w silniki krokowe. Droższe urządzenia wyższej klasy oferują napęd
oparty o serwomechanizmy z zastosowaniem silników prądu stałego. Plotery oparte o
serwonapędy są szybsze, dokładniejsze, a dzięki sprzężeniu zwrotnemu z silników dają
możliwość wykrycia zbyt dużego obciążenia oraz błędów.
Plotery tnące rolkowe przeznaczone są do cięcia materiałów z podkładem. Podkład
jest konieczny aby utrzymać materiał w całości po wycięciu zaprojektowanej grafiki.
Dlatego ploter przecina tylko wierzchnią warstwę materiału, najczęściej folię winylową,
lekko nacinając podkład. Plotery tnące używają dwóch typów narzędzi tnących, noża
pasywnego oraz noża aktywnego, z tym, że trzeba tutaj zaznaczyć, iż pierwsze z nich
obejmuje około 95% rynku z uwagi na swoją prostotę.
2.1.1
Nóż pasywny
Nóż pasywny nazywamy też nożem wleczonym z uwagi na sposób ustawiania
końcówki tnącej noża względem kierunku cięcia.
Rysunek 2.1.1.1: Głębokość cięcia noża
W tym rozwiązaniu nóż znajduje się w oprawce, która ma kształt cylindra z dwoma
osadzonymi łożyskami. Łożysko znajduje się w dolnej części oprawki a łożysko oporowe
ponad nożem. Dzięki mimośrodowej końcówce tnącej nóż ustawia się pod wpływem oporu
cięcia zgodnie z kierunkiem cięcia tak, aby ostrze tnące zawsze ustawiało się ostrzem w
kierunku cięcia.
10
Rysunek 2.1.1.2: Kompensacja przesunięcia końcówki noża
Taki sposób cięcia powoduje, że ostrze posiada przesunięcie punktu cięcia względem
osi obrotu noża. Nazywamy to przesunięciem końcówki noża. Jego wartość uzależniona jest
od typu noża i waha się od 0,15mm do 1mm. Następstwem takiej konstrukcji narzędzia
tnącego jest to, że ruch narzędzia nad materiałem nie może być idealnie taki sam jak
wycinany projekt. Taka sytuacja spowodowałaby zaokrąglenie narożników z powodu
skracania drogi przez nóż wleczony. Oprogramowanie sterujące ploterem musi
kompensować przesunięcie końcówki noża tak aby kąty proste nie były zaokrąglone.
Kompensację tą widać na rysunku powyżej. Realny ruch karetki plotera nie pokrywa się z
wycinanym wektorem. Karetka tnąca musi wykonać ruch w kształcie ćwiartki okręgu o
promieniu równym przesunięciu końcówki noża.
Rysunek 2.1.1.3: Nóż wleczony i budowa końcówki tnącej
11
2.1.2
Nóż aktywny
Drugim rozwiązaniem jest nóż aktywny, niekiedy nazywany nożem obrotowym (ang.
tangential knife). Tutaj nóż nie obraca się samoistnie lecz jest obracany przez dedykowany
silnik, który tak obraca nożem aby jego końcówka tnąca zawsze była równoległa do
stycznej ścieżki, po którym porusza się nóż.
Rysunek 2.1.2.1: Schemat noża tnącego oraz obracającego nim silnika
W tym rozwiązaniu karetka tnąca wykonuje ruch dokładnie taki jak zaprojektowany
wektor, ponieważ nóż tnący jest obracany w odpowiednim momencie przez dodatkowy
silnik. Takie działanie noża pociąga za sobą wiele korzyści. Umożliwia precyzyjne cięcia
grubych folii, w których nóż wleczony ma problemy z obracaniem. Inną przewagą noża
aktywnego jest możliwość cięcia z duża prędkością liter o wielkości przykładowo 4mm w
cienkiej folii. W przypadku noża pasywnego wywiera on nacisk boczny na wycinane
obiekty. Siła potrzebna do obrotu noża powstaje poprzez tarcie o cięty materiał. Takie tarcie
potrafi wyrwać wycinane obiekty z podkładu. Dzieje się tak gdy siła trzymająca je do
spodniej warstwy materiału jest mniejsza niż siła potrzebna do obrotu noża. W takim
przypadku sprawdza się nóż aktywny, który nie wywiera takiej siły na wycinane obiekty z
uwagi na to, że jest obracany przez zewnętrzny silnik, który w ploterach Summa z serii T
jest silnikiem prądu stałego z enkoderem.
12
Rysunek 2.1.2.2: Zasada działania noża aktywnego
Nóż aktywny stosowany jest głównie w przemyśle kamieniarskim do wycinania liter
w grubej folii gumowej (0,2mm do 0,7mm). Folia ta jest później używana m.in. do
piaskowania liter na pomnikach.
Rysunek 2.1.2.3: Nóż aktywny
2.1.3
Miękkie opuszczanie noża
Obydwa rodzaje narzędzie muszą być opuszczone na materiał w ciągu ułamka
sekundy, ponieważ opuszczanie i podnoszenie noża nie może powodować opóźnień.
Funkcja miękkiego opuszczania noża służy do gładkiego lądowania narzędzia tnącego oraz
zapobiega odbiciu narzędzia od materiału.
Kiedy maszyna otrzymuje rozkaz ruchu cewka nakłada nacisk, który przesuwa
narzędzie w dół. Po chwili cewka nakłada nacisk w stronę przeciwną, zanim narzędzie
dotknie materiału, wyhamowując większość prędkości opadania narzędzia. Gdy narzędzie
jest bardzo blisko materiału cewka nakłada zadany przez użytkownika nacisk gwarantujący
prawidłowe cięcie lub rysowanie. Jest to bardzo istotna funkcja, gdyż jej brak spowoduje
odbicie się narzędzia od materiału i podskakiwanie narzędzia po materiale przez pierwsze
chwile ruchu. Skutkuje to nieprawidłowym przerywanym cięciem.
13
Rysunek 2.1.3.1: Wykres kierunku nacisku noża w czasie opuszczania.
2.1.4
Budowa ploterów tnących
Konstrukcja ploterów tnący rolkowych różnych producentów jest bardzo podobna.
Wszystkie plotery posiadają karetkę tnącą napędzaną przez silniki krokowe lub prądu
stałego. Za ruch karetki odpowiada pasek zębaty lub stalowa linka w zależności od
producenta. Karetka tnąca porusza się w osi X.
Rysunek 2.1.4.1: Karetka tnąca
14
Kolejnym nieodłącznym elementem plotera są rolki napędowe oraz górne rolki
dociskowe. Razem odpowiadają za przesuw materiału czyli ruch w osi Y.
Rysunek 2.1.4.2: Górna rolka dociskowa oraz dolny wałek perforowany
2.1.5
Schemat blokowy
Typowy ploter tnący składa się z ruchomej karetki, na której znajduje się płytka
elektroniczna, gdzie znajdują się gniazda do podłączenia czujników oraz cewki mechanizmu
opuszczania noża. Płytka karetki jest połączona z płytą główną elastyczną taśmą sygnałową,
która umożliwia przekazywanie sygnału na poruszającą się karetkę tnącą. Materiał w
ploterze tnącym przesuwany jest na wałku perforowanym. Folia lub papier dociskany jest
do wałka perforowanego przez górne rolki dociskowe. Porównywane plotery tnące mają
podobną budowę, która została przedstawiona na schemacie poniżej:
G N IA Z D O
R S2 3 2
Z A S ILA C Z
PR Z ED N I C Z U JN IK M AT E R IAŁ U
G N IAZ D O
USB
PŁYTA GŁÓW NA
T YL N Y C Z U JN IK M AT ER IAŁ U
S IL N IK
PRZ ESUW U
K AR E T KI
P ŁY T K A K A R E T K I
S IL N IK
P R Z ES U W U
M AT ER IAŁ U
C EW KA
O PU SZ C Z A N IA
NOŻA
S EN SO R
S EN S O R
Z N A C Z N IK Ó W R O L EK
D O C ISK O W YC H
PŁYTKA
PAN ELU
WENTYLATOR
PR Z YC ISK I
Rysunek 2.1.5.1: Schemat blokowy typowego plotera tnącego [5].
15
2.2
Wykorzystane mikroprocesory
W procesie projektowania wybrano do sterowania osiami plotera procesor Atmel
ATmega32. Mikroprocesory z rodziny AVR są bardzo popularnymi układami 8-bitowymi.
Popularność zawdzięczają dużej ilości narzędzi programistycznych.
2.2.1
•
Specyfikacja procesora Atmega32
Architektura RISC
•
•
32 8-bitowe rejestry ogólnego przeznaczenia
•
•
131 instrukcji (większość wykonywana w jednym cyklu zegarowym)
Wydajność do 16 MIPS przy taktowaniu 16MHz
Pamięci
•
32kB pamięci flash programu
•
1kB pamięci EEPROM
•
2kB wewnętrznej pamięci SRAM
•
Możliwość do 10000 zapisów pamięci flash oraz 100000 pamięci
EEPROM
•
Wewnętrze elementy procesora
•
•
Jeden 16-bitowy timer/licznik
•
Licznik czasu rzeczywistego z odseparowym taktowaniem
•
Cztery kanały PWM
•
8-kanałowy 10-bitowy przetwornik analogowo-cyfrowy
•
Dwużyłowy interfejs szeregowy
•
Programowalny USART
•
Interfejs SPI
•
Watchdog
•
•
Dwa 8-bitowe timery/liczniki
Komparator analogowy
Funkcje specjalne mikroprocesora
•
Reset przy włączeniu oraz detekcja zaniku napięcia
•
Wewnętrzny oscylator RC
•
Wewnętrzne i zewnętrzne źródła przerwań
16
•
•
6 trybów uśpienia
Porty oraz obudowa
•
•
•
32 programowalne linie wyj/wej
40 pinowy PDIP
Napięcie zasilające
•
•
4,5V – 5,5V
Taktowanie
•
0 – 16MHz
Rysunek 2.2.1.1: Mikroprocesor ATMega32
17
2.3
Modulacja PWM
Modulacja PWM (z ang. Pulse Width Modulation) to inaczej modulacja szerokością
impulsu. Częstotliwość sygnału modulowanego szerokością impulsu powinna być
dostosowana do bezwładności urządzenia. W przypadku silników stosuje się częstotliwość
wyższą niż pasmo akustyczne aby uniknąć generowania dźwięku przez uzwojenie silnika.
Generowany przebieg prostokątny ma stałą częstotliwość natomiast zmienny jest
współczynnik wypełnienia. Wzór na współczynnik wypełnienia wygląda następująco.
=
tP
T
gdzie:
tP – długość impulsu
T – okres przebiegu
Modulacja PWM w niniejszej pracy wykorzystywana jest do sterowania mocą
silników osi X i Y.
Rysunek 2.3.1: Przebiegi czasowe sygnału PWM.
Wartość średniego napięcia jest wprost proporcjonalna do współczynnika
wypełnienia i napięcia zasilania.
18
2.3.1
Realizacja PWM w oparciu o układ mikroprocesora
Do generowania przebiegu prostokątnego o zmiennym współczynniku
wypełnienia wykorzystano 16-bitowy timer1. Został on skonfigurowany jako 10bitowe szybkie PWM (fast PWM, 10-bit), które generuje dwa przebiegi PWM
odwrócone w fazie. Licznik TCNT1 liczy od 0 do 1023. Wewnętrzny komparator
porównuje stan licznika TCNT1 z rejestrem OCR1x. W momencie gdy TCNT1 =
OCR1x rejestr OC1A zmienia stan na niski a OC1B na wysoki. Rejestr OC1A jest
fizycznie połączony z zewnętrznym pinem 5 portu D. Rejestr OC1B jest fizycznie
połączony z 4 pinem portu D. W ten sposób generowy jest przebieg o zmiennym
wypełnieniu, który steruje mocą silnika oraz kierunkiem. Wartość rejestru OCR1x
ustala regulator PID, który reguluje mocą silnika. Zakres pracy regulatora PID to od
-511 do +511, więc potrzebne jest przesunięcie wartości na osi liczbowej w prawą
stronę o 511.
Rysunek 2.3.1.1: Sposób działania generatora sygnałów PWM.
Częstotliwość sygnału PWM można obliczyć przy użyciu poniższego wzoru
[8].
f
PWM
=
f
I /0
N⋅12 n
19
gdzie:
fI/0 – częstotliwość taktowania procesora
N – dzielnik częstotliwości
n – rozdzielczość sterowania
Po podstawieniu:
f
PWM
=
16 MHz
=15,625 kHz
10
1⋅12
Dzięki zastosowaniu częstotliwości sygnału PWM zbliżonej do krańca pasma
akustycznego dla większości ludzi silnik nie jest słyszalny. Wyższą częstotliwość
PWM można uzyskać poprzez zmniejszenie rozdzielczości sterowania.
W pozycji zadanej gdy błąd wynosi 0 wypełnienie PWM równa się 50%.
Znaczy to, że przeciwległe tranzystory w mostku H przewodzą prąd na przemian za
sprawą dwóch odwrotnych przebiegów PWM generowanych przez mikroprocesor.
U
U /2
Z
0
t
-U /2
Z
Rysunek 2.3.1.2: Wykres napięcia na silniku w stanie bezruchu.
Średnie napięcie wynosi 0 przy częstotliwość PWM = 15kHz własności
fizyczne silnika powodują, że płynący przez niego prąd również jest znikomy (około
50mA). Wypełnienie 100% oznacza pełną moc silnika i obrót, np. w prawo, a 0%
pełną moc silnika i obrót w lewo. Dzięki umieszczeniu punktu pracy serwonapędu w
miejscu, gdzie wypełnienie wynosi 50% zlikwidowano problem niewielkiej
odporności serwonapędu na zewnętrzne zmiany obciążenia blisko punktu zadanego.
Inaczej mówiąc silnik słabo trzymał zadaną pozycję w okolicy punktu zadanego.
Wynikało to z tego, że wypełnienia od 0 do 60% były nieskuteczne z punktu
widzenia sterowania silnikiem, ponieważ silnik nie reagował na przyłożenie takiego
napięcia. Takie sterowanie zwiększa liniowość odpowiedzi układu blisko punktu
zadanego. Jako, że wypełnienie sygnału PWM było wprost proporcjonalne do
odpowiedzi regulatora PID, który w głównej mierze zależy od wartości członu
proporcjonalnego, ta zależność powodowała, że małe błędy były całkowicie
20
ignorowane przez napęd jako takie, które nie są w stanie wymusić ruchu silnika.
Dopiero gdy błąd osiągnął większą wartość silnik reagował dużą siłą, co
powodowało, że napęd stawał się niestabilny. Człon całkujący, który ma za zadanie
usunąć błąd w stanie ustalonym działa wolniej niż człon proporcjonalny, ponieważ
musi narosnąć w czasie. Większa wartość wzmocnienia członu całkującego
powoduje szybszą reakcję z uwagi na szybszy czas narastania akcji całkującej,
jednak ma to efekt uboczny w postaci przeregulowania. Poniższy poglądowy rysunek
przedstawia zachowanie napędu i generowanej przez silnik siły w sytuacji sterowania
końcówki mocy jednym przebiegiem PWM (linia przerywana – punkt pracy przy
wypełnieniu 0%) oraz dwoma przeciwnymi przebiegami PWM (linia ciągła – punkt
pracy przy wypełnieniu 50%).
Rysunek 2.3.1.3: Wykres siły w funkcji błędu.
21
2.4
Regulator PID
Regulator PID (regulator proporcjonalno-całkująco-różniczkujący, ang. proportionalintegral-derivative controller)
jest jednym z najczęściej używanych algorytmów w
systemach kontroli. Algorytm PID korzysta z pętli sprzężenia zwrotnego w celu korekcji
błędu pomiędzy wartością zmierzoną procesu a wartością zadaną. Regulator PID zawiera w
sobie 3 niezależne drogi kontroli błędu, człon proporcjonalny, całkujący i różniczkujący,
które odpowiednio regulują wartość zadaną bazując na błędzie aktualnym, przeszłym i
przyszłym. Poszczególne człony regulatora po pomnożeniu przez swoje wzmocnienia
sumują się na ogólną odpowiedź regulatora PID.
Postać ciągłą regulatora PID można zapisać jako:
t
1
d
u t =k p et ∫ e d T d e t
Ti 0
dt
gdzie:
u(t) – sygnał wyjściowy regulatora,
kp – współczynnik wzmocnienia,
Tc – czas całkowania,
Td – czas różniczkowania.
Regulator PID w formie dyskretnej, zastępując całkowanie – sumowaniem a
różniczkowanie – różnicowaniem, można zapisać jako:
Ts i
T
u i =k p ei ∑ en d e i−ei−1
T c n=0
Ts
gdzie:
u(i) – sygnał wyjściowy regulatora i-tym kroku,
e(i) – sygnał błędu w i-tym kroku,
e(i - 1) – sygnał błędu w i-1 kroku,
kp – współczynnik wzmocnienia,
Tc – czas całkowania,
Td – czas różniczkowania,
22
Ts – okres próbkowania.
Aby uzyskać regulator niezależny należy rozdzielić człony indywidualnymi wzmocnieniami
poprzez podstawienie Kp = kp , K i=k p
Ts
,
Tc
K d =k p
Td
, po podstawieniu wzór
Ts
przyjmuje postać:
i
u t =K p ei K i ∑ e n K d e i −ei−1
n=0
gdzie:
Kp – wzmocnienie członu proporcjonalnego,
Ki – wzmocnienie członu całkującego,
Kd – wzmocnienie członu różniczkującego.
W zaprojektowanym sterowniku wprowadzono pewną modyfikację powyższego
równania. W algorytmie realizowanym przez mikroprocesor równanie to przyjmuje postać:
i
u t =K p ei∑ K i⋅e n K d e i−ei−1
n=0
Różnica wydaje się żadna z punktu widzenia teoretycznego, gdyż skalowanie i
i
są
operacjami
liniowymi,
więc
i
n=0
całkowanie
n =0
∑ K i⋅e n=K i ∑ e n
,
jednak
w
praktycznym zastosowaniu istnieje różnica. W liniowym systemie powyższe dwa podejścia
są równoznaczne.
Jednym z powodów tej modyfikacji są jednostki członu całkującego. W przypadku
gdy całkujemy a potem skalujemy to jednostką członu całkującego jest jednostka
wejściowa. W przypadku gdy skalujemy a później całkujemy to jednostką członu
całkującego jest jednostka wyjściowa [3].
23
2.4.1
Człon całkujący a nawarstwienie błędu
Wszystkie systemy rzeczywiste mają ograniczenia. Na przykład silnik nie może
przekroczyć maksymalnego momentu obrotowego czy prędkości maksymalnej. W
porównaniu do idealnych systemów liniowych układu rzeczywiste są liniowe tylko w
pewnym zakresie. Zjawisko to występuje kiedy na wejściu regulatora PID wystąpi nagły
wzrost wartości zadanej i spowoduje wystąpienie błędu o dużej wartości. Jeśli prędkość
całkowania jest większa niż rzeczywista prędkość silnika to w takiej sytuacji silnik
momentalnie osiągnie maksymalną moc (będzie w stanie nasycenia). W takiej sytuacji silnik
będzie pracował w stanie nasycenia niezależnie od wartości wyjściowej regulatora PID a
pętla sprzężenia zwrotnego zostanie przerwana z powodu braku reakcji silnika na wartość
sterującą (system stanie się nieliniowy). Wtedy błąd będzie nadal całkowany a wielkość
członu całkującego będzie rosnąć, mówiąc potocznie, błąd będzie się nawijał (ang. windup).
Kiedy silnik osiągnie pozycję zadaną, znak błędu się zmieni i człon całkujący zacznie się
zmniejszać, mówiąc potocznie, odwijać. W czasie zmniejszania wartości członu całkującego
wyjście jest nasycone przez długi okres czasu, co powoduje opóźnienie odpowiedzi układu.
Takie zachowanie spowoduje duże przeregulowanie i niestabilność układu.
Rysunek 2.4.1.1: Zjawisko nawijania się akcji całkującej.
24
2.4.2
Anti-windup
Aby zaradzić temu problemowi stosuje się różne strategie [3]:
– Zmiana wartości zadanej po krzywej, która gwarantuje liniowość systemu,
– Wstrzymanie członu całkującego gdy wartość sterująca osiągnie limit (stan
nasycenia),
– Określenie minimalnej i maksymalnej wartości dla członu całkującego.
W zaprojektowanym sterowniku zastosowano wszystkie trzy strategie. Pierwsza
strategia realizowana jest na etapie programu sterującego. Prędkość posuwu osi jest tak
dobrana aby bezwładność i obciążenia osi sterowanych nie powodowały przeciążenia
silnika i, co za tym idzie, maksymalnej mocy silnika przez nie dłużej niż 30ms. W
przypadku przekroczenia tego czasu serwonapęd zatrzymuje się z błędem przeciążenia,
gdyż w tym czasie układ pracuje w otwartej pętli i wartość błędu nie jest kontrolowana.
Druga i trzecia strategia jest realizowana w sterowniku PID.
Druga strategia zastosowana w regulatorze PID została rozbudowana o dodatkowy
warunek wstrzymywania całkowania. Jeśli znak błędu oraz wyjścia regulatora jest taki sam
to całkowanie jest wstrzymywane.
u∗e0
Rozwiązanie to ma ogromną zaletę, gdyż człon całkujący nie jest hamowany gdy
pomaga wartości sterującej wyjść poza obszar nasycenia. Takie działanie nazywamy
warunkowym całkowaniem (ang. conditional integration).
Kolejny schemat przedstawia zastosowaną metodę zapobiegania nawijania się błędu (ang.
anti-windup).
25
Rysunek 2.4.2.1: Schemat blokowy algorytmu anti-windup [4].
gdzie:
a) włącznik członu całkującego,
b) wzmocnienie członu całkującego,
c) człon całkujący,
d) mnożenie e · u,
e) określenie znaku e · u & gt; 0,
f) sprawdzenie czy wyjście jest nasycone,
h) limitowanie wartości wyjściowych,
g) mnożenie warunków e · u & gt; 0 i nasycenie.
Rysunek 2.4.2.2: Zachowanie regulatora z mechanizmem Anti-windup.
26
2.5
Feed-forward – sterowanie przewidujące
Osiągi systemu sterującego mogą zostać poprawione przez połączenie systemu z
zamkniętą pętlą (ang. closed-loop) z systemem z otwartą pętlą (ang. open-loop). Człon
sterowania z wyprzedzeniem (ang. feed-forward), nazywany też czasem predykcyjnym, nie
jest wymuszony pętlą sprzężenia zwrotnego (ang. feedback), więc nie może spowodować
oscylacji systemu, jednak polepsza odpowiedzi czasowe systemu i stabilność.
Pętla kalkulacji serwonapędu oblicza zmianę rozkazu pomiędzy pętlami. Zmiana ta
obok wartości sterującej regulatora PID składa się na ogólną odpowiedź serwonapędu.
Regulator PID może potrzebować pomocy gdy silnik porusza się i przyspiesza. Oznacza to,
że gdy obciążenie jest przyspieszane lub hamowane, proporcjonalna ilość siły jest zadana do
napędu, niezależnie od wartości sprzężenia zwrotnego. Możliwe jest zastosowanie 3
członów sterowania z wyprzedzeniem opartych na zadanej pozycji, prędkości i
przyspieszeniu [2]. Człon oparty na pozycji jest zwykle nieużywany, jednak dwa pozostałe
człony są bardzo przydatne do korekcji błędów dynamicznych, ponieważ człony te są oparte
na wartości zadanej a nie na aktualnym błędzie, więc mogą stosować korekty, które
pomagają serwonapędowi pozostać na ścieżce, nawet zanim PID wykryje błąd. Dlatego
nazywa się je członami z wyprzedzeniem (predykcyjne, przewidujące).
400
3000
300
2000
200
Output
1000
100
FF1
FF0
P
0
I
D
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Command
-100
Feedback
-1000
-200
-2000
-300
-400
-3000
Rysunek 2.5.1: Człon predykcyjny (kolor granatowy) odpowiada za większość odpowiedzi
regulatora podczas ruchu z dużą prędkością.
27
Rozdział III
Komercyjne plotery
28
3.1
Porównanie ploterów trzech producentów
Porównanie przykładowych ploterów tnących wykorzystujących do napędu
serwonapędy oparte na silnikach prądu stałego.
1. Roland GX-24 – japoński ploter tnący bardzo popularny na polskim rynku, sprzedaż
tego modelu załamała się po kryzysie w 2009 i znacznym wzmocnieniu japońskiego
jena.
Rysunek 3.1.1: Ploter Roland CAMM-1 GX-24
2. Summa D60R Pharos – belgijski ploter tnący, najpopularniejszy na polskim rynku,
wybierany z uwagi na dobry stosunek jakości do ceny i wręcz legendarną
niezawodność.
Rysunek 3.1.2: Ploter SummaCut D60R
3. Graphtec FC8000-60 – japoński ploter tnący popularny na polskim rynku z uwagi na
stosunkowo niską cenę.
29
Rysunek 3.1.3: Ploter Graphtec FC8000-60
4. Summa D620 – historyczny model Summa produkowany około 15 lat temu.
Mechanika tego plotera posłużyła do zbudowania modelu.
3.1.1
Parametry techniczne ploterów
Porównanie istotnych parametrów technicznych powyższych ploterów tnących[5,6,7]:
Parametr/Model
Roland GX-24
Summa D60R
Graphtec FC8000
Własny / D620
Szerokość cięcia
584mm
630mm
610mm
600mm
250g
400g
600g
400g
Prędkość osiowa
500mm/s
800mm/s
1050mm/s
500mm/s
Prędkość przekątna
705mm/s
1131mm/s
1485mm/s
705mm/s
Przyspieszenie
brak danych
2G
4G
0,3G
Rozdzielczość
mechaniczna
0,0125mm/krok
0,0127mm/krok
0,005mm/krok
0,0123mm/krok
Rozdzielczość
programowa
0,025mm/krok
0,025mm/krok
0,025mm/krok
–
Język instrukcji
CAMM-GL III
HPGL / DMPL
GPGL / HPGL
Impulsy
STEP/DIR
Interfejs
USB / RS232
USB / RS232
USB / RS232
STEP/DIR
przez port LPT
Nacisk noża
Tabela 3.1.1.1: Porównanie ploterów fabrycznych z skonstruowanym ploterem.
30
3.1.2
Przedstawienie końcówek mocy ploterów
3.1.2.1
Roland GX-24
Firma Roland w ploterze z serii CAMM-1 – GX-24 zastosowała układ L6234 firmy
ST Electronics. Jest to sterownik silnika 3-fazowego, jednak w tej aplikacji służy do
sterowania silnika DC. Dwie trzecie układu czyli 2 kanały służą do sterowania silnika DC,
natomiast 3 kanał, który pozostał wolny zastosowano do sterowania mechanizmu
opuszczania noża. W ploterze znajdują się dwa układy L6234, po jednym na oś. Trzeci
kanał z układu sterującego osią X oraz trzeci kanał układu sterującego osią Y został
wykorzystany do sterowania cewki opuszczania noża [5].
Rysunek 3.1.2.1.1: Końcówka mocy plotera Roland GX-24
Układ L6234 ma takie same parametry prądowe jak L6203. Może sterować prądem o
natężeniu 4A oraz prądem chwilowym 5A. Maksymalna częstotliwość przełączania wynosi
150kHz i jest większa niż w przypadku układu L6203. Najczęściej jednak stosuje się
częstotliwość bliską górnej granicy pasma akustycznego aby zmniejszyć straty mocy, gdyż
im większa częstotliwość przełączania tym większe straty mocy. Częstotliwość powyżej
górnej granicy pasma akustycznego uniemożliwia generowanie słyszalnego dzwięku przez
uzwojenie silnika.
31
3.1.2.2
Summa D60R
Niestety producent ploterów Summa w przeciwieństwie do swojej konkurencji nie
udostępnia schematów płytek. Summa tak jak pozostali producenci korzysta z układów
firmy ST Electronics, a dokładniej układu L6203. Jego parametry zostały już opisane w
rozdziale o ploterze Graphtec. Można założyć, że sposób sterowania jest podobny.
3.1.2.3
Graphtec FC8000
Tak jak w innych porównywanych ploterach zastosowano tutaj mostek L6203. Jest to
4A mostek DMOS typu H. Maksymalny prąd szczytowy może osiągać 5A. Maksymalna
częstotliwość pracy tego układu wynosi 100kHz.
Do pomiaru prądu użyto wyjścia SENSE, które dzięki rezystorowi R121 (R sense)
umożliwia kontrolę prądu silnika. Sygnał o prądzie płynącym w silniku pod postacią
napięcia podawany jest na wejście ADC mikroprocesora sterującego pracą serwonapędu.
Zespół diód zabezpiecza wejścia mikroprocesora.
Rysunek 3.1.2.3.1: Wejścia przetworników ADC z informacją o prądzie [6].
32
DC MOTOR
Rysunek 3.1.2.3.2: Końcówka mocy plotera FC-8000
33
Rozdział IV
Konstrukcja zaprojektowanego plotera
34
4.1
Konstrukcja elektroniczna
Konstrukcja elektroniczna zaprojektowanego plotera tnącego jest modułowa i składa
się z kilku kluczowych elementów. Są to: komputer klasy PC z zainstalowanym
oprogramowaniem LinuxCNC, płytka interfejsu LPT & gt; STEP/DIR, sterownik z procesorem
zarządzającym silnikiem oraz końcowy stopień mocy. Poniższy schemat blokowy
sterowania jednej osi urządzenia przedstawia wszystkie zależności i kierunki przepływu
sygnałów w zaprojektowanym urządzeniu.
Rysunek 4.1.1: Schemat blokowy urządzenia.
Schemat ideowy osi urządzenia pokazuje więcej szczegółów niż schemat blokowy.
Na schemacie pominięto wyświetlacz LCD oraz interfejs komunikacyjny RS232 & gt; USB,
ponieważ nie jest to tematem niniejszej pracy. W kodzie programu znajdują się również
funkcje, które sterują wyjściami portu C. Na schemacie znalazły się 3 diody informujące o
gotowości napędu, nasyceniu silnika oraz błędu przeciążenia. Do portu C można podłączyć
8 diód LED, które pokazują stan wewnętrzny układu, wejścia do przerwań enkodera,
rozkazów itd. Nie narysowano ich na schemacie, ponieważ podczas normalnej pracy układu
są nieużyteczne, a przydają się podczas prac rozwojowych i wyszukiwaniu błędów w
programie. Więcej szczegółów można znaleźć w załączonym do pracy kodzie źródłowym
programu.
35
GND
100n
14
V CC
7
GND
100u/16V IC2P
C8
GND
29
28
27
26
25
24
23
22
(O C 2 )P D 7
(IC P )P D 6
(OC 1 A )P D 5
(OC 1 B )P D 4
(IN T1 )P D 3
(IN T0 )P D 2
(T X D )P D 1
(R X D )P D 0
VC C
+
C9
21
20
19
18
17
16
15
14
V SS
D5
VH E2 20
D6
VH E2 20
V SS
5
7
10
12
8
7
6
5
4
3
2
1
(TOS C 2 )P C 7
(TOS C 1 )P C 6
(TD I)P C 5
(T D O)P C 4
(T M S )P C 3
(T C K )P C 2
(S D A )P C 1
(S C L )P C 0
6
11
8
GND
4
VS
E NAB LE _A
E NAB LE _B
IN P U T1
IN P U T2
IN P U T3
IN P U T4
1
15
SE N_A
SE N_B
2
3
13
14
O U T1
O U T2
O U T3
O U T4
271
100n
C6
GN D
L298
470
C7
FL2
READY_LED
R7
470
SAT_LED
R8
13
IC2A
GND
R1
74HCT14N
47
R2
11
IC2B
MOT_OUT
OVR_LD_LED
74HCT14N
10
271
220u/63V
1
2
3
GND
R6
470
12
FL1
GND GND
VC C
GND
(S C K )P B 7
(M IS O)P B 6
(M OS I)P B 5
(S S )P B 4
(A IN 1 /O C 0 )P B 3
(A IN 0 /IN T2 )P B 2
(T1 )P B 1
( T0 /X C K ) P B 0
100n
V CC
D8
VH E2 20
D7
VH E2 20
V CC
GN D
C5
+
A RE F
AV C C
A GN D
1
22 p
Q1
32
30
31
10
11
C4
X TA L 1
33
34
35
36
37
38
39
40
VC C
X TA L 2
13
(A D C 7 )PA 7
(A D C 6 )PA 6
(A D C 5 )PA 5
(A D C 4 )PA 4
(A D C 3 )PA 3
(A D C 2 )PA 2
(A D C 1 )PA 1
(A D C 0 )PA 0
9
R3
1k
R4
1k
12
IC3
R5
VC C
RES E T
V CC
V CC
2 2p
9
2
C3
10k
IC1
C2 C1
47
1
2
3
4
FL3
271
FL4
271
ENC_IN
1n 1n
MEGA32-P
GND
GND
1
2
3
FL5
271
FL6
CAP_IN
271
GND
GND
Rysunek 4.1.2: Schemat ideowy urządzenia.
4.1.1
Interfejs podłączeniowy
Do podłączenia plotera do oprogramowania sterującego LinuxCNC, które generuje
impulsy STEP/DIR poprzez port równoległy, wykorzystano gotową płytkę pośredniczącą.
Kilku producentów oferuje takie płytki zmontowane lub w postaci samej płytki PCB.
Głównymi odbiorcami takiego produktu są hobbyści, którzy budują frezarki i inne
urządzenia sterowane numerycznie za pomocą oprogramowania takiego jak LinuxCNC lub
Mach2/Mach3. W zaprojektowanym ploterze zastosowano płytkę firmy " Akcesoria CNC " o
symbolu SSK-MB1. Oprogramowanie sterujące generuje impulsy sterujące poprzez port
równoległy komputera umożliwiając sterowanie do 4 osi oraz kilku urządzeń peryferyjnych,
takich jak pompa chłodziwa czy odkurzacz opiłków w przypadku sterowania urządzenia
frezującego.
36
Rysunek 4.1.1.2: Płytka SSK-MB1 połączona z płytą główną komputera
Wyprowadzenia płytki pośredniczącej należało skonfigurować w oprogramowaniu
LinuxCNC wg następującego schematu [11].
Rysunek 4.1.1.3: Wyprowadzenia portu równoległego.
1 – PRZEKAŹNIK PK1
2 – CLK X
3 – DIR X
4 – CLK Y
5 – DIR Y
6 – CLK Z
7 – DIR Z
8 – CLK A
9 – DIR A
10 – E-STOP
37
11 – HOME X
12 – HOME Y
13 – HOME Z
14 – KANTHALL/SPINDLE CONTROL
15 – HOME A
16 – PRZEKAŹNIK PK2
17 – ENABLE
18, 19, 20, 21, 22, 23, 24, 25 – GND
Płytka SSK-MB1 posiada 3 porty do podłączenia układów sterujących pracą 3 osi
urządzenia. Poniżej przedstawiono zdjęcie portu oraz opis wyprowadzeń.
Rysunek 4.1.1.4: Wyprowadzenia sterujące osi X [11].
GND – masa napięcia +5V i sygnałów sterujących,
VCC – zasilanie +5V (można użyć do zasilania mikroprocesora),
ENA – wyj. sygn. uruchamiającego sterownik (niepodłączone),
DIR – sygnał kierunku,
CLK – inaczej STEP, sygnał kroku osi,
H/F – sygnał pracy w trybie pełnego kroku i półkroku (wykorzystywane przy sterowaniu
silników krokowych).
4.1.2
Sterownik osi
Sterownik oparty o mikroprocesor realizuje funkcje sterowania silnikiem oraz
komunikacji z komputerem poprzez złącze USB w celu ustawienia parametrów pracy
serwonapędu. Każdy sterownik steruje jedną osią urządzenia. Sterownik otrzymuje rozkazy
38
o zadanych ruchu z płytki interfejsu w postaci sygnału STEP/DIR (krok/kierunek).
Regulator PID ustala adekwatną odpowiedź sterownika do aktualnych warunków pracy
silnika, tj. obciążenia i zadanej trajektorii ruchu.
4.1.3
Stopień mocy
W czasie tworzenia pracy zastosowano i przetestowano dwie końcówki mocy. Jedną
opartą o układ L298 a drugą o układ L6203. Obydwa układy scalone to mostki typu H.
Układ L298 oparty jest na tranzystorach bipolarnych a układ L6203 na unipolarnych, co w
czasie tworzenia urządzenia okazało się istotną różnicą. Układ L298 można obciążyć
maksymalnie 2A podczas ciągłej pracy natomiast drugi układ ma obciążalność dwa razy
większą [9, 10]. Zaletą układu L298 jest to, że ma w sobie 2 mostki H, więc można nim
obsłużyć do 2 osi urządzenia. Układ L298 okazał się wystarczający do wysterowania silnika
zastosowanego w zaprojektowanym urządzeniu.
Rysunek 4.1.3.1: Modułowa końcówka mocy oparta na układzie L298.
Drugą końcówkę mocy zaprojektowano od podstaw mając na uwadze wpływ
zakłóceń z silnika na elektronikę sterującą. Układem wykorzystanym w tej wersji końcówki
mocy był układ L6203. Układ ten wykorzystywany jest przez dwóch z trzech producentów
ploterów opisanych w tej pracy. W pierwszej wersji układu niedostateczna filtracja
sygnałów powodowała niechciane wejścia w przerwania enkodera oraz przerwania
rozkazów. Aby uniknąć takiej sytuacji konieczne było zastosowanie wyspecjalizowanych
39
filtrów EMI (ang. elektro-magnetic interference) na wejściach i wyjściach układu. Tego typu
problemy nie występowały podczas pracy z układem L298. Ponieważ mostek L6203 oparty
jest na tranzystorach unipolarnych, które są szybsze od bipolarnych, powoduje to tworzenie
większych szpilek zwrotnych z silnika. Rozwiązaniem tego problemu, jak już wspomniano,
VCC
są filtry na wejściach i wyjściach układu.
VMOT
VMOT
FL3
XIN
VREF
ENABLE
IN 1
IN 2
S E NS E
R12
1 0k
+5V FL9
2
C2
270p
GND
GND
22n
100n
C3
C4
100n
GND GND GND
GND
+
6
L6203
FL2
22n
4
3
1
8
GN D
VMOT
P-2
P-3
C1
VS
C B OOT 1
OU T1
OU T2
C B OOT 2
270p
FL1
D4
VH E2 20
9
11
5
7
10
R3
0
VC C
P-1
IC1
R 14
10 k
270p
R2
0
FL5
VSS
D3
VH E2 20
270p
D2
V H E22 0
R13
1 0k
FL4
D1
V H E22 0
270p
3 XEN
2 XIN1_
1 XIN2_
1
2
3
270p
XMOT
C5
220u/63V
GND
GND
Rysunek 4.1.3.2: Schemat końcówki mocy opartej o układ L6203.
Zaprojektowano również płytkę PCB.
Rysunek 4.1.3.3: Płytka PCB zaprojektowanej końcówki mocy.
W celu eliminacji zakłóceń zastosowano filtry, które znajdują się na wejściach płyty
głównej plotera Summa D620. Są to specjalizowane filtry EMI firmy Murata. Filtr składa
się z dwóch koralików ferytowych oraz kondensatora o pojemności 270pF.
40
Rysunek 4.1.3.4: Filtry EMI zastosowane przez firmę Summa.
Osiągi serwonapędu były dokładnie takie same dla obydwu końcówek mocy. W
czasie ostatecznych testów urządzenia korzystano z końcówki mocy opartej o układ L298, z
uwagi na generowanie mniejszych zakłóceń i możliwość wysterowania dwóch osi przy
pomocy jednego układu.
41
4.2
Konstrukcja mechaniczna
4.2.1
Model
Model, który został skonstuowany na potrzeby tej pracy został oparty na ploterze
SummaCut D620 produkowanym około 15 lat temu. Plotery Summa są projektowane w
USA a produkowane w Belgii.
Rysunek 4.2.1: Ploter SummaCut D620.
Powyższy ploter wykorzystuje 24V silniki prądu stałego oraz enkodery inkrementalne o
gęstości 500imp/obrót. Ploter tnący składa się z dwóch osi.
4.2.2
Oś X
Przesuwna karetka w poziomie – przez producenta nazywana osią Y.
Napęd: silnik prądu stałego 24V
Rysunek 4.2.1.1: Silnik DC wykorzystywany w zaprojektowanym urządzeniu
42
Przekładnia pasowa osi X
W ploterze zastosowano przekładnię redukcyjną (i12 & gt; 1), dzięki temu uzyskano
większą dokładność pozycjonowania karetki.
i 12 =
z 2 120
=
=5
z 1 24
gdzie:
i12 – przełożenie przekładni
z1 – ilość zębów koła napędzającego
z2 – ilość zębów koła napędzanego
Kolejna przekładnia pasowa zamienia ruch obrotowy koła napędzanego na ruch
liniowy karetki.
Rozdzielczość mechaniczna:
Enkoder silnika generuje 500imp/obrót co przy dekodowaniu poczwórnym generuje
2000imp/obrót. Przekłada to się na najmniejszy wykrywalny ruch wału o 0,18
stopnia. Dzięki przekładni zębatej najmniejszy wykrywalny ruch napędzanego koła
zębatego wynosi 0,18º / 5 = 0,036º. Obwód koła napędzającego karetkę wynosi
122mm. Posiadając powyższe dane możemy określić rozdzielczość mechaniczną osi
X.
Obliczenia:
360 ° z 1
⋅
N⋅enc z 2
1
24
l=
⋅z 3⋅T MXL =
⋅ ⋅60⋅2,032=0,012192 [mm]
360 °
4⋅500 120
gdzie:
l – najmniejszy wykrywalny ruch karetki
enc – rozdzielczość enkodera
z1 – ilość zębów koła napędzającego
z2 – ilość zębów koła napędzanego
z3 – ilość zębów koła napędzającego karetkę
TMXL – wielkość podziałowej zęba pasa MXL
N – sposób dekodowania sygnału kwadraturowego (N = 4 – poczwórne
dekodowanie)
43
Stąd można wyznaczyć ile impulsów sterujących przypadnie na 1mm.
1
1
n= =
=82,02 [imp / mm]
l 0,012192
Oczywiście liczba impulsów musi być liczbą całkowitą, więc w programie
sterującym przyjęto liczbę 82 imp/mm.
Błąd spowodowany tym zaokrągleniem będzie wynosił:
k=
82,02−82
⋅100 %=0,026 %
82,02
Spowoduje to błąd wielkości pracy na 1m o wielkości 0,26mm. Aby tego uniknąć
wielkość pracy powinna być skalibrowana na etapie oprogramowania sterującego.
4.2.2
Oś Y
Przesuwany materiał w pionie – przez producenta nazywana osią X.
Napęd: silnik prądu stałego 24V
Przekładnia pasowa osi Y
W ploterze zastosowano przekładnię redukcyjną (i12 & gt; 1) dzięki temu uzyskano
większą dokładność pozycjonowania karetki.
i 12 =
z 2 72
= =3
z 1 24
gdzie:
i12 – przełożenie przekładni
z1 – ilość zębów koła napędzającego
z2 – ilość zębów koła napędzanego
Kolejna przekładnia pasowa zamienia ruch obrotowy koła napędzanego na ruch
liniowy karetki.
Rozdzielczość mechaniczna:
Enkoder silnik generuje 500imp/obrót co przy dekodowaniu poczwórnym generuje
2000imp/obrót. Przekłada to się na najmniejszy wykrywalny ruch wału o 0,18
stopnia. Dzięki przekładni zębatej najmniejszy wykrywalny ruch napędzanego koła
zębatego wynosi 0,18º / 3 = 0,06º. Średnica wałka napędzającego oś Y . Posiadając
powyższe dane możemy określić rozdzielczość mechaniczną osi Y.
44
Obliczenia:
360 ° z 1
⋅
N⋅enc z 2
1
24
l=
⋅z 3⋅ d =
⋅ ⋅⋅23,5=0,0123[mm]
360 °
4∗500 72
gdzie:
l – najmniejszy wykrywalny ruch karetki
enc – rozdzielczość enkodera
z1 – ilość zębów koła napędzającego
z2 – ilość zębów koła napędzanego
d – średnica wałka napędzającego materiał
N – sposób dekodowania sygnału kwadraturowego (N = 2 – podwójne dekodowanie)
Stąd można wyznaczyć ile impulsów sterujących przypadnie na 1mm.
1
1
n= =
=81,3[imp / mm]
l 0,0123
W tym przypadku w programie sterującym przyjęto liczbę 81 imp/mm.
Różnica pomiędzy wartością obliczoną i zmierzoną wynika z kompensacji, która
dokonywana jest w oprogramowaniu plotera. Różnica ta wynosi 0,369%.
k=
81,3−81
⋅100 %=0,369 %
81,3
Spowoduje to błąd wielkości pracy na 1m o wielkości 3,69mm. Aby tego uniknąć
wielkość pracy powinna być skalibrowana na etapie oprogramowania sterującego.
45
4.3 Oprogramowanie zaprojektowane plotera
4.3.1 Obsługa enkodera
Impulsy z enkodera wyzwalają przerwania zewnętrzne INT0 oraz INT1. Wewnątrz
przerwań sprawdzany jest stan kanałów A i B oraz sprawdzana jest alternatywa rozłączna
stanów kanałów A i B aby określić kierunek obrotu enkodera. Ostatnią procedurą w
przerwaniu jest dodanie lub odjęcie jednego kroku z rejestru pozycji. Zastosowano w
niniejszej pracy dekodowanie poczwórne, inaczej mówiąc przerwania wyzwalane są przez
kanały A i B enkodera na zbocze rosnące i malejące.
Algorytm przerwania INT0 enkodera – przerwanie INT1 działa w sposób analogiczny.
Rysunek 4.3.1.1: Algorytm obsługi enkodera
Kod źródłowy:
/*************** Obsługa enkodera **********************/
//obsługa przerwania
ISR (INT0_vect, ISR_BLOCK)
{
ENC_LED_OFF;
//obsługa przerwania INT0
// Odczyt portu i przesuniecie bitow na prawo
// Sprawdzenie kierunku obrotu - dzialanie XOR
if((((ENC_PORT & 0x08) & gt; & gt; 3) ^ ((ENC_PORT & 0x04) & gt; & gt; 2)) == 0)
// Kierunek obrotu w prawo: dodaj
{
encoderPos++;
}
else
// Kierunek obrotu w lewo: odejmij
{
encoderPos--;
}
ENC_LED_ON;
}
46
4.3.2
Obsługa impulsów STEP/DIR
Dekodowanie impulsów STEP/DIR można zrealizować w ten sam sposób jak w przypadku
sygnału z enkodera, choć charakterystyka sygnału jest inna. Sygnał STEP (krok) wyzwala
przerwanie INT2 (na zbocze rosnące), w zależności od stanu linii DIR (kierunek) odejmowany lub
dodawany jest jeden krok do rejestru pozycji zadanej.
Kod źródłowy:
/*************** Obsluga rozkazów **********************/
ISR (INT2_vect, ISR_BLOCK)
//obsługa przerwania INT2 na sygnał STEP
{
// Sprawdzenie kierunku rozkazu - dzialanie XOR
if((CAP_PORT & 0x40))
// Sprawdza wartość DIR
// Kierunek rozkazu w prawo: dodaj
{
commandPos -= Servo.multiplierCap;
}
else
// Kierunek rozkazu w lewo: odejmij
{
commandPos += Servo.multiplierCap;
}
}
4.3.3
Regulator PID w przerwaniu 1kHz
Kod źródłowy całego przerwania 1kHz, w którym znajduje się również regulator PID oraz
ustawienie wypełnienia PWM.
/*************** Przerwanie 1kHz PID ******************/
ISR (TIMER0_COMP_vect, ISR_NOBLOCK)
{
LED4_PULSE_ON; // sprawdzamy jak długo tutaj jesteśmy
if(stat.pidOn)
// Włączenie wyłączenie Pida
{
if(stat.pidOn & & (last_state == 0))
{
pidStartUp();
}
Servo.position = commandPos;
Servo.feedback = encoderPos;
// uaktualnij zadaną pozycję
// uaktualnij pozycję z enkodera
calcPID();
// Oblicz odpowiedź regulatora PWM
if(stat.motorOn){
setPWM(Servo.output + Servo.offset);
SET_ENB;
}
else{
CLR_ENB;
}
last_state = stat.pidOn;
// Ustaw PWM
if(stat.testOn)
// Tryb rejestrowania trajektorii
{
if(a & lt; 200)
// Rejestrujemy tylko pierwsze 200ms ruchu
{
positionTable[a] = Servo.position;
feedbackTable[a] = Servo.feedback;
outputTable[a]
= Servo.output;
47
}
else
{
stat.testOn
= 0;
// Po rejestracji wyłącz tryb rejestrowania
for(int b=0 ; b & lt; a ; b++)
// Wydrukuj przez RS wyniki
{
rprintf( " \n " );
rprintfNum(10, 3, 0, ' ',b);
rprintf( " ; " );
rprintfNum(10, 4, 0, ' ',positionTable[b]);
rprintf( " ; " );
rprintfNum(10, 4, 0, ' ',feedbackTable[b]);
rprintf( " ; " );
rprintfFloat(4,outputTable[b]);
}
rprintfProgStr(ready_str);
a = 0;
}
a++;
// licznik 250ms
}
}
else
{
OCR1A = 0;
stop_motor();
}
LED4_PULSE_OFF;
// Jeśli serwo wyłączonone to PWM = 0 oraz silnik wyłączony
}
Poniższy schemat blokowy algorytmu PIDa przedstawia wszystkie czynności wykonywane w celu
obliczenia odpowiedzi regulatora PID. W schemacie znajduje się zabezpieczenie Anti-windup
członu całkującego.
48
W e jd ź
d o p r ze rw a n ia P ID a
O b licz b łą d
O b licz b łą d ró żn iczk o w y
C z y b łą d
p o zycji je st
w ię ks zy o d o sta tn ie g o
m a ksy m a ln e g o ?
tak
C zy b łą d
r ó żn icz. je st w ię ks zy
o d m a ks ym a ln e g o ?
U a ktu a ln ij m a ksym a ln y
b łą d p o zyc ji w yk ryty p o d c za s r u ch u
tak
O g ra n icz b łą d ró żn iczk o w y
d o w a rto ści m a ksym a ln e j
nie
nie
C zy b łą d
je st w ię kszy
o d m a ksym a ln e g o ?
O b licz o g ó ln ą o d p o w ie d ź
r e g u la to ru P ID
tak
O g ra n icz b łą d d o w a rto ści
m a ksy m a ln e j
nie
C zy o d p o w ie d ź
re g u la to ra je s t
w ię k sza o d
m a ks.?
C zy b łą d
je st m n ie jszy
o d za kr e su
n ie c zu ło ści?
tak
nie
B łą d = 0
tak
O g r a n ic z o d p o w ie d ź re g u la to r a
d o w a rto ści m a ksym a ln e j.
U sta w fla g ę m a ksym a ln e j m o cy siln ika
Z a p isz a ktu a ln y b łą d ja ko
p o p rze d n i
nie
W yjście
C zy w z m .
a kcji ca łku ją ce j je st
& gt; 0 i czy P ID je s t
w łą czo n y?
nie
B łą d ca łko w a n y = 0
tak
C zy siln ik
zn a jd u je się
w sta n ie m a ks.
m o c y?
tak
nie
nie
C zy b łą d
i w y jśc ie m a ją te n
sa m zn a k ?
C a łku j b łą d p o zycji
tak
Czy
ca łko w a n y b łą d
je st w ię ks zy o d
m a ksym a ln e g o ?
tak
B łą d ca łko w a n y = m a k s. b łą d ca łk.
nie
Rysunek 4.3.3.1: Algorytm PID wykorzystany w niniejszej pracy
Kod źródłowy:
void calcPID(void)
{
float tmp1;
49
float periodfp;
periodfp = 0.01;
// Oblicz blad
tmp1 = (float)(Servo.position - Servo.feedback);
Servo.error = tmp1;
// Aktualizuj zmienną wykorzystywaną do monitorowania maksymalnego błędu podczas ruchu
if(abs(Servo.error) & gt; abs(Servo.maxPosError))
Servo.maxPosError = abs(Servo.error);
// Licz calkowanie tylko gdy pid włączony
if((Servo.gainI & gt; 0.0) & & (stat.enable != 0))
{
// Jeśli wyjście jest na pełnej/zerowej mocy nie pozwól całkowaniu odpłynąć
if(((Servo.saturated & lt; 0) & & (Servo.error & lt; 0)) ||
((Servo.saturated & gt; 0) & & (Servo.error & gt; 0)))
{
//Nie całkuj gdy wyjście jest nasycone
}
else
// Całkuj
Servo.outputI += (Servo.error * Servo.gainI * periodfp);
// Saturacja człony całkującego
// Jeśli człon całkujący się nasyci to wyłącz całkowanie
Servo.saturated = satLimit(Servo.outputI, Servo.maxOutputI);
// Zastosuj maksima dla całkowania
if(Servo.maxOutputI != 0.0)
{
Servo.outputI = limitVal(Servo.outputI, Servo.maxOutputI);
}
}
else
{
// Jeśli PID nie włączony zresetuj całkowanie
Servo.outputI = 0;
}
// Oblicz akcję różniczkującą
Servo.errorD = (float)(Servo.error - Servo.prevError);
Servo.prevError = Servo.error;
// Zastosuj maksima dla akcji różniczkującej
if(Servo.maxErrorD != 0)
{
Servo.errorD = limitVal(Servo.errorD, Servo.maxErrorD);
}
// Oblicz różniczkę pozycji - prędkość
Servo.positionD = (float)(Servo.position - Servo.prevPos);
// Oblicz różniczkę prędkości - przyspieszenie
Servo.positionDD = (float)(Servo.positionD - Servo.prevPosD);
Servo.prevPos = Servo.position;
Servo.prevPosD = Servo.positionD;
// Zastosuj maksima dla akcji różniczkującej
if(Servo.maxPosD != 0)
{
Servo.positionD = limitVal(Servo.positionD, Servo.maxPosD);
}
if(Servo.maxPosDD != 0)
{
Servo.positionDD = limitVal(Servo.positionDD, Servo.maxPosDD);
}
// Dodaj błędy
Servo.output = (Servo.gainP * Servo.error);
Servo.output += Servo.outputI;
50
Servo.output += (Servo.gainD * Servo.errorD);
//Feed forward
Servo.output += (Servo.feedF0 * Servo.positionD);
Servo.output += (Servo.feedF1 * Servo.positionDD);
// Sprawdź czy napęd jest nasycony
Servo.saturated = satLimit(Servo.output, Servo.maxOutput);
// Sprawdź czy napęd jest przeciążony
if(Servo.saturated & & stat.motorOn)
{
Servo.overLoadCnt = Servo.overLoadCnt + 3;
}
else if(stat.motorOn)
{
Servo.overLoadCnt--;
if(Servo.overLoadCnt & lt; 0)
Servo.overLoadCnt = 0;
}
// Jeśli przeciążony przez 20ms to wyłącz silnik
if((Servo.overLoadCnt & gt; 60) & & stat.motorOn)
{
stat.overLoad = 1; // flaga przeciążonego serwonapędu
stat.motorOn = 0;
stat.motorOff = 1;
stat.bit = 1;
}
// Zastosuj maksima dla wyjścia PIDa
Servo.output = limitVal(Servo.output, Servo.maxOutput);
}
4.3.4
Funkcje pomocnicze
Funkcja limitująca wartość członu
Kod źródłowy:
// Funkcja limitująca wartość i zwacająca wartość ogr. zmiennej
float limitVal(float variable, float maxValue)
{
if(variable & gt; maxValue)
{
variable = maxValue;
return variable;
}
else if(variable & lt; -maxValue)
{
variable = -maxValue;
return variable;
}
else return variable;
}
Funkcja wykrywająca nasycenie napędu
Kod źródłowy:
//Wykrywanie nasycenia napędu
int satLimit(float variable, float maxValue)
{
if(variable & gt; maxValue)
{
return 1;
}
else if(variable & lt; -maxValue)
51
{
return -1;
}
else
{
return 0;
}
}
4.3.5
Funcja ustawiająca wypełnienie PWM
Funkcja ta ustawia wartość rejestru odpowiadającemu wypełnieniu sygnału PWM, który
steruje mocą silnika. Generuje dwa przebiegi PWM (PWM+,PWM-) odwrócone w fazie względem
siebie. W pozycji zadanej wypełnienie PWM wynosi 50%.
void setPWM(float amps)
{
OCR1A = abs(amps);
OCR1B = abs(amps);
}
4.3.6
//ustawienie wartości rejestru porównawczego A
//ustawienie wartości rejestru porównawczego B
Funkcja obsługi USART – RS232
Funkcja obsługi transmisji danych pomiędzy komputerem a sterownikiem.
ISR(USART_RXC_vect)
{
stat.servoOn = 0;
switch(udata = UDR)
{
case ',': DoCommand();
memset(inpBuf,0,8);
i=0;
comCount++;
UDR = udata;
break;
case 0x0d:DoCommand();
memset(inpBuf,0,8);
i=0;
comCount=0;
rprintf( " \n\rREADY & gt; " );
if(!stat.servoOff)
{
stat.servoOn = 1;
}
stat.servoOff = 0;
break;
default: inpBuf[i] = udata;
i++;
if (i & gt; 7)
{
rprintf( " \n\rREADY & gt; " );
memset(inpBuf,0,8);
i=0;
}
else UDR = udata;
break;
}
}
52
4.3.7
Funkcja przetwarzająca rozkazy
Aby uzyskać listę dostępnych funkcji wpisz literę H w terminalu komunikacyjnym ze
sterownikiem i naciśnij enter. Funkcja przetwarzająca rozkazy posiada m.in. następujące funkcje:
•
przełączanie dekodowania enkodera x2 / x4 (należy pamiętać o zmianie ilości impulsów
sterujących w programie LinuxCNC),
•
resetowanie licznika maksymalnego błędu podczas ruchu danej osi,
•
resetowanie wartości zmiennych regulatora PID (przydatne podczas korekcji ustawień
wzmocnień),
•
podgląd wartości poszczególnych członów składających się na całościową odpowiedź
regulatora,
•
zmiana parametrów dodatkowych członów sterujących takich jak feedforward.
// Przetwarzanie poleceń wydanych przez RS232
void DoCommand(void)
{
if (comCount == 0)
{
switch(inpBuf[0])
{
case 'P': parameter = 'P';
break;
case 'I': parameter = 'I';
break;
case 'D': parameter = 'D';
break;
case 'M': parameter = 'M';
break;
case 'N': parameter = 'N';
break;
case 'O': parameter = 'O';
break;
case 'R': parameter = 'R';
break;
case 'B': parameter = 'B';
break;
case 'X': parameter = 'X';
break;
case 'T': parameter = 'T';
break;
case 'F': parameter = 'F';
break;
case 'G': parameter = 'G';
break;
case 'C': parameter = 'C';
break;
case 'E': parameter = 'E';
break;
case 'H': rprintfProgStr(PSTR( " \nAvailable commands: " ));
rprintfProgStr(PSTR( " \n?
- current status of ServoDrive " ));
rprintfProgStr(PSTR( " \nX,x
- go to x position as fast as
possible " ));
rprintfProgStr(PSTR( " \nP,x
- change of Proportional Gain
parameter " ));
rprintfProgStr(PSTR( " \nI,x
- change of Integral Gain parameter " ));
rprintfProgStr(PSTR( " \nD,x
- change of Derivative Gain parameter " ));
rprintfProgStr(PSTR( " \nM,x
- change of Max Error parameter " ));
rprintfProgStr(PSTR( " \nN,x
- change of Max I Output parameter " ));
53
rprintfProgStr(PSTR( " \nO,x
rprintfProgStr(PSTR( " \nR,x
rprintfProgStr(PSTR( " \nB,x
rprintfProgStr(PSTR( " \nF,x
rprintfProgStr(PSTR( " \nG,x
rprintfProgStr(PSTR( " \nC,x
rprintfProgStr(PSTR( " \nE,x
rprintfProgStr(PSTR( " \nT,x
-
change of Max D Error parameter " ));
change of Max Output parameter " ));
change of Dead Band parameter " ));
change of FF0 parameter " ));
change of FF1 parameter " ));
change of multiplierCap parameter " ));
change of multiplierEnc parameter " ));
go to x position for step response
test " ));
case '0':
case '1':
case '2':
case '4':
case 'Q':
case 'W':
case '?':
case 'S':
rprintfProgStr(PSTR( " \nS
- current status of PID calculations " ));
rprintfProgStr(PSTR( " \n0
- turns the motor off " ));
rprintfProgStr(PSTR( " \n1
- turns the motor on " ));
rprintfProgStr(PSTR( " \n2
- 2x encoder decoding " ));
rprintfProgStr(PSTR( " \n4
- 4x encoder decoding " ));
break;
stat.motorOn = 0;
stat.motorOff = 1;
parameter
= 0;
rprintfProgStr(PSTR( " \nMotor is turned OFF " ));
break;
stat.motorOn = 1;
parameter
= 0;
rprintfProgStr(PSTR( " \nMotor is turned ON " ));
break;
encoderBOff();
rprintfProgStr(PSTR( " \n2x encoder decoding is ON " ));
break;
encoderBInit();
encoderBOn();
rprintfProgStr(PSTR( " \n4x encoder decoding is ON " ));
break;
Servo.maxPosError = 0;
rprintfProgStr(PSTR( " \nError counter is cleared " ));
break;
pidStartUp();
rprintfProgStr(PSTR( " \nPID has been initialized " ));
break;
rprintfProgStr(PSTR( " \nP gain
= " ));
rprintfFloat(4,Servo.gainP);
rprintfProgStr(PSTR( " \nI gain
= " ));
rprintfFloat(4,Servo.gainI);
rprintfProgStr(PSTR( " \nD gain
= " ));
rprintfFloat(4,Servo.gainD);
rprintfProgStr(PSTR( " \nEncoder position = " ));
rprintfNum(10, 6, 1, ' ',Servo.feedback);
rprintfProgStr(PSTR( " \nCom. position
= " ));
rprintfNum(10, 6, 1, ' ',Servo.position);
rprintfProgStr(PSTR( " \nMax. detect. err.= " ));
rprintfFloat(4,Servo.maxPosError);
rprintfProgStr(PSTR( " \nMax error
= " ));
rprintfFloat(4,Servo.maxError);
rprintfProgStr(PSTR( " \nMax I output
= " ));
rprintfFloat(4,Servo.maxOutputI);
rprintfProgStr(PSTR( " \nMax D error
= " ));
rprintfFloat(4,Servo.maxErrorD);
rprintfProgStr(PSTR( " \nMax output
= " ));
rprintfFloat(4,Servo.maxOutput);
rprintfProgStr(PSTR( " \nDead band
= " ));
rprintfFloat(4,Servo.deadBand);
rprintfProgStr(PSTR( " \nMultiplierCapture= " ));
rprintfNum(10, 6, 1, ' ',Servo.multiplierCap);
rprintfProgStr(PSTR( " \nMultiplierEncoder= " ));
rprintfNum(10, 6, 1, ' ',Servo.multiplierEnc);
parameter = 0;
break;
rprintfProgStr(PSTR( " \rServo Loop Internal Calcs:\r\n " ));
rprintfProgStr(PSTR( " Servo.errorP= " ));
rprintfFloat(4,(Servo.error * Servo.gainP));
rprintfProgStr(PSTR( " \nServo.outputI= " ));
rprintfFloat(4,Servo.outputI);
54
rprintfProgStr(PSTR( " \nServo.errorD= " ));
rprintfFloat(4,(Servo.error * Servo.gainD));
rprintfProgStr(PSTR( " \nServo.feedF0= " ));
rprintfFloat(4,(Servo.feedF0 * Servo.positionD));
rprintfProgStr(PSTR( " \nServo.feedF1= " ));
rprintfFloat(4,(Servo.feedF1 * Servo.positionDD));
rprintfProgStr(PSTR( " \nServo.output= " ));
rprintfFloat(4,Servo.output);
rprintfProgStr(PSTR( " \nMax. detect. err.= " ));
rprintfFloat(4,Servo.maxPosError);
rprintfProgStr(PSTR( " \nsaturated= " ));
rprintfNum(10, 2, 1, ' ',Servo.saturated);
rprintfProgStr(PSTR( " \nstat.enable= " ));
rprintfNum(10, 2, 0, ' ',stat.enable);
rprintfProgStr(PSTR( " \nstat.pidOn= " ));
rprintfNum(10, 2, 0, ' ',stat.pidOn);
rprintfProgStr(PSTR( " \nstat.motorOn= " ));
rprintfNum(10, 2, 0, ' ',stat.motorOn);
rprintfProgStr(PSTR( " \nOverLoad? " ));
rprintfNum(10, 5, 1, ' ',Servo.overLoadCnt);
rprintfProgStr(PSTR( " \nWynik I ? " ));
rprintfNum(10, 2, 0, ' ',((Servo.saturated & lt; 0) & & (Servo.error & lt; 0)) ||
((Servo.saturated & gt; 0) & & (Servo.error & gt; 0)));
parameter = 0;
break;
default: if (inpBuf[0] != '\0')
{
rprintfProgStr(PSTR( " \nUnknown command " ));
}
parameter = 0;
break;
}
}
else if (comCount == 1)
{
switch(parameter)
{
case 'P': Servo.gainP = atof(inpBuf);
rprintfProgStr(PSTR( " \nP gain
= " ));
rprintfFloat(4,Servo.gainP);
break;
case 'I': Servo.gainI = atof(inpBuf);
rprintfProgStr(PSTR( " \nI gain
= " ));
rprintfFloat(4,Servo.gainI);
break;
case 'D': Servo.gainD = atof(inpBuf);
rprintfProgStr(PSTR( " \nD gain
= " ));
rprintfFloat(4,Servo.gainD);
break;
case 'M': Servo.maxError = atof(inpBuf);
rprintfProgStr(PSTR( " \nMax Error
= " ));
rprintfFloat(4,Servo.maxError);
break;
case 'N': Servo.maxOutputI = atof(inpBuf);
rprintfProgStr(PSTR( " \nMax I Output
= " ));
rprintfFloat(4,Servo.maxOutputI);
break;
case 'O': Servo.maxErrorD = atof(inpBuf);
rprintfProgStr(PSTR( " \nMax D Error
= " ));
rprintfFloat(4,Servo.maxErrorD);
break;
case 'R': Servo.maxOutput = atof(inpBuf);
rprintfProgStr(PSTR( " \nMax Output
= " ));
rprintfFloat(4,Servo.maxOutput);
break;
case 'B': Servo.deadBand = atof(inpBuf);
rprintfProgStr(PSTR( " \nDead Band
= " ));
rprintfFloat(4,Servo.deadBand);
break;
case 'X': commandPos = atoi(inpBuf);
55
case 'T':
case 'F':
case 'G':
case 'C':
case 'E':
rprintfProgStr(PSTR( " \nCommanded pos.
= " ));
rprintfNum(10, 6, 1, ' ',commandPos);
break;
commandPos = atoi(inpBuf);
rprintfProgStr(PSTR( " \nTest jump
= " ));
rprintfNum(10, 6, 1, ' ',commandPos);
stat.testOn = 1;
break;
Servo.feedF0 = atof(inpBuf);
rprintfProgStr(PSTR( " \nFeedForward0 gain= " ));
rprintfFloat(4,Servo.feedF0);
break;
Servo.feedF1 = atof(inpBuf);
rprintfProgStr(PSTR( " \nFeedForward1 gain= " ));
rprintfFloat(4,Servo.feedF1);
break;
Servo.multiplierCap = atoi(inpBuf);
if(Servo.multiplierCap & gt; 4)
Servo.multiplierCap = 4;
if(Servo.multiplierCap & lt; 1)
Servo.multiplierCap = 1;
rprintfProgStr(PSTR( " \nMultiplierCap= " ));
rprintfNum(10, 6, 1, ' ',Servo.multiplierCap);
break;
Servo.multiplierEnc = atoi(inpBuf);
if(Servo.multiplierEnc & gt; 4)
Servo.multiplierEnc = 4;
if
(Servo.multiplierEnc & lt; 1)
Servo.multiplierEnc = 1;
rprintfProgStr(PSTR( " \nMultiplierEnc= " ));
rprintfNum(10, 6, 1, ' ',Servo.multiplierEnc);
break;
default: break;
}
}
else;
}
4.3.8.
Funkcja main()
W głównej pętli programu wykonywane są działania, które nie muszą być wykonywane
okresowo. Funkcja ta inicjalizuje peryferia układu oraz wyświetla informacje na ekranie LCD oraz
wysyła informacje na port RS232. W pętli nieskończonej znajdują się algorytmy sterujące
informacyjnymi diodami LED.
Kod źródłowy:
int main (void)
{
usartInit();
IOinit();
rprintfInitRS(print_byte_to_usart);
rprintfInitLCD(print_byte_to_lcd);
//
//
//
//
// Inicjalizacja LCD
LCDinit();
LCDcursorOFF();
LCDclr();
rprintfProgStrMLCD( " ServoMechanism " );
LCDGotoXY(0,1);
rprintfProgStrMLCD( " ver. 2.2 " );
56
Inicjalizacja
Inicjalizacja
Inicjalizacja
Inicjalizacja
USARTa
portów
funkcji rprintf dla RSa
funkcji rprintf dla LCDka
rprintf( " \nServoMechanism " );
rprintf( " \nver. 2.2 " );
rprintf( " \nType 'H' to see help\n " );
rprintfProgStr(ready_str);
_delay_ms(1000);
encoderAInit();
encoderBInit();
captureInit();
pidInit();
moveInit();
sei();
LCDclr();
//
//
//
//
//
//
Inicjalizacja kanału A enkodera
Inicjalizacja kanału B enkodera
Inicjalizacja kanału STEP rozkazu
Inicjalizacja PIDa
Inicjalizacja parametrów Serwa
Włączenie przerwań
while(1)
{
LCDhome();
rprintfProgStrMLCD( " Er " );
LCDGotoXY(2,0);
rprintfNumLCD(10,3,1,' ',Servo.error);
LCDGotoXY(0,1);
rprintfProgStrMLCD( " O " );
LCDGotoXY(1,1);
rprintfFloatLCD(4,Servo.output);
LCDGotoXY(8,0);
rprintfProgStrMLCD( " Pos " );
LCDGotoXY(11,0);
rprintfNumLCD(10,4,1,' ',Servo.position);
LCDGotoXY(11,1);
rprintfFloatLCD(3,Servo.maxPosError);
// wskaźnik nasyconego napędu
if(Servo.saturated) SAT_LED_ON;
// Dioda nasyconego serwonapędu
else SAT_LED_OFF;
if(stat.pidOn & & stat.motorOn) READY_LED_ON;
// Dioda gotowości serwonapędu
else READY_LED_OFF;
if(stat.overLoad & & stat.bit) // wyświetl jednokrotnie informację o przeciążeniu
{
rprintf( " \nMotor overload, type W and 1 to restart the motor " );
// zresetuj bit pomocniczy, zabezpieczenie przed wielokrotnym komunikatem
stat.bit = 0;
}
if(stat.overLoad)
OVERLO_LED_ON;
// zapal diodę przeciążenia
else
OVERLO_LED_OFF;
// zgaś diodę przeciążenia
if((PINB & (1 & lt; & lt; PB5)) == 0)
stat.testOn = 1;
//włącz rejestrowanie ruchu po naciśnięciu przycisku.
}
}
4.3.9.
Zabezpieczenia serwonapędu
Zabezpieczeniem przed uszkodzeniem mechanicznym mechanizmu plotera oraz
uszkodzeniem końcówki mocy, z uwagi na zbyt duży prąd silnika, jest licznik czasu, w
którym silnik pracuje z maksymalną mocą. Gdy silnik znajduje się w stanie nasycenia
(pełnej mocy), do licznika dodawana jest liczba 3. Gdy silnik wychodzi ze stanu nasycenia,
57
odejmujemy od licznika 1. Gdy licznik przeciążenia przekroczy wartość 30 silnik, zostaje
wyłączony. Poprzez terminal wysyłana jest wiadomość jak zresetować silnik i przywrócić
go do normalnego trybu pracy. Wyłączenie silnika następuje po 10ms przeciążenia silnika z
uwagi na inkrementację o 3 co 1ms. Zabezpieczenie to jest szczególnie ważne podczas prac
nad serwonapędem, kiedy złe ustawienie algorytmu PID lub zmiana algorytmu programu
może spowodować nieprzewidziane zachowanie napędu.
Kod umieszczony w pętli 1kHz – opóźnienie nieakceptowalne
// Sprawdź czy napęd jest nasycony
Servo.saturated = satLimit(Servo.output, Servo.maxOutput);
// Sprawdź czy napęd jest przeciążony
if(Servo.saturated & & stat.motorOn)
{
Servo.overLoadCnt = Servo.overLoadCnt + 3;
}
else if(stat.motorOn)
// zmniejsz wartość rejestru przeciążeniowego
{
// gdy napęd pracuje normalnie
Servo.overLoadCnt--;
if(Servo.overLoadCnt & lt; 0)
Servo.overLoadCnt = 0;
}
// Jeśli przeciążony przez 20ms to wyłącz silnik
if((Servo.overLoadCnt & gt; 60) & & stat.motorOn)
{
stat.overLoad = 1;
// flaga przeciążonego serwonapędu
stat.motorOn = 0;
// wyłącz silnik
stat.motorOff = 1;
// wyłącz silnik
stat.ovrLoadMsg = 1;
// bit pomocniczy
}
Kod umieszczony w pętli głównej programu – opóźnienie w czasie akceptowalne
if(stat.overLoad & & stat.ovrLoadMsg) // wyświetl jednokrotnie informację o przeciążeniu
{
rprintf( " \nMotor overload, type W and 1 to restart the motor " );
// Zresetuj bit pomocniczy, zabezpieczenie przed wielokrotnym komunikatem
stat.ovrLoadMsg = 0;
}
if(stat.overLoad)
OVERLO_LED_ON;
// zapal diodę przeciążenia
else
OVERLO_LED_OFF; // zgaś diodę przeciążenia
4.3.10.
Oprogramowanie LinuxCNC
LinuxCNC (Enhanced Machine Control) jest oprogramowaniem do komputerowego
sterowania maszyn takich jak obrabiarki, frezarki, urządzenia tnące i rysujące czy tokarki.
LinuxCNC jest to wolne oprogramowanie z otwartym kodem źródłowym. Aktualne wersje
LinuxCNC są w całości na licencji GNU General Public License i GNU Lesser General
Public License (GPL i LGPL). Może jednocześnie sterować aż 9 różnych osi poprzez
58
szeroką gamę interfejsów.
Poniżej przedstawiono jak skonfigurować oprogramowanie LinuxCNC do poprawnej
pracy z zaprojektowanym urządzeniem.
Strona początkowa
Rysunek 4.3.10.1: Zrzut ekranu, konfiguracja LinuxCNC - strona początkowa
Utwórz nową konfigurację – Tworzy nową konfigurację urządzenia.
Zmodyfikuj... – Modyfikuje istniejącą konfigurację. Po wybraniu tej opcji ukaże się okno,
gdzie będzie można wybrać plik *.stepconf do modyfikacji. Jeśli wcześniej zostaną
dokonane zmiany w plikach .hal lub .ini to zostaną one utracone.
Należy zaznaczyć dwie opcje na dole okna aby konfigurator utworzył pomocne skróty na
pulpicie.
59
Podstawowe informacje
Rysunek 4.3.10.2: Zrzut ekranu, konfiguracja LinuxCNC - podstawowe informacje
Nazwa maszyny
Funkcja ta służy do wybrania nazwy dla konfigurowanej maszyny.
Konfiguracja osi
Należy wybrać typ maszyny XYZ (frezarka), XYZA (4-osiowa frezarka) or XZ
(tokarka).
Jednostki maszyny
Należy wybrać mm lub cale. Wszystkie kolejne zapytania, takie jak obszar maszyny,
skok śruby, będą posiadały wybraną jednostkę.
Typ sterownika
W tym miejscu należy wybrać inny (other) oraz wpisać poniższe wartości, które
60
zostały doświadczalnie sprawdzone podczas tworzenia niniejszej pracy.
Czas trwania kroku
Parametr ten określa jak długo utrzymywać stan wysoki impulsu krok (step). Należy
tutaj wpisać wartość: 4000ns.
Odstęp kroku
Parametr ten określa minimalną wielkość przerwy pomiędzy impulsami kroku w ns.
Należy tutaj wpisać wartość: 4000ns.
Czas podtrzymania kierunku
Parametr ten określa jak długo wartość pinu kierunku jest utrzymywana po zmianie
kierunku. Należy tutaj wpisać wartość: 20000ns.
Czas ustawienia kierunku
Parametr ten służy do ustawienia czasu pomiędzy zmianą pinu kierunku po ostatnim
impulsie kroku. Należy tutaj wpisać wartość: 20000ns.
Adres portu równoległego
Należy tutaj wpisać adres portu równoległego. Zwykle jest to 0x378.
Maksymalna częstotliwość
Program automatycznie obliczy maksymalną możliwą wygenerowaną częstotliwość
kroków na podstawie podanych parametów opóźnień i długości sygnałów.
Komunikat o zmianie narzędzia
Tą opcję należy odznaczyć, ponieważ jej funkcjonalność nie jest przydatna w
zaprojektowanym urządzeniu.
61
Ustawienia portu równoległego
Rysunek 4.3.10.3: Zrzut ekranu, konfiguracja LinuxCNC – konfiguracja portu.
Opis wyprowadzeń interfejsu połączeniowego opisano w rozdziale 3.1.1.
62
Konfiguracja osi
Rysunek 4.3.10.4: Zrzut ekranu, konfiguracja LinuxCNC - konfiguracja osi
Kroki silnika na obrót
W przypadku zaprojektowanego urządzenia, które zostało oparte na silnikach prądu
stałego, ilość kroków na obrót ustala enkoder. Należy tutaj wpisać rozdzielczość
enkodera pomnożoną razy sposób dekodowania, w tym przypadku x2.
Mikrokrok sterownika
W przypadku serwonapędów należy wpisać wartość 1.
Ilość zębów przekładni
W tym miejscu należy wpisać ilość zębów koła napędzającego oraz napędzanego.
Skok śruby lub zębatki w przypadku napędu pasowego
Parametr ten określa skok śruby lub średnicę koła pasowego, które przesuwa element
napędu.
Maksymalna prędkość
Określenie maksymalnej prędkości dozwolonej dla danej osi w wybranych wcześniej
jednostkach.
63
Maksymalne przyspieszenie
Parametr maksymalnego przyspieszenia zależy od mocy silnika, bezwładności
elementów ruchomych czy oporów ruchu. Należy dobrać ten parametr doświadczalnie,
obserwując maksymalna błąd napędu aby mieścił się w założonych wartościach.
Bazowanie
Parametry bazowania są nieistotne, ponieważ bazowanie w zaprojektowanym
urządzeniu odbywa się ręcznie.
Testuj tę oś
Przycisk ten otwiera poniższe okno służące do testowania osi.
Testowanie osi
Rysunek 4.3.10.5: Zrzut ekranu, testowanie osi
Powyższe okno umożliwia przetestowanie napędu dla zadanych parametrów ruchu, takich
jak prędkość, przyspieszenie oraz dystans do pokonania.
64
Rozdział V
Testy zaprojektowanego plotera
65
5.1
Badania plotera
Podczas konstruowania plotera tnącego opartego na serwonapędach silników prądu
stałego najważniejszym kryterium oceny jest jego dokładność przy danej prędkości. Aby
dokładnie zbadać dokładność plotera w oprogramowaniu sterującym pracą serwonapędu
zaimplentowano możliwość rejestracji parametrów serwa przez 200ms. W ten sposób
można sprawdzać jak serwonapęd reaguje na zmianę paramentrów PID oraz innych
ustawień takich jak prędkość i przyspieszenie.
Jednym z pierwszych uzyskanych wykresów był wykres drogi zadanej, drogi rzeczywistej i
6
4
50
error [krok]
błędu.
Error
8
40
30
Command
2
10
0 t [ms]
0
-10
Feedback
0
6
12
18
24
30
36
42
48
54
60
66
72
78
84
90
96
102
108
114
120
126
132
138
144
150
156
162
168
174
180
186
192
198
s [krok]
20
-2
-20
-4
-30
-6
-40
-50
-8
Rysunek 5.1.1: Wykres trajektorii zadanej i rzeczywistej oraz błędu (prawa oś).
Powyższy wykres uzyskano przy parametrach pracy V maks = 50mm/s oraz dużym
przyspieszeniu 5000mm/s2. Droga, którą pokonywała karetka ruchem oscylacyjnym
wynosiła 1mm. Przy takich parametrach pracy maksymalna niedokładność wyniosła
0,17mm. Wykres ten uzyskano gdy urządzenie znajdowało się w dość wczesnej fazie
rozwoju, dalsze wykresy pokazują jak zmieniła się dokładność urządzenia w czasie jego
rozwoju.
Dzięki temu samemu narzędziu możliwe było również wykreślenie przebiegów
stanowiących odpowiedź regulatora PID. Niestety sterownik z powodu wielkości pamięci
wewnętrznej jest w stanie zapisać tylko 3 zmienne po 200 wartości. Przy zapisie co 1ms
66
umożliwia to zapis 200ms. Sterownik przesyła wartość zmiennych rozkazu (command),
rzeczywistej drogi (feedback) oraz całkowitej odpowiedzi regulatora (output). Wszystkie
inne wartości użyte do wyrysowania wykresów zostały obliczone w arkuszu kalkulacyjnym
w takim sam sposób, w jaki oblicza je mikroprocesor. Arkusz kalkulacyjny, który posłużył
do obliczenia wartości regulatora PID znajduje się na płycie dołączonej do niniejszej pracy.
Czerwona linia przedstawia wykres odpowiedzi członu proporcjonalnego. Widać wyraźnie,
że kształt jest proporcjonalny do błędu z poprzedniego wykresu. Przebieg I (linia żółta) jest
uśrednieniem poprzednich błędów, więc z założenia jest przebiegiem wolnozmiennym, w
przeciwieństwie do członu proporcjonalnego i różniczkującego. Człon różniczkujący to
inaczej różniczkowanie błędu, czyli prędkość zmian błędu. Oznacza to, że człon
różniczkujący wzmacnia wysokie częstotliwości. Im większa dynamika zmian błędu tym
człon różniczkujący osiąga większe wartości. Poniższy wykres przedstawia działanie
50
PID
600
40
s [krok]
urządzenia tylko z regulatorem PID bez członów predykcyjnych (feed-forward).
Output
400
30
Command
Feedback
20
200
P
I
10
D
0 t [ms]
0
-10
-200
-20
-30
-400
-40
-600
-50
Rysunek 5.1.2: Wykres trajektrorii oraz odpowiedzi regulatora PID
Dzięki takiemu narzędziu wizualizacyjnemu możliwe było precyzyjne strojenie regulatora
PID oraz zbadanie dokładności plotera przy założonej prędkości i przyspieszeniu.
Do testów plotera wykorzystano plik testowy, który udostępnia firma Roland. Plik
ten zawiera w sobie wszystkie obiekty, które potrzebne są do oceny jakości działania
urządzenia. Figury po prawej i na dole służą do oceny czy ploter podąża za prawidłową
ścieżką cięcia jadąc w lewo i w prawo, i analogicznie w przód i do tyłu. Koła oraz krzyżyki
67
pozwalają ocenić czy figury są zamknięte. Ułożenie takich samych figur obróconych o kąt
90stopni umożliwia stwierdzenie, która oś plotera działa nieprawidłowo.
Rysunek 5.1.3: Rysunek wektorowy służący do testowania urządzenia
5.1.1
Dokładność
Dokładność została przetestowana poprzez wykreślenie powyższego pliku na
różnych ustawieniach prędkości. Dzięki zmiennej, która umożliwia zapisanie najwyższego
błędu, który wystąpił podczas ruchu uzyskano następujące dane:
Prędkość
Błąd maksymalny
[mm/min]
[mm/s]
[krok]
[mm]
30000
500
8
0,09756
15000
250
8
0,09756
6000
100
7
0,08537
3000
50
7
0,08537
1200
20
5
0,06098
600
10
4
0,04878
300
5
3
0,03659
60
1
2
0,02439
Tabela 5.1.1: Zależność prędkości oraz błędu
maksymalnego wykrytego podczas ruchu.
68
9
8
7
Błąd [krok]
6
5
4
Błąd
3
2
1
0
0
50
100
150
200
250
300
350
400
450
500
Prędkość [mm/s]
Rysunek 5.1.1.1: Wykres błędu maksymalnego w zależności od prędkości.
Mniejszy błąd przy niskich prędkościach jest wynikiem tego, że silnik musi pokonać
mniejsze siły bezwładności ruchomych elementów oraz tego, że sterownik serwonapędu ma
więcej czasu na reakcje na zmieniającą się wartość zadaną.
Kolejną metodą sprawdzenia dokładności było wygenerowanie wykresów podczas
wykonywania określonego ruchu. Dzięki temu można zobaczyć jak wyglądają błędy
dynamiczne zmieniające się w czasie, w zależności od tego czy silnik hamuje, przyspiesza
czy porusza się ruchem jednostajnym. Na poniższym wykresie ploter wykonuje ruch 1mm
w prawo i 1mm w lewo z prędkością maksymalną (500mm/s) i przyspieszeniu 3000mm/s 2.
Oczywiście przy tak krótkim dystansie głowica plotera nie może się rozpędzić do prędkości
maksymalnej. Kolejne wykresy przedstawią wycinek trajektorii dla większego dystansu.
50
10
40
8
30
6
20
4
10
2
0
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
Command
Error
-10
-2
-20
-4
-30
-6
-40
-8
-50
-10
Rysunek 5.1.1.2: Wykres trajektorii ruchu 2mm oraz błędu (prawa oś).
69
Feedback
Z powyższego wykresu można odczytać, że błąd (prawa oś Y) nie przekroczył 4
impulsów z enkodera, co w przeliczeniu na mm wynosi 0,0976mm. Odpowiedź regulatora
wyglądała następująco:
Aby zrozumieć wykresy należy zapoznać się z poniższym opisem.
Na lewej osi Y umieszczono wartości odpowiedzi poszczególnych członów regulatora.
1. Output – sumaryczna odpowiedź regulatora będąca sumą poszczególnych członów,
2. FF1 – sterowanie predykcyjne (feed-forward drugiego stopnia) inaczej mówiąc
wartość przyspieszenia sygnału sterującego podana po wzmocnieniu na wyjście
regulatora (nie wpływa znacząco na jakość sterowania),
3. FF0 – sterowanie predykcyjne (feed-forward pierwszego stopnia) inaczej mówiąc
wartość prędkości sygnału sterującego podana po wzmocnieniu na wyjście
regulatora. Człon ten jest bardzo istotny przy większych prędkościach. Bardzo
dobrze widać to na dalszych wykresach gdzie napęd osiąga duże prędkości,
4. P – człon proporcjonalny, I – człon całkujący, D – człon różniczkujący.
Natomiast na prawej osi umieszczono:
1. Command – pozycja wartości zadanej (rozkaz),
2. Feedback – pozycja wartości rzeczywistej (informacja z enkodera).
300
50
40
200
30
20
100
Output
10
FF1
FF0
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
-10
-100
-20
P
I
D
Command
Feedback
-30
-200
-40
-300
-50
Rysunek 5.1.1.3: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 2mm.
Na powyższym wykresie skala pozycji zadanej i pozycji zwrotnej jest na prawej osi Y.
70
Kolejny wykres przedstawia ruch karetki 2mm w lewo i w prawo. Błąd nie przekracza 4
impulsów z enkodera.
100
10
80
8
60
6
40
4
20
2
0
0
-20
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
Command
Feedback
Error
-2
-40
-4
-60
-6
-80
-8
-100
-10
Rysunek 5.1.1.4: Wykres trajektorii ruchu 4mm oraz błędu (prawa oś).
Wykres odpowiedzi regulatora przedstawiono poniżej.
300
100
80
200
60
40
100
Output
FF1
20
FF0
P
0
-20
-100
I
D
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Command
Feedback
-40
-60
-200
-80
-300
-100
Rysunek 5.1.1.5: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 4mm.
Na powyższym wykresie widać, że sterowanie predykcyjne (feed-forward) bierze coraz
większy udział w ogólnej odpowiedzi regulatora gdyż napęd poruszając się na większą
odległość jest w stanie rozpędzić się do większej prędkości.
71
Poniższy wykres trajektorii oraz błędu dla ruchu oscylacyjnego o długości 8mm.
200
10
8
150
6
100
4
50
2
Command
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Feedback
Error
-2
-50
-4
-100
-6
-150
-8
-200
-10
Rysunek 5.1.1.6: Wykres trajektorii ruchu 8mm oraz błędu (prawa oś).
Na powyższym wykresie widać, że błąd nie przekracza 4 impulsów.
300
200
150
200
100
Output
100
50
FF1
FF0
P
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
I
D
Command
-50
Feedback
-100
-100
-200
-150
-300
-200
Rysunek 5.1.1.7: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 8mm.
Dzięki większemu dystansowi silnik rozpędza się do większej prędkości a sterowanie feedforward w coraz większym stopniu pomaga utrzymać serwo na ścieżce. Bez sterowania
predykcyjnego błąd osiągał prawie dwukrotną wartość.
72
350
10
8
250
6
150
4
2
50
Command
-50
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Feedback
Error
-2
-4
-150
-6
-250
-8
-350
-10
Rysunek 5.1.1.8: Wykres trajektorii ruchu na dystansie 16mm oraz błędu (prawa oś).
Błąd osiągnął w szczytowym momencie wielkość 5 impulsów z enkodera, co w przeliczeniu
wynosi 0,12mm.
300
350
250
200
150
100
Output
FF1
FF0
50
P
I
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
D
-50
Command
Feedback
-100
-150
-200
-250
-300
-350
Rysunek 5.1.1.9: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 16mm.
Silnik porusza się z coraz większą prędkością mając możliwość rozpędzenia się na
dłuższym dystansie. Wyjście regulatora osiąga coraz większe wartości.
73
10
550
8
6
350
4
150
2
Command
-50
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Feedback
Error
-2
-250
-4
-6
-450
-8
-650
-10
Rysunek 5.1.1.10: Wykres trajektorii ruchu na dystansie 32mm oraz błędu (prawa oś).
Błąd utrzymuje się na podobnym poziomie 4-5 impulsów enkodera. Dzięki członowi
predykcyjnemu napęd pozostaje na ścieżce, również podczas ruchu z maksymalną
prędkością.
300
550
200
350
Output
100
FF1
150
FF0
P
I
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
-50
D
Command
Feedback
-100
-250
-200
-450
-300
-650
Rysunek 5.1.1.11: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 32mm.
Wartość członu FF0 jest proporcjonalna do prędkości z jaką porusza się dana oś urządzenia.
74
Dystans 50mm – zmiana kierunku
500
8
400
6
300
4
200
2
100
Command
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Feedback
Error
-100
-2
-200
-4
-300
-6
-400
-500
-8
Rysunek 5.1.1.12: Wykres trajektorii ruchu podczas hamowania i rozpędziania silnika.
Podczas hamowania i rozpędzania błąd nie przekroczył wartości 5 impulsów.
400
500
400
300
300
200
200
Output
FF1
100
100
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
-100
-100
FF0
P
I
D
Command
Feedback
-200
-200
-300
-300
-400
-400
-500
Rysunek 5.1.1.13: Wykres odpowiedzi regulatora podczas hamowania i rozpędzania silnika.
Na wykresie pracy regulatora widać osiąganie wartości chwilowej 350, co oznacza
wypełnienie PWM około 70%. Oznacza to, że silnik ma jeszcze spory zapas mocy na
większe wartości przyspieszenia.
75
2500
8
2000
6
1500
4
1000
2
500
Command
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Feedback
Error
-500
-2
-1000
-4
-1500
-6
-2000
-2500
-8
Rysunek 5.1.1.14: Wykresy trajektorii oraz błędu z maksymalną prędkością 500mm/s.
Na powyższym wykresie widać, że regulator lepiej radzi sobie w ruchu jednostajnym niż
przy hamowaniu czy przyspieszaniu. Błąd nie przekracza wtedy wartości 2 impulsów.
400
2500
2000
300
1500
200
1000
Output
FF1
100
500
FF0
P
0
-500
-100
I
D
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Command
Feedback
-1000
-200
-1500
-300
-2000
-400
-2500
Rysunek 5.1.1.14: Wykres odpowiedzi regulatora dla ruchu z maksymalną prędkością.
Na wykresie można zaobserwować jak duży udział ma sterowanie liniowe w odpowiedzi
układu przy dużych prędkościach ruchu. Sterowanie predykcyjne ustala większość
odpowiedzi regulatora podczas gdy PID reguluje moc silnika w sposób precyzyjny.
76
5.1.2
Prędkość i przyspieszenie
Maksymalna prędkość z jaką pracuje układ wynosi 500mm/s. Oprogramowanie
LinuxCNC na testowym komputerze jest w stanie wygenerować sygnał sterujący tylko do
określonej częstotliwości, która przekłada się na prędkość maszyny.
3000
8
6
2000
4
1000
2
Command
0
2
9
16
23
30
37
44
51
58
65
72
79
86
93
100
107
114
121
128
135
142
149
156
163
170
177
184
191
198
0
Feedback
Error
-2
-1000
-4
-2000
-6
-3000
-8
Rysunek 5.1.2.1: Wykres błędu i drogi podczas ruchu z prędkością 750mm/s
Maksymalna możliwa
do uzyskania prędkość wynosi 750mm/s. Przetestowano pracę
układu z tą szybkością. Układ pozostaje stabilny jednak wielkość błędu podczas hamowania
przekracza założone wartości. Podczas ruchu jednostajnego z prędkością 750mm/s błąd jest
niewielki i nie przekracza 3 impulsów z enkodera. Prędkość 750mm/s jest maksymalną
prędkością, którą może obsłużyć mikroprocesor z uwagi na brak wolnego czasu
obliczeniowego spowodowanego bardzo częstym wywoływaniem przerwań sterujących i
enkodera. Prędkość z jaką porusza się oś plotera została sprawdzona również
doświadczalnie. Można ją obliczyć z danych, które mikroprocesor wysyła w celu
wykreślenia odpowiedzi regulatora. Prędkość jest to pochodna drogi oraz jeśli próbkowanie
odbywa się z częstotliwością 1kHz to wzór na prędkość osi wygląda w następujący sposób:
V=
s n−s n−1 3973−3952 kroków
kroków
=
[
]=21⋅10 3 [
]
−3
1
s
s
1⋅10
fs
należy przekształcić jednostkę,
3
V =21⋅10 [
kroków
mm
mm
]⋅0,02439[
]=512[
]
s
krok
s
77
gdzie:
sn, sn-1 – wartość zmiennej pozycji dla aktualnej i poprzedniej próbki,
fs – częstotliwość próbkowania.
Układ pracuje z prędkością zadaną w oprogramowaniu sterującym LinuxCNC. Z uwagi na
objętość arkusza kalkulacyjnego nie został on umieszczony w tym miejscu a znajduje się na
płycie CD dołączonej do niniejszej pracy.
Przyspieszenie z jakim pracuje układ to 3000mm/s2. Gwarantuje ono uzyskanie błędu
poniżej 5 impulsów z enkodera. Podczas badań układu okazało się, że to przyspieszenie ma
kluczowy wpływ na wielkość błędu.
Przyspieszenie:
3000mm/s2
10000mm/s2
15000mm/s2
20000mm/s2
22000mm/s2
Błąd:
4imp
11imp
15imp
15imp
29imp
Tabela 5.1.2.1: Wielkość błędu w zależności od przyspieszenia.
Poniższy wykres pokazuje wielkość błędu podczas przyspieszania i hamowania o
wartości ±15000mm/s2. Zmiana wartości przyspieszenia do tak ekstremalnych wartości,
gdzie przyspieszenie do prędkości 0,5m/s zajmuje tylko 30ms, powoduje czasem rezonanse
mechaniczne, które mogą znacznie zwiększyć wartość błędu. Widać to w tabeli powyżej
gdzie przy zwiększeniu przyspieszenia tylko o 10% powoduje to zwiększenie błędu aż
dwukrotnie.
500
20
400
15
300
10
200
5
100
Command
-100
0
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
Error
-5
-200
-10
-300
-400
-500
Feedback
-15
-20
Rysunek 5.1.2.2: Wykres ruchu oscylacyjnego z przyspieszenie 15000mm/s2.
78
Układ przetestowano do wartości przyspieszenia 22000mm/s2 i prędkości 750mm/s.
Przy tym przyspieszeniu silnik działał momentami na pełnej mocy co powodowało jego
awaryjne wyłączenie przez algorytmy zabezpieczające.
600
500
400
400
300
200
200
Output
FF1
100
FF0
P
0
I
D
2
8
14
20
26
32
38
44
50
56
62
68
74
80
86
92
98
104
110
116
122
128
134
140
146
152
158
164
170
176
182
188
194
0
-100
Command
Feedback
-200
-200
-300
-400
-400
-600
-500
Rysunek 5.1.2.3: Wykres odpowiedzi regulatora dla przyspieszenia 22000mm/s.
Ograniczenie wyjścia regulatora (kolor niebieski) do ±511 jest widoczne na
powyższym wykresie. Kształt przebiegów wskazuje, że przy napięciu zasilającym 20V to są
graniczne możliwości urządzenia, które oczywiście przekraczają założoną wielkość błędu.
Zwiększenie dokładności urządzenia przy tak ekstremalnych parametrach byłoby możliwe
poprzez zwiększenie napięcia zasilającego silnik co spowodowałoby zwiększenie momentu
obrotowego silnika, który odpowiada za to jak szybko silnik jest w stanie przyspieszyć i
wyhamować.
79
Rozdział VI
Podsumowanie
80
Celem pracy było opisanie, zaprojektowanie i wykonanie plotera tnącego
napędzanego serwonapędami. Cel pracy został zrealizowany. Po wykonaniu szeregu
obliczeń i doświadczeń wybrano optymalne rozwiązania zarówno programowe jak i
sprzętowe.
Program sterujący pracą serwonapędu oparty o regulator PID i sterowanie feedforward uzyskał założoną dokładność i został zaakceptowany jako ostateczny. Sterowanie
feed-forward po dobraniu odpowiednich współczynników wzmocnienia pozwoliło na
dwukrotne zmniejszenie błędu podczas ruchu osi plotera.
Głównym problemem napotkanym podczas konstruowania plotera tnącego były
zakłócenia EMI generowane przez silnik. Rozwiązaniem tego problemu była filtracja
zakłóceń przez krążki ferrytowe, filtry EMI oraz ekranowanie przewodów. Dodatkowo
impulsy z enkodera należało odfiltrować układem formującym impulsy z wejściem
Schmitta (74LS14). Zastosowanie wolniejszego układu z serii LS zamiast HCT
poskutkowało skuteczniejszym wyeliminowaniem zakłóceń.
Mikroprocesor ATMega32, który pracuje z częstotliwością 16MHz w stanie bezruchu
silników jest obciążony w 70%. Gdy osie pracują z maksymalną założoną prędkością
wynoszącą 500mm/s procesor jest zajęty w 95%. Spowodowane jest to tym, że przerwania
impulsów enkodera oraz impulsów sterujących obciążają procesor proporcjonalnie do
prędkości obrotowej silników. W chwili obecnej impulsy z enkodera dekodowane są w
trybie x2. Oprogramowanie sterownika umożliwia włączenie dekodowania x4 jednak
obecnie wykorzystywany procesor nie byłby w stanie obsłużyć tak dużej ilości przerwań z
enkodera oraz dwukrotnie większej ilości przerwań sygnału sterującego, z uwagi na
podwojenie rozdzielczości sterowania. Z tych powodów konstrukcja posiada potencjał
rozwojowy do dalszego udoskonalania.
Rozwój konstrukcji w przyszłości:
•
przeniesienie sterowania na mocniejszą 32-bitową platformę np. STM32,
•
zintegrowanie obsługi wielu osi w jednym mikroprocesorze,
•
zastosowanie dekodowania x4, co spowoduje zmniejszenie błędu dwukrotnie,
•
zwiększenie częstotliwości wywoływania przerwań regulatora PID,
•
zwiększenie częstotliwości przebiegu PWM sterującego mocą silnika.
81
Literatura
1. Przepiórkowski Jacek, Silniki elektryczne w praktyce elektronika, Warszawa 2007,
Wydawnictwo BTC
2. Glaister Lawrence, Dspic-Servo Project, http://members.shaw.ca/swstuff/dspic-
servo.html 2008
3. Jason Sachs, How to Build a Fixed-Point PI Controller That Just Works,
http://www.embeddedrelated.com/showarticle/121.php?articleid=121 2012
4. dr Bartłomiej Ufnalski, Integral Anti-Windup for PI Controllers,
http://www.isep.pw.edu.pl/ZakladNapedu/lab-ane/anti-windup.pdf
5. Istrukcja serwisowa, Service Notes Roland CAMM-1 GX-24, 2005 RolandDG Corporation
6. Istrukcja serwisowa, Service Manual Graphtec FC-8000,
http://222.146.7.157/support/manuals/FC8000/FC8000UM2510.pdf, 2007 Graphtec
7. Instrukcja obsługi, SummaCut Pharos D60R User's Manual,
http://www.summa.be/download/scl_en.pdf, 2011 Summa bvba
8. Nota katalogowa procesora Atmega32,
http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf, 2009 Atmel
9.
Nota katalogowa układu L298, http://www.st.com/st-webui/static/active/en/resource/technical/document/datasheet/CD00000240.pdf,
10.
Nota katalogowa układu L6203, http://www.st.com/st-webui/static/active/en/resource/technical/document/datasheet/CD00000089.pdf,
11.
2000 STMicroelectronics,
2003 STMicroelectronics,
Instrukcja obsługi płytki SSK-MB1, http://www.ebmia.pl/pliki/dodatkowe/SSK-MB1%20%20instrukcja%20obs%C5%82ugi.pdf, Akcesoria
82
CNC.
Spis rysunków
Rysunek 2.1.1: Ploter rolkowy firmy Roland
Rysunek 2.1.2: Ploter stołowy firmy Graphtec
Rysunek 2.1.1.1: Głębokość cięcia noża
Rysunek 2.1.1.2: Kompensacja przesunięcia końcówki noża
Rysunek 2.1.1.3: Nóż wleczony i budowa końcówki tnącej
Rysunek 2.1.2.1: Schemat noża tnącego oraz obracającego nim silnika
Rysunek 2.1.2.2: Zasada działania noża aktywnego
Rysunek 2.1.2.3: Nóż aktywny
Rysunek 2.1.3.1: Wykres kierunku nacisku noża w czasie opuszczania.
Rysunek 2.1.4.1: Karetka tnąca
Rysunek 2.1.4.2: Górna rolka dociskowa oraz dolny wałek perforowany
Rysunek 2.1.5.1: Schemat blokowy typowego plotera tnącego [5].
Rysunek 2.2.1.1: Mikroprocesor ATMega32
Rysunek 2.3.1: Przebiegi czasowe sygnału PWM.
Rysunek 2.3.1.1: Sposób działania generatora sygnałów PWM.
Rysunek 2.3.1.2: Wykres napięcia na silniku w stanie ustalonym.
Rysunek 2.3.1.3: Wykres siły w funkcji błędu.
Rysunek 2.4.1.1: Zjawisko nawijania się akcji całkującej.
Rysunek 2.4.2.1: Schemat blokowy algorytmu anti-windup [4].
Rysunek 2.4.2.2: Zachowanie regulatora z mechanizmem Anti-windup.
Rysunek 2.5.1: Człon predykcyjny (granatowy) odpowiada za większość odpowiedzi
regulatora podczas ruchu z dużą prędkością.
Rysunek 3.1.1: Ploter Roland CAMM-1 GX-24
Rysunek 3.1.2: Ploter SummaCut D60R
Rysunek 3.1.3: Ploter Graphtec FC8000-60
Rysunek 3.1.2.1.1: Końcówka mocy plotera Roland GX-24
Rysunek 3.1.2.3.1: Wejścia przetworników ADC z informacją o prądzie [6].
Rysunek 3.1.2.3.2: Końcówka mocy plotera FC-8000
Rysunek 4.1.1: Schemat blokowy urządzenia.
Rysunek 4.1.2: Schemat ideowy urządzenia.
Rysunek 4.1.1.2: Płytka SSK-MB1 połączona z płytą główną komputera
Rysunek 4.1.1.3: Wyprowadzenia portu równoległego.
Rysunek 4.1.1.4: Wyprowadzenia sterujące osi X [11].
Rysunek 4.1.3.1: Modułowa końcówka mocy oparta na układzie L298.
Rysunek 4.1.3.2: Schemat końcówki mocy opartej o układ L6203.
Rysunek 4.1.3.3: Płytka PCB zaprojektowanej końcówki mocy.
Rysunek 4.1.3.4: Filtry EMI zastosowane przez firmę Summa.
Rysunek 4.2.1: Ploter SummaCut D620.
Rysunek 4.2.1.1: Silnik DC wykorzystany w zaprojektowanym urządzeniu
Rysunek 4.3.1.1: Algorytm obsługi enkodera
Rysunek 4.3.3.1: Algorytm PID wykorzystany w niniejszej pracy
Rysunek 4.3.10.1: Zrzut ekranu, konfiguracja LinuxCNC - strona początkowa
Rysunek 4.3.10.2: Zrzut ekranu, konfiguracja LinuxCNC - podstawowe informacje
Rysunek 4.3.10.3: Zrzut ekranu, konfiguracja LinuxCNC – konfiguracja portu.
Rysunek 4.3.10.4: Zrzut ekranu, konfiguracja LinuxCNC - konfiguracja osi
83
Rysunek 4.3.10.5: Zrzut ekranu, testowanie osi
Rysunek 5.1.1: Wykres trajektorii zadanej i rzeczywistej oraz błędu (prawa oś).
Rysunek 5.1.2: Wykres trajektrorii oraz odpowiedzi regulatora PID
Rysunek 5.1.3: Rysunek wektorowy służący do testowania urządzenia
Rysunek 5.1.1.1: Wykres błędu maksymalnego w zależności od prędkości.
Rysunek 5.1.1.2: Wykres trajektorii ruchu 2mm oraz błędu (prawa oś).
Rysunek 5.1.1.3: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 2mm.
Rysunek 5.1.1.4: Wykres trajektorii ruchu 4mm oraz błędu (prawa oś).
Rysunek 5.1.1.5: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 4mm.
Rysunek 5.1.1.6: Wykres trajektorii ruchu 8mm oraz błędu (prawa oś).
Rysunek 5.1.1.7: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 8mm.
Rysunek 5.1.1.8: Wykres trajektorii ruchu na dystansie 16mm oraz błędu (prawa oś).
Rysunek 5.1.1.9: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 16mm.
Rysunek 5.1.1.10: Wykres trajektorii ruchu na dystansie 32mm oraz błędu (prawa oś).
Rysunek 5.1.1.11: Wykres odpowiedzi regulatora (lewa oś) dla ruchu 32mm
Rysunek 5.1.1.12: Wykres trajektorii ruchu podczas hamowania i rozpędziania silnika.
Rysunek 5.1.1.13: Wykres odpowiedzi regulatora podczas hamowania i rozpędzania silnika.
Rysunek 5.1.1.14: Wykresy trajektorii oraz błędu z maksymalną prędkością 500mm/s.
Rysunek 5.1.2.1: Wykres błędu i drogi podczas ruchu z prędkością 750mm/s.
Rysunek 5.1.2.2: Wykres ruchu oscylacyjnego z przyspieszenie 15000mm/s2.
Rysunek 5.1.2.3: Wykres odpowiedzi regulatora dla przyspieszenia 22000mm/s.
84
Spis tabel
Tabela 3.1.1.1: Porównanie ploterów fabrycznych z skonstruowanym ploterem.
Tabela 5.1.1: Zależność prędkości oraz błędu maksymalnego wykrytego podczas ruchu.
Tabela 5.1.2.1: Wielkość błędu w zależności od przyspieszenia.
85
Zawartość nośnika CD
1. Wersja elektroniczna pracy w formacie PDF.
2. Kompletny kod źródłowy pracy jako projekt programu AVR Studio 4.
3. Zdjęcia zaprojektowanego plotera oraz filmy.
86
PLOTER
TNĄCY
87