Experimente mit dem Laser HP5517
Auswerte-Elektronik für die Messanordnung



Die Messanordnung erzeugt zwei Signale, die miteinander verglichern werden müssen. Der Laser-Head (5517) erzeugt in Verbindung mit der magnetischen Frequenzaufspaltung ein Referenz-Signal (REF) und die Empfangseinheit (A10780C) erzeugt das eigentliche Mess-Signal (MEAS). In der Ruhelage stellt sich bei beiden Signalen die gleiche Frequenz von etwa 3,5MHz ein. Sobald das Messobjekt eine Ortsveränderung erfährt, ändert sich die Frequenz MEAS. Die Messeinrichtung hat also die Aufgabe, die Frquenz-Differenz auszuwerten und anzuzeigen.

Im Folgenden stelle ich eine Lösung vor, die an die Hardware so gut wie keine Anforderung stellt und für Experimente mit diesem Laser-Mess-System völlig ausreicht. Es kommt ein Mkrorechner von ATMEL, der MEGA2560/1, zur Anwendung. Der Grund für die Auswahl des Prozessors ist allein die Anforderung, zwei getrennte 16Bit Timer/Zähler zur Verfügung zu haben - es kann also jeder Prozessor mit dieser Ausrüstung verwendet werden.

An den Eingängen wird das Signal vom Laser-Head und vom Receiver etwas aufbereitet und dann direkt auf die Zähler-Eingänge geleitet. An einem freien Port wird ein zweizeiliges Display angeschlossen und mehr ist nicht erforderlich.
Die Spannungsversorgung sollte so ausgelegt werden, dass der Receiver A10780 mit versorgt werden kann. Zu diesem Zweck habe ich einen Spannungstransverter von 5V auf 15V auf die Schaltung gesetzt.


Software für den Prozessor MEGA2560




// Testprogramm für Experimente mit LASER-Mess-System

// S.Taborek 15.10.2009
// Entwicklungs-Sytem: AVRco /ELAB
//

program IFMess02;


{$NOSHADOW}
{ $WG}                     {global Warnings off}


Device = mega2561, VCC=5;

{ $BOOTRST $1F000}         {Reset Jump to $1F000}

Import SysTick,  LCDport;

From System Import  LongInt;


Define
  ProcClock      = 16000000;       {Hertz}
  SysTick        = 10;             {msec}
  //  Scheduler      = iData;
  StackSize      = $0064, iData;
  FrameSize      = $0064, iData;
  LCDport        = PortG, 0, PortB, 4;
  LCDtype        = 44780;
  LCDrows        = 4, 2;           {rows, enables}
  LCDcolumns     = 40;             {columns per line}



Implementation



{$IDATA}



{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}

var
  lcount_lw            : longword;
 
  T1_H                 : word;
  T3_H                 : word;
 
 
  lc0                  : word;
  lc1                  : word;
  lc3                  : word;
 
  llc0,llc1, dq        : longint;

  lcstr, hstr          : string[27];

  LED0[@PortF,0]       : bit;
  LED1[@PortF,1]       : bit;
  LED2[@PortF,2]       : bit;
  LED3[@PortF,3]       : bit;
 
  CtMR[@PortB,0]       : bit;    // MR des Counter-IC

  up_1, dn_1           : boolean;

  a,b,c, diff          : longint;

  sec                  : word;

  mess, w              : boolean;
 
  i                   : byte;
  j : word;
 
  c1   : array[0..255] of word;
  c3   : array[0..255] of word;


{--------------------------------------------------------------}
{Interrupts}



{ $NoSave}
{--------------------------I-----------------------------------}
Interrupt Timer1;    //Ausgelöst von Timer1  (REF)
{--------------------------------------------------------------}
// ca aller 26 msec
// Zum Zeitpunkt des Lesens des Registers TCNT3L hat der Counter3
// genau 3 Takte (bei 2,5MHz) weitergezählt, wenn Counter1 die
// selbe Frequenz am Eingang zählt ( REF = MEAS).
begin
  DisableInts;
    lc1 := TCNT3;
  EnableInts;
  inc(T1_H);
  c1[i] :=  lc1;
  inc(i);
end;



{$NoSave}
{--------------------------I-----------------------------------}
Interrupt Timer3;    //Ausgelöst von Timer3  (MEAS)
{--------------------------------------------------------------}
// ca aller
begin
  inc(T3_H);
end;



{--------------------------------------------------------------}
{ functions }



{--------------------------------------------------------------}
procedure LCD_Init;
{--------------------------------------------------------------}
begin
  mdelay(200);
  LCDUpper;
  LCDXY(0,0); Write(LCDOut,  Interferometrische Messung );
  LCDXY(0,1); Write(LCDOut,  S. Taborek 10/2009 );
  LCDLower;
  LCDXY(0,0); Write(LCDOut,  Position:  );
  LCDxy(0,1); Write(LCDOut,  Richtung: );
  mdelay(100);
end;



{--------------------------------------------------------------}
procedure LCD_Clear;
{--------------------------------------------------------------}
begin
  LCDUpper;
  LCDClr;
  LCDcursor(true, false);              { display 1 on, cursor off & no blink }
  LCDLower;
  LCDClr;
  LCDcursor(false, false);              { display 2 on, cursor off & no blink }
  mdelay(100);
end;




{--------------------------------------------------------------}
{ Main Program }
{$IDATA}



begin
  DDRF     := DDRF or %1;            // Bit0 für LED,
  PortF    := PortF or %1;            // PullUp für F0

  DDRD     := DDRD and $FE;          // ...   Int0

  //---Externer Interrupt Int0
 
//  EIMSK    := EIMSK and %11111110;   // zunächst Int0 sperren
  EICRA    := EICRA or  %00000010;   // bei falling edge





  EnableInts;
  mdelay(400);  //Zeit für Anschaltung des LCD-Processors
  LCD_Clear;    //erst jetzt initialisieren!  nach $LCDNOINIT
  LCD_Init;
  DisableInts;



//---------TIMER1---------
  TIMSK1   := TIMSK1 or %1;          // ISR Timer-Overflow  für Timer1
  TCCR1A   := %00000000;
  TCCR1B   := %00000110;             // External Clock on T1 falling edge
 
//---------TIMER3---------           // MEAS
  TIMSK3   := TIMSK3 or %1;          // ISR Timer-Overflow für Timer3
  TCCR3A   := %00000000;
  TCCR3B   := %00000110;             // External Clock on T3 falling edge


  T1_H := 0;
  T3_H := 0;
  i := 0;
  EnableInts;
  mdelay(2000);   // Messung läuft
  DisableInts;



  sec := 0;
  dq := 0;

  diff := 0;
  w := false;



  loop

    inc(sec);
   

    if not w then
      w := true;
      lcstr :=   ;
      for j := 1 to 3 do
        lc0 := c0[j];
        lc1 := c0[j+1];
        diff := longint(lc0) - longint(lc1);
        if diff < 0 then
          diff := diff +$FFFF;
        endif;
        lcstr := lcstr +    +LongToStr(diff);
      endfor;
      LCDUpper;
      LCDXY(0,0);
      Write(LCDOut, lcstr);

      lcstr :=   ;
      for j := 1 to 3 do
        lc0 := c0[j+3];
        lc1 := c0[j+4];
        diff := longint(lc0) - longint(lc1);
        if diff < 0 then
          diff := diff +$FFFF;
        endif;
        lcstr := lcstr +    +LongToStr(diff);
      endfor;
      LCDUpper;
      LCDXY(0,1);
      Write(LCDOut, lcstr);

      lcstr :=   ;
      for j := 1 to 3 do
        lc0 := c0[j+6];
        lc1 := c0[j+7];
        diff := longint(lc0) - longint(lc1);
        if diff < 0 then
          diff := diff +$FFFF;
        endif;
        lcstr := lcstr +    +LongToStr(diff);
      endfor;
      LCDLower;
      LCDXY(0,0);
      Write(LCDOut, lcstr);

      lcstr :=   ;
      for j := 1 to 3 do
        lc0 := c0[j+9];
        lc1 := c0[j+10];
        diff := longint(lc0) - longint(lc1);
        if diff < 0 then
          diff := diff +$FFFF;
        endif;
        lcstr := lcstr +    +LongToStr(diff);
      endfor;
      LCDLower;
      LCDXY(0,1);
      Write(LCDOut, lcstr);
    endif;

    LED0 := not LED0;
    mdelay(500);
  endloop;

end IFMess02.