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


Retour en haut de la page.