Sunteți pe pagina 1din 24

Construcia i comanda manipulatorului folosit la sudarea elementului sensibil de suporii acestuia.

Elementul sensibil este un fir din Wolfram cu diametrul de 8 m. Suporii din srm de oel inox au diametrul de 0,3 mm.

Fig. 4. Schema cinematic a manipulatorului Calculul cinematic:

Caracteristica mecanismului urub-piuli este

X=

* MPP motor pas cu pas

Motorul pas cu pas utilizat are pasul unghiular =18= rezult pasul liniar (incrementul): x = ;

rad, de aici

= 1,876 mm, rezult x=0,0938 mm. Tabel 4. Date tehnice ale motorului SPS 15 RF de la firma MOATECH: Frecventa Rezistenta Drive max la Seria Aplicatie nominala Faze Mode pornire (PPS) grade VDC 7% 042K FDD 18 4.5 2 16 Bipolar 960 Cuplu(gfcm) Surub conducator Pull in Pull out Pas Pentru Cursa surub L surub viteza Tip de alimentare (mm) unghiulara la 400PPS la 1400PPS (mm) nula mm 26 10.15 12.29 1.876 19.8 37.5 Tensiune constanta Unghiul pasului Eroarea de poziionare a elementului sensibil fa de centrul suporilor este data de relatia: Tensiune

Fig. 4. Eroarea de poziionare a elementului sensibil

MPP este un motor bipolar cu dou bobine.

Fig 4. Schem motor bipolar cu dou bobine

Comanda motoarelor MPP se face cu ajutorul unei plci de dezvoltare ce are o arhitectur dezvoltat n jurul microcontrolerului ATMEGA 16. Interfaa dintre microcontroler i MPP se realizeaz cu ajutorul circuitului integrat L293 D. Pentru a comanda pe rnd, dou MPP bipolare n ambele sensuri de rotaie folosind acelai circuit L293 D s-a folosit un comutator bipolar ce

leag pe rnd 1Y i 4Y (dou din ieirile circuitului L293 D) cu fazele A1 i B1 ale lui MPP1 sau cu fazele A2 i B2 ale lui MPP2.

Fig. 5. Manipulator

Fig. 6. Placa de achiziie folosita pentru comanda motoarelor

Comanda s-a fcut n secven simpl de pire prin apsarea a dou butoane pentru deplasarea sarcinii S1 nainte napoi sau sus jos a sarcinii S2. Programul a fost dezvoltat n mediul de programare Mikro Pascal PRO for AVR.

Fig. 7. Schema legaturilor electrice intre L293H, motoare pas cu pas si comutator bipolar

program manipulator;

var i,j:word;

procedure pas(var arg:word); begin

case arg of 0: begin portb.1:=1;portd.4:=0;portb.3:=0;portd.5:=0;end; 1: begin portb.1:=0;portd.4:=1;portb.3:=0;portd.5:=0;end; 2: begin portb.1:=0;portd.4:=0;portb.3:=1;portd.5:=0;end; 3: begin portb.1:=0;portd.4:=0;portb.3:=0;portd.5:=1;end; end; delay_ms(350); end;

begin ddrb:=$0a; ddrd:=$30; ddra.0:=0; i:=400; while true do begin if pina.0=0 then begin i:=i+1; j:=i mod 4; pas(j); end; if pind.6=0 then begin i:=i-1; j:=i mod 4;

pas(j); end; end; end.

program tradvit2; {Acest program permite calibrarea unui anemometru cu senzor de viteza cu element sensibil cald. Caracteristica statica a anemometrului se

determina pornind de la rezultatele experimentale si alegand drept functie de aproximare functia U^2=U0^2+B*v^n, ai carei coeficienti se determina folosind metoda de aproximare in sensul celor mai mici patrate.} uses crt,graph,printer; {$L AX5411P.OBJ} {$I AX5411.INC}

type traductor=record nume:string; temp_atm:real; viteza:array[1..50] of real; tensiune:array[1..50] of real; cont:integer; a,b,n:real; end; x=array[1..10] of integer; y=array[1..1000] of integer; aa=array[1..3,1..3] of real;

var dio:x; a,a1,a2,a3:aa; al:array[1..3] of real; flag,fun:integer; tv_file:file of traductor;

tv:traductor; dat,ch:y;

o,o1,poz,i,np,l,j,x1,y1,y2,cod,m,xmaxim,ymaxim,k,dr,mo,start_ch,stop_ch,count:i nteger; cha:char; fx,fy,vmax,vmin,dv,v,p_atm,p,p_offset,rap_pres,putere,U,U0,U02,dU02,B,dB,n,dn, suma,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,d,da:real;

function ax5411(fun:integer;var dio:x):integer;external;

function putere_f(b,e:real):real; begin if b=0.0 then putere_f:=0.0 else putere_f:=exp(e*ln(b)); end;

function det_3(a:aa):real; begin det_3:=a[1,1]*a[2,2]*a[3,3]+a[1,2]*a[2,3]*a[3,1]+a[2,1]*a[3,2]*a[1,3] -a[3,1]*a[2,2]*a[1,3]-a[1,1]*a[2,3]*a[3,2]-a[1,2]*a[2,1]*a[3,3]; end;

procedure offset;

begin fun:=set_ch; dio[1]:=0; dio[2]:=0; flag:=ax5411(fun,dio);

fun:=nadc_ary; dio[1]:=1000; dio[2]:=ofs(dat); dio[3]:=timer_trg; dio[4]:=ofs(ch); flag:=ax5411(fun,dio); p_offset:=0; for j:=1 to 1000 do begin p_offset:=p_offset+dat[j]; end; p_offset:=p_offset/1000; end;

procedure lista; begin writeln('Lista traductoarelor de viteza:'); seek(tv_file,0); poz:=0;

while eof(tv_file)<>true do begin poz:=poz+1; read(tv_file,tv); writeln(poz:2,'. ',tv.nume); end; end;

begin clrscr; fun:=init; dio[1]:=$300;{IOPORT} dio[2]:=3;{IRQ LEVEL} dio[3]:=3;{DMA CHANNEL} flag:=AX5411(fun,dio); if flag <> 0 then writeln('Eroare de initializare a placii AX5411, flag = ',flag);

fun:=set_timer; dio[1]:=10; dio[2]:=10; flag:=ax5411(fun,dio);

fun:=set_gain; dio[1]:=1; flag:=ax5411(fun,dio);

count:=100; assign(tv_file,'C:\bp\bogatu\date_vi.dat');

repeat clrscr; writeln('1. Ridicare caracteristica anemometru (calibrare) si'); writeln(' determinerea caracteristicii acestuia folosind'); writeln(' metoda de aproximare in sensul celor mai mici patrate'); writeln('2. Reprezentare grafica'); writeln('3. Afisare date anemometru'); writeln('4. Imprimare date anemometru'); writeln('5. Determinare viteza cu ajutorul traductorului de viteza cu ajutaj'); writeln('Optiune: ');readln(o); reset(tv_file); clrscr; writeln; lista; writeln;

if o=1 then begin writeln('1. Calibrare traductor nou.'); writeln('2. Modificare traductor existent.'); writeln('Optiune: ');readln(o1);

writeln(''); if o1=2 then begin writeln('Numar ordine traductor de modificat din lista: ');readln(j); seek(tv_file,j); end; writeln('Nume traductor: '); readln(tv.nume);

i:=0;

clrscr; write('Introduceti valoarea temperaturii atmosferice (oC): ');readln(tv.temp_atm);

clrscr; writeln; writeln(' Nr. Presiune atm. Tensiunea'); writeln(' crt. p_atm (Pa) Presiunea p (Pa) Temp. atm. Viteza v2 (m/s) U(V)');

temp_atm (C)

offset;

fun:=set_ch; dio[1]:=0; dio[2]:=1;

flag:=ax5411(fun,dio);

repeat i:=i+1; repeat if i=1 then begin gotoxy(1,22);clreol; gotoxy(1,22);write('Pentru primul punct de pe curba de calibrare viteza aerului trebuie sa fie zero!'); end; repeat gotoxy(1,23);clreol; gotoxy(1,23);write('Dupa fixarea vitezei dorite se apasa orice tasta!');

fun:=nadc_ary; dio[1]:=2*count; dio[2]:=ofs(dat); dio[3]:=timer_trg; dio[4]:=ofs(ch); flag:=ax5411(fun,dio); p_atm:=0; p:=0; for j:=1 to count do begin p_atm:=p_atm+dat[2*j]; p:=p+dat[2*j-1];

end; p_atm:=689600*p_atm/4096/count;{Pa} p:=6888*(p/count-p_offset)/4096;{Pa} if p<0 then p:=abs(p);

gotoxy(1,i+4);write(i:3); gotoxy(9,i+4);write(p_atm:10:2); gotoxy(24,i+4);write(p:10:2); gotoxy(40,i+4);write(tv.temp_atm:6:2);

rap_pres:=p_atm/(p_atm+p);

tv.viteza[i]:=0.833635*sqrt(2009.28*(273.15+tv.temp_atm)*(1putere_f(rap_pres,0.2857))); if i=1 then tv.viteza[i]:=0; gotoxy(53,i+4);write(tv.viteza[i]:7:3); delay(500); until keypressed;

gotoxy(1,23);clreol; gotoxy(1,22);clreol; gotoxy(1,22);write('Introduceti valoarea tensiunii indicate de anemometru (V): ');read(tv.tensiune[i]); gotoxy(1,22);clreol; gotoxy(66,i+4);write(tv.tensiune[i]:7:3);

gotoxy(1,23);clreol; gotoxy(1,23);write('Doriti repetarea ultimei conversii? (d/n) '); cha:=readkey; until cha<>'d'; gotoxy(1,23);clreol; gotoxy(1,23);write('Doriti realizarea unei noi conversii? (d/n) '); cha:=readkey; until cha<>'d'; tv.cont:=i;

U0:=2;B:=0.5;n:=0.5; dU02:=0;dB:=0;dn:=0; U02:=U0*U0; l:=0; repeat l:=l+1; s1:=0;s2:=0;s3:=0;s4:=0;s5:=0;s6:=0;s7:=0;s8:=0;s9:=0;s10:=0; for i:=1 to tv.cont do begin if tv.viteza[i]=0 then s7:=s7+putere_f(tv.tensiune[i],2) else begin; s1:=s1+putere_f(tv.viteza[i],n); s2:=s2+putere_f(tv.viteza[i],2*n); s3:=s3+putere_f(tv.viteza[i],n)*ln(tv.viteza[i]); s4:=s4+putere_f(tv.viteza[i],2*n)*ln(tv.viteza[i]);

s5:=s5+putere_f(tv.viteza[i],n)*ln(tv.viteza[i])*ln(tv.viteza[i]); s6:=s6+putere_f(tv.viteza[i],2*n)*ln(tv.viteza[i])*ln(tv.viteza[i]); s7:=s7+putere_f(tv.tensiune[i],2); s8:=s8+putere_f(tv.tensiune[i],2)*putere_f(tv.viteza[i],n); s9:=s9+putere_f(tv.tensiune[i],2)*putere_f(tv.viteza[i],n)*ln(tv.viteza[i]); s10:=s10+putere_f(tv.tensiune[i],2)*putere_f(tv.viteza[i],n)*ln(tv.viteza[i]) *ln(tv.viteza[i]); end; end; {determinarea coeficientilor matricei sistemului de ec.} a[1,1]:=tv.cont; a[1,2]:=s1; a[1,3]:=B*s3; a[2,1]:=s1; a[2,2]:=s2; a[2,3]:=U02*s3+2*B*s4-s9; a[3,1]:=s3; a[3,2]:=s4; a[3,3]:=U02*s5+2*B*s6-s10;

al[1]:=-(tv.cont*U02+B*s1-s7); al[2]:=-(U02*s1+B*s2-s8); al[3]:=-(U02*s3+B*s4-s9);

for i:=1 to 3 do a1[i,1]:=al[i];

for i:=1 to 3 do begin a1[i,2]:=a[i,2]; a1[i,3]:=a[i,3]; end; for i:=1 to 3 do a2[i,2]:=al[i]; for i:=1 to 3 do begin a2[i,1]:=a[i,1]; a2[i,3]:=a[i,3]; end; for i:=1 to 3 do a3[i,3]:=al[i]; for i:=1 to 3 do begin a3[i,1]:=a[i,1]; a3[i,2]:=a[i,2]; end; da:=det_3(a); dU02:=det_3(a1)/da; dB:=det_3(a2)/da; dn:=det_3(a3)/da; U02:=U02+dU02; B:=B+dB; n:=n+dn; clrscr; writeln(l:2,U02:15:7,B:15:7,n:15:7,abs(dU02)+abs(dB)+abs(dn):15:9); until (abs(dU02)+abs(dB)+abs(dn)<0.0001) or (l>50);

tv.a:=U02; tv.b:=B; tv.n:=n; write(tv_file,tv); end;

if o=2 then begin writeln('Numar ordine traductor: ');read(j); seek(tv_file,j-1); read(tv_file,tv); dr:=detect; initgraph(dr,mo,'c:\bp\bgi'); {setbkcolor(blue);} xmaxim:=getmaxx; ymaxim:=getmaxy; line(25,5,25,ymaxim-30); line(25,ymaxim-30,xmaxim-25,ymaxim-30); line(xmaxim-25,ymaxim-30,xmaxim-25,5); line(xmaxim-25,5,25,5); outtextxy(xmaxim-200,ymaxim-25,'Viteza (m/s)'); settextstyle(0,1,1); outtextxy(15,50,'Tensiunea(V)'); fx:=(xmaxim-50)/tv.viteza[tv.cont]; fy:=(ymaxim-35)/tv.tensiune[tv.cont];

for i:=1 to tv.cont do begin {setcolor(red);} x1:=round(tv.viteza[i]*fx); y1:=ymaxim-30-round(tv.tensiune[i]*fy); circle(x1+25,y1,2); end; cha:=readkey; x1:=0; v:=-0.03; while x1<=round(tv.viteza[tv.cont]*fx) do begin v:=v+0.03; x1:=round(v*fx); y1:=ymaxim-30-round(sqrt(tv.a+tv.b*putere_f(v,tv.n))*fy); putpixel(x1+25,y1,white); end; cha:=readkey; closegraph; restorecrtmode; end;

if o=3 then begin writeln('Numar de ordine traductor: ');readln(j); seek(tv_file,j-1); read(tv_file,tv);

writeln(' Caracteristica traductorului de viteza obtinuta prin'); writeln(' folosirea metodei de aproximare in sensul celor mai mici'); writeln(' patrate este: U^2(V^2)=',tv.a:5:3,'+',tv.b:5:3,'*v^',tv.n:4:2); writeln; writeln(' Punctele de pe caracteristica traductorului obtinute'); writeln(' in urma calibrarii sunt: '); writeln; writeln(' ! viteza(m/s) !Tensiunea(V)!'); writeln(' !-------------!------------!'); for i:=1 to tv.cont do writeln(' ! ',tv.viteza[i]:7:3,' ! ',tv.tensiune[i]:7:3,' !'); end;

if o=4 then begin writeln('Numar de ordine traductor: ');readln(j); seek(tv_file,j-1); read(tv_file,tv); writeln(lst,' Caracteristica traductorului de viteza obtinuta prin'); writeln(lst,' folosirea metodei de aproximare in sensul celor mai mici'); writeln(lst,' patrate este: U^2(V^2)=',tv.a:5:3,'+',tv.b:5:3,'*v^',tv.n:4:2); writeln(lst,''); writeln(lst,' Punctele de pe caracteristica traductorului obtinute'); writeln(lst,' in urma calibrarii sunt: '); writeln(lst,''); writeln(lst,' ! viteza(m/s) !Tensiunea(V)!');

writeln(lst,' !-------------!------------!'); for i:=1 to tv.cont do writeln(lst,' ! ',tv.viteza[i]:7:3,' ! ',tv.tensiune[i]:7:3,' !'); end;

if o=5 then begin offset; fun:=set_ch; dio[1]:=0; dio[2]:=1; flag:=ax5411(fun,dio);

write('Introduceti valoarea temperaturii atmosferice (oC): ');readln(tv.temp_atm); repeat fun:=nadc_ary; dio[1]:=2*count; dio[2]:=ofs(dat); dio[3]:=timer_trg; dio[4]:=ofs(ch); flag:=ax5411(fun,dio); p_atm:=0; p:=0; for j:=1 to count do begin p_atm:=p_atm+dat[2*j];

p:=p+dat[2*j-1]; end;

p_atm:=689600*p_atm/4096/count;{Pa} p:=6888*(p/count-p_offset)/4096;{Pa} if p<0 then p:=abs(p); rap_pres:=p_atm/(p_atm+p);

v:=0.833635*sqrt(2009.28*(273.15+tv.temp_atm)*(1putere_f(rap_pres,0.2857)));

clrscr; writeln('Viteza la iesirea din ajutaj este: ',v:5:2,' m/s'); delay(500); until keypressed; end;

writeln('Doriti iesirea din program ? D/N:'); until readkey='d'; close(tv_file); end.

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