Sunteți pe pagina 1din 11

Controllerul mppctrl pentru mpp

Controllerul de baza al motorului pas cu pas are trei intrari de cate un bit si o intrare de 8
biti:
- Semnalul de intrare clk este semnalul ceasului intern al placii, semnal care contorizeaza
permanent fiecare miscare realizata de program;
- Semnalul numit dir este semnalul care arata directia in care se efectueaza rotatia
motorului (inainte sau inapoi). Acest semnal este primit prin intermediul unui switch
atasat placii Nexys, si cand utilizatorul doreste sa inverseze sensul motoarelor de
pozitionare, v-a comuta acest switch;
- Semnalul numit pas este un semnal de start pentru rularea modulului mppctrl;
- In final, semnalul pasim de 8 biti arata cati pasi trebuie sa efectueze acel motor, si
aceasta informatie se preia din modul radacina numit mot; aceasta este informatia care
arata exact pozitia aleasa de utilizator.

Acest modul mai are si o iesire de 4 biti numita per, care este tocmai semnalul care
determina pasii motoarelor.
Alt semnal de iesire al acestui modul este cel numit donep, el primeste valoarea 1 atunci
cand numarul complet de pasi a fost efectuat.
Ultimul semnal de iesire al modului este adr, pe 6 biti, el fiind folosit pentru a specifica
adresa de unde trebuie citita urmatoarea informatie din modulul ce contine coordonatele; dupa ce
este efectuata o pozitionare a carei informatie este scrisa la adresa x, variabila adr se incrementeaza
cu 1, astfel incat urmatoarea informatie despre urmatoarea pozitie se v-a citii de la urmatoarea
adresa. Fiecare informative a coordonatelor este pusa in variabila pasim de 8 biti.

Modulul divizor

Este un modul simplu care are o intrare de un bit clk, si o iesire de un bit clkd. Intrarea clk
este ceasul intern al placii Nexys 2, care are o frecventa foarte mare, iar clkd este un semnal de
ceas modificat, ce are o frecventa mult mai mica, si care v-a fi folosit propriu-zis la generarea
pasilor motoarelor pas cu pas. Clkd v-a avea o frecventa de doi pasi pe secunda, adica exact atata
cat ne dorim noi pentru mpp.

Modulul mpppasi

Acest modul este un modul radacina, care include cele doua module realizate pana acuma,
mppctrl si divizor. Acest modul are functia de a face ca aceste doua module sa lucreze impreuna.
Variabilele de intrare sunt:
- Pasi, de 8 biti, care preia de la un modul situate mai sus ierarhic, informatia despre
numarul de pasi pe care trebuie sa ii transmita modulului mppctrl prin variabila interna
a aceluia, numita pasim;
- Dir este semnalul ce se transmite modulului mppctrl in variabila dir;
- Start este de asemenea transmisa modulului mppctrl in variabila pas a acestuia;
- Clk este ceasul placii Nexys, si se transmite modulului divizor, care o transforma in
variabila clkd, cu o frecventa mult mai mica, iar variabila clkd se v-a transmite
modulului mppctrl prin intermediul variabilei interne clk.

Variabilele de iesire sunt:
- Adr, de 6 biti, care preia de la modulul mppctrl adresa informatiei si o transmite mai
departe la modulul mot din care modulul mpppasi face parte;
- Per este variabila ce preia pasii motorului de la modulul mppctrl din variabila cu acelasi
nume;
- Clkdi este variabila care preia valoarea variabilei clkd din modulul divisor;
- Donep este variabila ce preia informatia sfarsitului efectuarii unei anumite gauri
preluata de la modulul mppctrl (ea devine 1 cand s-a terminat de pozitionat motorul, si
apoi imediat ea devina 0).

Modulul mot

Variabilele de intrare clk, dir, si start, care au exact aceeasi functionalitate ca si cele de mai
sus, cu acelasi nume, numai ca de data asta indeplinesc aceeasi functie in cadrul modulului mot.
La fel si variabilele de iesire per, pasi, si clkdi, indeplinesc aceleasi functii ca si cele de mai
sus. Semnalul done este acelasi cu donep de la modulul mppctrl, insa donex este un semnal ce
indica terminarea tuturor pozitionarilor.
Acest modul, mot, include si informatiile despre coordonatele fiecarei pozitionar, si dupa
ce le citeste succesiv, le transmite modulului mppctrl. La randul lui, modulul mppctrl, dupa ce a
terminat de efectuat pozitionarea pentru o anumita gaura, ii transmite modulului mot urmatoarea
adresa de unde el trebuie sa citeasca informatia urmatoarei pozitionari.
Se observa ca instructiunea case indica citirea unei informatii despre coordonatele gaurilor
in variabila pasim pe 8 biti; acest lucru se face in functie de adresa indicata prin variabila adr.
Acest modul mot este pentru controlul unui singur motor pas cu pas, deci, v-a fi necesar sa
folosesc doua astfel de module deoarece este nevoie sa comand doua motoare pas cu pas, cate unul
pentru fiecare axa de coordonate.

Modulul ins

Acest modul are rolul de a grupa imperuna toate modulele care folosesc la controlul
motoarelor pas cu pas. La controlul motoarelor pas cu pas folosesc doua module de tip mot. Fiecare
modul mot controleaza cate unul din cele doua motoare pas cu pas, pentru coordonarea pe axele
XOY.
Ca semnale de intrare avem:
- clk si dir cu rolurile pe care deja le cunoastem;
- start este semnalul de pornire al motoarelor pas cu pas.
Semnalele de iesire sunt:
- per1 si per, corespunzatoare celor doua motoare pas cu pas; aceste semnale sunt de 4
biti fiecare si constituie pasii fiecarui motor.


Mppctrl.v

module mppctrl(
input clk,
input dir,
input pas,
input [7:0] pasim,
output [3:0] per,
output [5:0] adr,
output donep
);

// definirea starilor:
parameter s0=4'b0001;
parameter s1=4'b0010;
parameter s2=4'b0100;
parameter s3=4'b1000;

reg [3:0] stare;
reg [7:0] pasi;
reg g;
reg [5:0] ad=6'b000000;

always @(posedge clk) begin

if ( pas) begin
pasi<=pasim;
g<=1;
end
if (g) begin

pasi<=pasi-1;

case (stare)

s0: begin
if (pasi>8'b0)
if (dir) stare=s1;
else stare=s3;
else begin
g<=0;
ad<=ad+1;
end
end

s1: begin
if (pasi>8'b0)
if (dir) stare=s2;
else stare=s0;
else begin
g<=0;
ad<=ad+1;
end
end

s2: begin
if (pasi>8'b0)
if (dir) stare=s3;
else stare=s1;
else begin
g<=0;
ad<=ad+1;
end
end

s3: begin
if (pasi>8'b0)
if (dir) stare=s0;
else stare=s2;
else begin
g<=0;
ad<=ad+1;
end
end

default: stare=s0;
endcase
end
end

assign per=stare;
assign adr=ad;
assign donep=!g;

endmodule

Divizor.v

module divizor(
input clk,
output clkd ) ;

reg [21:0] i=22'b0;
reg clkdiv=1;

always @( posedge clk ) begin
i<=i+1;
if (i<=22'b0111111111111111111111)
clkdiv<=1;
if (i>22'b0111111111111111111111)
clkdiv<=0;
if (i==22'b1111111111111111111111)
i<=22'b000000000000000000000;

end

assign clkd=clkdiv;

endmodule

Mpppasi.v

module mpppasi(input clk,
input dir,
input start,
output [3:0] per,
input [7:0] pasi,
output clkdi,
output [5:0] adr,
output donep
);

wire donep1;
reg donep11;
reg [1:0] f=2'b00;

divizor div1 ( .clk(clk),
.clkd(clkdi) );

mppctrl mp0 ( .clk(clkdi),
.dir(dir),
.pas(start),
.per(per),
.pasim(pasi),
.adr(adr),
.donep(donep1) );

always @ ( posedge donep1 ) begin
donep11<=donep1;
f<=f+1;
if (f==2'b11) begin
donep11<=0;
f<=2'b00;
end
end

assign donep=donep11;
endmodule

Mot.v

module mot1(input clk,
input dir,
input start,
output [3:0] per,
output clkdi,
output [7:0] pasi,
output done,
output reg [3:0] stare,
output donex
);

reg [7:0] pasim;
parameter s1=4'b0001;
parameter s2=4'b0010;
parameter s3=4'b0100;
parameter s4=4'b1000;
wire [5:0] adr;
reg [5:0] a=6'b000000;
reg st=0;

always @(posedge clk) begin
if (adr>a) begin
st<=0;
a<=adr;
end

if (start) st<=1;
case (adr)
6'b000001: begin
pasim<=8'b00000111;
stare<=s1;
end

6'b000010: begin
pasim<=8'b00001111;
stare<=s2;
end

6'b000011: begin
pasim<=8'b00001001;
stare<=s3;
end

6'b000100: begin
pasim<=8'b00011111;
stare<=s4;
end

6'b000101: begin
pasim<=8'b00011011;
stare<=s1;
end

6'b000110: begin
pasim<=8'b0011111;
stare<=s2;
end

6'b000111: begin
pasim<=8'b00011111;
stare<=s3;
end

6'b001000: begin
pasim<=8'b00111111;
stare<=s4;
end
endcase

end

mpppasi mpppasi1 ( .clk(clk),
.start(st),
.dir(dir),
.per(per),
.pasi(pasim),
.clkdi(clkdi),
.adr(adr),
.donep(donex) );

assign pasi=pasim;
assign done=adr[3];

endmodule

S-ar putea să vă placă și