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.