Program HP3586B_Selective_Voltmeter; {By Jack Smith K8ZOA} {19 October 2008} {Program controls an HP3586B selective voltmeter} Const HP3586B_Addr = 16; TimeOut = 5; //wait for 5 seconds CR = 13; //carriage return LF = 10; //line feed TabVal = 9; //tab character ListUpper = 19; Nsamp = 5; //number of samples for median Type Tsample = Array[1..Nsamp] of Single; Var answer : string; // for holding answer from machine Tab : String; //holds tab filename : String; // save file name, of coursec CRLF : String; // carriage return and line feed InitStr : Array[0..15] of String; //initialization commands CommentStr : Array[0..15] of String; //for display of what's going on FreqList : Array[0..ListUpper] of String; CallList : Array[0..ListUpper] of String; Bandwidth : Array[0..ListUpper] of String; NumericFreq : Array[0..ListUpper] of Double; DStr : Array[0..ListUpper] of String; //hold delta values for later write {--------------------} Procedure Initialize; {--------------------} Var i : Integer; tstr : String; Begin InitStr[0] := 'M1'; CommentStr[0] := 'Low Distortion Mode [better IMD]'; InitStr[1] := 'M4'; CommentStr[1] := 'SSB Carrier Mode'; InitStr[2] := 'R2'; CommentStr[2] := '100 dB Mode'; InitStr[3] := 'A0'; CommentStr[3] := 'Average OFF'; InitStr[4] := 'F1'; CommentStr[4] := 'Full scale automatic'; InitStr[5] := 'U1'; CommentStr[5] := 'DBM units'; InitStr[6] := 'T2'; CommentStr[6] := '75 ohm termination on input'; InitStr[7] := 'E1'; CommentStr[7] := 'Enter carrier'; InitStr[8] := 'CH2'; CommentStr[8] := 'USB mode'; InitStr[9] := 'CN1'; CommentStr[9] := 'Counter ON'; InitStr[10] := 'B1'; CommentStr[10] := 'Bandwidth select'; InitStr[11] := 'CA0'; CommentStr[11] := 'Automatic Calibration OFF'; InitStr[12] := ''; CommentStr[12] := ''; InitStr[13] := ''; CommentStr[13] := ''; InitStr[14] := ''; CommentStr[14] := ''; InitStr[14] := ''; CommentStr[15] := ''; FreqList[0] := '570' ; CallList[0] := 'WTNT' ; Bandwidth[0] := 'B1'; FreqList[1] := '630' ; CallList[1] := 'WMAL' ; Bandwidth[1] := 'B1'; FreqList[2] := '730' ; CallList[2] := 'WXTR' ; Bandwidth[2] := 'B1'; FreqList[3] := '780' ; CallList[3] := 'WAVA' ; Bandwidth[3] := 'B1'; FreqList[4] := '950' ; CallList[4] := 'WCTN' ; Bandwidth[4] := 'B1'; FreqList[5] := '980' ; CallList[5] := 'WTEM' ; Bandwidth[5] := 'B1'; FreqList[6] := '1120' ; CallList[6] := 'WUST' ; Bandwidth[6] := 'B1'; FreqList[7] := '1220' ; CallList[7] := 'WFAX' ; Bandwidth[7] := 'B1'; FreqList[8] := '1260' ; CallList[8] := 'WWRC' ; Bandwidth[8] := 'B1'; FreqList[9] := '1310' ; CallList[9] := 'WDCT' ; Bandwidth[9] := 'B1'; FreqList[10] := '1460' ; CallList[10] := 'WEMD' ; Bandwidth[10] := 'B1'; FreqList[11] := '1480' ; CallList[11] := 'WPWC' ; Bandwidth[11] := 'B1'; FreqList[12] := '1500' ; CallList[12] := 'WWWT' ; Bandwidth[12] := 'B1'; FreqList[13] := '1580' ; CallList[13] := 'WPGC' ; Bandwidth[13] := 'B1'; FreqList[14] := '1690' ; CallList[14] := 'WPTX' ; Bandwidth[14] := 'B1'; FreqList[15] := '760' ; CallList[15] := 'WJR' ; Bandwidth[15] := 'B1'; FreqList[16] := '' ; CallList[16] := '' ; Bandwidth[16] := ''; FreqList[17] := '' ; CallList[17] := '' ; Bandwidth[17] := ''; FreqList[18] := '' ; CallList[18] := '' ; Bandwidth[18] := ''; FreqList[19] := '' ; CallList[19] := '' ; Bandwidth[19] := ''; i := 0; While FreqList[i] <> '' Do Begin tstr := FreqList[i]; //EZGPIB_ScreenWrite(tstr+' : '); NumericFreq[i] := 1000.0 * EZGPIB_ConvertToFloatNumber(tstr); //EZGPIB_ScreenWriteln(NumericFreq[i]); i := i+1; End; For i := 0 to ListUpper-1 Do Dstr[i] := '0.0'; End; {-------------------------} Procedure Setup_Prologix; {-------------------------} Begin EZGPIB_ScreenClear; EZGPIB_ScreenWrite('HP3586B Control--GPIB Address Scan start at '); EZGPIB_ScreenWriteln(EZGPIB_TimeNow); EZGPIB_BusFindAllDevices; EZGPIB_ScreenWrite('Finished Scan at '); EZGPIB_ScreenWriteln(EZGPIB_TimeNow); CRLF := Chr(CR)+Chr(LF); Tab := Chr(TabVal); End; {----------------------------} procedure writefileheader; {----------------------------} Var tstr : String; i : Integer; begin; EZGPIB_ScreenWriteln('Enter file name and path '); filename := EZGPIB_kbdReadln; EZGPIB_ScreenWriteln(' '); EZGPIB_filedelete(filename); // If the file exists, delete it EZGPIB_fileclearbuffer; // Clear the file's Dataline EZGPIB_fileaddtobuffer('HP3586B Selective Voltmeter Run'); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; EZGPIB_fileaddtobuffer(EZGPIB_TimeNow); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; EZGPIB_ScreenWriteln('Comments?'); tstr := EZGPIB_kbdReadln; EZGPIB_ScreenWriteln(' '); EZGPIB_fileclearbuffer; EZGPIB_fileaddtobuffer(tstr); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; EZGPIB_fileaddtobuffer('------------------'); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; EZGPIB_fileaddtobuffer(CRLF+'HP3586 Setup Commands'); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; i := 0; //write setup commands to header While InitStr[i] <> '' Do Begin tstr := InitStr[i] + Tab + CommentStr[i]; EZGPIB_fileaddtobuffer(tstr); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; i := i+1; End; //write call and frequency list to header EZGPIB_fileaddtobuffer(CRLF+'Freq'+tab+'Call'+Tab+'BW'); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; i := 0; While FreqList[i] <> '' Do Begin tstr := FreqList[i] + Tab + CallList[i] + Tab + Bandwidth[i]; EZGPIB_fileaddtobuffer(tstr); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; i := i+1; End; EZGPIB_fileaddtobuffer(CRLF); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; //write callsign header tstr := 'Date/Time'+tab; i := 0; While FreqList[i] <> '' Do Begin tstr := tstr + CallList[i] + Tab i := i+1 End; i := 0; While FreqList[i] <> '' Do Begin tstr := tstr + CallList[i] + Tab i := i+1 End; EZGPIB_fileaddtobuffer(tstr); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; tstr := tab; //write frequency header i := 0; While FreqList[i] <> '' Do Begin tstr := tstr + FreqList[i] + Tab i := i+1 End; i := 0; While FreqList[i] <> '' Do Begin tstr := tstr + FreqList[i] + Tab i := i+1 End; EZGPIB_fileaddtobuffer(tstr); EZGPIB_filewrite(filename); EZGPIB_fileclearbuffer; end; {--------------------------------------------} Function GetMedian(dat : TSample) : Single; {--------------------------------------------} Var i : Integer; temp : Single; Last : Integer; Current : Integer; mid : Integer; Begin //bubble sort from Oh! Pascal! For Last := Nsamp downto 2 Do For Current := 1 to Last-1 Do Begin If dat[current] < dat[current+1] Then //swap Begin temp := dat[current]; dat[current] := dat[current+1] dat[current+1] := temp; End; End; //display results For i := 1 to Nsamp Do //Begin // EZGPIB_ScreenWrite(i); // EZGPIB_ScreenWrite(' '); // EZGPIB_ScreenWriteln(dat[i]); //End; mid := 1 + (Nsamp DIV 2); //Result := dat[mid]; Result := (dat[mid-1] + dat[mid] + dat[mid+1])/ 3.0 //EZGPIB_ScreenWrite('mid '); //EZGPIB_ScreenWrite(mid); End; {-----------------------} Procedure Setup_HP3586B; {-----------------------} Var i : Integer; Begin i := 0; EZGPIB_ScreenWriteln('Initializing HP3586B'); While InitStr[i] <> '' Do Begin EZGPIB_buswritedata(HP3586B_Addr,InitStr[i]); EZGPIB_ScreenWriteln(CommentStr[i]); i := i+1; End; End; {-----------------------} Procedure Read_HP3586B; {-----------------------} Var tstr : String; //temp string i,j : Integer; //counter SigStr : String; //string representation of signal strength FreqStr : String; //string representation of frequency Delta : Double; //frequency error measured to nominal SigSamp, //array with samples FreqSamp : TSample; SigMedian, FreqMedian : Single; //median signal and frequency Begin EZGPIB_TimeWaitForMultipleOf(60); //wait for start of minute EZGPIB_ScreenWriteln(' '); EZGPIB_ScreenWrite('Calibrate Cycle Start at '); EZGPIB_ScreenWriteln(EZGPIB_TimeNow); EZGPIB_buswritedata(HP3586B_Addr,'CA1'); //calibrate ON EZGPIB_buswritedata(HP3586B_Addr,'CL'); //start CAL cycle EZGPIB_TimeSleep(10); //allow 10 seconds for calibration EZGPIB_buswritedata(HP3586B_Addr,'MC'); // measurement continue at end EZGPIB_buswritedata(HP3586B_Addr,'CN1'); //counter on EZGPIB_buswritedata(HP3586B_Addr,'CA0'); //calibration off EZGPIB_ScreenWriteln('Finished with Calibrate Cycle'); EZGPIB_ScreenWriteln(''); EZGPIB_ScreenWriteln('-----------------------------------------------'); EZGPIB_fileclearbuffer; //clear the buffer to stash new data EZGPIB_fileaddtobuffer(EZGPIB_TimeNow); //date/time data at head of buffer While FreqList[i] <> '' Do //cycle through the frequency list Begin EZGPIB_ChangeLED; //flash the LED to show pgm is running EZGPIB_buswritedata(HP3586B_Addr,'FR'+FreqList[i]+'KZ'); //set 3586B to frequency EZGPIB_buswritedata(HP3586B_Addr,'MC'); //continue with measurement For j := 1 to Nsamp Do Begin EZGPIB_buswritedata(HP3586B_Addr,'TR'); If EZGPIB_BusWaitForData(HP3586B_Addr,Answer,Timeout) Then Begin SigStr := EZGPIB_ConvertStripToNumber(EZGPIB_StringNthArgument(1,Answer,',')); FreqStr := EZGPIB_ConvertStripToNumber(EZGPIB_StringNthArgument(2,Answer,',')); SigSamp[j] := EZGPIB_ConvertToFloatNumber(SigStr); FreqSamp[j] := EZGPIB_ConvertToFloatNumber(FreqStr); End; End; tstr := IntToStr(i); tstr := PadL(tstr,3); EZGPIB_ScreenWrite(tstr); tstr := PadL(CallList[i],10); EZGPIB_ScreenWrite(tstr); SigMedian := GetMedian(SigSamp); FreqMedian := GetMedian(FreqSamp); SigStr := EZGPIB_ConvertToFixed(SigMedian,2); FreqStr := EZGPIB_ConvertToFixed(FreqMedian,2); tstr := PadL(SigStr,12); EZGPIB_ScreenWrite(tstr); tstr := PadL(FreqStr,14); EZGPIB_ScreenWrite(tstr); Delta := EZGPIB_ConvertToFloatNumber(FreqStr) - NumericFreq[i]; //if invalid frequency data then hold over old dataset If Abs(Delta) < 500.0 Then DStr[i] := EZGPIB_ConvertToFixed(Delta,2) tstr := PadL(DStr[i],8); EZGPIB_ScreenWriteln(tstr); EZGPIB_fileaddtobuffer(SigStr); i := i+1; End; //frequency list scan EZGPIB_ScreenWriteln('-----------------------------------------------'); EZGPIB_ScreenWriteln(' '); i := 0; While FreqList[i] <> '' Do Begin EZGPIB_fileaddtobuffer(Dstr[i]); i := i+1; End; EZGPIB_filewrite(filename); End; begin; //Main Setup_Prologix; Initialize; Setup_HP3586B; WriteFileHeader; Repeat Read_HP3586B; until ezgpib_kbdkeypressed; // Loop until user presses key EZGPIB_ScreenWriteln('Program Terminated by User'); end.