- Built exact-match TXT formatter from QuickBASIC source (SCM5B, 8B, DSCA, DSCT, SCM7B) - Spec parser for 10 binary DAT files (1470+ models) - Work order report importer (33K WOs, 63K test lines) - On-demand PDF generation, styled HTML view - Archived 500K pre-2026 For_Web files into year subfolders - Created domain service account (INTRANET\svc_testdatadb) - Generated 73/73 Quatronix customer datasheets - Added STAGE + Reports auto-import to sync script Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2381 lines
77 KiB
QBasic
2381 lines
77 KiB
QBasic
'Automated Test Software for DSCAxx-xx Voltage,
|
|
'Current, TC and RTD input models.
|
|
|
|
'AUTHOR: John Lehman
|
|
'DATE: 1/18/99
|
|
'USES LIBRARY = NLIBATED.BAS
|
|
|
|
' REVISION RECORD
|
|
|
|
'DATE APPR DESCRIPTION
|
|
'---- ---- -----------
|
|
'1/18/99 JL Initial Release. Modified version of TST2DIN1.BAS w/ basis
|
|
' from SCM5B program TEST49.BAS.
|
|
' ... See "Revs.txt" file.
|
|
'11/15/13 PWR Version for lot-status and extended serial numbers release. Added "LOGMODFILES"
|
|
' sub to combine logging and file operations common to post-encap and sealed-module
|
|
' tests. Added "DATASHEETWRITE", "DATASHEETPRINT", "WORKORDERHEADER", "WORKORDERLINE"
|
|
' and "WORKORDERPRINT" subs in the "TSTDIN2C.BAS" file for datasheet and work order
|
|
' status file generation and print. Datasheet file creation and data logging is
|
|
' consolidated at the end of testing to prevent partial file generation if F10 is used
|
|
' to abort testing. F10 abort is disabled in the file functions to prevent the
|
|
' creation of defective datasheet or work order status files. The "FOOTER" sub was
|
|
' also updated to not print to the screen.
|
|
'
|
|
CONST VERSION$ = "B.1 2013.11.15 PWR KDSCOUT1.EXE" 'Version (Revision Date) and initials of engr.
|
|
CONST SOURCEFILES$ = "KDSCOUT1.BAS KDSCOUT2.BAS NLIBATE.BAS" 'Source file names
|
|
|
|
'******** Declare some useful constants *******
|
|
CONST MAXSTATUSINDEX = 18 'Maximum index of the Status array
|
|
|
|
'****************** Declare Subs *****************
|
|
DECLARE SUB CALDAC (TE$)
|
|
'
|
|
DECLARE SUB CHANGEDN (SN$) 'Allow user to change dash number
|
|
DECLARE SUB COMPTEST (STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Complete set of tests
|
|
DECLARE SUB CONTINUE ()
|
|
DECLARE SUB FOOTER (STATUS$()) 'Sends footer to printer if all tests passed
|
|
DECLARE SUB FUNCTEST (CAL%) 'Routines for functional test
|
|
DECLARE SUB GENSET (GENAMPL!) 'Displays message to set signal generator
|
|
DECLARE SUB GETADD (FILENAME$) 'Gets parallel port/Mux/Testhead address
|
|
DECLARE SUB GETSN (SN$) 'Gets serial number
|
|
DECLARE SUB GETSPECS () 'Gets module type and specifications
|
|
DECLARE SUB HEADERA (SN$) 'Prints test sheet header
|
|
DECLARE SUB HEADERB (TESTTITLE$) 'Prints test screen header
|
|
'
|
|
DECLARE SUB INDIVID (SEL%, ITERATION%) 'Performs the tests individually
|
|
DECLARE SUB INIT488 (DEVADDR%)
|
|
DECLARE SUB INITPS (ADDR%, OVERI!, OVERV!)
|
|
DECLARE SUB LOADMUX (CH%, CHON%)
|
|
DECLARE SUB LOGIT (STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Logs test results to disk
|
|
DECLARE SUB MODOUTLINE ()
|
|
DECLARE SUB NOTES () 'Notes on ATE operation
|
|
DECLARE SUB OHMSET (OHM!)
|
|
DECLARE SUB ONESHOTTEST () 'Tests one-shot pulse width
|
|
DECLARE SUB PAUSE (TIME!)
|
|
DECLARE SUB REPORT (STATUS$(), TSPEC$()) 'Prints test data on screen
|
|
DECLARE SUB RESETTH () 'Reset test head to known condition
|
|
'
|
|
DECLARE SUB SETDAC (VOLTAGE!, CH%, VSENATTEN!)
|
|
DECLARE SUB SETDAC2 (VOLTAGE!, CH%, VSENATTEN!) 'Sets DAC, output module test heads
|
|
DECLARE SUB SETDACFAST (VOLTAGE!)
|
|
DECLARE SUB SETOUTLOAD (LOAD!) 'Set output load
|
|
'
|
|
DECLARE SUB SETTEST (TEST%)
|
|
DECLARE SUB SETTH (DOUT%, CB%)
|
|
DECLARE SUB SETTHFAST (DOUT%, CB%)
|
|
DECLARE SUB SORTDB (ENDFLAG%)
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
DECLARE SUB TSPECS (TSPEC$(), TOTLRESPEC!) 'Creates a string array of test specifications
|
|
DECLARE SUB WRITEDVM (FUNC$, VALUE!)
|
|
'
|
|
'
|
|
DECLARE SUB INTERLUDE () ' WAIT FOR USER
|
|
DECLARE SUB WORKORDERLINE(FAILSTATE%, SN$)
|
|
DECLARE SUB WORKORDERPRINT (SN$)
|
|
DECLARE SUB WORKORDERHEADER (SN$)
|
|
DECLARE SUB HARDCOPY () ' cjt ' cjt
|
|
DECLARE SUB SNPARSE (SN$, WO$, DS$) 'Parses serial number into work order and dash numbers
|
|
|
|
DECLARE SUB DATASHEETWRITE (SN$, STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TX%, OUTLOAD! )
|
|
|
|
DECLARE SUB DATASHEETPRINT (SN$, STATUS$())
|
|
'Sub below writes data log, datasheet and work order status files
|
|
DECLARE SUB LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
|
|
'DECLARE FUNCTION GETDSFNAME$ (SN$) 'Returns datasheet file name from serial number
|
|
DECLARE FUNCTION GETWOSFNAME$ (SN$) 'Returns work order status file name from serial number
|
|
|
|
'************** Declare Functions ****************
|
|
DECLARE FUNCTION BESTFIT! (SLOPE!, OFFSETS!, TSIM!(), NUMPTS%, ERRO!())
|
|
'Library fn. Calculates besfit line and max error
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
DECLARE FUNCTION FAILS% (STATUS$()) 'Tests for failed tests
|
|
DECLARE FUNCTION FREQRESP$ (GENAMPL!) 'Performs Frequency response Test
|
|
DECLARE FUNCTION GAINCAL$ (CAL%) 'Performs Gain Calibration
|
|
'
|
|
DECLARE FUNCTION GETTHID% () 'Library fn. Get test head id #
|
|
DECLARE FUNCTION GETPSID% ()
|
|
'
|
|
DECLARE FUNCTION ILIMIT$ (POSI%) 'Test current limit
|
|
'
|
|
DECLARE FUNCTION INPUTR$ () 'Performs Input Resistance Test
|
|
DECLARE FUNCTION IOUTMAXL$ (MINMAX%) 'Test compliance
|
|
DECLARE FUNCTION KEYBDIN$ () 'Get keyboard input
|
|
'
|
|
DECLARE FUNCTION LINTEST$ (ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs Accuracy and Linearity Tests
|
|
DECLARE FUNCTION MEASRES! (OHM!, RESNUM%, TE$) 'Measure loop current sense resistor
|
|
DECLARE FUNCTION MENU1% () 'Gets the Test Group selection
|
|
DECLARE FUNCTION MENU2% () 'Gets the individual test #
|
|
DECLARE FUNCTION MENU3% () 'Gets the module family
|
|
'
|
|
'
|
|
DECLARE FUNCTION OFFSETCAL$ (CAL%) 'Performs Offset Calibration
|
|
'
|
|
'
|
|
DECLARE FUNCTION OUTNOISE$ () 'Performs Output Noise Test
|
|
'
|
|
DECLARE FUNCTION POWERIO$ (ADDR%, CMD$) 'Library fn. Kepco DPS power supply I/O
|
|
DECLARE FUNCTION READDVM! (TOL!) 'Library fn. Reads Fluke meter to TOL!
|
|
'
|
|
DECLARE FUNCTION READGPIB$ (ADDR%, CMD$)
|
|
DECLARE FUNCTION REPEAT$ (N$) 'Ask if you would like to repeat test
|
|
DECLARE FUNCTION REPEAT2$ (N$, SN$)
|
|
DECLARE FUNCTION RTDOHMS! (TEMP!, SENTYPE$) 'Library fn. Convert RTD in temp to ohms
|
|
DECLARE FUNCTION RTDTEMP! (OHMS!, SENTYPE$) 'Library fn. Convert RTD ohms to temp
|
|
'
|
|
'
|
|
DECLARE FUNCTION SENSORNUM% () 'Assign a number to each sensor type
|
|
'
|
|
DECLARE FUNCTION SETAC! (ONOFF%, GENAMPL!) 'Sets AC in Off or On
|
|
DECLARE FUNCTION SETATTEN% (VOLTAGE!) 'Library fn. Sets test head R/2R ladder
|
|
DECLARE FUNCTION SETCURRENTIN! (MODIN!) 'Set input current source
|
|
DECLARE FUNCTION SETPOWER$ (ADDR%, VSUPPLY!, FUNC$) '** Controls Kepco DPS 125
|
|
DECLARE FUNCTION STEPRESP$ () 'Performs Step Response Test
|
|
DECLARE FUNCTION STRINGVAL% (A$) 'Library fn.
|
|
DECLARE FUNCTION SUPPLYI$ (MAXL%) 'Measure module supply current
|
|
DECLARE FUNCTION SUPPLYSEN$ () 'Performs Power Supply Sensitivity
|
|
DECLARE FUNCTION TCTEMP! (TCV!, SENTYPE$) 'Library fn. Convert TC volts to deg. C
|
|
DECLARE FUNCTION TCVOLTS! (TEMP!, TCTYPE$) 'Library fn. Convert TC in temp to V
|
|
DECLARE FUNCTION UPSN$ (SN$) 'Increments dash# of serial#
|
|
'
|
|
DECLARE FUNCTION MODULEOUT! (SENOUT!) 'Calculates module output for a given input
|
|
'
|
|
'************** End of Functions ********************
|
|
|
|
'Database Record definition for the specifications
|
|
TYPE DBASE
|
|
MODNAME AS STRING * 13 'DSCA39-XXXXn
|
|
SENTYPE AS STRING * 7 'mV, V, mA
|
|
ISMAXNL AS SINGLE
|
|
ISMAXFL AS SINGLE
|
|
MININ AS SINGLE
|
|
MAXIN AS SINGLE
|
|
RCONV AS SINGLE
|
|
'
|
|
'
|
|
'
|
|
MINOUT AS SINGLE
|
|
MAXOUT AS SINGLE
|
|
OUTSIGTYPE AS STRING * 7 ''VOLTAGE' or 'CURRENT'
|
|
OSCALIN AS SINGLE 'input for offset calibration
|
|
GNCALIN AS SINGLE 'input for gain calibration
|
|
CALTOL AS SINGLE
|
|
LOAD1 AS SINGLE 'Vout min load (mA), Iout nom load (ohms)
|
|
LINEAR1 AS SINGLE 'Voltage or current output
|
|
ACCURACY1 AS SINGLE 'Voltage or current output
|
|
LOAD2 AS SINGLE 'Vout max load (mA), Iout min load (ohms)
|
|
LINEAR2 AS SINGLE 'Voltage output
|
|
ACCURACY2 AS SINGLE 'Voltage output
|
|
LOAD3 AS SINGLE 'Vout max load (mA), Iout not used
|
|
LINEAR3 AS SINGLE 'Voltage output
|
|
ACCURACY3 AS SINGLE 'Voltage output
|
|
BANDWIDTH AS SINGLE 'filter -3dB point
|
|
TESTFREQ AS SINGLE
|
|
ATTEN AS SINGLE
|
|
ATTENTOL AS SINGLE
|
|
STEPRMIN AS SINGLE
|
|
STEPRMAX AS SINGLE
|
|
PSS AS SINGLE
|
|
OUTNOISE AS SINGLE
|
|
INPUTRES AS SINGLE
|
|
COMPLIANCE AS SINGLE 'Current output, open loop voltage
|
|
MAXLOAD AS SINGLE 'Current output, max load resistance
|
|
ILIMIT AS SINGLE 'Voltage output, current limit
|
|
PERCOVER AS SINGLE 'Voltage output, percent overrange
|
|
'
|
|
'
|
|
'
|
|
MINVS AS SINGLE
|
|
MAXVS AS SINGLE
|
|
END TYPE
|
|
|
|
TYPE DBASE2
|
|
RECNUM AS INTEGER
|
|
MODNAME AS STRING * 13
|
|
END TYPE
|
|
|
|
'define common variables
|
|
COMMON SHARED /SAMPLE/ WO$, STATE$
|
|
COMMON SHARED /SAMPLE/ SPECS AS DBASE, SORTDATA1 AS DBASE2, SORTDATA2 AS DBASE2
|
|
COMMON SHARED /SAMPLE/ PON%, TX%, IINSEN.MEAS!, IOUTSEN.MEAS!, SN$, LOGDAT%
|
|
COMMON SHARED /SAMPLE/ TE$
|
|
COMMON SHARED CB0VAL%, CB1VAL%, CB2VAL%, CB3VAL%
|
|
COMMON SHARED MAINMAX!, MAINMIN!, VERNMAX!, VERNMIN!
|
|
COMMON SHARED BADDRS%, LPTADDR%, MUXADDR%, THADDR%, PSADDR%, VINADDR%
|
|
COMMON SHARED PSPORT%, DVMADDR%, GENADDR%
|
|
COMMON SHARED DPSPSADDR%, DPSVINADDR%, ABCPSADDR%, ABCVINADDR%
|
|
COMMON SHARED PSMODEL$, VINMODEL$
|
|
'VINMODEL$ will be used if 2 different KEPCOs are used.
|
|
|
|
'COMMON SHARED /PRTSCR/ inreg AS RegType, outreg AS RegType
|
|
|
|
'assign constants to Fluke meter commands
|
|
CONST OHM4$ = "F4", OHM2$ = "F3", VODC$ = "F1", VOAC$ = "F2", MADC$ = "F5"
|
|
'assign constants to test head variables
|
|
CONST CB0% = 0, CB1% = 1, CB2% = 2, CB3% = 3 'control bank addresses
|
|
CONST CON% = 1, COFF% = 0 'channel 'on' defined as '1'
|
|
'off' defined as '0'
|
|
'DVMADDR% = 1 'GPIB address of Fluke 8842A meter
|
|
'assign constants to Kepco DPS power
|
|
'supply commands
|
|
CONST VOLT$ = "STV=", LOOPON$ = "SOP=ON", LOOPOFF$ = "SOP=OFF"
|
|
CONST CURRENT$ = "RTC", ISTAT$ = "RCS"
|
|
'CONST PSADDR% = 1 'Power supply for module power
|
|
'CONST VINADDR% = 2 'Power supply for high voltage signal input
|
|
CONST OVERV! = 35 'Power supply over voltage limit
|
|
CONST PSILIMIT! = 500 'Power supply over current limit
|
|
'(max spec multiplier).
|
|
CONST VINOVERV! = 125
|
|
CONST VINILIMIT! = 32 'High voltage input current limit
|
|
|
|
'assign specifications which are constant for all modules
|
|
CONST IINSEN! = 192 'Input current source sense resistor, 250ohm
|
|
CONST IOUTSEN! = 192 'Output current sense resistor.
|
|
'
|
|
CONST RSERIES! = 1E+07 '10M ohm, test head series input R
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
|
|
DIM STATUS(MAXSTATUSINDEX) AS STRING, TSPEC(MAXSTATUSINDEX) AS STRING
|
|
DIM TSIM!(105), OUTCALC!(105), OUTMEAS!(105), ERROROUT!(105), ACCSTAT$(105)
|
|
|
|
' Variable intialization
|
|
BADDRS% = &H250 'Base address of PC4311 '488 controller
|
|
CB0VAL% = &HFF 'Set all lines off
|
|
CB1VAL% = &HFF
|
|
CB2VAL% = &HFF
|
|
CB3VAL% = &HFF
|
|
|
|
'TE1055 (pcb1133 A)
|
|
'(all control lines are active low)
|
|
|
|
'Use Relay/Mux TE1037 (see below)
|
|
'
|
|
'Control Bank Line Assignment
|
|
'------------ ------ ----------
|
|
' 0 7 MSB 0 = Connect DUT output to S/H input
|
|
' 6 1 = Step input to DUT, start S/H timer
|
|
' 5 0 = Bypass series input R
|
|
' 4 Vsupply control MSB
|
|
' 3 Vsupply control LSB
|
|
' 2 0 = AC signal input to DUT
|
|
' 1 0 = Connect step input to DUT
|
|
' 0 LSB 0 = DC signal input to DUT
|
|
'
|
|
'
|
|
' 1 7 MSB NC
|
|
' 6 NC
|
|
' 5 NC
|
|
' 4 NC
|
|
' 3 NC
|
|
' 2 NC
|
|
' 1 NC
|
|
' 0 LSB 0 = Connect Iout to load
|
|
'
|
|
' 2 7 MSB 1 = Output filter & CH4 connected to ouput, 0 = CH2 connected to output
|
|
' 6 1 = Input buffer gain = 3, 0 = Input buffer gain = 1
|
|
' 5 0 = Disable charge offset timer
|
|
' 4 0 = Tie WR EN\ to +5V.
|
|
' 3 0 = Output load #4, 5 ohm
|
|
' 2 0 = Output load #3, 750 ohm
|
|
' 1 0 = Output load #2, 500 ohm
|
|
' 0 LSB 0 = Output load #1, 250 ohm
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
|
|
'TE1054 (pcb1133 A)
|
|
'(all control lines are active low)
|
|
'Use Relay/Mux TE1013 (see below)
|
|
'
|
|
'Control Bank Line Assignment
|
|
'------------ ------ ----------
|
|
' 0 7 MSB 0 = Connect DUT output to S/H input
|
|
' 6 Step input to DUT, start S/H timer
|
|
' 5 0 = Bypass series input R
|
|
' 4 Vsupply control MSB
|
|
' 3 Vsupply control LSB
|
|
' 2 0 = AC signal input to DUT
|
|
' 1 0 = Connect step input to DUT
|
|
' 0 LSB 0 = DC signal input to DUT
|
|
'
|
|
' 1 7 MSB NC
|
|
' 6 NC
|
|
' 5 NC
|
|
' 4 NC
|
|
' 3 NC
|
|
' 2 NC
|
|
' 1 NC
|
|
' 0 LSB NC
|
|
'
|
|
' 2 7 MSB 0 = Output filter & CH4 connected to ouput, 1 = CH2 connected to output
|
|
' 6 0 = Input buffer gain = 3, 1 = Input buffer gain = 1
|
|
' 5 0 = Enable charge offset timer
|
|
' 4 0 = Connect output to BNC
|
|
' 3 0 = Output load #4, 200 ohm
|
|
' 2 0 = Output load #3, 100 ohm
|
|
' 1 0 = Output load #2, 2K ohm
|
|
' 0 LSB 0 = Output load #1, 1K ohm
|
|
'
|
|
|
|
'TE1013 Relay/Mux channel assignments
|
|
'Mux Channel Assignment
|
|
'----------- ----------
|
|
' 1 DUT +/-IN terminals
|
|
' 2 Vout
|
|
' 3 Supply current sense resistor
|
|
' 4 Vout, post 10KHz filter
|
|
' 5 Sample/Hold output
|
|
' 6 NC
|
|
' 7 Supply voltage
|
|
' 8 NC
|
|
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'TE1037 Relay/Mux channel assignments
|
|
'Mux Channel Assignment
|
|
'----------- ----------
|
|
' 1 DUT +/-IN terminals
|
|
' 2 Iout * Rload
|
|
' 3 Input current sense resistor
|
|
' 4 Output Noise, post 10KHz filter
|
|
' 5 Sample/Hold output
|
|
' 6 Sense lines, output load #4 (4-wire ohms)
|
|
' 7 Sense lines, input current sense resistor
|
|
' 8 Sense lines, output load #1 (4-wire ohms)
|
|
|
|
'****************** MAIN PROGRAM************************************
|
|
KEY(10) ON 'Activates F10 key
|
|
ON KEY(10) GOSUB FINISH 'Traps for F10 key Exits if pressed
|
|
|
|
CLS
|
|
TX% = 0 ' cjt
|
|
FILENAME$ = "KDSCIOUT.ADR" 'Parallel port, mux & test head addresses
|
|
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
|
|
|
|
CLS
|
|
LOCATE 5, 20: PRINT "Initializing test system. Please wait."
|
|
LOCATE 6, 10: PRINT "VERSION: "; VERSION$
|
|
LOCATE 7, 10: PRINT "SOURCE FILES: "; SOURCEFILES$
|
|
CALL CONTINUE
|
|
CLS
|
|
CALL INIT488(DVMADDR%) 'Initialize the GPIB interface
|
|
|
|
'
|
|
'
|
|
'CALL CONTINUE
|
|
|
|
PSID% = GETPSID%
|
|
'
|
|
|
|
|
|
|
|
LOCATE 9, 20: PRINT "Initializing DVM..."
|
|
CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
|
|
|
|
|
|
|
|
|
|
|
|
LOCATE , 20: PRINT "Initializing relay mux..."
|
|
CALL LOADMUX(0, CON%) 'Resets all mux's, independent of mux address
|
|
|
|
M% = MENU3%
|
|
SELECT CASE M%
|
|
CASE 1
|
|
TE$ = "TE1055" 'Assign test head #, defines channel
|
|
FILENAME$ = "KDSCIOUT.ADR" 'Parallel port, mux & test head addresses
|
|
'used for DAC input.
|
|
THIDSET% = 2
|
|
CASE 2
|
|
TE$ = "TE1054" 'Assign test head #, defines channel
|
|
FILENAME$ = "KDSCVOUT.ADR" 'Parallel port, mux & test head addresses
|
|
'used for DAC input.
|
|
THIDSET% = 3
|
|
CASE 3
|
|
GOTO MAINMENU
|
|
END SELECT
|
|
|
|
PRINT
|
|
PRINT TAB(20); "Initializing test head "; TE$; "..."
|
|
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
|
|
|
|
THID% = GETTHID% 'Get test head ID #
|
|
' PRINT THID%
|
|
IF THID% <> THIDSET% THEN
|
|
'BEEP
|
|
F% = F% + 1
|
|
PRINT
|
|
PRINT TAB(20); "SYSTEM STARTUP ERROR"
|
|
PRINT TAB(20); "Test head "; TE$; " is not connected."
|
|
PRINT TAB(20); "Check system setup."
|
|
PRINT TAB(20); "Press space bar to continue or ESC to exit."
|
|
DO
|
|
I$ = KEYBDIN$ ' user response
|
|
IF I$ = CHR$(27) THEN STOP
|
|
LOOP UNTIL I$ = CHR$(27) OR I$ = " "
|
|
ELSE
|
|
IF THID% = 2 THEN 'Don't know DUT input
|
|
PRINT 'conversion resistor
|
|
PRINT TAB(20); "Remove modules from test head."
|
|
BEEP
|
|
CALL CONTINUE
|
|
END IF
|
|
CB0VAL% = CB0VAL% AND &HDE '1 1 0 1 1 1 1 0
|
|
'Sets relays K00, K05
|
|
CALL SETTH(CB0VAL%, CB0%)
|
|
CB1VAL% = &HFF
|
|
CALL SETTH(CB1VAL%, CB1%)
|
|
CB2VAL% = &H1F '0 0 0 1 1 1 1 1 K27..K20
|
|
CALL SETTH(CB2VAL%, CB2%)
|
|
PRINT TAB(20); "Initializing DAC..."
|
|
CALL CALDAC(TE$) 'Calibrate DAC
|
|
IF TE$ = "ERROR" THEN
|
|
'BEEP
|
|
LOCATE , 20: PRINT " "
|
|
LOCATE , 20: PRINT "SYSTEM STARTUP ERROR"
|
|
LOCATE , 20: PRINT "DAC is not connected or is faulty."
|
|
LOCATE , 20: PRINT "Check system setup and restart program."
|
|
GOTO FINISH
|
|
END IF
|
|
CALL RESETTH
|
|
END IF
|
|
|
|
IF F% = 1 THEN STOP 'No test heads connected
|
|
|
|
PRINT TAB(20); "Initializing power supply..."
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
|
|
LOGDAT% = -1 'Log linearity test data OFF
|
|
'
|
|
PON% = 0
|
|
DO 'Main program loop
|
|
SN$ = "" 'Reset serial number
|
|
SEL% = MENU1% 'Gets the # of the sub program
|
|
SELECT CASE SEL% 'Branches to the specific Tests
|
|
|
|
'******************* Pre-Burn In Functional Test ***************************
|
|
CASE 1
|
|
TX% = 0 ' cjt no print to file
|
|
CAL% = 2 'Measure o.s and gain, don't calibrate
|
|
CALL GETSPECS 'Gets module test specs
|
|
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
|
|
CALL FUNCTEST(CAL%)
|
|
END IF
|
|
|
|
'*********************** Pre-Encap Complete Test ******************************
|
|
CASE 2
|
|
TX% = 0 ' cjt no print to file
|
|
CAL% = 0 'Calibrate o.s. & gain.
|
|
CALL GETSPECS 'Gets module test specs
|
|
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
|
|
|
|
CALL GENSET(GENAMPL!) 'Displays message to set signal gen.
|
|
DO 'Complete test loop start
|
|
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
|
|
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
|
|
CALL TSPECS(TSPEC$(), TOTLRESPEC!) 'Sets up a string with the test specifications
|
|
WIDTH , 43 'Change screen lines to 43
|
|
CALL REPORT(STATUS$(), TSPEC$()) 'Prints data to screen
|
|
CALL INTERLUDE
|
|
WIDTH , 25 'Change screen lines to 25
|
|
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N" 'End of Complete Test loop
|
|
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
|
|
PRINT
|
|
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
CALL CONTINUE
|
|
END IF
|
|
END IF
|
|
|
|
'**************** Post-Encap Complete Test ***********************************
|
|
CASE 3
|
|
CALL HARDCOPY 'Ask for harcopy printout (PWR)
|
|
TX% = 1 ' cjt print to file
|
|
CAL% = 0 'calibrate o.s & gain
|
|
CALL GETSPECS 'Gets module test specs
|
|
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
|
|
CALL GENSET(GENAMPL!) 'Displays message to set signal generator
|
|
CALL GETSN(SN$) 'Gets module serial #
|
|
CALL WORKORDERHEADER (SN$) 'Write header to work order status file
|
|
DO 'Start of Test loop
|
|
IF SPECS.OUTSIGTYPE$ = "CURRENT" AND SPECS.MINOUT < .001 THEN
|
|
ITERATION% = 2 'o.s. calibrated at +2.5% span results in interactive adjustments
|
|
ELSE
|
|
ITERATION% = 1 'Sets # of times to repeat offset/gain cal non-interactive adjustments
|
|
END IF
|
|
CALL HEADERA(SN$) 'Prints data sheet header on printer
|
|
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
|
|
CALL TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
|
|
WIDTH , 43 'Change screen lines to 43
|
|
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
|
|
CALL FOOTER(STATUS$()) 'Prints footer if no fails
|
|
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
|
|
'Log test results to data log, datasheet and work order status files
|
|
CALL LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'CALL INTERLUDE
|
|
WIDTH , 25 'Change screen lines to 25
|
|
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
|
|
CLS
|
|
PRINT TAB(10); "Printing work order status file: "; WO$ + ".TXT
|
|
CALL WORKORDERPRINT (SN$) 'Print the work order status file after "N" (not testing more of same module type)
|
|
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
|
|
PRINT
|
|
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
CALL CONTINUE
|
|
END IF
|
|
END IF
|
|
|
|
'**************** Sealed Module Re-Test ***********************************
|
|
CASE 4
|
|
CALL HARDCOPY 'Ask for hardcopy printout (PWR)
|
|
TX% = 1 ' cjt print to file
|
|
CAL% = 2 'Check o.s & gain
|
|
'CAL% = 4 'Check o.s & gain (4 or 2?: input modules used "4")
|
|
CALL GETSPECS 'Gets module test specs
|
|
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
|
|
CALL GENSET(GENAMPL!) 'Displays message to set signal generator
|
|
CALL GETSN(SN$) 'Gets module serial #
|
|
CALL WORKORDERHEADER (SN$) 'Write header to work order status file
|
|
DO 'Start of Test loop
|
|
ITERATION% = 0 'Sets # of times to repeat offset/gain cal
|
|
CALL HEADERA(SN$) 'Prints data sheet header on printer
|
|
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
|
|
CALL TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
|
|
WIDTH , 43 'Change screen lines to 43
|
|
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
|
|
CALL FOOTER(STATUS$()) 'Prints footer if no fails
|
|
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
|
|
'Log test results to data log, datasheet and work order status files
|
|
CALL LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'CALL INTERLUDE
|
|
WIDTH , 25 'Change screen lines to 25
|
|
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
|
|
CALL WORKORDERPRINT (SN$) 'Print the work order status file after "N" (not testing more of same module type)
|
|
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
|
|
PRINT
|
|
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
CALL CONTINUE
|
|
END IF
|
|
END IF
|
|
|
|
'***********************Individual Test Routines******************************
|
|
CASE 5
|
|
TX% = 0 ' cjt no print to file
|
|
DO 'Start of loop
|
|
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
|
|
SEL% = MENU2% 'Gets # of test
|
|
IF SEL% <> 16 THEN 'Checks for exit
|
|
IF SEL% = 14 THEN 'Checks for printer toggle
|
|
IF PON% = 1 THEN
|
|
PON% = 0
|
|
ELSE
|
|
PON% = 1 'Toggles printer status
|
|
END IF
|
|
ELSEIF SEL% = 13 THEN
|
|
CALL NOTES 'Print ATE notes
|
|
ELSEIF SEL% = 15 THEN
|
|
LOGDAT% = -LOGDAT%
|
|
ELSEIF SEL% = 17 THEN
|
|
CALL ONESHOTTEST
|
|
ELSE
|
|
CALL GETSPECS 'Gets module specs
|
|
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
|
|
CALL INDIVID(SEL%, ITERATION%)'Performs individual test
|
|
END IF
|
|
END IF
|
|
END IF
|
|
LOOP UNTIL SEL% = 16 'End of loop
|
|
|
|
'*************************** End Program Selection *********************************
|
|
|
|
CASE 6
|
|
ENDPROG% = 1 'Sets end program flag
|
|
END SELECT
|
|
LOOP WHILE ENDPROG% <> 1 'Loops until end program flag set
|
|
|
|
|
|
FINISH:
|
|
'Exit program from F10 keypress (PWR)
|
|
CLS ' CJT
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power
|
|
SL$ = SETPOWER$(PSADDR%, 999!, "LOC") 'Return to local mode
|
|
SL$ = SETPOWER$(PSADDR%, 999!, "ZER") 'Clear the error queue
|
|
|
|
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
|
|
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Turn off loop power
|
|
SL$ = SETPOWER$(VINADDR%, 999!, "LOC") 'Return to local mode
|
|
SL$ = SETPOWER$(VINADDR%, 999!, "ZER") 'Clear the error queue
|
|
|
|
END IF
|
|
CHAIN "C:\ATE\MENUX"
|
|
END 'End of program
|
|
'*@*@*@*@*@*@*@*@*@*@*@**@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@**@*@*@*@*@*@
|
|
|
|
MAINMENU:
|
|
CHAIN "C:\ATE\MENUX"
|
|
END
|
|
'*******************************
|
|
|
|
'*******************************
|
|
SUB COMPTEST (STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!)
|
|
|
|
MINOUT! = SPECS.MINOUT
|
|
OUTTYPE$ = SPECS.OUTSIGTYPE
|
|
SNM% = SENSORNUM%
|
|
|
|
IF SNM% = 2 THEN 'Check if current input
|
|
CALL WRITEDVM("S0", 0) 'Slow reading rate
|
|
IINSEN.MEAS! = MEASRES!(IINSEN!, 2, TE$) 'Measure current source sense R
|
|
CALL WRITEDVM("S1", 0) 'Medium reading rate
|
|
|
|
|
|
|
|
ELSE
|
|
IINSEN.MEAS! = 1
|
|
END IF
|
|
|
|
FOR X = 1 TO 18 'Clear test result array
|
|
STATUS$(X) = ""
|
|
NEXT X
|
|
|
|
IF SPECS.ISMAXFL <> 0 THEN
|
|
MODILIM! = SPECS.ISMAXFL
|
|
ELSE
|
|
MODILIM! = SPECS.ISMAXNL
|
|
END IF
|
|
|
|
CALL INITPS(PSADDR%, MODILIM! * PSILIMIT!, OVERV!)
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
STATUS$(1) = SUPPLYI$(0) 'Supply current test
|
|
'No excitation load
|
|
'
|
|
'
|
|
'
|
|
'
|
|
'
|
|
IF LEFT$(STATUS$(1), 4) = "FAIL" THEN
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
EXIT SUB 'Exit on over current
|
|
END IF
|
|
|
|
IF OUTTYPE$ = "VOLTAGE" THEN 'Check if voltage out
|
|
STATUS$(2) = SUPPLYI$(1) 'Supply current test
|
|
ELSE 'Max output load
|
|
STATUS$(2) = "PASS"
|
|
END IF
|
|
|
|
IF LEFT$(STATUS$(2), 4) = "FAIL" THEN EXIT SUB 'Exit on over current
|
|
POSI% = 1 'Test positive current limit
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
|
|
STATUS$(9) = ILIMIT$(POSI%)
|
|
ELSE
|
|
STATUS$(9) = "PASS"
|
|
END IF
|
|
IF OUTTYPE$ = "VOLTAGE" AND MINOUT! <> 0 THEN
|
|
POSI% = 0 'Test negative current limit
|
|
STATUS$(10) = ILIMIT$(POSI%)
|
|
ELSE
|
|
STATUS$(10) = "PASS"
|
|
END IF
|
|
|
|
STATUS$(11) = "PASS" 'OVERRANGE$ 'Test module overrange
|
|
STATUS$(12) = SUPPLYSEN$ 'Power supply sensitivity
|
|
STATUS$(13) = "PASS"
|
|
STATUS$(14) = FREQRESP$(GENAMPL!) 'Tests Frequency Response
|
|
STATUS$(15) = "PASS"
|
|
STATUS$(16) = OUTNOISE$ 'Test Output Noise
|
|
|
|
IF OUTTYPE$ = "CURRENT" THEN 'Max load resistance test
|
|
STATUS$(17) = IOUTMAXL$(1)
|
|
IF LEFT$(SPECS.MODNAME, 9) = "DSCA39-07" THEN
|
|
STATUS$(18) = IOUTMAXL$(0)
|
|
END IF
|
|
ELSE
|
|
STATUS$(17) = "PASS"
|
|
STATUS$(18) = "PASS"
|
|
END IF
|
|
|
|
WHILE ITERATION% > 0 'Offset/Gain calibration loop
|
|
|
|
A$ = OFFSETCAL$(CAL%) 'Offset calibration
|
|
A$ = GAINCAL$(CAL%) 'Gain calibration
|
|
ITERATION% = ITERATION% - 1
|
|
|
|
WEND 'Tests for Offset/Gain calibration end
|
|
|
|
FOR T% = 1 TO 3
|
|
SELECT CASE T%
|
|
CASE 1
|
|
OUTLOAD! = SPECS.LOAD3
|
|
STATUS$(3) = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
STATUS$(4) = ACC$ 'Assigns results of accuracy test
|
|
CASE 2
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
OUTLOAD! = SPECS.LOAD2
|
|
STATUS$(5) = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
STATUS$(6) = ACC$ 'Assigns results of accuracy test
|
|
ELSE
|
|
STATUS$(5) = "PASS"
|
|
STATUS$(6) = "PASS"
|
|
END IF
|
|
CASE 3
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
OUTLOAD! = SPECS.LOAD1
|
|
STATUS$(7) = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
STATUS$(8) = ACC$ 'Assigns results of accuracy test
|
|
ELSE
|
|
STATUS$(7) = "PASS"
|
|
STATUS$(8) = "PASS"
|
|
END IF
|
|
END SELECT
|
|
NEXT
|
|
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
|
|
CALL INTERLUDE
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION FAILS% (STATUS$())
|
|
|
|
FAILS% = 0
|
|
|
|
'FOR X = 1 TO 18
|
|
FOR X = 1 TO MAXSTATUSINDEX
|
|
IF LEFT$(STATUS$(X), 1) = "F" THEN 'Tests for failed tests
|
|
FAILS% = 1
|
|
END IF
|
|
NEXT
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
SUB FOOTER (STATUS$())
|
|
'Sub to create footer (if there are no fails). Removed code to print footer to file
|
|
'since that is now accomplished by the "DATASHEETWRITE" sub. The datasheet can still
|
|
'be sent to two places (screen and printer), so when updating remember to make any
|
|
'changes to both the "PRINT" and "LPRINT" sections.
|
|
'
|
|
'NOTE: Currently, the footer is only printed to the printer, not the screen.
|
|
'
|
|
OUTTYPE$ = SPECS.OUTSIGTYPE
|
|
|
|
'When updating remember to make the changes to all sections.
|
|
IF FAILS%(STATUS$()) <> 1 THEN
|
|
|
|
' 'Send to screen.
|
|
' PRINT TAB(5); "240VAC Withstand"; TAB(71); "PASS"
|
|
' PRINT TAB(5); "Hi-Pot"; TAB(71); "PASS"
|
|
' IF OUTTYPE$ = "CURRENT" THEN
|
|
' PRINT
|
|
' PRINT TAB(5); "Standard output load for test is 250 ohms."
|
|
' END IF
|
|
'
|
|
' PRINT TAB(5);
|
|
' FOR X = 5 TO 75
|
|
' PRINT "_";
|
|
' NEXT
|
|
' PRINT
|
|
' PRINT TAB(35); "Check List"
|
|
' PRINT
|
|
' PRINT TAB(5); "Tested by: _______________"; TAB(45); "QC: _______________"
|
|
' PRINT
|
|
' PRINT TAB(5); "It is hereby certified that the above product is in conformance with"
|
|
' PRINT TAB(5); "all requirements to the extent specified. This product is not"
|
|
' PRINT TAB(5); "authorized or warranted for use in life support devices and/or systems."
|
|
' PRINT
|
|
' PRINT TAB(5); "* NIST traceable calibration certificates support Measured Value data."
|
|
' PRINT TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
|
|
' PRINT TAB(5); " ISO Guide 25 Certified Metrology Labs."
|
|
|
|
'Send to printer
|
|
IF PON% = 1 THEN
|
|
LPRINT TAB(5); "240VAC Withstand"; TAB(71); "PASS"
|
|
LPRINT TAB(5); "Hi-Pot"; TAB(71); "PASS"
|
|
|
|
IF OUTTYPE$ = "CURRENT" THEN
|
|
LPRINT
|
|
LPRINT TAB(5); "Standard output load for test is 250 ohms."
|
|
END IF
|
|
|
|
LPRINT TAB(5);
|
|
FOR X = 5 TO 75
|
|
LPRINT "_";
|
|
NEXT
|
|
LPRINT
|
|
LPRINT TAB(35); "Check List"
|
|
LPRINT
|
|
LPRINT TAB(5); "Tested by: _______________"; TAB(45); "QC: _______________"
|
|
LPRINT
|
|
LPRINT TAB(5); "It is hereby certified that the above product is in conformance with"
|
|
LPRINT TAB(5); "all requirements to the extent specified. This product is not"
|
|
LPRINT TAB(5); "authorized or warranted for use in life support devices and/or systems."
|
|
LPRINT
|
|
LPRINT TAB(5); "* NIST traceable calibration certificates support Measured Value data."
|
|
LPRINT TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
|
|
LPRINT TAB(5); " ISO Guide 25 Certified Metrology Labs."
|
|
END IF
|
|
END IF
|
|
IF PON% = 1 THEN LPRINT CHR$(12) 'Send form feed to printer (whether a passing or failing module)
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION FREQRESP$ (GENAMPL!)
|
|
|
|
MININ! = SPECS.MININ 'Determine min in
|
|
MAXIN! = SPECS.MAXIN 'Determine max in
|
|
'
|
|
INRANGE! = MAXIN! - MININ!
|
|
ORANGE! = SPECS.MAXOUT - SPECS.MINOUT 'V or A
|
|
SPEC! = SPECS.ATTEN
|
|
SPECTOL! = SPECS.ATTENTOL
|
|
SNM% = SENSORNUM%
|
|
|
|
CLS
|
|
TESTTITLE$ = "Frequency Response Test"
|
|
CALL HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10: PRINT "Testing, please wait."
|
|
|
|
IF SNM% = 2 THEN 'mA in
|
|
SCALE% = 1000
|
|
ELSE
|
|
SCALE% = 1
|
|
END IF
|
|
|
|
XFERFN! = ORANGE! / (INRANGE! / SCALE%) 'V/A or A/A
|
|
|
|
VAC! = SETAC!(CON%, GENAMPL!) 'Turns on AC input
|
|
|
|
CALL LOADMUX(2, CON%) 'Turns on mux
|
|
CALL WRITEDVM(VOAC$, (10 ^ (SPEC! / -20) * VAC! / IINSEN.MEAS! * XFERFN!) * IOUTSEN.MEAS! * 2)'Sets up Meter (Autorange)
|
|
|
|
OUTMEAS! = READDVM!(.0002 * ORANGE!) / IOUTSEN.MEAS! 'Reads Meter to +/-0.02% span
|
|
|
|
IF OUTMEAS! > .0002 THEN
|
|
OUTMEAS! = SQR(OUTMEAS! ^ 2 - .0002 ^ 2) 'Account for meter zero-input error
|
|
END IF 'See output noise test for details
|
|
|
|
CALL LOADMUX(2, COFF%) 'Turns off mux
|
|
'Calculate attenuation
|
|
'
|
|
'
|
|
'
|
|
ATTEN! = -20 * (LOG(OUTMEAS! / (VAC! / IINSEN.MEAS! * XFERFN!)) / LOG(10))
|
|
|
|
IF ABS(ATTEN! - SPEC!) <= SPECTOL! THEN
|
|
ATTEN$ = "PASS"
|
|
ELSE
|
|
ATTEN$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
LOCATE 10, 10: PRINT "Status: ";
|
|
|
|
IF LEFT$(ATTEN$, 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT ATTEN$;
|
|
COLOR 11, 0
|
|
|
|
PRINT SPC(20);
|
|
PRINT TAB(10); USING "Attenuation at ##### Hz is"; SPECS.TESTFREQ!;
|
|
PRINT TAB(50); USING "###.# dB"; ATTEN!
|
|
PRINT TAB(10); "Required attenuation is";
|
|
PRINT TAB(50); USING "###.# +/- ##.# dB"; SPEC!; SPECTOL!
|
|
'
|
|
FREQRESP$ = ATTEN$ + STR$(ATTEN!) + "1"
|
|
VAC! = SETAC(COFF%, GENAMPL!) 'Turns off AC input
|
|
|
|
CALL PAUSE(1!)
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
SUB FUNCTEST (CAL%)
|
|
|
|
'Sequence of tests to determine if main module circuits are functional
|
|
|
|
MAXOUT! = SPECS.MAXOUT 'V or A
|
|
SNM% = SENSORNUM%
|
|
|
|
IF SNM% = 2 THEN 'Check if current input
|
|
IINSEN.MEAS! = IINSEN!
|
|
ELSE
|
|
IINSEN.MEAS! = 1
|
|
END IF 'sensor type.
|
|
|
|
IF SPECS.ISMAXFL <> 0 THEN
|
|
MODILIM! = SPECS.ISMAXFL
|
|
ELSE
|
|
MODILIM! = SPECS.ISMAXNL
|
|
END IF
|
|
' CALL INITPS(PSADDR%, MODILIM! * PSILIMIT!, OVERV!)
|
|
DO
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
CONFLAG% = 0
|
|
FOR FTEST% = 1 TO 2
|
|
SELECT CASE FTEST%
|
|
CASE 1
|
|
IF LEFT$(SUPPLYI$(0), 4) = "FAIL" THEN 'Check supply current
|
|
CALL CONTINUE
|
|
CONFLAG% = 1 'Sets exit flag
|
|
END IF
|
|
CASE 2
|
|
|
|
IF LEFT$(OFFSETCAL$(CAL%), 4) = "FAIL" THEN
|
|
CALL CONTINUE 'Checks for offset error < 8% span
|
|
CONFLAG% = 1
|
|
END IF
|
|
|
|
IF LEFT$(GAINCAL$(CAL%), 4) = "FAIL" THEN
|
|
CALL CONTINUE 'Checks for Gain error < 8% span
|
|
CONFLAG% = 1
|
|
END IF
|
|
|
|
' CASE 3
|
|
|
|
END SELECT
|
|
IF CONFLAG% <> 0 THEN EXIT FOR
|
|
NEXT
|
|
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
'
|
|
|
|
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N" 'Repeat for another module
|
|
|
|
CALL RESETTH 'Reset the test head
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION GAINCAL$ (CAL%) ' THIS SHOULD USE A UNIVERSAL FUNCTION GAINCAL$(FAMILY, CAL%, ETC OR PASS A PTR TO A STRUCT)
|
|
|
|
'Calibrate module gain
|
|
'Inputs; calibration flag
|
|
' measured contact resistance (used for resistance in only)
|
|
|
|
SENSOR$ = SPECS.SENTYPE
|
|
MAXIN! = SPECS.MAXIN
|
|
MININ! = SPECS.MININ
|
|
MINOUT! = SPECS.MINOUT 'V or A
|
|
MAXOUT! = SPECS.MAXOUT
|
|
INITTOL! = 8 'Uncalibrated gain tolerance (%)
|
|
CALTOL! = SPECS.CALTOL 'Calibration tolerance (%)
|
|
OSCALIN! = SPECS.OSCALIN 'Module input for offset calibration
|
|
GNCALIN! = SPECS.GNCALIN 'Module input for gain calibration
|
|
'
|
|
'
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
|
|
CALSPAN! = MODULEOUT!(GNCALIN!) - MODULEOUT!(OSCALIN!) 'Adjustment range is +/- x% of +f.s.
|
|
OUTTYPE$ = SPECS.OUTSIGTYPE
|
|
SNM% = SENSORNUM%
|
|
|
|
IF SNM% = 2 THEN
|
|
SCALE% = 1000
|
|
|
|
ELSE
|
|
SCALE% = 1
|
|
END IF
|
|
|
|
INRANGE! = (MAXIN! - MININ!) / SCALE% * IINSEN.MEAS!
|
|
|
|
IF OUTTYPE$ = "CURRENT" AND ABS(MINOUT!) = MAXOUT! THEN 'Bipolar current output
|
|
CALGN! = .00025 'Calibrate @ +0.025% span to correct for nonlinearity
|
|
'@ -f.s. output.
|
|
END IF
|
|
|
|
CLS
|
|
TESTTITLE$ = "Gain Calibration"
|
|
CALL HEADERB(TESTTITLE$)
|
|
CALL MODOUTLINE
|
|
LOCATE 7
|
|
PRINT TAB(44); CHR$(24);
|
|
PRINT TAB(35); "GAIN POTENTIOMETER";
|
|
|
|
IF CAL% = 2 THEN
|
|
GERROR! = INITTOL! 'Gain tolerance for func. test (%)
|
|
TOL! = .0001 * ORANGE! 'Measurement tolerance, 1 pass test
|
|
ELSE
|
|
GERROR! = CALTOL! 'Gain calibration tolerance (%)
|
|
TOL! = 0! 'Measurement tolerance, continuous test
|
|
END IF
|
|
|
|
LOCATE 10, 10: PRINT "Observe that the LED between the potentiometers is ON."
|
|
BEEP: BEEP: BEEP
|
|
LOCATE 20, 5: PRINT "After you have verified the LED is ON, you may hit any key to continue."
|
|
CALL CONTINUE
|
|
|
|
DO
|
|
TIME1! = TIMER 'Start timer
|
|
LOCATE 12, 10: PRINT TAB(10); "Measuring input. Please wait..."
|
|
MAXIN! = GNCALIN! 'Calc. maxin volts
|
|
IF SNM% = 2 THEN
|
|
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
|
|
ELSE
|
|
|
|
|
|
CALL SETDAC2(MAXIN!, 1, 0) 'Sets DAC
|
|
IF CAL% = 0 OR MAXIN! > 10! THEN 'Always measure high voltage
|
|
'input to get exact setting
|
|
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
CALL LOADMUX(1, CON%)
|
|
CALL WRITEDVM(VODC$, MAXIN!) 'Sets meter to read
|
|
CALL PAUSE(2!)
|
|
MAXINMEAS! = READDVM!(INRANGE! * MAXACCERR! / 10!) '10x better than accuracy
|
|
|
|
CALL LOADMUX(1, COFF%)
|
|
ELSE
|
|
MAXINMEAS! = MAXIN!
|
|
'
|
|
END IF
|
|
END IF
|
|
|
|
CALL WRITEDVM("S1", 0) 'Medium reading rate
|
|
|
|
OUTCALC! = MODULEOUT!(MAXINMEAS!) + CALGN! * CALSPAN!
|
|
|
|
CALL LOADMUX(2, CON%) 'Measure Vout
|
|
'
|
|
CALL WRITEDVM(VODC$, OUTCALC! * IOUTSEN.MEAS!)
|
|
|
|
LOCATE 12, 10: PRINT "Gain Error = ";
|
|
PRINT SPC(20);
|
|
|
|
L% = 0
|
|
|
|
DO
|
|
L% = L% + 1
|
|
ERROROUT! = (READDVM!(TOL!) / IOUTSEN.MEAS! - OUTCALC!) / CALSPAN! * 100! 'Error (%)
|
|
|
|
LOCATE 12, 24
|
|
PRINT USING "+###.### %"; ERROROUT!
|
|
|
|
LOCATE 15, 10
|
|
IF CAL% > 0 THEN
|
|
CONREADS% = 5
|
|
ELSEIF ABS(ERROROUT!) < GERROR! THEN
|
|
SOUND 400, .5
|
|
PRINT "Stop turning gain potentiometer "
|
|
CONREADS% = CONREADS% + 1
|
|
ELSEIF ERROROUT! < 0 THEN
|
|
PRINT "Turn gain potentiometer clockwise "
|
|
CONREADS% = 0
|
|
ELSE
|
|
PRINT "Turn gain potentiometer counter-clockwise"
|
|
CONREADS% = 0
|
|
END IF
|
|
|
|
LOCATE 20, 10
|
|
A$ = INKEY$
|
|
IF UCASE$(A$) = "T" THEN
|
|
PRINT TAB(10); "Trouble Shooting Mode"
|
|
CALL WRITEDVM("*", OUTCALC! * IOUTSEN.MEAS!)
|
|
CALL CONTINUE
|
|
'
|
|
LOCATE 20, 10: PRINT SPC(22);
|
|
ELSEIF UCASE$(A$) = "C" THEN
|
|
CONREADS% = 5
|
|
END IF
|
|
're-measure input
|
|
'once every 40 cycles
|
|
CALL PAUSE(.2) 'Slow down loop
|
|
LOOP WHILE CONREADS% < 5 AND L% < 400
|
|
CALL LOADMUX(2, COFF%)
|
|
|
|
LOOP WHILE CONREADS% < 5
|
|
|
|
IF ABS(ERROROUT!) <= GERROR! THEN
|
|
GN$ = "PASS"
|
|
ELSE
|
|
GN$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
LOCATE 15, 10
|
|
PRINT "Status: ";
|
|
|
|
IF LEFT$(GN$, 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT GN$;
|
|
COLOR 11, 0
|
|
PRINT SPC(30);
|
|
PRINT TAB(10); "Gain calibration error is";
|
|
PRINT TAB(50); USING " +###.### %"; ERROROUT!
|
|
PRINT TAB(10); "Max. gain calibration error is";
|
|
PRINT TAB(50); USING "+/-##.### %"; GERROR!
|
|
|
|
GAINCAL$ = GN$ + STR$(ERROROUT!)
|
|
|
|
CALL RESETTH 'Reset the test head
|
|
CALL PAUSE(1!)
|
|
|
|
END FUNCTION
|
|
|
|
SUB GENSET (GENAMPL!)
|
|
|
|
MININ! = SPECS.MININ
|
|
MAXIN! = SPECS.MAXIN 'Convert to A
|
|
|
|
|
|
RCONV! = SPECS.RCONV
|
|
ATTEN! = SPECS.ATTEN
|
|
SNM% = SENSORNUM%
|
|
|
|
IF SNM% = 2 THEN
|
|
SCALE% = 1000
|
|
ELSE
|
|
SCALE% = 1
|
|
END IF
|
|
|
|
INRANGE! = (MAXIN! - MININ!) / SCALE% * IINSEN!
|
|
ORANGE! = (SPECS.MAXOUT! - SPECS.MINOUT!) * IOUTSEN.MEAS! 'V
|
|
|
|
IF SNM% = 2 THEN
|
|
SCALE% = 1000
|
|
GENAMPL! = MAXIN! / SCALE% * (RCONV! + IINSEN!)
|
|
ELSE
|
|
SCALE% = 1
|
|
'Set amplitude for > 5mV p-p signal out
|
|
UNATTENOUT! = 10 ^ (ATTEN! / 20) * .005
|
|
GENAMPL! = UNATTENOUT! / ORANGE! * INRANGE! * .9
|
|
IF GENAMPL! < 5 THEN
|
|
GENAMPL! = 4
|
|
ELSE
|
|
GENAMPL! = 8 '10V and +5V offset can cause
|
|
'clipping on 0-20mA output modules.
|
|
'Leave some leeway in the setting.
|
|
END IF
|
|
END IF
|
|
'Convert to round numbers
|
|
'for ease of use
|
|
GATTEN! = INRANGE! / GENAMPL! 'Attenuator gain
|
|
GENOS! = (MININ! / SCALE% * IINSEN! + INRANGE! / 2!) / GATTEN!
|
|
|
|
IF GENAMPL! < .5 * ABS(GENOS!) THEN 'GENAMPL! cannot be less
|
|
GENAMPL! = .5 * ABS(GENOS!) 'than 1/2 the offset. Max
|
|
END IF 'offset is 2x amplitude.
|
|
IF GENAMPL! > 20 - 2 * ABS(GENOS!) THEN GENAMPL! = 20 - 2 * ABS(GENOS!)
|
|
|
|
|
|
CLS
|
|
LOCATE 5, 10: PRINT "Set the function generator as follows:"
|
|
LOCATE 10, 27: PRINT "Function Generator Settings"
|
|
LOCATE 11, 27: PRINT "---------------------------"
|
|
LOCATE 12, 31: PRINT USING "Frequency: ##### Hz"; SPECS.TESTFREQ!
|
|
LOCATE 13, 31: PRINT USING "Amplitude: ##.# V p-p"; GENAMPL!
|
|
LOCATE 14, 31: PRINT USING "DC Offset: +##.# V"; GENOS!
|
|
CALL CONTINUE
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
SUB GETADD (FILENAME$)
|
|
|
|
'LPT$ = parallel printer port used to control ATE
|
|
'MUX$ = multiplexer box address
|
|
'TESTHEAD$ = test head address
|
|
'PS1ADDR$ = Power Supply #1 address (module power)
|
|
'PS2ADDR$ = Power Supply #2 address (high voltage input to dut)
|
|
'PSPORTADDR$ = Power Supply serial port address
|
|
'DVM$ = DVM address
|
|
|
|
OPEN "C:\ATE\ADDR\" + FILENAME$ FOR RANDOM AS #3 LEN = 19
|
|
FIELD #3, 3 AS LPT$, 2 AS MUX$, 2 AS TESTHEAD$, 2 AS DPSPSADDR$, 2 AS DPSVINADDR$, 2 AS PSPORTADDR$, 2 AS DVM$, 2 AS ABCPSADDR$, 2 AS ABCVINADDR$
|
|
GET #3
|
|
LPTADDR% = VAL(LPT$)
|
|
MUXADDR% = VAL(MUX$)
|
|
THADDR% = VAL(TESTHEAD$)
|
|
DPSPSADDR% = VAL(DPSPSADDR$)
|
|
DPSVINADDR% = VAL(DPSVINADDR$)
|
|
PSPORT% = VAL(PSPORTADDR$)
|
|
DVMADDR% = VAL(DVM$)
|
|
ABCPSADDR% = VAL(ABCPSADDR$)
|
|
ABCVINADDR% = VAL(ABCVINADDR$)
|
|
|
|
CLOSE #3
|
|
'PRINT LPTADDR%, MUXADDR%, THADDR%, DPSPSADDR%, DPSVINADDR%, PSPORT%, DVMADDR%, ABCPSADDR%, ABCVINADDR%
|
|
'CALL CONTINUE
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION GETPSID%
|
|
CLS
|
|
|
|
LOCATE 3, 10: PRINT "Identifying power supplies connected to test system"
|
|
|
|
PRINT
|
|
'****** First, assume KEPCO DPS125 for PSMODEL$ string assignment.
|
|
PSMODEL$ = "DPS125"
|
|
|
|
'****** KEPCO DPS VIN supply address for serial interface.
|
|
' PSADDR% = 2
|
|
|
|
'****** Obtain Identification string from KEPCO DPS 125.
|
|
|
|
LOCATE 5, 20: PRINT "KEPCO DPS125 Power Supply: ";
|
|
DPSPS$ = POWERIO$(DPSPSADDR%, "ID")
|
|
|
|
'****** Assign corresponding address obtained from address file dependent
|
|
'****** on if the Power supply is DPS125 or ABC125.
|
|
IF DPSPS$ = "KEPCO DPS 125-0.5M" THEN
|
|
PSADDR% = DPSPSADDR% 'this value should = 2
|
|
|
|
LOCATE 5, 53: PRINT "Yes!"
|
|
PSMODEL$ = "DPS125"
|
|
CALL INITPS(DPSPSADDR%, PSILIMIT!, OVERV!)
|
|
DPSPSFLAG! = 1!
|
|
ELSE
|
|
LOCATE 5, 53: PRINT "Not present"
|
|
DPSPSFLAG! = 0!
|
|
PSADDR% = 0!
|
|
END IF
|
|
|
|
'****** Check for High Voltage Power Supply
|
|
|
|
LOCATE 6, 20: PRINT "KEPCO DPS125 High-Voltage Input: ";
|
|
DPSVIN$ = POWERIO$(DPSVINADDR%, "ID")
|
|
|
|
IF DPSVIN$ = "KEPCO DPS 125-0.5M" THEN
|
|
VINADDR% = DPSVINADDR%
|
|
|
|
LOCATE 6, 53: PRINT "Yes!"
|
|
PRINT
|
|
CALL INITPS(DPSVINADDR%, VINILIMIT!, VINOVERV!)
|
|
DPSVINFLAG! = 1!
|
|
ELSE
|
|
LOCATE 6, 53: PRINT "Not present"
|
|
DPSVINFLAG! = 0!
|
|
VINADDR% = 0!
|
|
END IF
|
|
|
|
IF DPSPSFLAG! = 0! AND DPSVINFLAG! = 0! THEN
|
|
|
|
PSMODEL$ = "ABC125"
|
|
PRINT TAB(20); "KEPCO ABC-125 Power Supply: ";
|
|
ABCPS$ = READGPIB$(ABCPSADDR%, "*IDN?")
|
|
IF LEFT$(ABCPS$, 14) = "KEPCO,ABC-1251" THEN
|
|
PSADDR% = ABCPSADDR%
|
|
CALL INITPS(ABCPSADDR%, PSILIMIT!, OVERV!)
|
|
PRINT TAB(55); "Yes!"
|
|
ELSE
|
|
PRINT TAB(55); "Not present"
|
|
END IF
|
|
|
|
PRINT TAB(20); "KEPCO ABC-125 High-Voltage Input: ";
|
|
ABCVIN$ = READGPIB$(ABCVINADDR%, "*IDN?")
|
|
IF LEFT$(ABCVIN$, 14) = "KEPCO,ABC-1251" THEN
|
|
VINADDR% = ABCVINADDR%
|
|
CALL INITPS(ABCVINADDR%, VINILIMIT!, VINOVERV!)
|
|
PRINT TAB(55); "Yes!"
|
|
PRINT
|
|
ELSE
|
|
PRINT TAB(55); "Not present"
|
|
PRINT
|
|
END IF
|
|
END IF
|
|
|
|
IF PSADDR% = 0! AND VINADDR% = 0! THEN
|
|
PRINT TAB(15); ">>>>>>>> No Power Supplies are connected <<<<<<<<"
|
|
CALL CONTINUE
|
|
END IF
|
|
|
|
GETPSID% = 99 'This has yet to be utilized. At this time there is
|
|
'no requirement to pass anthing back to function call
|
|
CALL PAUSE(1)
|
|
END FUNCTION
|
|
|
|
'*****************************************
|
|
SUB GETSPECS ' THIS ONE SHOULD BE CHANGED TO SUB GETSPECS CALL GETSPECS(TE$=FAMILY) END SUB
|
|
|
|
DIM POINTER%(1000)
|
|
|
|
CALL SORTDB(ENDFLAG%)
|
|
IF ENDFLAG% = 1 THEN
|
|
SPECS.MODNAME = "EXIT"
|
|
EXIT SUB
|
|
END IF
|
|
|
|
CLS
|
|
LOCATE 3, 30: PRINT " Model Selection Menu "
|
|
LOCATE 4, 30: PRINT " -------------------- "
|
|
LOCATE 5, 30: PRINT " "
|
|
|
|
YINIT% = CSRLIN 'Initialize starting rows
|
|
|
|
OPEN "C:\ATE\DSCDATA\DBSORT2.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1)
|
|
|
|
DO
|
|
I% = I% + 1
|
|
GET #2, I%, SORTDATA1
|
|
IF SORTDATA1.RECNUM <> -1 THEN NUMRECORD! = NUMRECORD! + 1
|
|
LOOP WHILE SORTDATA1.RECNUM <> -1
|
|
|
|
SCRNCTR% = 40 'display center
|
|
NUMCHAR% = 19 '13 char + 4 char for # + 2 spaces
|
|
NUMLINES! = 16 '# of lines for model display below header
|
|
NUMCOLUMNS! = 1 + INT(NUMRECORD! / NUMLINES!)
|
|
'Model # length = 20 characters max
|
|
'-> 3 columns max per screen
|
|
'3 columns x 26 char = 78 spaces
|
|
I% = 1
|
|
|
|
FOR C% = 0 TO NUMCOLUMNS! - 1
|
|
Y% = YINIT%
|
|
TB% = SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + NUMCHAR% * C%
|
|
DO
|
|
GET #2, I%, SORTDATA1
|
|
IF SORTDATA1.RECNUM <> -1 THEN
|
|
POINTER%(I%) = SORTDATA1.RECNUM
|
|
LOCATE Y%, TB%
|
|
PRINT USING "##.) &"; I%; SORTDATA1.MODNAME
|
|
I% = I% + 1
|
|
Y% = Y% + 1
|
|
END IF
|
|
LOOP WHILE SORTDATA1.RECNUM <> -1 AND Y% - YINIT% < NUMLINES!
|
|
|
|
NEXT C%
|
|
|
|
LOCATE Y%, TB%
|
|
PRINT USING "##.) Exit"; I%
|
|
|
|
CLOSE #2
|
|
|
|
DO
|
|
LOCATE 23, SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS!
|
|
PRINT "Enter Selection ";
|
|
INPUT SEL%
|
|
LOOP WHILE SEL% < 1 OR SEL% > I%
|
|
|
|
IF SEL% = I% THEN
|
|
SPECS.MODNAME = "EXIT"
|
|
ELSE
|
|
OPEN "C:\ATE\DSCDATA\DSCOUT.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
|
|
GET #1, POINTER%(SEL%), SPECS
|
|
CLOSE #1
|
|
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
|
|
CLS
|
|
|
|
LOCATE 10, 5
|
|
BEEP
|
|
PRINT "This module requires high voltage input."
|
|
PRINT
|
|
PRINT TAB(5); "Turn on the high voltage power supply and connect it to the test head."
|
|
PRINT
|
|
PRINT TAB(5); "DO NOT PROBE THE CIRCUITRY DURING TEST"
|
|
PRINT
|
|
PRINT TAB(5); "Remove the yellow connector from the meter +/-SENSE terminals."
|
|
CALL CONTINUE
|
|
|
|
END IF
|
|
IF SPECS.OUTSIGTYPE = "CURRENT" THEN
|
|
CALL SETOUTLOAD(IOUTSEN!) 'Set current output sense resistor
|
|
'Connect CH2 to output
|
|
'Measure current output sense resistor
|
|
CALL WRITEDVM("S0", 0) 'Slow reading rate
|
|
IOUTSEN.MEAS! = MEASRES!(IOUTSEN!, 3, TE$)
|
|
CALL WRITEDVM("S1", 0)
|
|
ELSE
|
|
CALL SETOUTLOAD(1E+10) 'Connect CH2 to output
|
|
IOUTSEN.MEAS! = 1
|
|
|
|
END IF
|
|
END IF
|
|
|
|
|
|
SEL% = POINTER%(SEL%) 'pass back to main code for use in SAVEDATA
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
SUB HEADERA (SN$)
|
|
|
|
IF PON% = 1 THEN
|
|
LPRINT TAB(5); "DATAFORTH CORPORATION"; TAB(51); "Phone: (520) 741-1404"
|
|
LPRINT TAB(5); "3331 E. Hemisphere Loop"; TAB(51); "Fax: (520) 741-0762"
|
|
LPRINT TAB(5); "Tucson, AZ 85706 USA"; TAB(51); "email: info@dataforth.com"
|
|
LPRINT
|
|
LPRINT TAB(33); "TEST DATA SHEET"
|
|
LPRINT TAB(5);
|
|
FOR X = 5 TO 75
|
|
LPRINT "~";
|
|
NEXT
|
|
LOCATE 8
|
|
LPRINT TAB(5); "Date: "; DATE$
|
|
LPRINT TAB(5); "Model: "; SPECS.MODNAME
|
|
LPRINT TAB(5); "SN: "; TAB(12); SN$
|
|
LPRINT
|
|
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
SUB HEADERB (TESTTITLE$)
|
|
|
|
'print test title, model under test, and sn at top of screen
|
|
|
|
TITLEN = LEN(TESTTITLE$) + LEN(SPECS.MODNAME)
|
|
PRINT TAB(40 - TITLEN / 2); SPECS.MODNAME; " "; TESTTITLE$;
|
|
IF SN$ <> "" THEN
|
|
PRINT TAB(66); "SN: "; SN$ 'print sn if available
|
|
ELSE
|
|
PRINT
|
|
END IF
|
|
LOCATE , 40 - TITLEN / 2
|
|
FOR L = 1 TO TITLEN + 1 'underline test title
|
|
PRINT "-";
|
|
NEXT
|
|
PRINT
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION ILIMIT$ (POSI%)
|
|
|
|
' Test the output current limit
|
|
' Inputs: POSI%, indicates positive or negative current limit
|
|
|
|
MAXOUT! = SPECS.MAXOUT
|
|
MODLOAD! = SPECS.LOAD3 * 2 'Set load value (mA)
|
|
IOUTLIM! = SPECS.ILIMIT
|
|
OUTTYPE$ = SPECS.OUTSIGTYPE
|
|
|
|
IF POSI% = 1 THEN
|
|
MODIN! = SPECS.MAXIN
|
|
MODOUT! = SPECS.MAXOUT 'V or A
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
BIDIR$ = "Positive"
|
|
END IF
|
|
POL% = 1
|
|
ELSE
|
|
MODIN! = SPECS.MININ
|
|
MODOUT! = SPECS.MINOUT 'V or A
|
|
BIDIR$ = "Negative"
|
|
POL% = -1
|
|
END IF
|
|
|
|
IMAXOUT! = SPECS.ILIMIT * POL%
|
|
|
|
CLS
|
|
TESTTITLE$ = BIDIR$ + " Current Limit Test"
|
|
CALL HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
IF OUTTYPE$ = "CURRENT" THEN
|
|
PRINT "This test is not performed on model "; SPECS.MODNAME
|
|
EXIT FUNCTION
|
|
ELSE
|
|
PRINT "Testing, please wait."
|
|
END IF
|
|
|
|
IF OUTTYPE$ = "CURRENT" THEN
|
|
RL! = IOUTSEN.MEAS!
|
|
ELSE 'Voltage output modules
|
|
RL! = 1 / (1 / 2000 + 1 / 1000 + 1 / 200 + 1 / 100)'MEASRES!(MODLOAD!, 5, TE$)
|
|
CALL SETOUTLOAD(RL!) 'Sets load to 61 ohms
|
|
CALL SETDAC2(MODIN!, 1, 0) 'Sets DAC for + or - f.s. in
|
|
END IF
|
|
|
|
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
|
|
CALL LOADMUX(2, CON%)
|
|
|
|
MEASILIM! = READDVM!(.0005) / RL! * 1000! 'measured current limit (mA)
|
|
|
|
IF ABS(MEASILIM!) > ABS(IOUTLIM!) THEN
|
|
IL$ = "FAIL"
|
|
SOUND 1000, .5
|
|
ELSE
|
|
IL$ = "PASS"
|
|
END IF
|
|
|
|
LOCATE 10, 10: PRINT "Status: ";
|
|
|
|
IF LEFT$(IL$, 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT IL$;
|
|
COLOR 11, 0
|
|
|
|
PRINT SPC(20);
|
|
PRINT TAB(10); USING "Measured & current limit = ####.# mA"; BIDIR$; MEASILIM!
|
|
PRINT TAB(10); USING "Maximum & current limit = ###.# mA"; BIDIR$; IOUTLIM! * POL%
|
|
|
|
ILIMIT$ = IL$ + STR$(MEASILIM!) + "1" 'append # decimal places
|
|
|
|
IF OUTTYPE$ = "VOLTAGE" THEN 'Remove output load, DSCA49
|
|
CALL SETOUTLOAD(5000!)
|
|
END IF
|
|
CALL RESETTH 'Reset the test head
|
|
CALL PAUSE(1!)
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
SUB INDIVID (SEL%, ITERATION%)
|
|
|
|
DIM TSIM!(105), OUTCALC!(105), OUTMEAS!(105), ERROROUT!(105), ACCSTAT$(105)
|
|
|
|
SNM% = SENSORNUM%
|
|
MINOUT! = SPECS.MINOUT
|
|
OUTTYPE$ = SPECS.OUTSIGTYPE
|
|
|
|
IF SNM% = 2 THEN 'Check if current input
|
|
CALL WRITEDVM("S0", 0) 'Slow reading rate
|
|
IINSEN.MEAS! = MEASRES!(IINSEN!, 2, TE$) 'Measure current source sense R
|
|
CALL WRITEDVM("S1", 0) 'Medium reading rate
|
|
|
|
ELSE
|
|
IINSEN.MEAS! = 1
|
|
END IF
|
|
|
|
IF SPECS.ISMAXFL <> 0 THEN
|
|
MODILIM! = SPECS.ISMAXFL
|
|
ELSE
|
|
MODILIM! = SPECS.ISMAXNL
|
|
END IF
|
|
|
|
DO
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
SELECT CASE SEL%
|
|
|
|
CASE 1
|
|
|
|
IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
END IF
|
|
A$ = SUPPLYI$(0)
|
|
|
|
CASE 2
|
|
|
|
IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
END IF
|
|
A$ = SUPPLYI$(1)
|
|
|
|
CASE 3
|
|
|
|
ITER2% = ITERATION%
|
|
WHILE ITER2% > 0 'Offset/Gain calibration loop
|
|
A$ = OFFSETCAL$(CAL%) 'Offset calibration
|
|
A$ = GAINCAL$(CAL%) 'Gain calibration
|
|
ITER2% = ITER2% - 1
|
|
WEND 'Tests for Offset/Gain calibration end
|
|
CASE 4
|
|
FOR T% = 1 TO 3
|
|
SELECT CASE T%
|
|
CASE 1
|
|
OUTLOAD! = SPECS.LOAD3
|
|
A$ = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
A$ = ACC$ 'Assigns results of accuracy test
|
|
CASE 2
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
OUTLOAD! = SPECS.LOAD2
|
|
A$ = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
A$ = ACC$ 'Assigns results of accuracy test
|
|
END IF
|
|
CASE 3
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
OUTLOAD! = SPECS.LOAD1
|
|
A$ = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
A$ = ACC$ 'Assigns results of accuracy test
|
|
END IF
|
|
END SELECT
|
|
NEXT
|
|
CALL INTERLUDE
|
|
CASE 5
|
|
POSI% = 1 'Test positive current limit
|
|
A$ = ILIMIT$(POSI%)
|
|
IF OUTTYPE$ = "VOLTAGE" AND MINOUT! <> 0 THEN
|
|
POSI% = 0 'Test negative current limit
|
|
A$ = ILIMIT$(POSI%)
|
|
END IF
|
|
CASE 6
|
|
|
|
A$ = OVERRANGE$ 'Test module overrange
|
|
CASE 7
|
|
|
|
A$ = SUPPLYSEN$
|
|
CASE 8
|
|
|
|
A$ = INPUTR$
|
|
CASE 9
|
|
CALL GENSET(GENAMPL!)
|
|
A$ = FREQRESP$(GENAMPL!)
|
|
CASE 10
|
|
|
|
A$ = STEPRESP$
|
|
CASE 11
|
|
|
|
A$ = OUTNOISE$
|
|
CASE 12
|
|
|
|
A$ = IOUTMAXL$(1)
|
|
IF LEFT$(SPECS.MODNAME, 9) = "DSCA39-07" THEN
|
|
CALL CONTINUE
|
|
B$ = IOUTMAXL$(0)
|
|
END IF
|
|
END SELECT
|
|
|
|
CALL CONTINUE
|
|
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
|
|
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N"
|
|
|
|
IF SNM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
|
|
PRINT
|
|
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
CALL CONTINUE
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION INPUTR$
|
|
|
|
MAXIN! = SPECS.MAXIN '+f.s. input voltage (V)
|
|
MININ! = SPECS.MININ '-f.s. input voltage (V)
|
|
MINOUT! = SPECS.MINOUT 'V or A
|
|
MAXOUT! = SPECS.MAXOUT
|
|
SPEC! = SPECS.INPUTRES 'Meg ohms
|
|
INRANGE! = MAXIN! - MININ!
|
|
ORANGE! = MAXOUT! - MINOUT!
|
|
|
|
CLS
|
|
TESTTITLE$ = "Input Resistance & Bias Current Test"
|
|
CALL HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
IF SNM% = 2 THEN 'Check for V in only
|
|
PRINT "This test is not performed on model "; SPECS.MODNAME
|
|
EXIT FUNCTION
|
|
ELSE
|
|
PRINT "Testing, please wait."
|
|
END IF
|
|
|
|
CALL SETDAC2(MAXIN!, 1, 0)
|
|
|
|
' CALL LOADMUX(2, CON%) 'Measure output
|
|
' CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
|
|
' OUT1! = READDVM!(.001)
|
|
|
|
CB0VAL% = CB0VAL% OR &H20 'Insert large resistor in series
|
|
CALL SETTH(CB0VAL%, CB0%) 'with input.
|
|
|
|
CALL LOADMUX(2, CON%) 'Turns on mux, reset w/ resistor insert
|
|
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
|
|
OUT2! = READDVM!(.001) 'Measure output
|
|
CALL LOADMUX(2, COFF%)
|
|
|
|
' DELTAOUT! = (OUT2! - OUT1!) * 1000! 'Output change
|
|
' MAXDELTA! = (MAXOUT! - MODULEOUT!((SPEC! / (SPEC! + RSERIES!)) * MAXIN!)) / ORANGE! * 100 'max change (%)
|
|
|
|
PEDOS! = MODULEOUT!(0!)
|
|
XFERFN! = ORANGE! / INRANGE!
|
|
RINMEAS! = ABS((OUT2! - PEDOS!) * RSERIES! / (MAXIN! * XFERFN! - OUT2!) / 1000000!)
|
|
|
|
IF RINMEAS! > 1000 THEN RINMEAS! = 1000
|
|
|
|
IF RINMEAS! >= SPEC! THEN
|
|
INR$ = "PASS"
|
|
ELSE
|
|
INR$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
LOCATE 10, 10
|
|
PRINT "Status: ";
|
|
|
|
IF LEFT$(INR$, 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT INR$;
|
|
COLOR 11, 0
|
|
|
|
|
|
PRINT SPC(20);
|
|
PRINT TAB(10); "Measured input resistance is";
|
|
PRINT TAB(50); USING " #### Mohms"; RINMEAS!
|
|
PRINT TAB(10); "Required input resistance is";
|
|
PRINT TAB(50); USING ">= #### Mohms"; SPEC!
|
|
|
|
INPUTR$ = INR$ + STR$(RINMEAS!) + "0"
|
|
|
|
CALL RESETTH 'Reset the test head
|
|
CALL PAUSE(1!)
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
FUNCTION IOUTMAXL$ (MINMAX%)
|
|
|
|
'test operation of current output modules with max load resistance.
|
|
|
|
SENSOR$ = SPECS.SENTYPE
|
|
PLUSFSIN! = SPECS.MAXIN
|
|
MINUSFSIN! = SPECS.MININ
|
|
MINOUT! = SPECS.MINOUT 'V or A
|
|
MAXOUT! = SPECS.MAXOUT
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
|
|
SNM% = SENSORNUM%
|
|
OUTTYPE$ = SPECS.OUTSIGTYPE
|
|
MAXLOAD! = SPECS.MAXLOAD
|
|
MINLOAD! = 5 '5 ohms, used to test DSCA39-07
|
|
MAXACCERR! = SPECS.ACCURACY1 * 2 '%
|
|
COMPLIANCE! = SPECS.COMPLIANCE 'Max change in output w/ load (%)
|
|
'Allows for 5 ohm lead resistance
|
|
'and 0.1% output change
|
|
CLS
|
|
IF MINMAX% = 1 THEN
|
|
TESTTITLE$ = "Maximum Output Load Test"
|
|
ELSE
|
|
TESTTITLE$ = "Minimum Output Load Test"
|
|
END IF
|
|
|
|
CALL HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
IF OUTTYPE$ = "VOLTAGE" THEN
|
|
PRINT "This test is not performed on model "; SPECS.MODNAME
|
|
EXIT FUNCTION
|
|
ELSE
|
|
PRINT "Testing, please wait."
|
|
END IF
|
|
|
|
MAXIN! = PLUSFSIN! 'Calc. maxin volts
|
|
IF SNM% = 2 THEN
|
|
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
|
|
ELSE
|
|
CALL SETDAC2(MAXIN!, 1, 0) 'Sets DAC
|
|
END IF
|
|
|
|
CALL LOADMUX(2, CON%) 'Measure output
|
|
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
|
|
|
|
OUTNOMLOAD! = READDVM!(.0001 * ORANGE!) / IOUTSEN.MEAS! '.01% tolerance
|
|
CALL LOADMUX(2, COFF%)
|
|
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
|
|
IF MINMAX% = 1 THEN
|
|
CALL SETOUTLOAD(MAXLOAD!) 'Set max load resistor
|
|
IOUTSEN2.MEAS! = MEASRES!(MAXLOAD!, 5, TE$)
|
|
TESTLIM! = COMPLIANCE!
|
|
ELSE
|
|
CALL SETOUTLOAD(MINLOAD!) 'Set min load resistor
|
|
IOUTSEN2.MEAS! = MEASRES!(MINLOAD!, 4, TE$)
|
|
TESTLIM! = MAXACCERR!
|
|
END IF
|
|
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN2.MEAS!)
|
|
CALL LOADMUX(2, CON%) 'Measure output
|
|
CALL LOADMUX(2, CON%) 'Doesn't always set first time.
|
|
|
|
OUTMAXLOAD! = READDVM!(.0001 * ORANGE!) / IOUTSEN2.MEAS! '.01% tolerance
|
|
PERCOUTCHG! = (OUTMAXLOAD! - OUTNOMLOAD!) / ORANGE! * 100!
|
|
|
|
IF ABS(PERCOUTCHG!) <= TESTLIM! THEN
|
|
ML$ = "PASS"
|
|
ELSE
|
|
ML$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
LOCATE 15, 10
|
|
PRINT "Status: ";
|
|
|
|
IF LEFT$(ML$, 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT ML$;
|
|
COLOR 11, 0
|
|
|
|
PRINT SPC(30);
|
|
PRINT TAB(10); "Change in output current at max load is";
|
|
PRINT TAB(50); USING " +###.### %"; PERCOUTCHG!
|
|
PRINT TAB(10); "Max. change in output current is";
|
|
PRINT TAB(50); USING "+/-##.### %"; TESTLIM!
|
|
|
|
IOUTMAXL$ = ML$ + STR$(PERCOUTCHG!) + "2"
|
|
|
|
CALL RESETTH 'Reset the test head
|
|
CALL SETOUTLOAD(IOUTSEN!) 'Set current output sense resistor
|
|
CALL PAUSE(1!)
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION LINTEST$ (ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
'Sub to perform the accuracy/linearity tests and create the accuracy test results section of
|
|
'the datasheet. Removed code to print to file since that is now accomplished by the
|
|
'"DATASHEETWRITE" sub. The datasheet data can still be sent to two places (screen and
|
|
'printer), so when updating remember to make any changes to both the "PRINT" and "LPRINT"
|
|
'sections (PWR: 2013-11-12).
|
|
'
|
|
SENSOR$ = SPECS.SENTYPE
|
|
MININ! = SPECS.MININ
|
|
MAXIN! = SPECS.MAXIN
|
|
MINOUT! = SPECS.MINOUT 'V or A
|
|
MAXOUT! = SPECS.MAXOUT
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
|
|
|
|
LOAD1! = SPECS.LOAD1
|
|
LOAD2! = SPECS.LOAD2
|
|
LOAD3! = SPECS.LOAD3
|
|
|
|
CLS
|
|
IF SPECS.OUTSIGTYPE = "VOLTAGE" THEN
|
|
UNIT$ = "V"
|
|
SCALE! = 1!
|
|
IF OUTLOAD! > 1 THEN 'Output load in mA
|
|
CALL SETOUTLOAD(MAXOUT! / OUTLOAD! * 1000)
|
|
END IF
|
|
|
|
IF OUTLOAD! = LOAD1! THEN
|
|
MAXACCERR! = SPECS.ACCURACY1 '%
|
|
MAXLINERR! = SPECS.LINEAR1
|
|
ELSEIF OUTLOAD! = LOAD2! THEN
|
|
MAXACCERR! = SPECS.ACCURACY2
|
|
MAXLINERR! = SPECS.LINEAR2
|
|
ELSE
|
|
MAXACCERR! = SPECS.ACCURACY3
|
|
MAXLINERR! = SPECS.LINEAR3
|
|
END IF
|
|
|
|
CLS
|
|
TESTTITLE$ = "Accuracy, Load Current = " + STR$(OUTLOAD!) + " mA"
|
|
ELSE
|
|
UNIT$ = "mA"
|
|
SCALE! = 1000!
|
|
TESTTITLE$ = "Accuracy Test"
|
|
OUTLOAD! = 0 'Flag for header printing
|
|
MAXACCERR! = SPECS.ACCURACY1 '%
|
|
MAXLINERR! = SPECS.LINEAR1
|
|
END IF
|
|
|
|
CALL HEADERB(TESTTITLE$)
|
|
|
|
SNM% = SENSORNUM%
|
|
IF SNM% = 2 THEN 'Current input modules
|
|
INPUTTYPE$ = "Iin (mA)"
|
|
SCALE% = 1000
|
|
ELSE
|
|
INPUTTYPE$ = " Vin (V)" 'Voltage input modules
|
|
SCALE% = 1
|
|
END IF
|
|
|
|
INRANGE! = (MAXIN! - MININ!) / SCALE% * IINSEN.MEAS!
|
|
'
|
|
PRINT
|
|
PRINT TAB(23); "Calculated"; TAB(38); "Measured"
|
|
PRINT TAB( 9); INPUTTYPE$;
|
|
PRINT TAB(22); "Output ("; UNIT$; ")"; TAB(37); "Output ("; UNIT$; ")*";
|
|
PRINT TAB(53); "Error (%)"; TAB(67); "Status"
|
|
PRINT TAB(8); "----------"; TAB(22); "-----------"; TAB(37); "-----------";
|
|
PRINT TAB(52); "----------"; TAB(66); "--------"
|
|
|
|
'8 22 37 52 66
|
|
' Iin (mA)
|
|
' Vin (V) Output (mA) Output (mA) Error (%) Status
|
|
'---------- ----------- ----------- ---------- --------
|
|
' #####.##
|
|
' +####.##
|
|
'+###.### +##.### +##.### +###.### &&&&
|
|
|
|
IF PON% = 1 AND OUTLOAD! <= 1 THEN
|
|
LPRINT TAB(34); "ACCURACY TEST"
|
|
LPRINT
|
|
LPRINT TAB(23); "Calculated"; TAB(38); "Measured"
|
|
|
|
IF SNM% = 2 THEN 'Current input modules
|
|
LPRINT TAB(9); "Iin (mA)";
|
|
'
|
|
ELSE 'Voltage input modules
|
|
LPRINT TAB(10); "Vin (V)";
|
|
'
|
|
END IF
|
|
LPRINT TAB(22); "Output ("; UNIT$; ")"; TAB(37); "Output ("; UNIT$; ")*";
|
|
LPRINT TAB(53); "Error (%)"; TAB(67); "Status"
|
|
LPRINT TAB(8); "----------"; TAB(22); "-----------"; TAB(37); "-----------";
|
|
LPRINT TAB(52); "----------"; TAB(66); "--------"
|
|
END IF
|
|
|
|
INC% = 0 'Array element
|
|
NUMPTS% = 5 'Number of points in test
|
|
|
|
IF LOGDAT% > 0 THEN
|
|
INPUT "Enter the number of points to be tested "; NUMPTS%
|
|
INPUT "Enter file name "; F$
|
|
F$ = "C:\QB45\JJM\" + F$
|
|
OPEN F$ FOR OUTPUT AS #3
|
|
WRITE #3, (MAXIN! - MININ!)
|
|
WRITE #3, MININ!
|
|
WRITE #3, NUMPTS%
|
|
END IF
|
|
|
|
FAILED% = 0
|
|
LINSTEP! = (MAXIN! - MININ!) / (NUMPTS% - 1)
|
|
'LINSTEP!/2 ensures NUMPTS% test point
|
|
FOR MODIN! = MININ! TO MAXIN! + LINSTEP! / 2 STEP LINSTEP!
|
|
INC% = INC% + 1
|
|
IF INC% = 1 THEN
|
|
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
|
|
END IF
|
|
IF SNM% = 2 THEN
|
|
MEASIN! = SETCURRENTIN!(MODIN!)
|
|
ELSE
|
|
CALL SETDAC2(MODIN!, 1, 0) 'Sets input voltage
|
|
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
CALL LOADMUX(1, CON%)
|
|
CALL WRITEDVM(VODC$, MODIN!) 'Sets meter to read
|
|
MEASIN! = READDVM!(INRANGE! * MAXACCERR! / 100! / 10!)'10x better than accuracy
|
|
IF ABS(MODIN!) > 10.1 AND ABS(MODIN!) - ABS(MEASIN!) > 1 THEN
|
|
'Power supply current limit tripped
|
|
PRINT "Multiple MUX channels are ON"
|
|
PRINT "Notify engineering about problem"
|
|
CONTINUE
|
|
' SL$ = SETPOWER$(VINADDR%, ABS(MODIN!), FUNC$) 'Set Vin
|
|
' CALL pause(2!)
|
|
' MEASIN! = READDVM!(INRANGE! * MAXACCERR! / 100! / 10!)'10x better than accuracy
|
|
END IF
|
|
CALL LOADMUX(1, COFF%)
|
|
END IF
|
|
|
|
CALL WRITEDVM("S1", 0) 'Medium reading rate
|
|
|
|
TSIM!(INC%) = MEASIN!
|
|
OUTCALC!(INC%) = MODULEOUT!(TSIM!(INC%))
|
|
|
|
CALL LOADMUX(2, CON%)
|
|
CALL WRITEDVM(VODC$, OUTCALC!(INC%) * IOUTSEN.MEAS!) 'Sets meter to read output
|
|
|
|
OUTMEAS!(INC%) = READDVM!(.00005 * ORANGE!) / IOUTSEN.MEAS!'.005% tolerance
|
|
ERROROUT!(INC%) = (OUTMEAS!(INC%) - OUTCALC!(INC%)) / ORANGE! * 100! 'Error (%)
|
|
IF LOGDAT% > 0 THEN WRITE #3, ERROROUT!(INC%)
|
|
CALL LOADMUX(2, COFF%)
|
|
|
|
IF SNM% <> 2 AND ABS(MODIN!) > 10.1 THEN '10.1V limit matches that of SETDAC2
|
|
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Disable power supply
|
|
END IF
|
|
|
|
IF ABS(ERROROUT!(INC%)) <= MAXACCERR! THEN
|
|
ACCSTAT$(INC%) = "PASS"
|
|
ELSE
|
|
ACCSTAT$(INC%) = "FAIL"
|
|
FAILED% = FAILED% + 1
|
|
SOUND 800, .5
|
|
END IF
|
|
'Voltage or current input modules
|
|
PRINT TAB(8); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%) * SCALE!; OUTMEAS!(INC%) * SCALE!; ERROROUT!(INC%);
|
|
IF LEFT$(ACCSTAT$(INC%), 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT TAB(68); ACCSTAT$(INC%)
|
|
COLOR 11, 0
|
|
|
|
IF PON% = 1 AND OUTLOAD! <= 1 THEN
|
|
'Voltage or current input modules
|
|
LPRINT TAB(8); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%) * SCALE!; OUTMEAS!(INC%) * SCALE!; ERROROUT!(INC%);
|
|
LPRINT TAB(68); ACCSTAT$(INC%)
|
|
END IF
|
|
|
|
IF ABS(ERROROUT!(INC%)) > ABS(ACCERR!) THEN
|
|
ACCERR! = ERROROUT!(INC%)
|
|
END IF
|
|
|
|
'Variables used to calculate the best fit line using linear regression.
|
|
SMODIN! = SMODIN! + TSIM!(INC%)
|
|
SSMODIN! = SSMODIN! + TSIM!(INC%) ^ 2
|
|
SERR! = SERR! + ERROROUT!(INC%)
|
|
SPROD! = SPROD! + TSIM!(INC%) * ERROROUT!(INC%)
|
|
'If DAC limitation was exceeded, reset MODIN!
|
|
IF INC% = 1 AND ABS(MODIN! - MININ!) > VERNMIN! THEN MODIN! = MININ!
|
|
|
|
NEXT
|
|
|
|
IF LOGDAT% > 0 THEN CLOSE #3
|
|
|
|
IF FAILED% = 0 THEN
|
|
ACC$ = "PASS"
|
|
ELSE
|
|
ACC$ = "FAIL"
|
|
SOUND 800, .5
|
|
END IF
|
|
|
|
SLOPE! = ((NUMPTS% * SPROD!) - (SMODIN! * SERR!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
|
|
OFFSET1! = ((SERR! * SSMODIN!) - (SMODIN! * SPROD!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
|
|
BFERR! = ABS(BESTFIT!(SLOPE!, OFFSET1!, TSIM!(), NUMPTS%, ERROROUT!()))
|
|
IF ABS(BFERR!) <= MAXLINERR! THEN
|
|
BF$ = "PASS"
|
|
ELSE
|
|
SOUND 600, .5
|
|
BF$ = "FAIL"
|
|
END IF
|
|
|
|
PRINT
|
|
PRINT TAB(10); "Accuracy status: ";
|
|
|
|
IF LEFT$(ACC$, 4) = "FAIL" THEN COLOR 12, 0
|
|
PRINT ACC$
|
|
COLOR 11, 0
|
|
|
|
PRINT TAB(10); "Measured accuracy error is";
|
|
PRINT TAB(50); USING " +###.### %"; ACCERR!
|
|
PRINT TAB(10); "Maximum accuracy error is";
|
|
PRINT TAB(50); USING "+/-##.### %"; MAXACCERR!
|
|
PRINT
|
|
PRINT TAB(10); "Linearity status: ";
|
|
|
|
IF BF$ = "FAIL" THEN COLOR 12, 0
|
|
PRINT BF$
|
|
COLOR 11, 0
|
|
|
|
PRINT TAB(10); "Measured best-fit linearity error is";
|
|
PRINT TAB(50); USING "+/-###.### %"; BFERR!
|
|
PRINT TAB(10); "Maximum best-fit linearity error is";
|
|
PRINT TAB(50); USING "+/- ##.### %"; MAXLINERR!
|
|
|
|
ACC$ = ACC$ + STR$(ACCERR!) + "3" '% span
|
|
LINTEST$ = BF$ + STR$(BFERR!) + "3" 'append # decimal places
|
|
|
|
IF SPECS.OUTSIGTYPE = "VOLTAGE" THEN 'Remove output load, DSCA49
|
|
CALL SETOUTLOAD(5000!)
|
|
END IF
|
|
CALL RESETTH 'Reset the test head
|
|
CALL PAUSE(1!)
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
SUB LOGIT (STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!)
|
|
|
|
IF FAILS%(STATUS$()) = 0 OR LEFT$(SN$, 6) = "1000HR" THEN
|
|
|
|
OPEN "C:\ATE\DSCLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #4
|
|
OPEN "C:\ATE\LOGPATH.ADR" FOR INPUT AS #7
|
|
INPUT #7, LOGPATH$
|
|
CLOSE #7
|
|
OPEN LOGPATH$ + "\DSCLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #8
|
|
|
|
NUMPTS% = 5
|
|
|
|
'builds a sequential file. 20 records required for 1 module
|
|
WRITE #4, SPECS.MODNAME
|
|
WRITE #8, SPECS.MODNAME
|
|
|
|
FOR INC% = 1 TO NUMPTS%
|
|
WRITE #4, TSIM!(INC%), OUTCALC!(INC%), OUTMEAS!(INC%), ERROROUT!(INC%), ACCSTAT$(INC%)
|
|
WRITE #8, TSIM!(INC%), OUTCALC!(INC%), OUTMEAS!(INC%), ERROROUT!(INC%), ACCSTAT$(INC%)
|
|
NEXT
|
|
|
|
FOR INC% = 0 TO 14 STEP 5
|
|
WRITE #4, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4), STATUS$(INC% + 5)
|
|
WRITE #8, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4), STATUS$(INC% + 5)
|
|
NEXT
|
|
|
|
WRITE #4, STATUS$(16), STATUS$(17), STATUS$(18)
|
|
WRITE #8, STATUS$(16), STATUS$(17), STATUS$(18)
|
|
|
|
WRITE #4, SN$, DATE$
|
|
WRITE #8, SN$, DATE$
|
|
|
|
CLOSE #4
|
|
CLOSE #8
|
|
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
FUNCTION MEASRES! (OHM!, RESNUM%, TE$)
|
|
|
|
'Measure specified resistance
|
|
'Legend:
|
|
'RESNUM% Resistor
|
|
'------- --------
|
|
' 1 On board supply current sense resistor, not used.
|
|
' 2 Input current source sense resistor, 192 ohm
|
|
' 3 Output current sense resistor, 192 ohm
|
|
' 4 Output current sense resistor, 5 ohm
|
|
' 5 Output current sense or load resistor
|
|
' TE1055; 500 or 750 ohm
|
|
' TE1054; 100, 200, 1000 or 2000 ohm
|
|
'
|
|
'* TE$ not used in this program.
|
|
|
|
SELECT CASE RESNUM% 'Branches to the specific measurement
|
|
CASE 1
|
|
CALL WRITEDVM(OHM2$, OHM! / 1000) 'Sets meter
|
|
CALL LOADMUX(3, CON%) 'Sets mux channel
|
|
MEASTOL! = .001 '0.1% measurement tolerance
|
|
INITTOL! = .2 '20% initial tolerance
|
|
CASE 2
|
|
'Update commands below for Vout and Iout test heads
|
|
CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter
|
|
CALL LOADMUX(3, CON%) 'Sets mux channel
|
|
CALL LOADMUX(3, CON%) 'Sets mux channel
|
|
CALL LOADMUX(7, CON%) 'set sense channel
|
|
MEASTOL! = .00001 '0.001% measurement tolerance
|
|
INITTOL! = .05 '5% initial tolerance
|
|
CLS
|
|
LOCATE 10, 10: PRINT "Measuring Input Sense Resistor. Please Wait..."
|
|
CASE 3
|
|
CB1VAL% = CB1VAL% OR &H1 '0 0 0 0 0 0 0 1
|
|
CALL SETTH(CB1VAL%, CB1%) 'Disconnect +OUT from load
|
|
'for accurate 4-wire ohms meas.
|
|
CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter
|
|
CALL LOADMUX(2, CON%) 'Sets mux channel
|
|
CALL LOADMUX(8, CON%) 'set sense channel
|
|
MEASTOL! = .00001 '0.001% measurement tolerance
|
|
INITTOL! = .05 '5% initial tolerance
|
|
CLS
|
|
LOCATE 10, 10: PRINT "Measuring Load Resistor. Please Wait..."
|
|
CASE 4
|
|
CB1VAL% = CB1VAL% OR &H1 '0 0 0 0 0 0 0 1
|
|
CALL SETTH(CB1VAL%, CB1%) 'Disconnect +OUT from load
|
|
'for accurate 4-wire ohms meas.
|
|
CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter
|
|
CALL LOADMUX(2, CON%) 'Sets mux channel
|
|
CALL LOADMUX(6, CON%) 'set sense channel
|
|
MEASTOL! = .00001 '0.001% measurement tolerance
|
|
INITTOL! = .05 '5% initial tolerance
|
|
CASE 5
|
|
CB1VAL% = CB1VAL% OR &H1 '0 0 0 0 0 0 0 1
|
|
CALL SETTH(CB1VAL%, CB1%) 'Disconnect +OUT from load
|
|
|
|
CALL WRITEDVM(OHM2$, OHM! / 1000) 'Sets meter
|
|
CALL LOADMUX(2, CON%) 'Sets mux channel
|
|
'
|
|
MEASTOL! = .001 '0.1% measurement tolerance
|
|
INITTOL! = .05 '5% initial tolerance
|
|
|
|
' CASE 6 NOT USED
|
|
' CASE 7 NOT USED
|
|
' CASE 8 NOT USED
|
|
END SELECT
|
|
|
|
TEMP! = READDVM!(OHM! * MEASTOL!) 'Measure resistor value to +/-0.01%
|
|
|
|
IF OHM! > 1! AND ABS(TEMP! - OHM!) > (OHM! * INITTOL!) THEN 'Test for 15% deviation
|
|
CLS
|
|
LOCATE 10, 10
|
|
PRINT "Measured resistance = "; TEMP!; " ohms."
|
|
PRINT TAB(10); "Required resistance = "; OHM!; "ohms."
|
|
PRINT TAB(10); "Check system setup and restart program."
|
|
PRINT TAB(10); "If the failure continues, notify engineering."
|
|
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power
|
|
END
|
|
END IF
|
|
|
|
IF RESNUM% = 3 OR RESNUM% = 4 OR RESNUM% = 5 THEN
|
|
CB1VAL% = CB1VAL% AND &HFE '1 1 1 1 1 1 1 0
|
|
CALL SETTH(CB1VAL%, CB1%) 'Connect Iout to load
|
|
END IF
|
|
|
|
CALL WRITEDVM(VODC$, 1!) 'Resets meter
|
|
CALL LOADMUX(0, CON%) 'Clears mux
|
|
|
|
MEASRES! = TEMP! 'Passes resistor value back
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
FUNCTION MENU1%
|
|
|
|
' ***** PROGRAM CONTROL MENU 1 *****
|
|
COLOR 15, 0, 0 ' cjt these 2 lines get rid of screen artifacts
|
|
CLS
|
|
COLOR 14, 0, 0
|
|
LOCATE 5, 23: PRINT "DSCA39,49-xx AUTOMATED TEST EQUIPMENT"
|
|
LOCATE 6, 23: PRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
COLOR 11, 0, 0
|
|
LOCATE 8, 24: PRINT "1.) Functional Test"
|
|
LOCATE 9, 24: PRINT "2.) Pre-Burn-In Complete Test"
|
|
LOCATE 10, 24: PRINT " (No Printout)"
|
|
LOCATE 11, 24: PRINT "3.) Post-Burn-In Complete Test"
|
|
LOCATE 12, 24: PRINT " (Optional Printout)"
|
|
LOCATE 13, 24: PRINT "4.) Sealed Module Retest"
|
|
LOCATE 14, 24: PRINT " (No Adjustments, Optional Printout)"
|
|
LOCATE 15, 24: PRINT "5.) Individual Test Menu"
|
|
LOCATE 17, 24: PRINT "6.) Return to the FAMILY TYPE menu"
|
|
LOCATE 20, 16: PRINT ""
|
|
LOCATE 22, 16: PRINT "Press the F10 key at any time to exit the program."
|
|
DO
|
|
I$ = INKEY$
|
|
LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 6
|
|
|
|
MENU1% = VAL(I$)
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
FUNCTION MENU2%
|
|
|
|
CLS
|
|
COLOR 14, 0, 0
|
|
|
|
LOCATE 2, 23: PRINT "DSCA39,49-xx AUTOMATED TEST EQUIPMENT"
|
|
LOCATE 3, 22: PRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
COLOR 11, 0, 0
|
|
LOCATE 5, 9: PRINT "1.) Supply Current Test, Min. Output Load"
|
|
LOCATE 6, 9: PRINT "2.) Supply Current Test, Max. Output Load"
|
|
LOCATE 7, 9: PRINT "3.) Offset & Gain Calibration"
|
|
LOCATE 8, 9: PRINT "4.) Linearity / Accuracy Test"
|
|
LOCATE 9, 9: PRINT "5.) Current Limit Test"
|
|
LOCATE 10, 9: PRINT "6.) Over-Range Test"
|
|
LOCATE 11, 9: PRINT "7.) Power Supply Sensitivity Test"
|
|
LOCATE 12, 9: PRINT "8.) Input Resistance & Bias Current Test"
|
|
LOCATE 13, 9: PRINT "9.) Frequency Response Test"
|
|
LOCATE 14, 9: PRINT "A.) Step Response Test"
|
|
LOCATE 15, 9: PRINT "B.) Output Noise Test"
|
|
LOCATE 16, 9: PRINT "C.) Output Current @ Min./Max. Load Test (DSCA39 ONLY)"
|
|
LOCATE 17, 9: PRINT "D.) Notes On ATE Operation"
|
|
LOCATE 18, 9: PRINT "E.) Printer Output = ";
|
|
|
|
|
|
IF PON% > 0 THEN
|
|
LOCATE 18, 31: PRINT "ON"
|
|
ELSE
|
|
LOCATE 18, 31: PRINT "OFF"
|
|
END IF
|
|
|
|
LOCATE 19, 9: PRINT "F.) Log Linearity Test Data = ";
|
|
IF LOGDAT% > 0 THEN
|
|
LOCATE 19, 31: PRINT "ON"
|
|
ELSE
|
|
LOCATE 19, 31: PRINT "OFF"
|
|
END IF
|
|
|
|
LOCATE 20, 9: PRINT "G.) Exit to the DSCA Main Menu"
|
|
LOCATE 21, 9: PRINT "Enter your selection. "
|
|
|
|
DO
|
|
DO
|
|
I$ = UCASE$(INKEY$)
|
|
LOOP WHILE I$ = ""
|
|
C% = ASC(I$)
|
|
LOOP WHILE (C% < 49 OR C% > 57) AND (C% < 65 OR C% > 72)
|
|
|
|
IF C% > 57 THEN
|
|
MENU2% = C% - 55
|
|
ELSE
|
|
MENU2% = C% - 48
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
'*******************************
|
|
FUNCTION MENU3%
|
|
|
|
CLS
|
|
COLOR 14, 0, 0
|
|
LOCATE 3, 26: PRINT "Module Family Selection Menu"
|
|
LOCATE 4, 26: PRINT "---------------------------"
|
|
COLOR 11, 0, 0
|
|
LOCATE 6, 34: PRINT "1.) DSCA39-xx"
|
|
LOCATE 7, 34: PRINT "2.) DSCA49-xx"
|
|
LOCATE 8, 34: PRINT "3.) Return to the FAMILY TYPE menu"
|
|
|
|
DO
|
|
I$ = INKEY$
|
|
LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 3
|
|
|
|
M3% = VAL(I$)
|
|
|
|
IF M3% = 1 THEN 'Parallel port, mux & test head addresses
|
|
TE$ = "TE1055" 'Current output test head
|
|
FILENAME$ = "KDSCIOUT.ADR"
|
|
ELSE
|
|
TE$ = "TE1054" 'Voltage output test head
|
|
FILENAME$ = "KDSCVOUT.ADR"
|
|
END IF
|
|
|
|
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
|
|
MENU3% = M3%
|
|
|
|
END FUNCTION
|
|
|
|
SUB NOTES
|
|
'Notes on ATE operation
|
|
CLS
|
|
LOCATE 5, 25: PRINT "AUTOMATED TEST EQUIPMENT NOTES"
|
|
LOCATE 7, 10: PRINT "1.) During the calibration subroutines the following keystrokes"
|
|
LOCATE 8, 14: PRINT "can be used:"
|
|
LOCATE 10, 14: PRINT "(C)alibrate will exit the routine and continue"
|
|
LOCATE 11, 14: PRINT "program execution."
|
|
LOCATE 13, 14: PRINT "(T)roubleshoot will pause the program. The DVM will continuously"
|
|
LOCATE 14, 14: PRINT "display the calibration reading."
|
|
LOCATE 16, 10: PRINT "2.) Press (F10) at any time to break out of the program and"
|
|
LOCATE 17, 14: PRINT "return to DOS."
|
|
|
|
CALL CONTINUE
|
|
|
|
END SUB
|
|
|
|
'*******************************
|
|
SUB LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'Sub to write the data log, datasheet, and work order status files (and inform the
|
|
'operator of these operations)
|
|
|
|
KEY(10) OFF 'Deactivates F10 key
|
|
|
|
CALL INTERLUDE
|
|
'CLS
|
|
PRINT "" 'Blank line
|
|
PRINT TAB(10); "Logging test results."
|
|
CALL LOGIT(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Logs test data to disk
|
|
PRINT TAB(10); "Writing datasheet file."
|
|
CALL DATASHEETWRITE (SN$, STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TX%, OUTLOAD!)
|
|
PRINT TAB(10); "Writing status to work order status file."
|
|
CALL WORKORDERLINE(FAILS%(STATUS$()), SN$)
|
|
CALL DATASHEETPRINT (SN$, STATUS$())
|
|
'CALL INTERLUDE
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
|
|
KEY(10) ON 'Reactivates F10 key
|
|
|
|
END SUB
|
|
|