Ce programme a pour but de commander le déplacement de la soude (en utilisant le programme lcreadOX pour la traduction en langage binaire). Il a également pour but d enregistrer la vibration de tous les points du wafer tout au long de la manipulation et de les enregistrer dans des fichier du type : X=….,Y=….. .trc.
Voici le code réalisé sous Matlab, qui nous a permit de faire ce programme.
%% PROGRAMME PRINCIPAL
%19-12-08
%S/N=-3.3 dBm
% h= oscilloscope LeCroy Wavesurfer 42Xs
% k= controleur table de translation X/Y ESP300
%% DECLARATION DES VARIABLES
%%% ATTENTION: les parametres de temporisation(entre autre) dependent du type de mesure
%%% effectué. Il ne faut pas oublier de les régler en consequence avant chaque
%%% lancement de ce programme.
tic
Naverage=50; % nombre de moyennes
imax=151; % nbre total de lignes
jmax=231; % nbre total de colonnes
tempo=0.5;
pas=0.3; % pas de deplacement en mm (le meme suivant X et Y ici)
Nmesure=0; % compteur de mesures
pasY=['2PR-',num2str(pas)]; % Y toujours dans le sens negatif
valmax=0.430; %sensibilite au max du signal (a l'endroit de l'impact)
%seuil=0.070; %seuil en dessous duquel on est hors wafer
% position initiale
Y=0;
X=0;
%nombre de points de mesures : jmax*imax
% i=Y/pas+1
% j=X/pas+1
%% INITIALISATION DU SCOPE POUR LES MESURES
h = actxserver('Lecroy.XStreamDSO'); % pour établir la communication avec l'application du scope
ID = h.Item('InstrumentID').Value
hAcq = h.Object.Item('Acquisition');
hAcq.Object.Item('C1').Item('View').Value = true; % voie 1 activee
hAcq.Object.Item('C2').Item('View').Value = false; % voie 2 desactivee
%hAcq.Object.Item('C1').Item('VerScale').Value=0.2; % sensibilite verticale: 200mV/div
%hAcq.Object.Item('C1').Item('Coupling').Value='DC1M' ; % couplage DC1M ?
hAcq.Object.Item('C1').Item('AverageSweeps').Value=1; % pas de moyennage sur C1!!!!!!
hAcq.Object.Item('Horizontal').Item('MaxSamples').Value = 500000 ;
hAcq.Object.Item('Horizontal').Item('Source').Value = 'ExtDivide10' ; % sélection source ext/10 pour le trigger
% hAcq.Object.Item('Horizontal').Item('HorScale').Value =0.010 ;
% hAcq.Object.Item('Horizontal').Item('HorOffset').Value =-0.0498 ;
% hAcq.Object.Item('Horizontal').Item('HorScale').Value =0.000005 ;
% hAcq.Object.Item('Horizontal').Item('HorOffset').Value =-0.000167 ;
%hAcq.Object.Item('Horizontal').Item('HorScale').Value = 0.00005 ; % sensibilite horizontale 50microsec/Div
hAcq.Object.Item('C1').Item('VerScaleVariable').Value=true; % sensibilite verticale variable
hAcq.Object.Item('C1').Item('VerOffset').Value=0; % pas d'offset vertical
%% INITIALISATION DES PARAMETRES POUR LES MESURES DES VALEURS PEAK TO PEAK
% (vont servir pour le "fullscale" en vertical)
hMeas= h.Object.Item('Measure');
hMeas.Object.Item('P1').Item('Source1').Value='C1';
hMeas.Object.Item('P1').Item('ParamEngine').Value='PeakToPeak';
%% INITIALISATION DES PARAMETRES POUR LES MOYENNES
hMath=h.Object.Item('Math');
hMath.Object.Item('F1').Item('Source1').Value='C1';
hMath.Object.Item('F1').Item('Operator1').Value='Average';
hMath.Object.Item('F1').Item('View').Value=true;
hMath.Object.Item('F1').Object.Item('Operator1Setup').Item('AverageType').Value='Summed';
hMath.Object.Item('F1').Object.Item('Operator1Setup').Item('Sweeps').Value=Naverage;
%% INITIALISATIONS POUR LA SAUVEGARDE DES DONNEES
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('SaveTo').Value='File';
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('SaveSource').Value='F1';
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('WaveFormat').Value='Binary';
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('BinarySubFormat').Value='Word';
% sous-format binaire=byte,word ou auto(voir p.60,107 et 281 du Remote
% Control Manual de LeCroy)
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('WaveformDir').Value='E:\mesures manip\LAAS_D3_wafer-entier-29-01-09\';
%% DEBUT DE L'ACQUISITION
% communication avec l'ESP300
k=gpib('ni',0,1);
k.EOImode='off';
k.EOSmode='read&write';
k.EOSCharcode='CR';
fopen(k) % ouverture de la communication
fprintf(k,'1VA0.8') % vitesse de la translation 1
fprintf(k,'2VA0.8')
fprintf(k,'1AC100') % acceleration tramslation 1
fprintf(k,'2AC100')
fprintf(k,'1AG100') % decceleration tranlsation 1
fprintf(k,'2AG100')
%% mesure 1er point
hAcq.Item('TriggerMode').Value='Normal'; % declenchement en mode normal
ActNow(hAcq.Object.Item('C1').Item('ClearSweeps'));
hAcq.Object.Item('C1').Item('VerScale').Value=valmax; % le signal ne doit pas depasser de l'ecran
pause(0.4)
% Fullscale en vertical
% hAcq.Object.Item('Horizontal').Item('HorScale').Value =0.00002 ;
% hAcq.Object.Item('Horizontal').Item('HorOffset').Value =-0.0001 ;
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value % lit le pk to pk de C1
calcvertscale=pkpkC1/7; % calcul de la nouvelle valeur de sensibilité vert
hAcq.Object.Item('C1').Item('VerOffset').Value=0; % pas d'offset vertical
hAcq.Object.Item('C1').Item('VerScale').Value=calcvertscale; % envoi de la valeur
newvertscale=hAcq.Object.Item('C1').Item('VerScale').Value; % nouvelle
valeur de la sensibilité verticale réellement appliquée par l'oscillo
pause(.3) % necessaire sinon valeur mal actualisee
% hAcq.Object.Item('Horizontal').Item('HorScale').Value =0.02 ;
% hAcq.Object.Item('Horizontal').Item('HorOffset').Value =-0.1 ;
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value
while (get(hMath.Object.Item('F1').Out.Result,'Sweeps'))<Naverage
pause(0.1) % attend que le moyennage soit fini
end
hAcq.Item('TriggerMode').Value='Stop'; % on arrête le déclenchement à la fin de la mesure
Nmesure=Nmesure+1
% fprintf('mesure n=%d effectuee !\n',Nmesure);
% fprintf('point de mesure : (X,Y)=(%g,%g)\n\n',X,Y);
file_name=['X=', num2str(X),'_Y=',num2str(Y),'_'];
% sauvegarde de la mesure
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('TraceTitle').Value=file_name;
ActNow(h.Object.Item('SaveRecall').Object.Item('Waveform').Item('DoSave'));
% display('mesure sauvegardee !');
%else
% display('hors wafer, pas de sauvegarde')
%% deplacement 1ere ligne(i=1)
for j=1:(jmax-1) % boucle sur les colonnes
pasX=['1PR-',num2str(pas)];
fprintf(k,pasX)
X=X+pas;
pause(tempo)
% mesure 1ere ligne
hAcq.Item('TriggerMode').Value='Normal'; % declenchement en mode normal
ActNow(hAcq.Object.Item('C1').Item('ClearSweeps'));
hAcq.Object.Item('C1').Item('VerScale').Value=valmax ; % le signal ne doit pas depasser de l'ecran
pause(0.4)
% Fullscale en vertical
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value; % lit le pk to pk de C1
calcvertscale=pkpkC1/7; % calcul de la nouvelle valeur de sensibilité vert
hAcq.Object.Item('C1').Item('VerOffset').Value=0; % pas d'offset vertical
hAcq.Object.Item('C1').Item('VerScale').Value=calcvertscale; % envoi de la valeur
newvertscale=hAcq.Object.Item('C1').Item('VerScale').Value; % nouvelle
valeur de la sensibilité verticale réellement appliquée par l'oscillo
pause(.3)
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value;
%display('c''est bon!')% test to avoid points outside wafer, to be tuned
while (get(hMath.Object.Item('F1').Out.Result,'Sweeps'))<Naverage
pause(0.1) % attend que le moyennage soit fini
end
hAcq.Item('TriggerMode').Value='Stop'; % on arrête le déclenchement à la fin de la mesure
Nmesure=Nmesure+1
%fprintf('mesure n=%d effectuee !\n',Nmesure);
%fprintf('point de mesure : (X,Y)=(%g,%g)\n\n',X,Y);
file_name=['X=', num2str(X),'_Y=',num2str(Y),'_'];
% sauvegarde de la mesure
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('TraceTitle').Value=file_name;
ActNow(h.Object.Item('SaveRecall').Object.Item('Waveform').Item('DoSave'));
% display('mesure sauvegardee !');
%else
% display('hors wafer, pas de sauvegarde')
end
% debut de la boucle sur l'indice i (a partir de la 2eme ligne)
for i=2:imax
% choix du sens de deplacement des X suivant la parite de la
% ligne
if(mod(i,2)==1)
% cas ou i est impair = ligne impaire = mesure de gauche a droite =
% deplacement -X pour la table
pasX=['1PR-',num2str(pas)];
X=0;
else
% cas ou i est pair = deplacement +X pour la table
pasX=['1PR',num2str(pas)];
X=(jmax-1)*pas;
end
fprintf(k,pasY)
Y=Y+pas;
pause(tempo)
hAcq.Item('TriggerMode').Value='Normal'; % declenchement en mode normal
ActNow(hAcq.Object.Item('C1').Item('ClearSweeps'));
hAcq.Object.Item('C1').Item('VerScale').Value=valmax ; % le signal ne doit pas depasser de l'ecran
pause(0.4)
% Fullscale en vertical
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value; % lit le pk to pk de C1
calcvertscale=pkpkC1/7; % calcul de la nouvelle valeur de sensibilité vert
hAcq.Object.Item('C1').Item('VerOffset').Value=0; % pas d'offset vertical
hAcq.Object.Item('C1').Item('VerScale').Value=calcvertscale; % envoi de la valeur
newvertscale=hAcq.Object.Item('C1').Item('VerScale').Value; % nouvelle
valeur de la sensibilité verticale réellement appliquée par l'oscillo
pause(.3)
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value;
%display('c''est bon!')% test to avoid points outside wafer, to be tuned
while (get(hMath.Object.Item('F1').Out.Result,'Sweeps'))<Naverage
pause(0.1) % attend que le moyennage soit fini
end
hAcq.Item('TriggerMode').Value='Stop'; % on arrête le déclenchement à la fin de la mesure
Nmesure=Nmesure+1
%fprintf('mesure n=%d effectuee !\n',Nmesure);
% fprintf('point de mesure : (X,Y)=(%g,%g)\n\n',X,Y);
file_name=['X=', num2str(X),'_Y=',num2str(Y),'_'];
% sauvegarde de la mesure
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('TraceTitle').Value=file_name;
ActNow(h.Object.Item('SaveRecall').Object.Item('Waveform').Item('DoSave'));
% display('mesure sauvegardee !');
% else
% display('hors wafer, pas de sauvegarde')
% debut de la boucle sur j ( i.e sur les colonnes)
for j=1:jmax-1
fprintf(k,pasX) % deplacement selon x
if(mod(i,2)==1)
% cas ou i est impair = mesure de gauche a droite = deplacement -X
X=X+pas;
else
%cas ou i est pair = mesure de droite a gauche = deplacement +X
X=X-pas;
end
if(X<1e-4) %elimine les resultats bizarres du genre 1e-14 au lieu de 0
X=0;
end
pause(tempo)
% mesure
hAcq.Item('TriggerMode').Value='Normal'; % declenchement en mode normal
ActNow(hAcq.Object.Item('C1').Item('ClearSweeps'));
hAcq.Object.Item('C1').Item('VerScale').Value=valmax ; % le signal ne doit pas depasser de l'ecran
pause(0.4)
% Fullscale en vertical
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value ;% lit le pk to pk de C1
calcvertscale=pkpkC1/7; % calcul de la nouvelle valeur de sensibilité vert
hAcq.Object.Item('C1').Item('VerOffset').Value=0; % pas d'offset vertical
hAcq.Object.Item('C1').Item('VerScale').Value=calcvertscale; % envoi de la valeur
newvertscale=hAcq.Object.Item('C1').Item('VerScale').Value; % nouvelle
valeur de la sensibilité verticale réellement appliquée par l'oscillo
pause(.3)
pkpkC1=hMeas.Object.Item('P1').Out.Result.Value;
% display('c''est bon!')% test to avoid points outside wafer, to be tuned
while (get(hMath.Object.Item('F1').Out.Result,'Sweeps'))<Naverage
pause(0.1) % attend que le moyennage soit fini
end
hAcq.Item('TriggerMode').Value='Stop'; % on arrête le déclenchement à la fin de la mesure
Nmesure=Nmesure+1
% fprintf('mesure n=%d effectuee !\n',Nmesure);
% fprintf('point de mesure : (X,Y)=(%g,%g)\n\n',X,Y);
file_name=['X=', num2str(X),'_Y=',num2str(Y),'_'];
% sauvegarde de la mesure
h.Object.Item('SaveRecall').Object.Item('Waveform').Item('TraceTitle').Value=file_name;
ActNow(h.Object.Item('SaveRecall').Object.Item('Waveform').Item('DoSave'));
% display('mesure sauvegardee !');
% else
%
display('hors wafer, pas de sauvegarde')
end
end % fin de la boucle sur j = sur les colonnes = sur les X
% fin de la boucle sur i = sur les Y
%% FIN DE CONNECTION AVEC LE SCOPE ET L'ITL09
fclose(k)
delete(k)
h.delete
clear all
toc