Skip to content

Commit 6debaf6

Browse files
committed
Add lab report for peripheral devices (stepper motor)
1 parent 7ee3084 commit 6debaf6

File tree

2 files changed

+241
-0
lines changed

2 files changed

+241
-0
lines changed

UP/Silnik_krokowy/main.tex

+216
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
\documentclass{article}
2+
\usepackage[utf8]{inputenc}
3+
\usepackage{polski}
4+
\usepackage{listings}
5+
\usepackage{hyperref}
6+
\usepackage{chngpage}
7+
\usepackage{natbib}
8+
\usepackage{graphicx}
9+
\usepackage{url}
10+
\usepackage{minted}
11+
12+
\setminted{
13+
linenos=true,
14+
autogobble,
15+
breaklines,
16+
frame=lines,
17+
framerule=1pt,
18+
framesep=10pt
19+
}
20+
21+
\newenvironment{longlisting}{}{}
22+
23+
\makeatletter
24+
\newcommand{\linia}{\rule{\linewidth}{0.4mm}}
25+
\renewcommand{\maketitle}{\begin{titlepage}
26+
\vspace*{1cm}
27+
\begin{center}\small
28+
Politechnika Wrocławska\\
29+
Wydział Elektroniki\\
30+
Urządzenia Peryferyjne
31+
\end{center}
32+
\vspace{3cm}
33+
\noindent\linia
34+
\begin{center}
35+
\LARGE \textsc{\@title}
36+
\end{center}
37+
\linia
38+
\vspace{0.5cm}
39+
\begin{flushright}
40+
\begin{minipage}{7cm}
41+
\textit{\small Autor:}\\
42+
\normalsize \textsc{\@author} \par
43+
\end{minipage}
44+
\vspace{5cm}
45+
46+
{\small środa, 14\textsuperscript{15}-17\textsuperscript{15} TN}\\
47+
Mgr inż. Kamil Szyc
48+
\end{flushright}
49+
\vspace*{\stretch{6}}
50+
\begin{center}
51+
\@date
52+
\end{center}
53+
\end{titlepage}
54+
}
55+
\makeatother
56+
\author{225942 Justyna Skalska \\
57+
226126 Grzegorz Kopacz}
58+
\title{\textbf{Urządzenia peryferyjne}\\
59+
\normalsize{Sterowaniem silnikiem krokowym za pomocą USB}}
60+
61+
\begin{document}
62+
\maketitle
63+
\tableofcontents
64+
65+
\newpage
66+
67+
\section{Opis zadania}
68+
Podczas zajęć laboratoryjnych mieliśmy zapoznać się ze sposobami sterowania silnikiem krokowym za pomocą USB. Pierwszym zadaniem było obrócenie wirnika o 360 stopni. Następnie trzeba było zmodyfikować napisany wcześniej program, tak aby wirnik wykonał jeden obrót w zdanym przez użytkownika czasie. Ostatnim zadaniem było dostosowanie prędkości obrotu wirnika do zadanej przez użytkownika oraz sprawienie, że wirnik nie startuje z wybraną prędkością lecz przyśpiesza do niej, aby uniknąć problemów z nagłym startem.
69+
70+
\section{Wstęp}
71+
Silnik krokowy jest to silnik elektryczny, w którym impulsowe zasilanie prądem elektrycznym powoduje, że jego wirnik nie obraca się ruchem ciągłym, lecz wykonuje każdorazowo ruch obrotowy o ściśle określony kąt. Ze względu na typ budowy silniki krokowe można podzielić na: silnik z magnesem trwałym, silnik o zmiennej reluktancji oraz silnik hybrydowy.
72+
Podczas laboratorium nasze urządzenie było połączone z komputerem za pomocą portu USB. Za konwersje standardu USB na 8 bitową linię odpowiedzialny jest układ firmy FTDI o symbolu FT245BM. Do wyjścia tego układu, które ma postać 8 bitowej szyny dołączony jest układ ULN2803A.\cite{lab}
73+
74+
\section{Zadanie}
75+
Kod został wykonany przy użyciu języka C\#. Silnik został podłączony do portu USB. Z przyczyn technicznych nie jestem w stanie zamieścić zdjęcia interfejsu wykonanej aplikacji. Posiadała ona jednak przyciski pozwalające wykonać obrót o zadany kąt oraz w zadanym czasie. Znajdował się tam także slider, dzięki któremu można było wybrać prędkość obrotu wirnika. Można go było wystartować oraz zatrzymać dzięki dodatkowym 2 przyciskom.
76+
\newline
77+
\newline
78+
79+
\begin{listing}
80+
\caption{Zmienne globalne}
81+
\begin{minted}{csharp}
82+
// liczba wysłanych bitów
83+
public UInt32 WrittenBytesCount = 0;
84+
// bity pozwalające obrócić wirnik w prawo
85+
public byte[] stepRightBytes = { 0x01, 0x08, 0x02, 0x04 };
86+
// bity pozwalające obrócić wirnik w lewo
87+
public byte[] stepLeftBytes = { 0x04, 0x02, 0x08, 0x01 };
88+
// bity pozwalające rozłączyć się z urządzeniem
89+
public byte[] disconnectBytes = { 0x00 };
90+
// indeks wysłanych bitów
91+
public int index = 0;
92+
// procent prędkości maksymalnej wybranej przez użytkownika
93+
public int speedPercentage = 0;
94+
\end{minted}
95+
\label{lst:global}
96+
\end{listing}
97+
98+
\begin{listing}[H]
99+
\caption{Funkcja do łączenia się z urządzeniem}
100+
\begin{minted}{csharp}
101+
public void connect() {
102+
UInt32 deviceCount = 0;
103+
Device = new FTDI();
104+
Device.GetNumberOfDevices(ref deviceCount);
105+
FTDI.FT_DEVICE_INFO_NODE[] deviceList = new FTDI.FT_DEVICE_INFO_NODE[deviceCount];
106+
Device.GetDeviceList(deviceList);
107+
Console.WriteLine("Device count: " + deviceList.Length);
108+
Device.OpenBySerialNumber(deviceList[0].SerialNumber);
109+
Device.SetBitMode(0xff, 1);
110+
foreach (FTDI.FT_DEVICE_INFO_NODE d in deviceList) {
111+
Console.WriteLine("Device name: " + d.Description);
112+
Console.WriteLine("Device serial number: " + d.SerialNumber);
113+
}
114+
}
115+
\end{minted}
116+
\label{lst:connect}
117+
\end{listing}
118+
119+
\begin{listing}[H]
120+
\caption{Funkcja do odłączania urządzenia}
121+
\begin{minted}{csharp}
122+
public void disconnect() {
123+
WrittenBytesCount = 0;
124+
Int32 bytesToWrite = 1;
125+
Device.Write(disconnectBytes, bytesToWrite, ref WrittenBytesCount);
126+
Console.WriteLine("Device disconnected!");
127+
}
128+
\end{minted}
129+
\label{lst:disconnect}
130+
\end{listing}
131+
132+
\begin{listing}[H]
133+
\caption{Funkcja wysyłania bitów do urządzenia}
134+
\begin{minted}{csharp}
135+
public void writeBytes(int speed, byte[] bytes) {
136+
byte[] x = { bytes[index % 4] };
137+
Device.Write(x, bytesToWrite, ref WrittenBytesCount);
138+
Thread.Sleep(speed);
139+
index++;
140+
}
141+
\end{minted}
142+
\label{lst:write_bytes}
143+
\end{listing}
144+
145+
\begin{listing}[H]
146+
\caption{Funkcja wykonująca zadaną liczbę kroków wirnika}
147+
\begin{minted}{csharp}
148+
// obliczanie liczby kroków na obrót
149+
var stepsCount = (int)(360 / 7.5f);
150+
// obliczanie prędkości jednego obrotu
151+
var timeout = (int)(5 * 1000 / stepsCount);
152+
153+
public void step(int count, int speed, byte[] bytes) {
154+
WrittenBytesCount = 0;
155+
for (int i = 0; i < count; i++) {
156+
writeBytes(speed, bytes);
157+
}
158+
}
159+
\end{minted}
160+
\label{lst:step}
161+
\end{listing}
162+
163+
\begin{listing}[H]
164+
\caption{Funkcja wykonująca kroki wirnika przez określony czas}
165+
\begin{minted}{csharp}
166+
public void stepTimed(int time, int speed, byte[] bytes) {
167+
WrittenBytesCount = 0;
168+
169+
Stopwatch timer = new Stopwatch();
170+
timer.Start();
171+
while (timer.Elapsed.TotalSeconds < time) {
172+
writeBytes(speed, bytes);
173+
}
174+
timer.Stop();
175+
}
176+
\end{minted}
177+
\label{lst:step_timed}
178+
\end{listing}
179+
180+
\begin{listing}[H]
181+
\caption{Funkcja odpowiedzialna za obracanie wirnika z wybraną prędkością i pozwalająca na jego zatrzymanie}
182+
\begin{minted}{csharp}
183+
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
184+
BackgroundWorker worker = sender as BackgroundWorker;
185+
int minSpeed = 205;
186+
int maxSpeed = 5;
187+
int chosenSpeed = (int)(minSpeed - (((minSpeed - maxSpeed) * ch.speedPercentage) / 100));
188+
int speedStep = 10;
189+
int speed = minSpeed;
190+
191+
while (true) {
192+
if (worker.CancellationPending == true) {
193+
e.Cancel = true;
194+
break;
195+
} else {
196+
ch.writeBytes(speed, ch.stepRightBytes);
197+
if (speed > maxSpeed) {
198+
speed -= speedStep;
199+
}
200+
}
201+
}
202+
203+
ch.WrittenBytesCount = 0;
204+
}
205+
\end{minted}
206+
\label{lst:background_worker}
207+
\end{listing}
208+
209+
\section{Wnioski}
210+
To ćwiczenie pozwoliło nam zapoznać się z podstawami obsługi silnika krokowego poprzez port USB. Okazało się to być stosunkowo prostym i przyjemnym zadaniem. Wiedza na ten temat może przydać się przy tworzeniu różnego rodzaju urządzeń, np. napędów DVD oraz drukarek, a także w szeroko rozumianej automatyce.
211+
\newpage
212+
213+
\listoflistings
214+
\bibliographystyle{unsrt}
215+
\bibliography{references}
216+
\end{document}

UP/Silnik_krokowy/references.bib

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
@misc{lab,
2+
key={PCL},
3+
title={Instrukcja do laboratorium nr 15},
4+
url = {http://www.zsk.ict.pwr.wroc.pl/zsk/dyd/intinz/up/lab/lab_15},
5+
urldate = {2019-01-27}
6+
}
7+
@misc{wiki,
8+
key={PCL},
9+
title={https://en.wikipedia.org/wiki/Printer\_Command\_Language},
10+
url = {https://en.wikipedia.org/wiki/Printer\_Command\_Language},
11+
urldate = {2018-12-04}
12+
}
13+
@book{printerSpecs,
14+
author={Hewlett-Packard Company},
15+
title={Hewlett Packard DeskJet 600/800 Series Printers -Software Developer’s PCL Guide},
16+
url={http://lprng.sourceforge.net/DISTRIB/RESOURCES/DOCS/Vcs_pcl.pdf},
17+
year={Wrzesień 1997},
18+
publisher={Hewlett-Packard Company}
19+
}
20+
@misc{csgnetwork,
21+
key={PCL},
22+
title={http://www.csgnetwork.com/hppclhist.html},
23+
url = {http://www.csgnetwork.com/hppclhist.html},
24+
urldate = {2018-12-04}
25+
}

0 commit comments

Comments
 (0)