SPECIALIZAREA: AUTOMATIC Ă SI INFORMATIC Ă APLICAT Ă [610158]
FACULTATEA DE INGINERIE
SPECIALIZAREA: AUTOMATIC Ă SI INFORMATIC Ă APLICAT Ă
Îndrumător științific: Absolvent: [anonimizat] 2014
Sistem de comandă pentru motoare
pas cu pas implementat cu FPGA
2
Cuprins
1 Abrevieri și lista figurilor folosite ………………………….. ………………………….. …………………. 6
1.1 Abrevieri ………………………….. ………………………….. ………………………….. …………………. 6
1.2 Lista figurilor ………………………….. ………………………….. ………………………….. …………… 6
2 Considera ții teoretice ………………………….. ………………………….. ………………………….. ………. 8
2.1 Motorul pas cu pas ………………………….. ………………………….. ………………………….. ……. 8
2.1.1 Aplica ții ale motoarelor pas cu pas ………………………….. ………………………….. ……. 8
2.1.2 Mărimi caracteristice ale motoarelor pas cu pas ………………………….. ……………… 9
2.1.3 Construc ția și func ționarea motoarelor pas cu pas ………………………….. …………. 10
2.1.4 Motoare pas cu pas unipolare și bipolare ………………………….. ……………………… 13
2.2 Placa de dezvoltare Nexys 2 ………………………….. ………………………….. …………………. 14
2.2.1 Prezentare gen erală ………………………….. ………………………….. ……………………….. 14
2.2.2 Dispozitive intrare/iesire ………………………….. ………………………….. ………………… 16
2.3 Limbajul VHDL ………………………….. ………………………….. ………………………….. ……… 20
2.3.1 VHDL – descriere func țională ………………………….. ………………………….. ……….. 20
2.3.2 Structura unui Program ………………………….. ………………………….. ………………….. 21
2.3.3 Tipuri de Date ………………………….. ………………………….. ………………………….. ….. 21
2.3.4 Operatori ………………………….. ………………………….. ………………………….. …………. 22
2.3.5 Constructiile de Control. ………………………….. ………………………….. ……………….. 23
2.3.6 Selec ția – Instruc țiunile if și case. ………………………….. ………………………….. …… 23
2.3.7 Repetiția – Instruc țiunile for, while și repeat. ………………………….. ……………….. 24
2.3.8 Task -uri si Functii ………………………….. ………………………….. …………………………. 25
3 Realizarea proiectului ………………………….. ………………………….. ………………………….. ……. 26
3.1 Motoare pas cu pas ………………………….. ………………………….. ………………………….. …. 26
3.2 Modul de comandă pentru motoare pas cu pas ………………………….. …………………….. 27
3.3 Implementarea prin VHDL ………………………….. ………………………….. …………………… 29
3
4 Prezentarea practic ă ………………………….. ………………………….. ………………………….. ………. 33
5 Contribu ții personale ………………………….. ………………………….. ………………………….. …….. 36
6 Bibliografie ………………………….. ………………………….. ………………………….. ………………….. 37
4
Introducere
Am ales acest proiect deoa rece sunt fascinat de capabilită țile de c ircuite integrate
programabile și am gă sit a fi o provocare pentru mine pent ru a implementa controlul motoare lor
pas c u pas, folosind limbajul VHDL .
Obiectivul lucrării de licen ță este implementarea controlului a unui motor pas cu pas,
bazat p e FPGA, implementat pe placa de dezvoltare Nexys 2, prin limbajul VHDL, sa fac ă ture
complete at âta timp cât este apăsat un buton, viteza motoarelor pas cu pas fiind selectată de
către utilizator pr in intermediul switch -urilor de pe placa de dezvoltare Nexys 2.
Control lerul pe baza de FPGA este descris în limbajul VHDL , și constă î n mai multe
module, care vor controla motorul pas cu pas.
Pentru controlul motoar elor pas cu pas am folosit următ oarele :
Placa de dezvoltare Nexys 2 FPGA;
Un modul pentru controlul motoarelor pas cu pas;
Un motoare pas cu pas.
Softul folosit pentru implementarea circuitului este XilinxISE 10.1.
Design -ul acestui proiect are o abordare modulară și fiecare component ă are o anumit ă
func ție, acesta analizâ nd ideea de a controla diferite motoare pas cu pas. Proiectat pe
componente, acestea pot fi folosite și în alte proiec te, fiind necesare mici modificări în func ție
de cerin țele proiectului.
Proiectul este structurat în cin ci capitole, î n care sunt prezentate aspecte teoretice si
practice, necesare imp lementă rii comenzii motoarelor pas cu pas cu FPGA.
În primul capitol sunt prezentate abrevierile și figurile folosite in ac est proiect, pentru a
face mai u șoară citirea lui.
Capitolul al doilea reprezintă prezentarea considera țiile teoretice . In acest capitol sunt
descrise motoarele pas cu pas, precum și func ționarea și tipurile acestora. Acestea sunt
convertoare electromecanice, care realizează transformarea unor trenuri de i mpulsuri, într -o
mișcare propor țională axului său. Motoarele pas cu pas se pot folosii in aplica ții de mică putere,
unde este necesară o mi șcare precisă, de exemplu: imprimante, mecanisme de orientare pentru
robo ți, unită ți de disc flexibil, etc. Mărimile caracteristice motoarelor pas cu pas sunt: unghiul
de pă șire, frecven ța maximă de start -stop în gol, frecven ța limită de pornire, viteza unghiulară,
puterea la arbore, cuplul de men ținere, etc. Alt subiect studiat în capitolul al doilea, este placa
de dezv oltare, Nexys 2. Circuitul Nexys2 se bazează pe o placa Xilinx spartan 3E FPGA. Placa
5
de dezvoltare Nexys2 poate fi utilizat ă cu un computer/laptop pentru a crea un design cu
adevărat portabil. Ultimul subiect studiat în acest capitol, este limbajul VHDL , acesta este un
limbaj de descriere a hardware -ului, destin at descrierii comportamentului și/sau arh itecturii
unui sistem numeric. Aici sunt prezentate tipurile de date, care pot fi date fizice sau date
abstracte, tipurile de operatori, care pot fi operat ori ar itmetici binari, operatori rela ționali,
operatori logici , etc.
În capitolul al treilea, am prezentat detaliile despre componentele folosite de mine
pentru a realiza acest proiect. Sunt prezentate detalii despre motorul pas cu pas folosit de mine,
despre modulul de comandă realizat pentru a controla motorul pas cu pas cu ajutorul plăcii
Nexys 2, și la urmă este prezentată descrierea codului scris in VHDL.
În capitolul al patrulea sunt prezentate componentele acestui proiect, și anume, placa de
dezvoltare Nexys 2, modul de comandă al motorului pas cu pas și standul fin al.
În capitolul al cincilea am prezentat contribu țiile personale pentru realizarea acestui
proiect.
În ultimul capitol este prezentată bibliografia.
6
1 Abrevieri și lista figurilor folosite
1.1 Abrevieri
FPGA – Field-Programmable Gate Array
MPP – Motor Pas cu Pas
I/O – Intrare/Iesire
A/D – Analog/Digital
D/A – Digital/Analog
1.2 Lista figurilor
Figura 2.1. MPP cu magnet permanent.
Figura 2.2. Funționarea MPP cu magnet permanent.
Figura 2.3. Metode de îmbunătățire a acurateței rotației motorului.
Figura 2.4. Funționarea MPP cu reluctanță variabilă.
Figura 2.5. Privire laterală a motorului hibrid cu rotorul scos.
Figura 2.6. Configura ția bipolară și unipolară ale unui motor pas cu pas.
Figura 2.7. Schema bloc Nexys 2
Figura 2.8. Schema bloc de alimentare a plăcii Nexys 2
Figura 2.9. Dispozitive I/O a placii Nexys 2
Figura 2.10. Display -ul cu sapte segmente a placii Nexys 2
Figura 2.11. Codurile tastelor
Figura 2.12. Datele transmise de mouse
Figura 2.13. Pini VGA
Figura 2.14. Circuitele memoriilor
Figura 2.15. Conectorul Pmod
Figura 2.16. Alocarea PIN -ilor
Figura 3.1. Specifica ții motor
Figura 3.2. Motorul Mitsumi M24SP -7
Figura 3.3. Simularea pa șilor motorului
Figura 3.4. Specifica ții L293
7
Figura 3.5. Schema elec trică a modului de comandă al motorului pas cu pas
Figura 3.6. Diagrama bloc L293
Figura 3.7. Intrările și ieșirile modulului debouncer
Figura 3.8. Intrările și ieșirile modulului main_module
Figura 3.9. Intrările și ieșirile modulului display_7seg
Figura 3.10. Leg ăturile dintre module
Figura 4.1. Prezentarea plăcii de dezvoltare
Figura 4.2. Modulul de comandă al motorului pas cu pas
Figura 4.3. Prezentarea standului final
Figura 8.1. Legăturile modului pentru comanda motorului pas cu pas
8
2 Considera ții teoretice
2.1 Motorul pas cu pas
Motorul pas cu pas (MPP) este un convertor electromecanic care realizează
transformarea unui tren de impulsuri digitale într -o mișcare proporțională a axului său.
Mișcarea rotorului constă din deplasări unghiulare discrete, succesive, de mărimi egale și care
reprezintă pașii motorului . Dacă nu este aplicat nici un tren de comandă, motorul pas cu pas
“memoreaz ă” ultima pozi ție până la primirea unui alt tren de impulsuri.
În general un motor pas cu pas este alcătuit dintr -un magnet montat pe axa de rota ție și
din bobine fixe, situate î mprejurul acestui magnet. Pentru a ob ține o rezolu ție satisfăcatoare
(număr de pasi pentru o rota ție completa suficient de mare), magnetul este multipolar. Rotorul
este compus dintr -un magnet permanent la suprafa ța căruia sunt fixate două coroane danturate
cu câte 50 de dinti, decalate între ele cu o jumătate de dinte. Statorul este constituit din două
bobine (model bipolar) montate sub forma de opt electromagne ți.
Motorul pas cu pas mai prezintă proprietatea de a putea intra în sincronism față de
impulsur ile de comandă chiar din stare de repaus, funcționând fără alunecare iar frânarea se
efectuează, de asemenea, fără ieșirea din sincronism. Datorită acestui fapt se asigură porniri,
opriri si schimbări ale direcției bruște, fără pierderi de pași pe tot dome niul de lucru.
Viteza unui motor pas cu pas poate fi reglată în limite largi prin modificarea frecvenței
impulsurilor de intrare. Astfel, dacă pasul unghiular al motorului este 1,8° numărul de impulsuri
necesare efectuării unei rotații complete este 200, iar pentru un semnal de intrare cu frecvența
de 400 impulsuri pe secundă turația motorului este de 120 rotații pe minut.
Motorul pas cu pas poate lucra pentru frecvențe între 1.000 si 20.000 pași / secundă,
având pași unghiulari cuprinși între 180° si 0, 3°.
2.1.1 Aplica ții ale motoarelor pas cu pas
Aplicațiile motorului pas cu pas sunt limitate la situațiile în care nu se cer puteri mari
(puteri u zuale cuprinse între domeniile microwaților si kilowaților).
Motoarele pas cu pas sunt utilizate în aplicații d e mică putere, caracterizate de mișcări
rapide, precise, repetabile: plotere x -y, unități de disc flexibil, deplasarea capului de imprimare
9
la imprimante, acționa rea mecanismelor de orientare si presiune la roboti, deplasarea axială a
elementelor sistemelo r optice, mese de poziționare 2D , pentru mașinile de găurit etc.
2.1.1.1 Avantajele și dezavantajele folosirii motoarelor pas cu
pas
Avantaje:
– asigură univocitatea conversiei numărului de impulsuri în deplasare și ca urmare pot fi
utilizate în circuit deschis ( buclă deschisă, fără măsurarea și reglarea automată a poziției
unghiulare);
– gamă largă a frecvențelor de comandă;
– precizie de poziționare și rezoluție mare;
– permit porniri, opriri, schimbări ale direcției fără pierderi de pași;
– memorează poziția;
– sunt compatibile cu comanda numerică.
Dezavantaje:
– unghi de pas, deci increment de rotație, de valoare fixă pentru un motor dat;
– viteză de rotație relativ scăzută;
– putere dezvoltată la arbore de valoare redusă;
– randament energetic scăzut;
Unul dintre cele mai importante avantaje a unui motor pas cu pas este capacitatea sa de
a fi controlat cu precizie. Acest tip de control elimină necesitatea de senzor scump și dispozitive
de feedback, cum ar fi codifi catoare optice. Poziția este determinata pur și sim plu prin
impulsurile de intrare .
2.1.2 Mărimi caracteristice ale motoarelor pas cu pas
Unghiul de pas ( Up) este unghiul cu care se deplas ează rotorul la aplicarea unui impuls de
comandă.
10
Frecvența maximă de start -stop în gol este frecvența maximă a impulsurilor de comandă, la
care motorul poate porni, opri sau schimba direcția fără pierderi de pași.
Frecvența limită de pornire reprezintă frecvența maximă a impulsurilor de comandă, cu care
MPP poate porni, fără pierderi de pași, pentru un cuplu rezistent și un mom ent de inerție date.
Cuplul limită de pornire reprezintă cuplul rezistent maxim la arbore, cu care MPP poate porni,
la o frecvență si un moment de inerț ie date, fără pierderi de pași. Caracteristica limită de
pornire definește domeniul cuplu -frecvență de co mandă limită, în care MPP poate poni fără
pierderi de pași.
Frecvența maximă de mers în gol este frecvența maximă a impulsurilor de comandă pe care
o poate urmări motorul, fără pierderea sincronismului.
Frecvența limită de mers reprezintă frecvența maximă cu care poate funcționa un MPP, pentru
un cuplu rezistent și un moment de inerție date.
Cuplul limită de mers reprezintă cuplul rezistent maxim, cu care poate fi încărcat un MPP
pentru un moment de inerție dat și o frecvență de comandă cunoscută.
Caracteri stica de mers definește domeniul cuplu limită de mers – frecvență limită de mers în
care MPP poate funcționa în sincronism, fără pierderi de pasi.
Viteza unghiulară (w) poate fi calculată ca produs dintre unghiul de pas si frecvența de
comandă.
Puterea la arbore este puterea utilă la arborele motorului, corespunzătoare punctului de
funcționare de pe caracteristica de mers, punct caracterizat de cuplul limită de mers și de
frecvența maximă de mers.
Cuplul de menținere este egal cu cuplul rezistent maxim, car e poate fi aplicat la arborele
motorului cu fazele nealimentate, fără ca să provoace rotirea continuă a rotorului.
2.1.3 Construc ția și func ționarea motoarelor pas cu pas
Din punctul de vedere al constru cției circuitului magnetic sunt :
– MPP cu magnet permanent (de tip activ);
– MPP cu reluctanță variabilă (de tip reactiv);
– MPP hibride.
11
2.1.3.1 Motoare pas cu pas cu magnet permanent
Caracteristica MPP este construcția rotorului din magneți permanenți și polii dispuși
radial. Statorul este alcătuit din două sau mai mul te bobine.
Fiecare bobină, deși este o singură entitate, este împărțită în două. În figura 2.1. s-a notat
bobina A cu A și A’, iar bobina B cu B și B’.
Figura 2.1. MPP cu magnet permanent.
Pentru a învârti rotorul se aplică tensiune pe fiecare bobină într -o anumită ordine și cu
o anumită polaritate ca în figura 2.2.
Figura 2.2. Funționarea MPP cu magnet permanent.
Pentru îmbunătățirea rezoluției rotației rotorului sau pentru a scade unghiul pasului se
crește numarul de perechi de poli ai rotorului (Figura 2.3a) sau se adaugă mai multe bobine pe
stator (Figura 2.3b).
a)
12
b)
Figura 2.3. Metode de îmbunătățire a acurateței rotației motorului.
2.1.3.2 Motoare pas cu pas cu reluctanță variabilă
Are atât statorul cât si rotorul prevăzute cu dinți uniform distribuiți, pe dintii statorului
fiind montate înfășurările de comandă. Rotorul este pasiv. Fiecare înfășurare este alimentată
separat pentru a crea o polaritate pe polul corespunzător al statorului. Rotorul se învârte pentru
a minimiza reluctanța fluxului magnetic.
Pentru a învârti rotorul într -o anumită direcție, secvența de alimentare a înfăsurărilor
statorului este invers față de cea folosită la motorul cu magnet permanent. Unghiul pasului este
jumătate față de cel al unui motor cu magnet permanent cu același numar de înfășurări.
În figura 2.4. este alimentată pe rând câte o fază statorică. Rotorul s e va deplasa în pași întregi
iar unghiul de pas va fi de 6 0°.
Figura 2.4. Funționarea MPP cu reluctanță variabilă.
13
2.1.3.3 Motoare pas cu pas hibrid
Acest tip de motor împrumută din caracteristicile motorului cu magnet permanent și ale
motorului cu reluctan ță variabil ă. În cazul unui MPP hibrid, rotorul este constituit dintr -un
magnet permanent, dispus longitudinal, la ale cărui extremități sunt fixate două coroane dințate
din material feromagnetic. Dinții unei coroane constituie polii nord, iar dinții celeilalte coroane,
polii sud. Dinții celor două coroane sunt decalați spațial, astfel încât, dacă un dinte al unei
coroane se găsește în dreptul unui dinte statoric, dintele rotoric de pe cealaltă coroană să se afle
la jumătatea unghi ului dintre do i dinți statorici .
Figura 2.5. Privire laterală a motorului hibrid cu rotorul scos.
2.1.4 Motoare pas cu pas unipolare și bipolare
Motoare cu magnet permanent și cele hibride se împart în două subcategorii:
– unipolare
– bipolare
Aceste două subcategorii sunt determinate de modul în care capetele fiecărei faze sunt
scoase în afara motorului.
În figura 2.6a. este prezentată o configura ție bipolară. Fiecare capăt al unei înfășurări
este scos în afară separat. Acest tip de înfășurare poate produ ce flux de curent în ambele direc ții,
în fun ție de ce tensiune și la ce capăt este aplicată. Acest lucru permite fiecărui pol al statorului
sa fie magnetizat la nord sau sud.
14
Configura ția unipolară (figura 2.6b) permite circularea curentului în jumătate de
înfășurare odat ă. Fiecare înfășurare are un contact central care este scos în afara motorului,
împreună cu firele de la fiecare înfășurare .
a) b)
Figura 2.6. Configura ția bipolară și unipolar ă ale unui motor pas cu pas.
2.2 Placa de dezvoltare Nexys 2
Figura 2.7. Schema bloc Nexys 2
2.2.1 Prezentare generală
Circuitul Nexys2 se bazează pe o placa Xilinx spartan 3E FPGA. Placa Nexys2 po ate fi
utilizata cu un computer/laptop pentru a crea un design cu adevărat portabil.
Nexys2 aduce tehnologii noi care conduc la o platform ă pe care oricine o poate folos i
pentru a obține experiență in programarea digital ă. Placa se poate interconecta cu nenum ărate
alte sisteme digitale, des ene și modele industriale bazate pe FPGA folosind toate cele cinci
expansiuni de conectori. Patru conectori periferici de 12 pini pot găzdui până la opt module
Pmod pentru controlul motoarelor, circuite audio, precum și o gazdă de senzor. Toate semnalele
de pe placa accesibile utilizatorului sunt protejate de scurtcircuit, si asigura un timp de viață de
operare, în orice mediu.
15
Placa Nexys 2 este perfect compatibila cu toate versiunile Xilinx ISE. Acum, oricine
poate construe sisteme digitale real. Placa Nexys 2 se poate alimenta de la un cablu USB, de la
o baterie sau de la un alimentator de 5VDC -15VDC.
La intrare avem un regulator de tensiune ce scoate 3.3V si este suficient pentru toate
elementele necesare de pe placa.
Figura 2.8. Schema bloc de a limentare a placii Nexys 2
Circuitul FPGA de pe placa Nexys2 trebuie să fie configurat (sau programat) de către
utilizator, înainte de a putea îndeplini o anumit ă funcție. În timpul de configurare, un fisier este
transferat în celulele de memorie în FPGA pentru a defini funcțiile logice și inte rconexiunile
din circuit. Kitul gratuit ISE / WebPack CAD de la Xilinx poate fi folosit pentru a crea în
VHDL, Verilog, sau pe bază de schematică ni ște fișiere sursă care să compună programul dorit.
Placa FPGA poat e fi programata în două moduri: direct de pe un PC, folosind portul
USB, sau de la o platformă on -board Flash ROM (Flash ROM este, de asemenea, programabil ă
prin intermediul portului USB) . Un switch de pe placa Nexys2 determină ce sursă (PC sau
ROM) de FPG A va folosi pentru a încărca fisierele de configurare. Placa va încărca în mod
automat o configurație de la Flash ROM în cazul în care Jumper -ul de configurare este setat pe
"Master de serie ". În cazul în care Jumper -ul este setat la "JTAG",placa FPGA va aștepta
programare de la PC (prin intermediul cablului Figura 3.3. Circuitele programabile USB).
După ce placa FPGA este configurat ă, va rămâne așa până când se va reseta d e la
butonul de reset FPGA . Platforma Flash ROM va menține in memorie fișierele p ână când nu se
reprogrameaza.
Placa Nexys2 include un Oscilator de 50MHz. Ceasul semnalelor de la oscilatoare se
conecteaza la ceasu l globale al pinilor de intrare de pe FPGA astfel încât să poată conduce
impreuna la ceasul Sintetizor de blocuri disponi bile în FPGA.
Ceasurile sintetizatoare (numite DLLs) furnizează ceasul de management de
capabilități, care include dublarea sau quadruplarea frecvenței de intrare, împărțirea frecven ței
de intrare, și definirea exactă fază întârziere precum și relațiile dintre diverse semnale de ceas.
16
Placa Nexys2 include mai multe dispozitive pentru introducere de date, dispozitive de
ieșire, și porturile de date, care să permită mai multe desene și modele pentru a fi puse în
aplicare fără a fi nevoie de orice alte componente.
2.2.2 Dispozitive intrare/iesire
Switch -uri și butoane
Patru butoane și opt comutatoare sunt prevăzute ca semnale de intr are. Butoanele si
comutatoarele utilizeaz ă un rezistor în serie pentru protec ția împotriva scurt -circuitelor .
Figura 2.9. Dispozitive I/O a placii Nexys 2
LED -uri
Opt LED -uri sunt furnizate pentru ieșirile circuitului . Al nouălea LED este utilizat
pentru a indica dacă placa noastra este pornita , iar al zecelea LED indică starea de programar e
a placii. Placa Nexys2 conține un display cu șapte segmente cu patru cifre. Fiecare din cele
patru cifre este compus din șapte segmente ar anjate într -un model "cifra 8" , cu un LED
încorporat în fiecare segment. Segmentul de LED -uri pot fi iluminate individual, astfel încât
oricare dintre cele 128 de modele pot fi afișate pe o cifră prin iluminarea anumitor segmente cu
LED -uri lăsându -le pe celelalte stinse. Dintre aceste 128 posibile modele, cele zece
corespunzătoare cifrelor zecim ale, sunt cele mai utile.
Anozii celor șapte LED -uri care formează fiecare cifr ă sunt lega ți împreună într -un
anod comun, dar catozii de la LED -uri rămân separati. Semnalele anozilor comuni pun la
dispozi ție patru cifre de afișare. Catozii de pe toate cele patru cifre sunt conecta ți în circuitul
de șapte noduri etichetate de la CA la CG (deci, de exemplu, cei patru catozi "D" de la cele
17
patru cifre sunt grupati într -un singur nod de circuit numit "CD "). Semnalele acestor șapte catozi
sunt disponibile c a intrări pentr u display -ul de 4 cifre . Acest sistem de conexiune a semnalelor
creează o multiplexare a afișarii.
Figura 2.10. Display -ul cu sapte segmente a placii Nexys 2
Portul USB
Placa Nexys2 include un port USB de mare viteză, bazat pe un controller USB Cypress
CY7C68013A . Portul USB poate fi folosit de Programul Xilinx, pentru a efectua transferuri de
date de până la 38Mbytes/sec, si pentru a alimenta placa.
Tastatura
Placa Nexys2 poate folosi t astatura cu următoarele coduri:
Figura 2.11. Codurile tastelor
18
Mouse
Mouse -ul se deplasează în sistemul de coordonate xOy fapt care g enerează numere
binare la placă ; daca mouse -ul se deplaseaz ă spre dreapta genereaz ă un număr pozitiv, pe axa
X, daca se deplasează la stânga generează un număr negativ. De asemenea, daca se deplasează
în sus generea ză un număr pozitiv, pe axa Y , iar daca se deplasează în jos, genereaz ă un num ăr
negativ.
Figura 2.12. Datele transmise de mouse
VGA Port
Placa Nexys2 folosește 10 semnale de la
FPGA pentru a crea un port VGA cu 8 biți și de
cele două semnale de sincronizare standard ( HS
– Horizontal Sync, și VS – Vertical Sync). Se pot
afișa pe ecranul VGA ata șat plăcii semnale de
opt niveluri de culoare, doua de roșu și verde, și
patru pe albastru (ochiul uman este mai puțin
sensibil la nivelurile de albastru).
Utilizând acest circuit, se pot afi șa 256
de culori diferite, câte una pentru fiecare model
unic de 8 bi ți.
Figura 2.13. Pini VGA
Portul serial
Cele două dispozitive conectate la portul serial, sunt cunoscute sub numele de
echipamente terminale de date (DTE) și echipamente de comunicații de date (DCE). DCE a fost
inițial conceput pentru a fi un modem , dar acum multe dispozitive se conectează la calculator
19
prin DCE . Dispozitivul DTE folosește un conector “tata” DB-9, și un dispozitiv periferic DCE
utilizează un conector “mama” DB-9. Nexys 2 este configurat ca un dispozitiv DCE,
presupunând ca el v -a fi conectat la un dispozitiv DCE , ca un calculator.
Memoria
Placa Nexys2 are dispozitive externe de memorie RAM și ROM. Memoria RAM este
un Mi cron M45W8MW16 de 128Mbit. Memoria ROM este un Intel TE28F128J3D75 -110 de
128Mbit.
Figura 2.14. Circuitele memoriilor
Conectori Periferici
Placa Nexys2 oferă patru conectori Pmod cu două rânduri de 6 pini, care împreună s ă
poată găzdui până la 8 Pmod -uri. Cei patru conectori, au fiecare câte 8 pini ca semnale de date,
doi pini GND, și doi pini ca alimentare .
Toți conecto rii includ rezistențe de protecție la scurtcircuit și diode de protecție ESD.
Fiecare conector poate furniza 3.3V si nu mai mult de 200mA. Pmod -urile pot fi atașate direct,
sau prin utilizarea unui mic cablu. Pmod -urile dis ponibile includ convertoare A/ D și D/A, driver
pentru motoare , amplificatoare difuzoare, dispozitive de măsurare a dista nței, etc.
20
Figura 2.15. Conectorul Pmod
Alocarea PIN -ilor
Pmod JA Pmod JB Pmod JC Pmod JD
JA1-L15 JA5-K13 JB1-M13 JB7-P17 JC1-G15 JC7-H15 JD1-J13 JD7-K14
JA2-K12 JA8-L16 JB2-R18 JB8-R16 JC2-J16 JC8-F14 JD2-M18 JD8-K15
JA3-L17 JA9-M14 JB3-R15 JB9-T18 JC3-G13 JC9-G16 JD3-N18 JD9-J15
JA4-M15 JA10 -M16 JB4-T17 JB10 -U18 JC4-H16 JC10 -J12 JD4-P18 JD10 -J14
Figura 2.16. Alocarea PIN -ilor
2.3 Limbajul VHDL
2.3.1 VHDL – descriere funcțional ă
VHDL reprezintă un limbaj utilizat pentru descrierea sistemelor numerice. Sistemele
numerice pot fi calculatoare, componenete ale acestora sau alte structur i care manipulează
informați a numeric. În cele ce urmează accentul se va pune pe d escrierea sisemelor numerice
la nivelul transferurilor între registre (RTL – Register Transfer Language).
VHDL poate fi utilizat pentru descrierea sistemelor numerice din punct de vedere
comportamental si structural:
21
descrierea comportamentală este legată de modul în care operează sistemul și utilizează
construcții ale limbajelor traditionale de programare, de exemplu if sau atribuiri.
descrierea structurală exprimă modul în care entitățile/componentele logice ce
alcătuiesc sistemul sunt interconec tate în vedeea realizării comportamentului dorit.
2.3.2 Structura unui Program
Limbajul VHDL descrie un sistem numeric ca un set de module . Fiecare dintre aceste
module are o interfa ță cu alte module, pentru a specifica maniera în care sunt interconect ate.
De regul ă, un modul se plaseaz ă într-un fisier, f ără ca aceasta sa fie o cerin ță obligatorie.
Modulele opereaza concurent. Modulele reprezint ă părți hardware, care pot fi de la simple por ți
până la sisteme complete ex., un microprocesor. Modulele pot fi specificate, fie
comportamental, fie structural (sau o combina ție a celor dou ă).
2.3.3 Tipuri de Date
2.3.3.1 Tipuri de Date Fizice.
Întruc ât scopul limbajului VHDL este acela de a modela hardware -ul numeric, tipurile
primare de date vor fi destinate model ării registrelor (reg) și firelor (wire).
Variabilele reg stocheaz ă ultima valoare, care le -a fost atribuit ă procedural. Variabilele
wire reprezint ă conexiuni fizice între entit ăți structurale cum ar fi por țile. Obiectele reg și
wire, care reprezint ă date, pot lua urm ătoarele valori: 0 valoarea logic ă zero sau fals, 1 logic
sau adevarat, x valoare logic ă necunoscut ă, z impedan ța ridicat ă a unei por ți “tristate”.
La începutul simul ării variabilele reg sunt ini țializate la valoarea x. Oricare variabil ă
wire neconectat ă la ceva are valoarea x.
2.3.3.2 Tipuri de Date Abstracte.
Într-un model de hardware, pe l ângă variabilele, care modeleaz ă hardware -ul, se g ăsesc
și alte tipuri de variabile. De exemplu, proiectantul dore ște să foloseasc ă o varia bilă integer,
pentru a contoriza num ărul de apari ții ale unui eveniment. Pentru comoditatea proiectantului,
22
VHDL HDL posed ă mai multe tipuri de date c ărora nu le corespund realiz ări hardware. Aceste
tipuri de date includ integer, real și time.
Tipurile de date integer și real se compor tă ca și in alte limbaje, de exemplu C. Trebuie
sublinia t faptul c ă variabila reg este fara semn, în timp ce variabila integer reprezint ă un întreg
de 32 de bi ți cu semn. Acest fapt are o mare importan ță la scădere.
2.3.4 Operatori
2.3.4.1 Operatori Aritmetici binari.
Operatorii aritmetici binari opereaz ă cu doi operanzi.
Operanzii de tip reg si net sunt trata ți ca f ără semn. Operanzii de tip real și integer pot
avea semn.
2.3.4.2 Operator Nume Comentarii
+ Adunare
– Scădere
Înmultire / Împărțire Împărțirea cu zero furnizeaz ă un x, necunoscut
% Modul
2.3.4.3 Operatori Rela ționali.
Operatorii rela ționali compară doi operanzi și întorc o valoare logic ă, adica TRUE (1)
sau FALSE (0). Dac ă un bit oarecare este necunoscut, rela ția este ambigu ă și rezultatul este
necunoscut.
> Mai mare dec ât
>= Mai mare dec ât sau egal
< Mai mic dec ât
<= Mai mic dec ât sau egal
== Egalitate logic ă
!= Inegalitate logic ă
23
2.3.4.4 Operatori Logici
Operatorii logici opereaz ă cu operanzi logici și întorc o valoare logic ă, adic ă TRUE (1)
sau FALSE (0). Sunt utiliza ți în instruc țiunile if și while. A nu se confunda cu operatorii logici
Booleeni la nivel de bit. De exemplu, ! este un NOT logic, iar ~ este NOT la nivel de bit. Primul
neaga, ex., !(5 == 6) este TRUE. Al doilea complementeaz ă biții, de exemplu: ~{1,0,1,1} este
0100.
2.3.4.5 Operatori la nivel de bit.
Operatorii la nivel de bit ac ționeaz ă pe bi ții operandului sau operanzilor. De exemplu,
rezultatul lui A & B este AND pentru bi ții corespunz ători din A și B.
2.3.5 Constructiile de Control.
VHDL posed ă o bogat ă colec ție de instruc țiuni de control, care pot fi utilizate în
secțiunile procedurale de cod, adic ț în cadrul blocurilor ini țial și always. Cele ma i multe sunt
familiare programatorului, care cunoa ște limbajele tradi ționale de programare, cum ar fi
limbajul C.
Principala diferen ță const ă în aceea c ă in locul parantezelor { }, din limbajul C, VHDL
utilizeaza begin si end. În VHDL , parantezele { } sunt utilizate pentru concatenarea șirurilor de
biți. Deoarece cei mai multi utilizatori sunt familiariza ți cu limbajul C, urm ătoarele subsec țiuni
vor con ține numai c âte un exemplu din fiecare construc ție.
2.3.6 Selecția – Instrucțiunile if și case.
Instruc țiunea if este usor de utilizat:
if (A==4)
begin
B = 2;
end
24
else
begin
B = 4;
end
case (<expression>)
<value1>: <instructiune>
<value2>: <instructiune>
default: <instructiune>
endcase
2.3.7 Repetiția – Instrucțiunile for, while și repeat.
Instruc țiunea for este foarte apropiat ă de instruc țiunea for din C, cu excep ția ca
operatorii ++ și – nu sunt prezen ți in VHDL . De aceea, se va folosi i = i + 1.
for(i = 0; i < 10; i = i + 1)
begin
$display("i= %0d" , i);
end
Instruc țiunea while opereaz ă in forma normal ă:
i = 0;
while(i < 10)
begin
$display("i= %0d", i);
i = i + 1;
end
Instructiunea repeat repet ă următorul bloc de un num ăr fixat de 5 ori, in exemplul
următor:
– de 5 ori:
repeat (5)
begin
$display("i= %0d", i);
i = i + 1;
end
25
2.3.8 Task -uri si Functii
Task -urile sunt asem ănătoare procedurilor din alte limbaje de programare, de exemplu,
task-urile pot avea zero sau mai multe argumente și nu întorc o valoare. Func țiile se comport ă
ca subrutinele din alte limbaje de programare.
Excep ție:
O func ție VHDL trebuie s ă se execute într-o unitate de timp simulat. Nu vor exista
instruc țiuni de control al timpului: comanda întârzierii (#), comanda de eveniment (@) sau
instruc țiunea wait. Un task poate con ține instruc țiuni controlate de timp. Este important ca
blocul always să conțină cel puțin o instrucțiune cu întârziere sau controlată de un eveniment,
în caz contrar blocul se va repeta la timpul zero, blocând simulare a.
Scopul unei funcții este acela de a returna o valoare, care urmeaz ă să fie folosit ă într-o
expresie.
26
3 Realizarea proiectului
3.1 Motoare pas cu pas
Pentru acest proiect am folosit urm ătorul motor :
Mitsumi M24SP -7
Caracteristici:
Cuplu ridicat de ie șire;
Unghi de p ășire: 7,5 °.
Specifica ții:
Tensiune nominal ă DC 12V DC 24V
Tensiune de lucru DC 10.8~13.2V DC 21.6~26.4V
Curent nominal/faz ă 259mA 173mA
Num ăr faze 4 faze 4 faze
Rezisten ță bobin ă DC 50Ω/phase±7% 150Ω/phase±7%
Unghi de pășire 7.5°/step 7.5°/step
Clasa de izola ție Class E insulation Class E insulation
Figura 3.1. Specifica ții motor
Figura 3.2. Motorul Mitsumi M24SP -7
27
Figura 3.3. Simularea pa șilor motorului
3.2 Modul de comand ă pentru motoare pas cu pas
Pentru comandarea motoarelor pas cu pas, am realizat un modul care se conecteaz ă la
placa Nexys 2. Acestea au fost realizate pe calculator, prin intermediul softului specializat
ARES. Pentru controlul motorului pas cu pas, am realizat modulul ce urmeaz ă a fi conectat la
placa de dezvoltare Nexys 2, cu un driver specializat pentru motoare pas cu pas L293. Modul
de comanda este izolat galvanic și pentru protec ția plăcii Nexys 2, am folosit două
optocuploare.
Simbol Parametrii Valoare Unitate de măsură
𝑉𝑆 Tensiune de alimentare 36 V
𝑉𝑖 Tensiune de intrare 7 V
𝑉𝑒𝑛 Tensiune de activare 7 V
𝐼𝑜 Curent de ie șire 1.2 A
𝑃𝑡𝑜𝑡 Puterea disipată 4 W
𝑇𝑠𝑡𝑔,𝑇𝑗 Temperatura de depozitare Între -40 si 150 °C
Figura 3. 4. Specifica ții L293
28
Figura 3. 5. Schema electrică a modului de comandă al motorului pas cu pas
29
Figura 3. 6. Diagrama bloc L293
3.3 Implementarea prin VHDL
Implementarea prin VHDL am realizat -o cu trei module.
Debouncer care are rolul de a rotii motorul at âta timp cat unul dintre cele doua butoane
setate pentru a controla dire cția motorului sunt apăsate. Ca intrări are un clock care este un
semnal al ceasului intern al plăcii, semnal care contorizează permanent fiecare mi șcare realizată
de program; a doua intrare a modului este cea pentru butoane, de patru bi ți, iar ultimul semnal
este de opt bi ți, pentru switch -uri. Ca ie șiri sunt setate două ie șiri, una pentru butoane de patru
biți, iar al doilea semnal este de opt bi ți, pentru switch -uri.
Al doilea modul, main_m odule , are rolul de seta viteza prin intermediul celor opt
switch -uri de pe placa de dezvoltare Nexys 2, și direc ția motorului. Acest modul are trei intrări,
un clock care este un semnal al ceasului intern al plăcii, semnal care contorizează permanent
fiecare mi șcare realizată de program, a doua intrare a modului este cea pentru butoane, de patru
biți, iar ultimul semnal este de opt bi ți, pentru switch -uri.
Ultimul modul folosit se nume ște display_7seg care afi șează, pe cele patru display -uri
de pe placa de dezvoltare, viteza setată de utilizator prin intermediul switch -urilor. Are două
30
intrări și patru ie șiri. Cele două intrări sunt : clk cu rolul pe care il știm de mai sus, și data_in
care prime ște datele și le afi șează pe display.
Figura 3. 7. Intrările și ieșirile modulului debouncer
Figura 3. 8. Intrările și ieșirile modulului main_module
31
Figura 3. 9. Intrările și ieșirile modulului display_7seg
32
Figura 3.10. Leg ăturile dintre module
33
4 Prezentarea practic ă
În figura 4.1. este prezentată placa de dezvoltare Nexys 2, împreună cu func țiile de
selectare a vitezei, a direc ției și verificarea pe display -ul plăcii dacă viteza corespunde cu
numărul in binar introdus prin intermediul switch -ului.
Figura 4.1. Prezentarea plăcii de dezvoltare
Switch -uri pentru selectarea Butoane pentru selectarea Display -ul plăcii
vitezei motorului pas cu pas direc ției
34
În figura următoare este prezentat modulul de comandă al motorului pas cu pas.
Figura 4.2. Modulul de comandă al motorului pas cu pas
Optocuploarele împreuna cu Bornele de alimentare Driverul L293 pentru
izolarea galvanică a modulului ale plăcii comanda motoarelor
35
Figura 4.3. Prezentarea standului final
36
5 Contribuții personale
În acest proiect am studiat motoarele pas cu pas, precum și aplica țiile unde se pot folosii
aceste motoare, pe lânga aceasta, am studiat construc ția si func ționarea lor , mărimile
caracteristice, tipurile acestora, precum și modurile de comandă ale motoarelor pas cu pas , și
modul în care se po ate implementa controlul acestora, pe placa de dezvoltare Nexys 2 prin
intermediul unui limbaj de dezvoltare , eu preferând limbajul VHDL.
Implementarea prin VHDL am realizat -o cu ajutorul a trei module, fiecare având un rol
important in realizarea proiectului, cum ar fi, afi șarea corespun zătoare vitezei pe cele patru
afișaje digitale ale plăcii de dezvoltare Nexys 2, setarea vitezei motorului prin intermediul celor
8 switch -uri, precum și definirea butoanelor de pe placă, pentru alegerea direc ției motorului.
Am realizat de asemenea și modulul de comandă al motoarelor pas cu pas care se
conecteaza la placa de dezvoltare Nexys 2, cu ajutorul programului ARES, modulul fiind izolat
galvanic, pentru a preve nii distrugerea echipamentelor, i zolarea galvanică având rolul de a izola
electric și fizică a sec țiunilor din sistemele electrice. Acesta are și un driver specializat pentru
controlul motoarelor pas cu pas, și anume L293 . Conexiunea modului cu placa de dezvoltare,
am realizat -o prin intermediul unui Pmod de pe placa, iar alimentarea modului se realizeaza
extern, de la o sursa de curent, de 9V.
37
6 Bibliografie
1. Cadence Design Systems, Inc., Verilog -XL Reference Manual.
2. Open Verilog International (OVI), Verilog HDL Language Reference Manual (LRM)
3. Peter J . Ashenden – The Student’s Guide to VHDL. 1998
4. John F. Wakerly: Circuite digitale – principiile și practicile folosite in proiectare,
Editura Teora, Bucu rești 2002
5. Xilinx – The Programmable Logic Data Book, 1998
6. Gheorghe Toac șe, Dan Nicula – Digital Integrated Circuits, Hardware Description
Language – VHDL
7. http://www.atelierulelectric.ro/articole/Actionarea%20motoarelor%20pas%20cu%20p
as.pdf
8. http://en.wikipedia.org/wiki/V hdl
9. http://www.digilentinc.com/
38
Anex a 1
Debouncer.vhd
library ieee;
use ieee.std_logic_1164.all;
entity debouncer is
port
(
clk_in : in std_logic;
btns_in : in std_logic_vector (3 downto 0);
sw_in : in std_logic_vector (7 downto 0);
btns_out : out std_logic_vector (3 downto 0);
sw_out : out std_logic_vector (7 downto 0)
);
end debouncer;
architecture behavioral of debouncer is
constant max_count : integer range 0 to 4095 := 4095;
signal btns_state : std_logic_vector (3 downto 0) := "0000";
signal sw_state : std_logic_vector (7 downto 0) := "00000000";
signal sw_out7, sw_out6, sw_out5, sw_out4, sw_ out3, sw_out2, sw_out1, sw_out0,
btn_out3, btn_out2, btn_out1, btn_out0 : std_logic := '0';
begin
btns_state <= btns_in;
sw_state <= sw_in;
btns_out <= btn_out3 & btn_out2 & btn_out1 & btn_out0;
sw_out <= sw_out7 & sw_out6 & sw_out5 & sw_out4 & sw_ou t3 & sw_out2 &
sw_out1 & sw_out0;
debounce3 : process (clk_in) is
39
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (btns_state(3) = '1') then
if (count = max_count) then
btn_out3 <= '1';
else
btn_out3 <= '0';
count := count + 1;
end if;
else
count := 0;
btn_out3 <= '0';
end if;
end if;
end process debounce3;
debounce2 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (btns_state(2) = '1') then
if (count = max_count) then
btn_out2 <= '1';
else
btn_out2 <= '0';
count := count + 1;
end if;
else
count := 0;
btn_out2 <= '0';
end if;
end if;
end pr ocess debounce2;
40
debounce1 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (btns_state(1) = '1') then
if (count = max_count) then
btn_out1 <= '1';
else
btn_out1 <= '0';
count := count + 1;
end if;
else
count := 0;
btn_out1 <= '0';
end if;
end if;
end process debounce1;
debounce0 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (btns_state(0) = '1') then
if (count = max_count) then
btn_out0 <= '1';
else
btn_out0 <= '0';
count := count + 1;
end if;
else
count := 0;
btn_out0 <= '0';
end if;
41
end if;
end process debounce0;
debouncer7 : p rocess (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (sw_state(7) = '1') then
if (count = max_count) then
sw_out7 <= '1';
else
sw_out7 <= '0';
count := count + 1;
end if;
else
count := 0;
sw_out7 <= '0';
end if;
end if;
end process debouncer7;
debouncer6 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (sw_state(6) = '1') then
if (count = max_count) then
sw_out6 <= '1';
else
sw_out6 <= '0';
count := count + 1;
end if;
else
count := 0;
42
sw_out6 <= '0';
end if;
end if;
end process debouncer6;
debouncer5 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (sw_state(5) = '1') then
if (count = max_count) then
sw_out5 <= '1';
else
sw_out5 <= '0';
count := count + 1;
end if;
else
count := 0;
sw_out5 <= '0';
end if;
end if;
end process debouncer5;
debouncer4 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (sw_state(4) = '1') then
if (count = max_count) then
sw_out4 <= '1';
else
sw_out4 <= '0';
count := count + 1;
end if;
43
else
count := 0;
sw_out4 <= '0';
end if;
end if;
end process debouncer4;
debouncer3 : process (clk_in) is
variable count : integer range 0 to max_count ;
begin
if (rising_edge(clk_in)) then
if (sw_state(3) = '1') then
if (count = max_count) then
sw_out3 <= '1';
else
sw_out3 <= '0';
count := count + 1;
end if;
else
count := 0;
sw_out3 <= '0';
end if;
end if;
end process debouncer3;
debouncer2 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (sw_state(2) = '1') then
if (count = max_count) then
sw_out2 <= '1';
else
sw_out2 <= '0';
44
count := count + 1;
end if;
else
count := 0;
sw_out2 <= '0';
end if;
end if;
end process debouncer2;
debouncer1 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) th en
if (sw_state(1) = '1') then
if (count = max_count) then
sw_out1 <= '1';
else
sw_out1 <= '0';
count := count + 1;
end if;
else
count := 0;
sw_out1 <= '0';
end if;
end if;
end process debouncer1;
debouncer0 : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (sw_state(0) = '1') then
if (count = max_count) then
sw_out0 <= '1';
45
else
sw_out0 <= '0';
count := count + 1;
end if;
else
count := 0;
sw_out0 <= '0';
end if;
end if;
end process debouncer0;
end behavioral;
Main_module.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity main_module is
port
(
clk_in : in std_logic;
btns_in : in std_logic_vector (3 downto 0);
sw_in : in std_logic_vector (7 downto 0);
displ_out : out std_logic_vector (7 downto 0);
ctrl_out : out std_logic_vector (3 downto 0)
);
end main_module;
architecture behavioral of mai n_module is
signal speed : integer range 0 to 255 := 0;
signal clk2, clk3 : std_logic := '0';
46
signal ctrl : std_logic_vector (3 downto 0) := "0000";
signal dir : std_logic_vector (1 downto 0) := "00";
begin
ctrl_out <= ctrl;
displ_out <= sw_in;
speed <= to_integer(unsigned(sw_in));
clk_div1 : process (clk_in)
variable count : integer range 0 to 195312;
begin
if (rising_edge(clk_in)) then
if (count = 195312) then
clk2 <= '1';
count := 0;
else
clk2 <= '0';
count := count + 1;
end if;
end if;
end process clk_div1;
clk_div2 : process (clk2)
variable count : integer range 0 to 256;
begin
if (rising_edge(clk2)) then
if (count > 255 – speed) then
clk3 <= '1';
count := 0;
else
clk3 <= '0 ';
count := count + 1;
end if;
end if;
47
end process clk_div2;
fsm : process (clk_in)
begin
if (rising_edge(clk_in)) then
case (btns_in) is
when "1000" =>
dir <= "10";
when "0100" =>
dir <= "01";
when "0010" =>
when "0001" =>
when others =>
dir <= "00";
end case;
end if;
end process fsm;
sequencer : process (clk3)
begin
if (rising_edge(clk3)) then
case dir is
when "10" =>
case ctrl is
when "1000" => ctrl <= "0001";
when "0100" => ctrl <= "1000";
when "0010" => ctrl <= "0100";
when "0001" => ctrl <= "0010";
when others => ctrl <= "1000";
end case;
when "01" =>
case ctrl is
when "1000" => ctrl <= "0100";
when "0100" => ctrl < = "0010";
48
when "0010" => ctrl <= "0001";
when "0001" => ctrl <= "1000";
when others => ctrl <= "1000";
end case;
when "00" =>
ctrl <= "0000";
when others =>
end case;
end if;
end process sequencer;
end behavioral;
Display_7seg.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity display_7seg is
port
(
clk_in : in std_logic;
data_in : in std_logic_vector (7 downto 0);
an_out : out std_logic_vector (3 downto 0);
seg_out : ou t std_logic_vector (6 downto 0);
leds_out : out std_logic_vector (7 downto 0);
dp_out : out std_logic
);
end display_7seg;
architecture behavioral of display_7seg is
constant max_count : integer range 0 to 100000 := 100000;
49
signal clk2 : std_logic := '0';
signal anode : std_logic_vector (3 downto 0) := "1111";
signal segm : std_logic_vector (6 downto 0) := "1111111";
signal steps : integer range 0 to 3 := 0;
signal digit3, digit2, digit1, digit0 : integer range 0 to 15 := 0;
signal data1 : integer range 0 to 255 := 0;
begin
an_out <= anode;
seg_out <= segm;
dp_out <= '1';
leds_out <= data_in;
data1 <= to_integer(unsigned(data_in));
clk_div : process (clk_in) is
variable count : integer range 0 to max_count;
begin
if (rising_edge(clk_in)) then
if (count = max_count) then
clk2 <= '1';
count := 0;
else
clk2 <= '0';
count := count + 1;
end if;
end if;
end process clk_div;
converter : process (clk_in) is
variable count, data2 : integer range 0 to 255;
variable d3, d2, d1, d0 : integer range 0 to 15;
begin
if (rising_edge(clk_in)) then
if (data2 /= data1) then
50
data2 := data1;
count := 0;
d3 := 0;
d2 := 0;
d1 := 0;
d0 := 0;
else
if (count /= data2) then
count := count + 1;
d0 := d0 + 1;
if (d0 = 10) then
d1 := d1 + 1;
d0 := 0;
end if;
if (d1 = 10) then
d2 := d2 +1;
d1 := 0;
d0 := 0;
end if;
if (d2 = 10) then
d3 := d3 + 1;
d2 := 0;
d1 := 0;
d0 := 0;
end if;
if (d3 = 10) then
d3 := 10;
d2 := 10;
d1 := 10;
d0 := 10;
end if;
else
digit3 <= d3;
digit2 <= d2;
51
digit1 <= d1;
digit0 <= d0;
end if;
end if;
end if;
end process converter;
sequencer : process (clk2) is
variable digit_data : integer range 0 to 15 := 0;
begin
if (rising_edge(clk2)) then
case steps is
when 3 =>
anode <= "0111";
digit_ data := digit3;
steps <= 2;
when 2 =>
anode <= "1011";
digit_data := digit2;
steps <= 1;
when 1 =>
anode <= "1101";
digit_data := digit1;
steps <= 0;
when 0 =>
anode <= "1110";
digit_data := digit0;
steps <= 3;
when others =>
anode <= "1111";
digit_data := 0;
steps <= 3;
52
end case;
case digit_data is
when 0 => segm <= "1000000";
when 1 => segm <= "1111001";
when 2 => segm <= "0100100";
when 3 => segm <= "01 10000";
when 4 => segm <= "0011001";
when 5 => segm <= "0010010";
when 6 => segm <= "0000010";
when 7 => segm <= "1111000";
when 8 => segm <= "0000000";
when 9 => segm <= "0010000";
when others => segm <= "0111111";
end case;
end if;
end process sequencer;
end behavioral;
53
Anexa 2
Figura 8.1. Legăturile modului pentru comanda motorului pas cu pas
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: SPECIALIZAREA: AUTOMATIC Ă SI INFORMATIC Ă APLICAT Ă [610158] (ID: 610158)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
