Anexo 3. Software usado para la caracterización de los motores
1. lectura de datos para la prueba estática
program leedatos.pas;
uses crt;
{$I c:\ernest\pascal\analog\analog.bib}
const
digioutaddrlow : word =$220+13; digioutaddrhigh: word =$220+14;
var
lastk,k,kk,j,l,ll,jj : integer; portlow : word;
porthigh : word; nom_fitxer: string; nom_aux : string; fitx : text; aa,bb,f : real; size : word; espai : longint; lect : word;
procedure inicialize; begin clrscr; {port[digioutaddrlow]:=0; portlow:=0; port[digioutaddrhigh]:=0; porthigh:=0;} end; begin clrscr; inicialize;
writeln('escriu el nom del fitxer sense extensi¢.');
writeln(' Es genera un fitxer extensi¢ . dat a c:\pepe'); readln(nom_fitxer); nom_aux:= 'c:\pepe\'+nom_fitxer+'.dat'; assign(fitx,nom_aux); rewrite(fitx); nosound; kk:=0; repeat kk:=kk+1; aa:=leevolt(0,100); bb:=leevolt(1,100); writeln(aa,' ',bb); writeln(fitx,aa,' ',bb); delay(100);
gotoxy(10,10);
until keypressed; close(fitx); end.
2
. programa para la excitación de la etapa de potencia y lectura del
par , la posición i la velocidad del motor en la prueba dinàmica
program trifasic.pas;
uses crt, dos;
{$I c:\ernest\pascal\analog\analog.bib}
type
binari = string;
const
digioutaddrlow : word =$220+13; digioutaddrhigh: word =$220+14; modecountaddr : word =$220+3 ; countreadaddr : word =$220 ;
var
ona, estat : array[1..12] of byte; pas : byte;
wait : word; a : real;
function pasabin(numero:byte):binari; var
j : byte; pasabi:binari;
begin
pasabi:='';
for j:=1 to 8 do begin
pasabi:=pasabi+char(48+numero mod 2); numero:=numero div 2;
end; pasabin:=pasabi; end; procedure inicialize; var j:byte;
ona1,ona2,ona3 : byte;
begin clrscr;
for j :=1 to 3 do ona[j]:=0; for j :=4 to 6 do ona[j]:=2; for j :=7 to 9 do ona[j]:=0; for j :=10 to 12 do ona[j]:=1; for j:=1 to 12 do
begin
ona2:=ona[(j+4)mod 12]; ona3:=ona[(j+8)mod 12];
estat[j]:=ona1 or 4*ona2 or 16*ona3 ; end; wait:=120; port[modecountaddr]:=$38; port[countreadaddr]:=$ff; port[countreadaddr]:=$ff; delay(20000); end; function readcount:word; var
prim, second :byte;
begin
prim:=port[countreadaddr]; second:=port[countreadaddr]; readcount:=prim+ 256*second; end;
procedure cicle(espera: word); var
j :byte;
begin
for j:= 1 to 12 do begin
port[digioutaddrhigh]:=estat[j]; {gotoxy(1,15);
writeln(pasabin(estat[j]),' '); a:=leevolt(0,100);
3. programa para el control de l motor paso a paso de frenado
.
program frena; uses crt,dos;
const prt :word =$378; var j,k,d : integer;
procedure frenar(x:integer);
var: integer; begin
for n:=0 to x do begin port[prt]:=3; delay(k); port[prt]:=9; delay(k); port[prt]:=12; delay(k); port[prt]:=6; end; end; procedure desfrenar(x:integer); var n:integer; begin
4. movimiento axial del estator, y adquisición y almacenamiento de los
datos de fuerzas de levitación.
Fuerzas.pas
Program forces;
Uses
Crt,t8255,sensors,motors,grafics,control;
Type
senyuelo = Integer;
Const
tmp_const: Real = 210; {210 pasos por segundo; retardo=1} sec: Real = 1.2; {margen de securitad de puntos medidos} n_mot: Integer = 2; {número de motores}
n_finestres: Integer = 4;
max_bucles_petits: Integer = 4; Var
Psi: Rsistema; retard: g_int; maxims,minims:g_int;
ms: g_mot; busca_fi: g_bool;
cnls: g_int; {canales de los sensores} cont: Integer;
process: Boolean; relax: Integer; N: Integer; nom_fitxer: String; nom_aux: String; fminx,fmaxx: Integer; fminz,fmaxz: Integer; espaiat,tram: Integer; vuit: Tgraf;
claus: Array[1..2] of conj_claus; marge: Array[1..4] of conj_limits; maxtmp: Real;
primer,ultim: Integer; n_bucles_petits: Integer;
incd: Integer; {incremento densidad puntos bucles pequeños}
interval: Integer; {relación puntos medida-pasos} int_aux: Real;
cicles: Integer; desti: LongInt; referencia: Integer; fitxer: Text;
Procedure prepara_fitxer(nom_fitxer:String;Var fitxer:Text); Var
nom_aux: String; Begin
nom_aux:=Concat('c:\tp60\isabel\',nom_fitxer,'.m'); Assign(fitxer,nom_aux);
Rewrite(fitxer);
Writeln(fitxer,nom_aux); Close(fitxer);
End;
Function cas_fc(Var mot:Rmotor):Boolean; Var
resposta: Char; Begin
mot.retard:=mot.retard*proporcio; mot.maxpos:=mot.maxpos*proporcio; mot.minpos:=mot.minpos*proporcio;
While (mot.mou_motor(DAVANT) AND (mot.pos<mot.maxpos) AND (mot.estat=DAVANT)) Do;
Writeln('FC Preparat. Continuem? (S/N)'); Readln(resposta);
If ((resposta<>'s') AND (resposta<>'S')) Then cas_fc:=False
Else
cas_fc:=True;
mot.pos:=mot.pos div proporcio;
mot.maxpos:=mot.maxpos div proporcio; mot.minpos:=mot.minpos div proporcio; mot.retard:=mot.retard div proporcio; End;
Begin
{ writeln(26946*14/60);}
process:=True; {True: ZFC; False:FC} relax:=0; {minutos a esperar} N:=1; {ciclos de medida} nom_fitxer:='cal';
fminx:=7000; {fuerzas estimadas según x} fmaxx:=9000;
fminz:=8400; { fuerzas estimadas según z} fmaxz:=9000;
espaiat:=2200; { 2200 pasos=5 mm retardo=1)}
tram:=2*625; { 440 pasos=1mmz (retardo=1); 420 pasos=1mmx (retardo=2)}
{ 625 pasos=1mmx (retardo=3)}
incd:=4; {incremento densidad puntos bucles pequeños}
vuit.init('c:\tp60\bgi',0); If vuit.acces Then
Writeln('Acceso a opciones gráficas');
retard[1]:=1; retard[2]:=3; ms[1]:=MZ; ms[2]:=MX;
busca_fi[1]:=false; busca_fi[2]:=False; minims[1]:=0; minims[2]:=-28716; maxims[1]:=37733; maxims[2]:=21345;
cnls[1]:=0; cnls[2]:=8; If
Psi.crea_sistema(n_mot,retard,ms,busca_fi,maxims,minims,cnls,n_finestr es) Then
Writeln('Ok. Motor amb retard=',retard[1]);
If N>2 Then
int_aux:=sec*((2*N-1)*Psi.mot[1].maxpos+4*(N-2)*int_aux)+relax*60*tmp_const Else int_aux:=sec*(2*N*Psi.mot[1].maxpos+4*(N-2)*int_aux)+relax*60*tmp_const Else
If Not(process) Then
int_aux:=sec*((2*N-1)*Psi.mot[1].maxpos+4*(N-1)*int_aux) Else
int_aux:=sec*(2*N*Psi.mot[1].maxpos+4*(N-1)*int_aux); maxtmp:=int_aux/tmp_const;
{x's} {min(x)} {max(x)} claus[1][1]:=1; marge[1][1]:=0;
marge[3][1]:=Psi.mot[1].maxpos;
claus[1][2]:=1; marge[1][2]:=0; marge[3][2]:=Psi.mot[1].maxpos;
claus[1][3]:=3; marge[1][3]:=0; marge[3][3]:=maxtmp; claus[1][4]:=2; marge[1][4]:=-1.1*tram; marge[3][4]:=1.1*tram;
{y's} {min(y)} {max(y)} claus[2][1]:=5; marge[2][1]:=fminx; marge[4][1]:=fmaxx; claus[2][2]:=4; marge[2][2]:=fminz; marge[4][2]:=fmaxz; claus[2][3]:=4; marge[2][3]:=fminz; marge[4][3]:=fmaxz; claus[2][4]:=5; marge[2][4]:=fminx; marge[4][4]:=fmaxx;
Psi.graf.asigna_indexs(claus[1],claus[2]);
Psi.graf.fin[1].title(' Psi1'); Psi.graf.fin[1].xnom('dist…ncia Z (pasos)'); Psi.graf.fin[1].ynom('forza X (A/D)');
Psi.graf.fin[2].title(' Psi2'); Psi.graf.fin[2].xnom('dist…ncia Z (pasos)'); Psi.graf.fin[2].ynom('forza Z (A/D)');
If Process Then
nom_aux:='Cas Zero Field Cooled' Else
nom_aux:='Cas Field Cooled'; Psi.graf.fin[3].title(nom_aux);
Psi.graf.fin[3].xnom('temps (segons)'); Psi.graf.fin[3].ynom('forza Z (A/D)'); Psi.graf.fin[4].title(' Psi3'); Psi.graf.fin[4].xnom('dist…ncia X (pasos)'); Psi.graf.fin[4].ynom('forza X (A/D)');
Psi.graf.asigna_limits(marge[1],marge[2],marge[3],marge[4]);
prepara_fitxer(nom_fitxer,fitxer);
If Not(process) Then
If Not(cas_fc(Psi.mot[1])) Then Exit; primer:=1; {**********************************} Psi.tmp.posa_zero; desti:=trunc(Psi.mot[1].maxpos/80)*77; interval:=2000;
primer:=1; delay(3000);
desti:=trunc(Psi.mot[1].maxpos/80)*6; interval:=5;
if Psi.cami(1,desti,true,primer,ultim,interval) then primer:=ultim+1;
desti:=trunc(Psi.mot[1].maxpos/80)*7; interval:=5;
if Psi.cami(1,desti,true,primer,ultim,interval) then primer:=ultim+1;
desti:=trunc(Psi.mot[1].maxpos/80)*67; interval:=6;
if Psi.cami(1,desti,true,primer,ultim,interval) then primer:=ultim+1;
desti:=trunc(Psi.mot[1].maxpos); interval:=5;
if Psi.cami(1,desti,true,primer,ultim,interval) then primer:=ultim+1;
desti:=trunc(Psi.mot[1].maxpos/80)*77; interval:=5;
if Psi.cami(1,desti,true,primer,ultim,interval) then writeln('ultim=',ultim);
Str(cicles,nom_aux);
nom_aux:=Concat(nom_fitxer,nom_aux,'=['); escriu(fitxer,Psi.resultat,ultim,0,nom_aux);
primer:=1; desti:=0;
interval:=2000;
if Psi.cami(1,desti,true,primer,ultim,interval) then primer:=1;
For cont:=1 To n_motors Do Psi.mot[cont].tanca_port;
Repeat Until KeyPressed; vuit.fi;
5.
software necesario para el funcionamiento de fuerzas.pas
Motores.pas
Unit motors; Interface Uses Crt,t8255; Typetipus_motor = (MX,MY,MZ);
cicle_motor = Array[1..8] of Byte; estat_motor = (DAVANT,ENRERA,DESACT); mascares = Array[1..2] of Byte;
{************************************} Rmotor = Object(Tt8255)
pos : LongInt; maxpos,minpos : LongInt; posicio: Real;
estat : estat_motor; retard : Integer; digfi : Tt8255; fi : mascares;
Function fi_carrera:Byte; Function mou_motor(sentit:estat_motor):Boolean; Function ini_motor:Boolean; Function crea_motor(rtard:Integer;m:tipus_motor; opcio:Boolean;maxim,minim:LongInt): Boolean;
Function pas: LongInt; Function situacio: Real; Function max_pos: LongInt; Procedure vis_motor;
Procedure mata_motor; End;
Const
cicle : cicle_motor = (7,5,13,9,11,10,14,6);} cicle : cicle_motor = (6,14,10,11,9,13,5,7);
pas_micra: Real = 2; {Conversión paso-micra} Implementation Function Rmotor.fi_carrera:Byte; Var fi_aux:Byte; aux:Byte; Begin fi_aux:=0; aux:=Port[digfi.base];
If (Port[digfi.base] And fi[1])=0 Then fi_aux:=1;
Else
fi_carrera:=fi_aux; End;
Function Rmotor.mou_motor(sentit:estat_motor):Boolean; Var
index_motor, index_motor_bis :Byte; aux:Byte;
Begin
mou_motor:=True; estat:=sentit; aux:=fi_carrera; Case aux of 0: Begin
Case sentit of
DAVANT: pos:=pos+1; ENRERA: pos:=pos-1; End; End; 1: Begin estat:=DAVANT; minpos:=pos; pos:=pos+1; End; 2: Begin estat:=ENRERA; maxpos:=pos; pos:=pos-1; End; Else Begin
Writeln('Error al motor. Problemas con los fines de carrera.');
estat:=DESACT; mou_motor:=False; End;
End;
If estat<>DESACT Then Begin
aux:=round(pos/retard+0.01*abs(pos/retard)); index_motor:=(aux And $7)+1;
index_motor_bis:=((aux-2) And $7)+1;
Port[base]:=cicle[index_motor]+cicle[index_motor_bis]*16;
{ posicio:=(2+((pos-1) div retard))/pas_micra; index_motor:=(1+((pos-1) div retard) And $7)+1;
index_motor_bis:=(1+(((pos-1) div retard)-2) And $7)+1; Port[base]:=cicle[index_motor]+cicle[index_motor_bis]*16;} End;
End;
Function Rmotor.ini_motor:Boolean; Var
sort : Boolean; i : Word;
c: Char; Begin
pos:=0;
While ((estat=DAVANT) And Not(sort)) Do sort:=Not(mou_motor(DAVANT));
If sort Then Begin
Writeln('Error al motor. Problemas con el segundo fin de carrera.');
ini_motor:=False; End
Else Begin
Writeln('Detectado primer fin de carrera. Ok. Pulsa una tecla');
Read(c); maxpos:=pos;
While ((estat=ENRERA) And Not(sort)) Do sort:=Not(mou_motor(ENRERA));
If sort Then Begin
Writeln('Error al motor. Problemas con el segundo fin de carrera.'); ini_motor:=False; End Else minpos:=pos; End; End; Function Rmotor.crea_motor(rtard:Integer;m:tipus_motor; opcio:Boolean;maxim,minim:LongInt): Boolean; Begin crea_motor:=True; retard:=rtard; Case m of MX: Begin base:=$1b5; fi[1]:=4; fi[2]:=2; End; MY: Begin base:=$1b4; fi[1]:=4; fi[2]:=2; End; MZ: Begin base:=$1b4; fi[1]:=8; fi[2]:=1; End; End; digfi.base:=$1b0; digfi.ini_port; If opcio Then
End;
Function Rmotor.pas: LongInt; Begin
pas:=pos; End;
Function Rmotor.situacio: Real; Begin
situacio:=posicio; End;
Function Rmotor.max_pos: LongInt; Begin
max_pos:=maxpos; End;
Procedure Rmotor.vis_motor; Begin
Write('Pos= ',pos,' MaxPos= ',maxpos); End;
Procedure Rmotor.mata_motor; Begin
tanca_port;
digfi.tanca_port; End;
6. programa para la lectura de datos de los sensores
sensores.pas
Unit sensors; Interface Uses Crt, basics; Type Rsensor=Object(Tbase) analog : Word; canal: Byte; valor,zero: Integer; Function leevolt(promig:Integer):Integer; Procedure ini_sensor; Procedure crea_sensor(ab:Word;cnl:Byte); End; Implementation Function Rsensor.leevolt(promig:Integer):Integer; Constespera : Integer = 1; Var
i,k : Integer; j,Hsal,Lsal : Byte; parcial : Real; q : Byte;
Begin
parcial:=0;
For i:=1 To promig Do Begin
Port[analog+1]:=0; Port[analog]:=canal; For j:=1 to 8 Do
Hsal:=Port[analog+8]; For j:=1 to 8 Do
Lsal:=Port[analog+12]; Lsal:=Port[analog+2];
Hsal:=Port[analog+3] And $3F; parcial:=parcial+Lsal+256*Hsal; for q:=1 to espera Do;
End.
7. programa para la representación de gráficos en la pantalla
Graficos.pas
Unit grafics; Interface Uses Crt,basics,Graph; Typeconj_claus= Array[1..4] of Integer; conj_limits= Array[1..4] of Real;
{************************************} Tgraf=Object(Tbase)
Mx,My: Integer;
PathToDriver: String; GraphMode: Integer;
Constructor init(S:string;I:Integer); Function acces: Boolean;
Procedure fi; End; {************************************} Rseccio=Object(Tbase) buffer: Pointer; tamany: Word;
limits: Array[1..4] of Integer;
Constructor init(x1,y1,x2,y2:Integer); Destructor fi; Procedure agafa; Procedure posa; End; {************************************} Rpantalla=Object(Tbase)
bloc: Array[1..4] of Rseccio; Constructor init;
Destructor fi; End;
{************************************} Rgrafica=Object(Tbase)
int_limits: Array[1..4] Of Integer; real_limits: Array[1..4] Of Real; Procedure init(x1,y1,x2,y2:Integer); Procedure canvi_escala(x1,y1,x2,y2:Real);
Function obte_punt(x,y:Real;Var xp,yp:Integer):Boolean; Procedure dibuixa_punt(x,y:Real);
End;
{************************************} Reix=Object(Rgrafica)
grid: Boolean; t,x,y: String; Procedure activa; Procedure desactiva; Procedure canvi_escala(x1,y1,x2,y2:Real); Procedure nou(clau:Integer); Procedure xarxa(g:Boolean); Procedure title(nom:String); Procedure xnom(xtitle:String); Procedure ynom(ytitle:String); End; {************************************} Rfinestra=Object(Tbase)
n_finestres : Integer;
fin : Array[1..4] of Reix; {n_ventanas=4} cx,cy : conj_claus;
Procedure defineix_finestres(claus:conj_claus); Procedure asigna_indexs(claux,clauy:conj_claus); Procedure asigna_limits(minx,miny,maxx,maxy:conj_limits); End; Implementation Constructor Tgraf.init(S:String;I:Integer); Begin PathToDriver:=S; GraphMode:=I; End;
Function Tgraf.acces: Boolean; Var
GraphDriver: Integer; ErrorCode: Integer; LowMode: Integer; HighMode: Integer;
Begin { acces }
DirectVideo:=False; acces:=True; GraphDriver:=Detect; InitGraph(GraphDriver,GraphMode,PathToDriver); GetModeRange(GraphDriver,LowMode,HighMode); SetGraphMode(HighMode); ErrorCode:=GraphResult; ClrScr;
If ErrorCode<>grOk Then Begin
Writeln('Error en gr…fics: ',GraphErrorMsg(ErrorCode)); Writeln('Sin acceso a las opciones gráficas');
Delay(7500); acces:=False; End Else ClearDevice; Mx:=GetMaxX; My:=GetMaxY; End; { acces }
CloseGraph; End; Constructor Rseccio.init(x1,y1,x2,y2:Integer); Begin limits[1]:=x1; limits[2]:=y1; limits[3]:=x2; limits[4]:=y2; tamany:=Imagesize(x1,y1,x2,y2); GetMem(buffer,tamany); End; Destructor Rseccio.fi; Begin FreeMem(buffer,tamany); End; Procedure Rseccio.agafa; Begin GetImage(limits[1],limits[2],limits[3],limits[4],buffer^); End; {---} Procedure Rseccio.posa; Begin PutImage(limits[1],limits[2],buffer^,NormalPut); End; Constructor Rpantalla.init; Begin
bloc[1].init(0,0,GetMaxX div 2,GetMaxY div 2);
bloc[2].init(GetMaxX div 2,0,GetMaxX,GetMaxY div 2); bloc[3].init(0,GetMaxY div 2,GetMaxX div 2,GetMaxY);
bloc[4].init(GetMaxX div 2,GetMaxY div 2,GetMaxX,GetMaxY); End;
Destructor Rpantalla.fi; Var
i:Integer; Begin
real_limits[3]:=x2; real_limits[4]:=y2; End;
Function Rgrafica.obte_punt(x,y:Real;Var xp,yp:Integer):Boolean; Begin obte_punt:=True; xp:=Round((x-real_limits[1])*(int_limits[3]-int_limits[1]) /(real_limits[3]-real_limits[1])+int_limits[1]); yp:=Round((y-real_limits[2])*(int_limits[2]-int_limits[4]) /(real_limits[4]-real_limits[2])+int_limits[4]);
If (x<real_limits[1]) Or (x>real_limits[3]) Then obte_punt:=False;
If (y<real_limits[2]) Or (y>real_limits[4]) Then obte_punt:=False; End; Procedure Rgrafica.dibuixa_punt(x,y:Real); Var auxx,auxy:Integer; Begin
If obte_punt(x,y,auxx,auxy) Then PutPixel(auxx,auxy,LightGray); End;
Procedure Reix.activa; Var
p: Real; xx,yy: Integer; s: String; Begin SetColor(LightGray); SetTextStyle(TriplexFont,HorizDir,1); OutTextXY(int_limits[1]+15,int_limits[2]-30,t); SetTextStyle(SmallFont,HorizDir,4); OutTextXY(int_limits[3]-8*length(x),int_limits[4]+15,x); SetTextStyle(SmallFont,VertDir,4); OutTextXY(int_limits[1]-50,int_limits[2]+8*length(y),y); SetTextStyle(SmallFont,HorizDir,2); SetColor(DarkGray); Rectangle(int_limits[1],int_limits[2],int_limits[3],int_limits[4]); SetColor(LightGray); p:=real_limits[1];
While obte_punt(p,real_limits[2],xx,yy) Do Begin
PutPixel(xx,yy+1,LightGray); Str(p:1:1,s);
SetTextStyle(SmallFont,HorizDir,2); OutTextXY(xx-15,yy+3,s);
While obte_punt(real_limits[1],p,xx,yy) Do Begin PutPixel(xx-1,yy,LightGray); Str(p:1:1,s); SetTextStyle(SmallFont,HorizDir,2); OutTextXY(xx-30,yy-7,s);
If grid Then Begin SetColor(DarkGray); SetLineStyle(DottedLn,0,0); Line(int_limits[1],yy,int_limits[3],yy); SetLineStyle(SolidLn,0,0); SetColor(LightGray); End; p:=p+incy; End; Line(int_limits[1]-5,int_limits[4],int_limits[3]+5,int_limits[4]); Line(int_limits[1],int_limits[4]+5,int_limits[1],int_limits[2]-5); End; Procedure Reix.desactiva; Var
p: Real; xx,yy: Integer; s: String; Begin SetColor(Black); SetTextStyle(TriplexFont,HorizDir,1); OutTextXY(int_limits[1]+15,int_limits[2]-30,t); SetTextStyle(SmallFont,HorizDir,4); OutTextXY(int_limits[3]-8*length(x),int_limits[4]+15,x); SetTextStyle(SmallFont,VertDir,4); OutTextXY(int_limits[1]-50,int_limits[2]+8*length(y),y); SetTextStyle(SmallFont,HorizDir,3); Rectangle(int_limits[1],int_limits[2],int_limits[3],int_limits[4]); p:=real_limits[1];
While obte_punt(p,real_limits[2],xx,yy) Do Begin
PutPixel(xx,yy+1,Black); Str(p:1:1,s);
SetTextStyle(SmallFont,HorizDir,2); OutTextXY(xx-15,yy+3,s);
If grid Then Begin SetLineStyle(DottedLn,0,0); Line(xx,int_limits[4],xx,int_limits[2]); SetLineStyle(SolidLn,0,0); End; p:=p+incx; End; p:=real_limits[2];
While obte_punt(real_limits[1],p,xx,yy) Do Begin
PutPixel(xx-1,yy,Black); Str(p:1:1,s);
SetTextStyle(SmallFont,HorizDir,2); OutTextXY(xx-30,yy-7,s);
If grid Then Begin
Line(int_limits[1],yy,int_limits[3],yy); SetLineStyle(SolidLn,0,0); End; p:=p+incy; End; Line(int_limits[1]-5,int_limits[4],int_limits[3]+5,int_limits[4]); Line(int_limits[1],int_limits[4]+5,int_limits[1],int_limits[2]-5); End; Procedure Reix.canvi_escala(x1,y1,x2,y2:Real); Begin desactiva; real_limits[1]:=x1; real_limits[2]:=y1; real_limits[3]:=x2; real_limits[4]:=y2; incx:=(real_limits[3]-real_limits[1])/5; incy:=(real_limits[4]-real_limits[2])/5; activa; End; Procedure Reix.nou(clau:Integer); Const
lc: Array[1..4] Of Integer=(10,45,60,95); Var
aux: Array[1..4] Of Real; Begin
Procedure Rfinestra.defineix_finestres(claus:conj_claus); Var
cont: Integer; Begin
For cont:=1 To n_finestres Do Begin
fin[cont].nou(claus[cont]); fin[cont].xarxa(True); End;
End;
Procedure Rfinestra.asigna_indexs(claux,clauy:conj_claus); Var
cont: Integer; Begin
For cont:=1 To n_finestres Do Begin
cx[cont]:=claux[cont]; cy[cont]:=clauy[cont]; End;
End;
Procedure Rfinestra.asigna_limits(minx,miny,maxx,maxy:conj_limits); Var
cont: Integer; Begin
For cont:=1 To n_finestres Do
fin[cont].canvi_escala(minx[cont],miny[cont],maxx[cont],maxy[cont]); End;
8. control del sistema
Control.pas
Unit control; Interface Uses Crt,basics,t8255,sensors,motors,grafics; Typeg_bool = Array[1..2] of Boolean; {n_motores =2} g_mot = Array[1..2] of tipus_motor; {n_motores =2} g_int = Array[1..2] of LongInt; {n_sensores=2} grup_sensors = Array[1..2] of Rsensor; {n_sensores=2} grup_dades = Array[1..5] of Real;
{x,z,tiempo,s1,s2=1+n_motores+n_sensores}
dades =Array[1..1500] of grup_dades; {limite=1500, cambiar abajo, 8000 / (1+ n_motores + n_sensores)}
{************************************} Rdevice = Object(Tbase)
mot : Array[1..2] of Rmotor; {n_motores =2} lectors : grup_sensors;
conjunt : grup_dades; promig : Integer;
Function crea_device(n_mot:Integer;dretard:g_int;m:g_mot; ini:g_bool;dmaxpos,dminpos:g_int;cnl:g_int):Boolean; Function mou_i_llegeix(motor:Integer;sentit:estat_motor;pasos:Integer):Boolean; End; {************************************} Rsistema = Object(Rdevice)
tmp : Ttemps; graf : Rfinestra; resultat : dades; primer : Integer;
Function crea_sistema(n_mot:Integer;dretard:g_int;m:g_mot;ini:g_bool; dmaxpos,dminpos:g_int;cnl:g_int;n_fin:Integer):Boolean; Procedure dibuixa_fin(index:Integer); Function cami(motor:Integer;final:LongInt;llegeix:Boolean; Var actual,ultim:Integer;pasos:Integer):Boolean;
Procedure espera(minuts:Integer;Var actual: Integer); End;
Procedure escriu(Var fitxer:Text;Var
valors:dades;max,tipus:Integer;cadena:String); Function existfitxer(fitxer : String): Boolean; Procedure emergencia(recupera:dades;index:Integer);
proporcio: Integer = 4; {relación retardo motor sin leer/motor leyendo}
limit: Integer = 1500; {8000/(1+n_motor+n_sensores)}
n_motors: Integer = 2; n_sensors: Integer = 2; punts_per_minut: Integer = 60; promig_ini: Integer = 5;
Implementation Function Rdevice.crea_device(n_mot:Integer;dretard:g_int;m:g_mot;ini:g_bool; dmaxpos,dminpos:g_int;cnl:g_int):Boolean; Var cont: Integer; Begin crea_device:=True; n_motors:=n_mot;
For cont:=1 To n_mot Do Begin
If
Not(mot[cont].crea_motor(dretard[cont]*proporcio,m[cont],ini[cont], dmaxpos[cont]*proporcio,dminpos[cont]*proporcio)) Then crea_device:=False;
mot[cont].maxpos:=mot[cont].maxpos div mot[cont].retard; mot[cont].minpos:=mot[cont].minpos div mot[cont].retard; mot[cont].pos:=mot[cont].pos div mot[cont].retard;
mot[cont].retard:=dretard[cont];
mot[cont].maxpos:=mot[cont].maxpos*mot[cont].retard; mot[cont].minpos:=mot[cont].minpos*mot[cont].retard; mot[cont].pos:=mot[cont].pos*mot[cont].retard;
End;
For cont:=1 To n_sensors Do
lectors[cont].crea_sensor($170,cnl[cont]); promig:=promig_ini; End; Function Rdevice.mou_i_llegeix(motor:Integer;sentit:estat_motor;pasos:Integer): Boolean; Var
aux: Array[1..10] of Real; cont,cont2,cont3: Integer; Begin
For cont:=1 To n_sensors Do aux[cont]:=0;
cont3:=0;
For cont:=1 To pasos Do Begin
mou_i_llegeix:=mot[motor].mou_motor(sentit); If sentit<>mot[motor].estat Then cont:=pasos; For cont2:=1 To n_sensors Do
aux[cont2]:=aux[cont2]+lectors[cont2].leevolt(promig); Inc(cont3);
End;
For cont:=1 To n_sensors Do
Function Rsistema.crea_sistema(n_mot:Integer;dretard:g_int;m:g_mot;ini:g_bool; dmaxpos,dminpos:g_int;cnl:g_int;n_fin:Integer):Boolean; Var claus: conj_claus; cont: Integer; Begin crea_sistema:=crea_device(n_mot,dretard,m,ini,dmaxpos,dminpos,cnl); Case n_fin Of
1:claus[1]:=111; 2:Begin claus[1]:=211; claus[2]:=212; End; 3:Begin claus[1]:=221; claus[2]:=222; claus[3]:=212; end; 4:Begin claus[1]:=221; claus[2]:=222; claus[3]:=223; claus[4]:=224; End End; graf.n_finestres:=n_fin; graf.defineix_finestres(claus); End; Procedure Rsistema.dibuixa_fin(index:integer); Var cont,ix,iy: Integer; x,y: Real; Begin
For cont:=1 To graf.n_finestres Do Begin ix:=graf.cx[cont]; iy:=graf.cy[cont]; x:=resultat[index][ix]; y:=resultat[index][iy]; graf.fin[cont].dibuixa_punt(x,y); End; End; Function Rsistema.cami(motor:Integer;final:LongInt;llegeix:Boolean;Var actual,ultim:Integer;pasos:Integer):Boolean; Var
index: Integer; cont: Integer; min_pas: Integer; sentit0: estat_motor; sort: Boolean; Begin
sort:=False;
If final=mot[motor].pos Then sort:=True
If final<mot[motor].pos Then sentit0:=ENRERA Else sentit0:=DAVANT; End; mot[motor].estat:=sentit0; index:=actual;
While ((mot[motor].estat=sentit0) And Not(sort)) Do Begin
If llegeix Then Begin
If abs(final-mot[motor].pos)<pasos Then min_pas:=abs(final-mot[motor].pos) Else
min_pas:=pasos;
cami:=mou_i_llegeix(motor,mot[motor].estat,min_pas); For cont:=1 To n_motors Do
resultat[index][cont]:=mot[cont].pos; tmp.actualizar;
resultat[index][1+n_motors]:=tmp.cputime/100; For cont:=1 To n_sensors Do
resultat[index][1+n_motors+cont]:=conjunt[1+n_motors+cont]; dibuixa_fin(index);
Inc(index);
If index>limit Then Begin Writeln('Buffer excedit'); emergencia(resultat,index); index:=1; End; End Else cami:=mot[motor].mou_motor(mot[motor].estat); If (sentit0=DAVANT) AND (mot[motor].pos>=final) Then sort:=True;
If (sentit0=ENRERA) AND (mot[motor].pos<=final) Then sort:=True;
End;
ultim:=index-1; End;
Procedure Rsistema.espera(minuts:Integer;Var actual:Integer); Var
nsegons, conta: Integer; Begin
For nsegons:=1 To minuts*60 Do Begin
For conta:=1 To n_motors Do
resultat[actual][conta]:=mot[conta].pos; tmp.actualizar;
resultat[actual][1+n_motors]:=tmp.cputime/100; For conta:=1 To n_sensors Do
{ ********************************** } Procedure escriu(Var fitxer:Text;Var
valors:dades;max,tipus:Integer;cadena:String); Var
aux,cont,cont2:Integer; Begin
Append(fitxer); If tipus=0 Then
Writeln(fitxer,cadena); For cont:=1 To max-1 Do Begin
For cont2:=1 To 1+n_motors+n_sensors Do Write(fitxer,valors[cont][cont2],' '); If ((tipus=0) And (cont=max-1)) Then Writeln(fitxer,'];') Else Writeln(fitxer,';'); End; Close(fitxer); End; {**** ****************************** }
{ Torna True si existe el fichero y False si hay error } Function existfitxer(fitxer : String): Boolean;
{ función booleana que torna True si existe el fichero } Var f:File; Begin {$I-} Assign(f,fitxer); Reset(f); Close(f); {$I+}
existfitxer := (IOResult=0) And (fitxer <> ''); End; Procedure emergencia(recupera:dades;index:Integer); Var fitxer_emergencia: Text; Begin Assign(fitxer_emergencia,'c:\tmp\tmp.m'); If existfitxer('c:\tmp\tmp.m') Then
9. definición de los parámetros
Basics.pas
Unit basics; Interface Type Tbase=Object End; Implementation End.10. control de puertos de entrada-salida
cputime:=time_aux+100*(LongInt(timecpu.Sec+60*(timecpu.Min+60*timecpu. Hour)))-t_ini; End; Procedure Tt8255.ini_port; Begin Port[base+11]:=$36; Port[base+11]:=$76; Port[base+11]:=$b6; Port[base+8]:=$2; Port[base+8]:=$0; Port[base+9]:=$32; Port[base+9]:=$0; Port[base+10]:=$64; Port[base+10]:=$0; Port[base+3]:=$80; Port[base+7]:=$80; Port[base]:=255; End; Procedure Tt8255.tanca_port; Begin Port[base]:=255; End; End.
3. programa de lectura de datos para la caracterización estática
f30(:,1)=(f30(:,1)+4.37)/0.0134; f30(:,2)=f30(:,2)*esc; f40(:,1)=(f40(:,1)+4.2)/0.0134; f40(:,2)=f40(:,2)*esc; f50(:,1)=(f50(:,1)+4.59)/0.0134; f50(:,2)=f50(:,2)*esc; f60(:,1)=(f60(:,1)+4.5)/0.0134; f60(:,2)=f60(:,2)*esc;
save 'd:\usuarios\granados\joan\f30.dat' f30 -ascii save 'd:\usuarios\granados\joan\f40.dat' f40 -ascii save 'd:\usuarios\granados\joan\f50.dat' f50 -ascii save 'd:\usuarios\granados\joan\f60.dat' f60 -ascii
[Y,I]=sort(f40);
for k=1 :500 40
k
[Y,I]=sort(Y); Y(:,2)=f40(I(:,1),2); n=size(Y);
for j=1 : n(1)-1 if Y(j+1,1)==Y(j,1) Y(j+1,1)=Y(j+1,1)+0.0001; end end end Xi=linspace(-20,338,180); Yi=interp1(Y(:,1),Y(:,2),Xi); F40=Yi; [Y,I]=sort(f50);
for k=1 :500 50
k
[Y,I]=sort(Y); Y(:,2)=f50(I(:,1),2); n=size(Y);
Yi=interp1(Y(:,1),Y(:,2),Xi); F50=Yi;
[Y,I]=sort(f60);
for k=1 :500 60
k
[Y,I]=sort(Y); Y(:,2)=f60(I(:,1),2); n=size(Y);
for j=1 : n(1)-1 if Y(j+1,1)==Y(j,1)
Y(j+1,1)=Y(j+1,1)+0.0001; end
end end
Xi=linspace(-20,338,180); Yi=interp1(Y(:,1),Y(:,2),Xi); F60=Yi;
cur=linspace(30,60,4) surf(cur,Xi,mat) shading interp view(-85,20)
zlabel('torque (Nxm)')
title('torque vs current & slip angle') xlabel('current (Amps)')
A2 Motor de flujo axial
A2.1 Simulaciones en el caso de polos de igual polaridad
encarados:
Fx= 5.4104 N/m
[image:69.595.81.507.179.415.2]Fx= 7.441 N/m
[image:70.595.81.510.74.306.2]Simulación del caso de
figura 2 polos del mismo signo enfrentados y rotor desplazado 4mm de la posición de inicio.
Fx= 4.0157 N/m
Simulación del caso de
figura 4 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 12mm de la posición de inicio.
Fx= -1.7422
figura 5 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 16mm de la posición de inicio.
Fx= -2.5613
figura 6 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 20mm de la posición de inicio.
figura 7 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 24mm de la posición de inicio.
figura 8 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 28mm de la posición de inicio.
[image:73.595.103.524.92.316.2]Fx= -0.01147 N/m
figura 9 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 32mm de la posición de inicio.
0.0000 0.0483 0.0966 0.1449 0.1932 0.2415 0.2898 0.3381 0.3864 0.4347 0.4830 B( T)
Flux Density
figura 10 Simulación del caso de polos del mismo signo enfrentados y rotor desplazado 36mm de la posición de inicio.
0.0000 0.0483 0.0966 0.1449 0.1932 0.2415 0.2898 0.3381 0.3864 0.4347 0.4830 B( T)
Flux Density
Fx= 5.6014 N/m
- Simulaciones de polos de diferente polaridad encarados:
Fx= -20.893 N/m
figura 12 Simulación del caso de polos de distinto signo enfrentados y rotor desplazado 8mm de la posición de inicio.
Fx= 34,601 N/m
figura 13 Simulación del caso de polos de distinto signo enfrentados y rotor desplazado 12mm de la posición de inicio.
figura 14 Simulación del caso de polos dedistinto signo enfrentados y rotor desplazado 16mm de la posición de inicio.
Fx= 38.361 N/m
figura 15 Simulación del caso de polos de distinto signo enfrentados y rotor desplazado 20mm de la posición de inicio.
[image:76.595.100.528.84.702.2]figura 16 Simulación del caso de polos de distinto signo enfrentados y rotor desplazado 24mm de la posición de inicio.
figura 17 Simulación del caso de polos de distinto signo enfrentados y rotor desplazado 28mm de la posición de inicio.
figura 18 Simulación del caso de polos de disitnto signo enfrentados y rotor desplazado 32mm de la posición de inicio.
figura 19 Simulación del caso de polos de disitnto signo enfrentados y rotor desplazado 36mm de la posición de inicio.
A2.2 Sistema de medidas para la caracterización estática
-Sistema de montaje y sujeción de todos los componentes
Todo el motor estará sumergido en nitrógeno líquido. Para ello se dispone de una caja de poliestireno expandido en la que se situaran los dos semiestátores y el rotor.
Figura 1 Placa base de fibra de vidrio, situada en el fondo del contenedor de nitrogeno. Sujeta 8 varillas roscadas en las que se efectuaran las conexiones de los devanados entre si y a la alimentación del motor.
En la parte inferior de la caja se colocará una placa de fibra de vidrio a la que se le han practicado 6 agujeros. Por estos agujeros se pasarán 8 varillas roscadas de acero inoxidable (Figura 1), que se sujetarán a la placa mediante dos contratuercas y arandelas. Estas varillas servirán para efectuar todas las conexiones eléctricas del sistema trifásico que forman los devanados del motor.
Cada una de los dos semiestátores se sujetarán mediante 6 tornillos a unas piezas de acero de forma triangular. Estas irán sujetas entre si por tres barras roscadas de M-10 que permitirán, si se requiere, modificar la posición relativa de
Fig. 2 Fotografia del semiestátor y la plancha de acero
ambos semiestátores. La figura 3 muestra el esquema de un semiestátor y la pieza que lo sujeta.
Esta pieza ha sido realizada cortando una plancha de 5mm de acero para conseguir un conjunto con suficiente rigidez para que aguante el peso del semiestátor y las fuerzas de origen magnético. La deformación que se producirá en el centro debe ser suficientemente pequeña para no afectar el movimiento del rotor.
Para generar el par de fuerzas se ha dispuesto una rueda de madera sujeta al eje del motor mediante un cojinete que la centra, pero no afecta la transmisión del par. Esta rueda lleva sujeta mediante tornillos una pieza de aluminio que es la encargada de empujar la célula de carga sujeta al eje. Así se transmite y se mide el par simultáneamente.
Tal como se muestra en la figura 4, el par de fuerzas se ejerce mediante un cable previamente enrollado en la periferia de la rueda y dos ruedas auxiliares. Un motor de corriente alterna se encarga de realizar el movimiento del cable, que se mantiene tensado mediante un contrapeso de 1 kg. aproximadamente.
El conjunto de piezas están sujetadas a una estructura de ángulo de hierro ranurado mediante tornillos y arandelas. Algunas de las uniones se han realizado con soldadura para garantizar dimensiones y rigidez. Una de las dos ruedas auxiliares se ha sujetado con una varilla de acero con un fuerte peso en la base. La rigidez del conjunto se ha completado con una barra de hierro ranurado sujeta al resto de la estructura mediante tornillos y abrazaderas.
Fig. 4 Dibujo esquemático del montaje efectuado para la caracterización estática del motor con el rotor superconductor. Se puede ver la situación de la pieza de empuje, la célula extensométrica en el eje del motor, y el potenciómetro acoplado a una tercera rueda , así como el sistema de arrastre formado por el motor, el cable y el contrapeso.
Fig. 5 Fotografia de la estructura donde pueden verse las partes indicadas anteriormente.
-Fuente de alimentación
El sistema de alimentación debe proveer las tensiones adecuadas para la célula de carga, el potenciómetro , y los sistemas de acondicionamiento de la señal.
Para ello se usará una fuente de alimentación de corriente continua comercial que dispone de salidas fijas de +15- 0 - -15 V, 2A y una salida que puede variar entre 0 y 30V, 2A. Esta última regulable en intensidad y ambas protegidas contra cortocircuitos.
- Célula de carga:
Se dispone en el ICMAB de una célula UTILLCEL, Mod 120 de 10 kg. El catálogo del fabricante indica que hay que alimentarla a 10V. Para alimentarla se usará la fuente regulable descrita en el parágrafo anterior.
Para la calibración de la misma se ha usado un dinamómetro de Fmax = 15 kp. Con el que se ha aplicado fuerza sobre el sistema célula de carga-amplificador. La salida del amplificador se ha conectado a la placa de adquisición de datos que se ha encargado de registrar los datos de salida del amplificador. La lectura de los mismos se ha realizado mediante un programa de lectura y tratamiento de datos (Dades.txt- Anexo 3). Además se ha puesto un voltímetro en
A B
Fig. 6 Esquema de conexiones de la célula de carga, donde pueden verse las entradas de alimentació( +in y –in) y las salidas (+out y – out).
paralelo para comprobar la validez de los mismos durante la fase de comprobación. Los datos obtenidos se muestran el la siguiente tabla y se han representado en la figura 7
Fuerza (N) 1 2 3 4 5 6 7 8 9 10 11
Tensión (V) 0.17 0.27 0.41 0.55 0.67 0.80 0.94 1.03 1.23 1.38 1.5
0 2 4 6 8 1 0
0 2
C a l i b r a c i ó n d e l a c é l u l a d e c a r g a
T
e
nsió
n (
V
)
F u e r z a ( N )
Fig. 7 Calibración de la célula de carga, donde puede apreciarse la linealidad de la misma para el rango de valores que se van a usar en la caracterización estática
-Acondicionamiento de la salida de la célula de carga
La placa de adquisición de datos conectada al ordenador tiene un margen de lectura de de +5 a –5 V. Para el rango de fuerzas que esperamos en nuestra prueba, las tensiones de salida de la célula son del orden de –4mV a +4mV. El circuito interface deberá multiplicar por 1000 estas tensiones para adaptarlas a las de entrada de la placa de adquisición de datos. La figura 8 muestra este circuito amplificador.
La siguiente tabla muestra los resultados obtenidos y la gráfica de los mismos permite observar la linealidad de la respuesta del sistema en el rango de valores en los que va a ser usada.
Fig. 8 Circuito amplificador para adaptar la señal procvedente de la célula
Se desea obtener la gráfica posición- par para distintos valores de corriente de alimentación. Puesto que lo que se mide es la fuerza ejercida sobre la célula de carga, hay que multiplicar este valor por la distancia de la célula al eje y así se obtiene el par. A partir de la lectura de tensión en voltios hay que realizar las siguientes operaciones:
N V célula
la de
pendiente 0.1363636
11 5 . 1
: =
Y para cada lectura de tensión:
) ( ) ( ) (
: F N
N V célula la de pendiente V tensión de lectura célula la sobre fuerza =
Y teniendo en cuenta que la célula se encuentra a 160 mm del eje:
) ( ) ) ( ( 1733 . 1 ) ( 16 . 0 1363636 . 0 ) ( ) ( : m N V m N V tensión de lectura tensión de lectura m d N F
par × = × = × =
τ
Este valor debe introducirse en el programa de lectura de datos para poder determinar el par a partir de la lectura de la tensión del amplificador de la célula de carga
-Lectura de la posición angular
Para la lectura de la posición angular, se gira la rueda del potenciómetro hasta que el contrapeso esta en su posición más alta. Esta es la posición que se tomará como referencia cero. En este punto se lee la tensión que proporciona el potenciómetro. Se da una vuelta completa al motor y se vuelve a leer la tensión. Con estas dos lecturas, se realiza la siguiente operación:
Lectura inicial: -5.079 V
Lectura tras una vuelta: -0.164 V
) ( 134 . 0 ) ( ) ( 164 . 0 079 . 5 360
: lecturaV lectura Grados
V Grados girado
Angulo × = ×
−
Este valor debe introducirse en el programa de lectura de datos para obtener la posición en grados a partir de la lectura en voltios del potenciómetro. Si además quiere tomarse el primer valor como cero, debe sumarse a todas las lecturas el valor de la primera lectura cambiada de signo. El programa Dades.txt (anexo 1), es el encargado de la lectura de estos datos.
A2.3 Sistema de medidas para la caracterización dinámica
- Sistema de freno para variar el par:
Se ha utilizado un freno de polvo magnético acoplado al eje del motor. Esencialmente consta dos partes móviles entre las que hay aceite con polvo de hierro y una bobina por la que se hace pasar intensidad. La bobina está situada de forma que puede provocar un campo magnético sobre el espacio ocupado por el polvo magnético. Una de las partes se sujeta al eje y la otra a una célula de carga.
Al incrementar la intensidad, las partículas de hierro se entrelazan, incrementando la viscosidad aparente del conjunto. Así la fuerza
del eje se transmite a la parte que presiona la célula de carga. La fuerza de esta célula por la distancia al eje mide el par. El freno comercial que hemos utilizado es .
Fig. 1 Esquema del freno de polvo magnético usado para la caracterización dinámica
FBB TYPE FRAT 120 FTQR 120
Tensión máxima: 24V c.c.
Par máximo: 12 Nm
Potencia máxima: 200W
Imax: 0.51A
- Control del freno:
Para controlar el freno se ha usado la fuente de intensidad programable KEITHLEY 228A a la que se ha conectado la bobina del freno de polvo magnético.
[image:85.595.337.533.159.308.2]TEP 0 1
OLTS 0 0 0 0 0 0 0 0 0 0 0
MP .05 .1 .15 .2 .25 .3 .35 .4 .45 .5
EG.
TEP 2 3 4 5 6 7 8 9 0 1
OLTS 0 0 0 0 0 0 0 0 0 0
MP. .45 .4 .35 .30 .25 .20 .15 .10 .05
EG.
- Alimentación del motor.
Para la alimentación del motor se ha diseñado un ondulador trifásico controlado desde un ordenador. Esto permitirá modificar la frecuencia si se requiere en pruebas posteriores y en todo caso, permitirá conocer la posición del campo generado en el estator en cada instante. Con la lectura de la posición del rotor podremos conocer el ángulo de carga para cada par. Para ello se ha pensado en un ondulador como el que se muestra en la figura 6.67
Para cada
interruptor mostrado en la figura se han elegido 4 transistores Rectifier hexfet Power mosfets IRFP054, cuyas características principales se muestran en
la siguiente tabla. Se montarán sobre una superficie de aluminio a la que se unirán mediante
tornillo y tuerca. Esta superficie servirá de refrigerante, así que entre los transistores y la misma se colocará una capa de silicona que mejore la transmisión de calor. Para cada transistor se ha previsto una corriente que puede variar desde los 280 A para 25 ºC a los 256 A a 100 ºC
Fig 2 Esquema del ondulador usado para la caracterización dinámica del motor
Vbr D-S RDS(0n) Id (25ºC) Id(100ºC) Pd IRFP450 60 V 0.014 Ω 70 A 64 A 230 W
por ello que en las siguientes pruebas se ha alimentado el conjunto con 4 baterias de
[image:87.595.54.565.234.583.2]40A-Hora. Según las necesidades podrán conectarse en serie y en paralelo y se dispondrá un circuito para la recarga de las mismas durante los periodos en los que no se realicen las pruebas. Esta es la alimentación dibujada en el circuito de la figura 3.
Fig 3 Esquema de una de las tres fases del ondulador montado para la caracterización dinámica del motor
- Transformador-rectificador-filtro:
KA/m. La pendiente de la línea de rebote (permeabilidad de rebote) es prácticamente tangente a la curva de histéresis, no existiendo prácticamente desmagnetización en el funcionamiento normal del motor como motor síncrono. Es por ello que a pesar del gran entrehierro, esta máquina tenga una inductancia equivalente relativamente grande y pueda conectarse, durante los transitorios de aceleración, a una tensión de 220V.
Si se sustituyen los imanes del rotor por superconductores, el caso es totalmente distinto y ahora se requiere una adaptación de impedancias. La tensión de alimentación depende de la intensidad que se quiera hacer pasar por el motor. Ya vimos que el conductor de cobre a temperatura de ebullición del nitrógeno permitía el paso de hasta 1700 A. Para nuestros propósitos (unos 120 A como máximo) deberemos disponer de un sistema regulador de tensión. Para ello se dispone un autotransformador trifásico que regula la tensión de entrada y un transformador toroidal en el que se ha devanado un segundo arrollamiento de 40 vueltas con una toma central.
Fig 4 Esquema de la fuente de c.c. para alimentar el ondulador
Los transformadores son de tipo toroidal. Se han usado 3 toriodales de INTELSA de 220 v en el primario y dos secundarios de 22V 5A.
Para nuestros propósitos se han bobinado nuevos secundarios formados por 10 hilos de cobre de 1mm en paralelo con los cuales se han dado 40 vueltas con una toma intermedia. Las tensiones en estas condiciones son de 7.6 V en cada mitad del secundario.
- Para cada rectificador de la figura se han usado 3 rectificadores en paralelo tipo FAGOR FB5006
B250/220-50
Cada uno puede proporcionar una intensidad media de 50A
- El filtro esta constituido por 36 condensadores SPRAGUE
EXTRALYTIC de 75 VDC y 4500µF cada uno, lo que hace un total de 162000
µF
- Para la conexión del primario del autotransformador trifásico a la red se ha usado un INTERRUPTOR magnetotérmico de MERLIN GERIN, MULTI9, de 4 polos, 380 V. y 5 A.
-Sensor para la determinación de la posición del rotor
- El sensor para determinar la posición del rotor se ha realizado a partir de las siguientes piezas:
hoja de poliéster con 360 divisiones
soporte ( madera contrachapada de 1 mm) con interior de celulosa para reducir el rozamiento
La figura 6.70 muestra las diferentes partes del sensor de posición y el esquema del conjunto. El papel de acetato con las 360 divisiones se sujeta a la parte superior del eje mediante un pequeño imán. Para sujetar la célula y dirigir el papel de acetato, se ha construido una caja de madera contrachapada, cuyo interior se ha forrado con celulosa para reducir el rozamiento.
Cada vuelta del rotor se detectan 360 pulsos que tras amplificarse, son
leídos por la placa de adquisición de datos. El resultado es que se conoce la posición del rotor con una resolución de un grado.
Fig 5 Esquema del sensor para medir la posición del rotor.
- Amplificador para le célula fotoeléctrica:
La salida de la célula fotoeléctrica se amplifica y se hace cuadrada para tener un pulso cada grado. Tras fijarla al nivel de 5V, se manda a la entrada de la placa de adquisición de datos y es leída por el programa.
[image:89.595.95.520.225.561.2]Fig. 6 El Amplificador para la célula fotoeléctrica toma como tensión umbral 1V. Tras multiplicar la salida por 25,la señal es cuadrada y fijada a 5V.
- Amplificador para célula de carga:
Para la célula de carga se ha usado un amplificador diferencial que multiplica la entrada por 1000.
Fig. 7 Amplificador diferencial para la señal procedente de la célula de carga. La salida se puede poner como Vout= (V+out – V-out)1000
A1.1 Funcionamiento del motor de flujo radial
Inicialmente el motor se enfría sumergiéndolo en nitrógeno líquido. Esto se hace para que el rotor se enfríe en ausencia de campo magnético (zero field cooled). Posteriormente, se alimenta el estator. La simetría del campo magnético creado hace que el rotor se estabilice y centre.
La alimentación de las bobinas del estator se hace secuencialmente con pulsos cuadrados de tensión. La forma de alimentar cada una de las fases se muestra en la
figura 1
(a) (b) (c) (d)
(e) (f) (g) (h)
Fig. 1 Alimentación de las diferentes fases del estator en función del tiempo
En presencia de un campo magnético, los materiales superconductores se magnetizan creándose una red de vórtices de corrientes superconductoras. La creación de nuevos vórtices o la destrucción de ellos comporta un consumo energético. Al producir un campo magnético en el espacio ocupado por un superconductor, se provoca la magnetización del mismo y ello implica una energía asociada al proceso de desplazarlo. Como:
F dU
dx
= (1)
Siempre que cuando se realice un desplazamiento exista una variación de energía, se producirá una fuerza. Esto es lo que le ocurre a un superconductor cuando se acerca a un campo magnético, sufre una fuerza de repulsión que le impulsa hacia las zonas donde su magnetización se mantiene constante.
La curva de magnetización B(H) del superconductor está representada en la figura 2. Como se puede observar, presenta un comportamiento claramente histerético. La energía almacenada en el superconductor es el área de la curva de magnetización, según la
ecuación 2 : Fig. 2 Ciclo de histéresis del YBCO
∫
=
V
m HBdV
U
2 1
(2)
Si el rotor es colocado en el interior del estator, se magnetiza debido al campo existente. De esta forma, el punto de trabajo de la curva de magnetización se desplaza, lo que implica una variación de la energía en el superconductor.
La corriente de alimentación crea cuatro polos magnéticos, que inducen otros cuatro en el rotor. El superconductor queda entonces fijo en el interior del estator. Cualquier alteración de su posición relativa al campo supone un cambio del punto de trabajo en la curva anterior, lo que implica la aparición de una fuerza de recuperación según la ecuación 3:
(3) dV B M F V
∫
∇ = ( ) rτ ϕ
= dU
d (4)
Donde τ es el par del motor
ϕ es el ángulo de giro
Gracias a la histéresis de magnetización, se produce un par que es el responsable del giro del rotor. Por todo lo explicado anteriormente, inicialmente el motor se comporta como un motor de histéresis.
Cuando el rotor está magnetizado, puede alcanzar el régimen de sincronía. El punto de trabajo de la curva de magnetización no varía, por lo cual, a partir de este momento desaparecen la pérdidas en el rotor y su par motor dependerá sólo del flujo atrapado, del flujo inductor y del ángulo que forman rotor y campo inductor.
A1.2 Sistema de medidas
La figura 1 muestra una fotografia del sistema montado para efectuar las medidas
[image:94.595.78.419.436.737.2]La figura 2 és un esquema del montaje efectuado.
Alimentación de los motores paso a paso: El sistema consta de una fuente de alimentación continua de 40V y 2A, un sistema excitador de los motores y de un ordenador (figura 3).
Fig.4 Sistema de desplazamiento del rotor
[image:95.595.95.514.107.518.2]- Fuente de alimentación
La fuente consta de un transformador de 220V a 24V (2 A), un puente de diodos y un condensador de 4700 µF (figura 4)
24 V
Fig.6 Esquema circuital de la fuente de alimentación para los motores paso a paso
La señal de salida obtenida es de tensión continua, de 40V y 2A de intensidad, lo que es suficiente para alimentar los dos circuitos excitadores (uno para cada motor).
-Excitador para motor paso a paso
El sistema representado en la figura 5, controla motores bipolares de dos fases, como es el caso de los dos motores paso a paso utilizados. La corriente máxima por fase es de 2A, lo que es más que suficiente.
Fig. 7 Sistema de excitación de los motores paso a paso
El corazón de este montaje son un par de circuitos integrados de SGS-Thomson Microelectronics, el L297 y el L298. El L297 genera las señales de control para cada una de las dos fases de un motor bipolar. Mediante la programación en sus dos entradas (compatibles TTL) permite la selección del sentido de rotación y del tamaño del paso (paso completo o semipaso). Según el caso, el motor avanza o retrocede un paso, o un semipaso, en el flanco descendiente de la señal aplicada a la entrada de reloj (CLK).
La amplitud del rizado residual (ripple) presente en la corriente del estator depende de la autoinducción del mismo así como del nivel aplicado en la patilla mode. Con un nivel alto en dicha entrada, las salidas del L298 se ponen en estado de alta impedancia durante el periodo de funcionamiento de los diodos de protección, que entran en conducción porque la tensión instantánea en bornes de los bobinados del estator sobrepasa ligeramente la tensión de alimentación, de forma que el campo del estator cae rápidamente.
Cuando la entrada MODE está a nivel bajo, uno de los transistores internos del L298 permanece activo durante el período de conducción de los diodos, lo que tiene como efecto mantener a un valor relativamente débil la tensión de freno en bornes del bobinado del estator, lo que conlleva una disminución menos importante de la fuerza del campo del estator, reduciendo así la amplitud del rizado residual. Esta opción permite mantener a una intensidad suficiente la corriente de control de un motor que presente una autoinducción de estator relativamente baja.
El divisor incorporado en el esquema, 4024, está destinado a proporcionar una señal de reloj cuando la salida del ordenador desde el que se controla el circuito no puede ser programado para conmutar a la velocidad de paso necesaria. El selector de velocidad, K1, permite escoger entre una de las siete frecuencias (velocidades de paso) posibles. Se puede colocar el dispositivo divisor de frecuencia fuera de servicio mediante la aplicación de un nivel bajo en la entrada GATE disponible sobre el circuito impreso. La entrada CLOCK funciona en este caso como una salida, lo que permite al ordenador seguir el número de pasos efectuados. Si se aplica un reloj externo a la placa de control se podrá simplemente eliminar 4024.
Control por el ordenador
Del ordenador se han obtenido los controles de todas las señales. Igualmente, ha proporcionado la señal continua de alimentación de 5V y GND (la cual es común con la GND de la fuente de 40 V).
Las señales de GATE, SYNC, RESET, H/F y ENABLE no han sido conectadas, dejándose en circuito abierto, ya que su uso no ha sido necesario.
La señal CW/CCW y CLK se controlan desde el programa en pascal, enviando las correspondientes señales en forma de pulsos.
Sistema de acondicionamiento de la señal
Hay dos señales de entrada a la tarjeta del ordenador, la que proviene de la sonda Hall y la del potenciómetro. La alimentación de ambos se hace con una fuente de tensión continua común de tres salidas: -12, 0 y +12V.
Para su correcta lectura, el voltaje de entrada a la tarjeta del ordenador ha de estar entre -5 a +5V. Para ello, se necesita un sistema que amplifique la señal cuando sea necesario y la sitúe entre los valores comentados anteriormente, pero sin sobrepasarlos. Para que la tarjeta no tenga sobretensiones que puedan dañarla, se ha colocado un limitador de tensión a ±5V a la salida de cada una de las señales.
El sistema de amplificación de la sonda es más delicado, ya que la señal es más débil y el ruido la afecta mucho más. Así que, se ha utilizado un amplificador de instrumentación (INA 110 Burr Brown).
-Acondicionamiento de la señal del potenciómetro
Fig.8 Diagrama de bloques del sistema de acondicionamiento de la señal del potenciómetro
A continuación se explicará con más detalle cada uno de los bloques.
- Fuente de alimentación
La fuente de alimentación suministra una tensión continua mediante tres salidas de +12, 0 y -12V. Para su construcción se ha utilizado un transformador de 220 a 12V y de 0.75 A, dos puentes de diodos, cuatro condensadores y dos referencias de tensión (figura 7)
Fig. 9 Esquema de la fuente de alimentación
El transformador convierte la señal proveniente de la red eléctrica (220V, 50Hz), en dos señales alternas de la misma frecuencia y de amplitud 12V. El objetivo de los puentes de diodos es transformar las señales de corriente alterna en continuas de 12 V, una de signo positivo y otra de signo negativo.
Posteriormente, el regulador de voltaje positivo (7812) convierte la señal continua de entrada en una de valor +12V. El regulador de voltaje negativo (7912) tiene la misma función, pero en este caso la señal de salida es de -12V. Por último, la función de los condensadores es filtrar la señal eléctrica.
El potenciómetro utilizado es multivuelta (diez vueltas), y con una resistencia de 1KΩ. En las medidas que se han realizado, se ha girado el rotor únicamente vuelta y media, por lo que la variación de resistencia requerida es de 150Ω. La sensibilidad del potenciómetro es pues de 150Ω/540º, lo que es igual a 0.28 Ω/º.
Los dos terminales del potenciómetro entre los que hay una resistencia fija de 1KΩ se han conectado entre los terminales de tensión +12 y -12V, por lo que la tensión de alimentación aplicada es de 24V. La alimentación se ha buscado simétrica porque la tensión de entrada a la tarjeta del ordenador es también simétrica, variando entre ±5V.
Fig.10 Conexión del potenciómetro
El tercer terminal de resistencia variable junto con la señal GND forman la tensión de salida. Cuando VO es nula, el potenciómetro se encuentra en el punto central, es decir, con una resistencia de 500Ω.
Amplificación
La excursión de la medida es de 1.5 vueltas, lo que indica que el extremo inferior se encuentra a -0.75 vueltas y el superior a +0.75 vueltas. Como la tensión de alimentación es de 24 V:
Extremo inferior = -0.75 vueltas 24V 10 vueltas
× =−1 8. V (5.1)
Extremo superior = 0.75 vueltas 24 V 10 vueltas
× =1 8. V (5.2)
Ganancia del amplificador = 5V 1.8V
±
± =2 78. (5.3)
El amplificador utilizado ha sido un no inversor como se muestra la figura 9
Fig. 11 Esquema del amplificador de la señal del potenciómetro
La relación entre la tensión de salida y la de entrada en un amplificador no inversor, como ya se conoce, viene dada por la ecuación 5.3:
V R
R V
o =(1+ 2
1 i
) (5.4)
Como la ganancia había de ser de aproximadamente de 2.78, los valores de las resistencias utilizados fueron de 1KΩ para R1 y un potenciómetro de 2.2KΩ para R2. El amplificador que se hizo servir era del tipo OP07CP.
- Limitador de tensión
Fig.12 Esquema del limitador de tensión
En este caso, los amplificadores actúan como comparadores. Cuando la amplitud de la señal de entrada está entre las referencias, la señal de salida es igual que la de entrada. Si supera las referencias, en cambio, la señal de salida es igual a una de las referencias.
Se ha utilizado un TL072, ya que el circuito integrado contiene dos amplificadores operacionales. Los diodos son de baja corriente de fugas.
La referencia de +5V se ha conseguido con un circuito integrado REF02, el cual da una tensión continua muy estable de esa amplitud. Para obtener la referencia de -5V se ha invertido la señal de salida del REF02 con un inversor de tensión (figura 11) [Thom].
Fig.13 Inversor de tensión para la referencia de -5V.
[image:103.595.171.450.78.305.2]V R
R V
o = − 2
1
i (5.5)
Donde R1 = R2 = 1KΩ.
Acondicionamiento de la sonda Hall
El diagrama de bloques del funcionamiento de la sonda se muestra en la figura 12 Consta de una fuente de alimentación, una sonda Hall, un sistema de amplificación de la señal y un limitador de tensión.
Fig. 14 Diagrama de bloques del funcionamiento de la sonda Hall
A continuación se comenta con más detalle cada uno de los bloques.
- Fuente de corriente