From: David Schleef Date: Mon, 14 Jan 2002 21:26:26 +0000 (+0000) Subject: Add README. Add a few boards. Fix: CONFIG_GUESS boards output dump X-Git-Tag: r0_7_18~23 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=861f57900f025c0f578c5321092be2626667a06e;p=comedilib.git Add README. Add a few boards. Fix: CONFIG_GUESS boards output dump information. --- diff --git a/comedi_calibrate/README b/comedi_calibrate/README new file mode 100644 index 0000000..7066421 --- /dev/null +++ b/comedi_calibrate/README @@ -0,0 +1,146 @@ + +I always seem to forget how to convert the calibration +dump information into code for doing a calibration, so +I'm writing this mostly for myself. + +Boards may have one of 4 calibrations statuses, depending +on how well the calibration code is trusted. These are: +STATUS_NONE, the default for no information; STATUS_SOME, +meaning that a dump has been converted to initial code, +but not tested; STATUS_DONE means that the output of a +STATUS_SOME dump has been checked, and is correct; +STATUS_GUESS is a marker that code has been converted +from a previous version of the code, but not checked. + +The NI E series boards have several internal voltages that +can be measured, and also several calibration DACs that function +similar to adjustable resistors on old data acquisition boards. +The information we need is which DACs affect which measurable +voltages; then we can write calibration code that adjusts those +DACs until the voltages are within spec. + +Usually, there are DACs (or multiple DACs) that are added to +an analog input signal: 1) before the variable gain amplifier +("pre-gain"), 2) after the variable gain amplifier ("post-gain"), +3) between the board's stable voltage reference and the +reference input to the ADC ("gain offset"), and 4) before a +unipolar-to-bipolar adjuster ("unipolar offset"), or other +equivalent circuit. + +In addition there are DACs that adjust the output voltages and/or +reference voltage inputs to a D/A converter. These are pretty +intuitive once analog input is understood, and is dependent on +correct analog input calibration. + +The measurable quantities are 0 volts and an internal voltage +reference near 5 volts, and can be measured at any gain. The +interesting combinations are: + + ai, bipolar zero offset, low gain + ai, bipolar zero offset, high gain + ai, bipolar voltage reference, low gain + ai, unipolar zero offset, low gain + +The unipolar zero offset may not be available on some boards. + +In a STATUS_NONE dump, for each measurable quantity and each +calibration DAC, the DAC is varied throughout its entire range +and the quantity measured. The data is linearly fit, and if +the slope is statistically non-zero, a line is printed: + + caldac[0] gain=1.26(11)e-7 V/bit S_min=235.659 dof=254 + +The information given is caldac index, slope (gain) and slope +error (in parenthesis, modifying the last two digits of the +slope), and two statistical parameters S_min and degrees +of freedom. S_min and dof will be roughly similar for a +good fit. If S_min is more than a factor of 4 greater than +dof, this is probably not a good fit. Typically this means +that the DAC doesn't affect the measureable strictly linearly, +or there is systematic noise. The latter seems to common in +E series boards, so I'm not too worried about the following +dump where there are S_min/dof ratios above 4. + +Here's an example dump, generated by a STATUS_NONE dump for +a pci-mio-16xe-10, with the analog output section removed: + + Warning: device not fully calibrated due to insufficient information + Please send this output to + Id: comedi_calibrate.c,v 1.21 2001/10/10 22:07:53 ds Exp + Driver name: ni_pcimio + Device name: pci-mio-16xe-10 + Comedi version: 0.7.61 + ai, bipolar zero offset, low gain + offset -6.795(14)e-3, target 0 + caldac[0] gain=1.26(11)e-7 V/bit S_min=235.659 dof=254 + caldac[2] gain=3.96840(14)e-4 V/bit S_min=1390.18 dof=254 + caldac[3] gain=4.348(11)e-6 V/bit S_min=258.75 dof=254 + caldac[8] gain=5.4659(69)e-7 V/bit S_min=386.361 dof=254 + ai, bipolar zero offset, high gain + offset -2.4224(55)e-4, target 0 + caldac[0] gain=3.61(45)e-9 V/bit S_min=247.26 dof=254 + caldac[2] gain=3.96644(48)e-6 V/bit S_min=351.927 dof=254 + caldac[3] gain=4.063(46)e-8 V/bit S_min=272.024 dof=254 + caldac[8] gain=5.46305(30)e-7 V/bit S_min=314.035 dof=254 + ai, bipolar voltage reference, low gain + offset 4.992959(13), target 5 + caldac[0] gain=-4.4928(11)e-5 V/bit S_min=1111.4 dof=254 + caldac[1] gain=-2.792(11)e-6 V/bit S_min=248.971 dof=254 + caldac[2] gain=3.96488(14)e-4 V/bit S_min=1059.18 dof=254 + caldac[3] gain=4.318(11)e-6 V/bit S_min=437.441 dof=254 + caldac[8] gain=5.4810(70)e-7 V/bit S_min=404.213 dof=254 + ai, unipolar zero offset, low gain + offset nan, target 0 + caldac[2] gain=3.96773(39)e-4 V/bit S_min=158.236 dof=107 + +[The explanation gets a little fuzzy here] + +The resulting function for calibration will look something like: + + void cal_ni_pci_mio_16xe_10(void) + { + postgain_cal(ni_zero_offset_low, ni_zero_offset_high, XXX); + cal1(ni_zero_offset_high, XXX); + cal1(ni_reference_low, XXX); + cal1(ni_unip_offset_low, XXX); + } + +You get to fill in the XXX's. The post-gain calibration DAC will +be the one for which the ratio of caldac slopes for the low and +high gain measurables is similar to the ratio of input ranges for +low and high gain. This ratio is typically 100 or 200, and really +should be printed by the program. Thus, for this dump, we choose +caldac[2], since the ratio is very nearly 100. We don't choose +caldac[0] or caldac[3], because the gains are smaller, and the +ratio isn't exactly 100 or 200. + +Next is the pre-gain calibration. Adding a voltage before the +amplifier will affect every input range selection equally, so the +pre-gain cadac slope will be nearly equal for both bipolar zero +offset at low and high gain. In this example, it would be caldac[8]. + +Next is the voltage reference calibration. The caldac controlling +the voltage reference adjustment is proportional to the offset, +so the correct caldac will typically be the one that has a large +slope for the bipolar voltage reference measurement, but a small +slope (by a factor of 2e4, here) for the zero offset measurements. +It could be any of caldac[0], caldac[1], or caldac[3], or possibly +all of them. We'll choose the caldac with the largest slope for +rough calibration, then use the one with the smallest slope for +fine calibration, namely caldac[0] and caldac[1]. + +This is one way that STATUS_SOME is useful, because you can calibrate +the zero offset, then get a much better idea which other channels +are likely to be for the voltage reference. + +In this example, there doesn't appear to be a caldac that affects +unipolar zero offset, so it will not be used in the final function: + + void cal_ni_pci_mio_16xe_10(void) + { + postgain_cal(ni_zero_offset_low, ni_zero_offset_high, 2); + cal1(ni_zero_offset_high, 8); + cal1(ni_reference_low, 0); + cal1(ni_reference_low, 1); + } + diff --git a/comedi_calibrate/comedi_calibrate.c b/comedi_calibrate/comedi_calibrate.c index 856e9ff..36ab4c4 100644 --- a/comedi_calibrate/comedi_calibrate.c +++ b/comedi_calibrate/comedi_calibrate.c @@ -177,6 +177,12 @@ ok: do_calibrate=1; do_results=1; } + if(device_status==STATUS_GUESS){ + do_reset=1; + do_dump=1; + do_calibrate=1; + do_results=1; + } } if(verbose>=0){ printf("$Id$\n"); diff --git a/comedi_calibrate/ni.c b/comedi_calibrate/ni.c index d522483..4c8a184 100644 --- a/comedi_calibrate/ni.c +++ b/comedi_calibrate/ni.c @@ -49,6 +49,7 @@ void cal_ni_at_mio_16e_2(void); void cal_ni_daqcard_ai_16xe_50(void); void cal_ni_at_mio_16e_1(void); void cal_ni_pci_mio_16e_1(void); +void cal_ni_pci_6025e(void); void cal_ni_pci_6035e(void); void cal_ni_pci_6071e(void); void cal_ni_pxi_6071e(void); @@ -56,6 +57,7 @@ void cal_ni_at_mio_16e_10(void); void cal_ni_pci_mio_16xe_50(void); void cal_ni_pci_6023e(void); void cal_ni_at_mio_16xe_50(void); +void cal_ni_pci_mio_16xe_10(void); struct board_struct boards[]={ { "at-mio-16e-2", STATUS_DONE, cal_ni_at_mio_16e_2 }, @@ -63,19 +65,20 @@ struct board_struct boards[]={ { "at-mio-16xe-50", STATUS_SOME, cal_ni_at_mio_16xe_50 }, { "at-mio-16e-1", STATUS_SOME, cal_ni_at_mio_16e_1 }, { "pci-mio-16e-1", STATUS_SOME, cal_ni_pci_mio_16e_1 }, + { "pci-6025e", STATUS_GUESS, cal_ni_pci_6025e }, { "pci-6035e", STATUS_GUESS, cal_ni_pci_6035e }, { "pci-6071e", STATUS_GUESS, cal_ni_pci_6071e }, { "pxi-6071e", STATUS_GUESS, cal_ni_pxi_6071e }, { "at-mio-16e-10", STATUS_GUESS, cal_ni_at_mio_16e_10 }, { "pci-mio-16xe-50", STATUS_GUESS, cal_ni_pci_mio_16xe_50 }, { "pci-6023e", STATUS_GUESS, cal_ni_pci_6023e }, + { "pci-mio-16xe-10", STATUS_SOME, cal_ni_pci_mio_16xe_10 }, #if 0 // { "at-mio-16de-10", cal_ni_unknown }, { "at-mio-64e-3", cal_ni_16e_1 }, // { "at-mio-16xe-50", cal_ni_unknown }, // { "at-mio-16xe-10", cal_ni_unknown }, // { "at-ai-16xe-10", cal_ni_unknown }, - { "pci-mio-16xe-10", cal_ni_16xe_10 }, // { "pxi-6030e", cal_ni_unknown }, // { "pci-mio-16e-4", cal_ni_unknown }, // { "pxi-6040e", cal_ni_unknown }, @@ -84,10 +87,8 @@ struct board_struct boards[]={ // { "pci-6033e", cal_ni_unknown }, // { "pci-6071e", cal_ni_unknown }, { "pci-6024e", cal_ni_6023e }, // guess - { "pci-6025e", cal_ni_6023e }, // guess { "pxi-6025e", cal_ni_6023e }, // guess { "pci-6034e", cal_ni_6023e }, // guess - { "pci-6035e", cal_ni_6023e }, // { "pci-6052e", cal_ni_unknown }, // { "pci-6110e", cal_ni_unknown }, // { "pci-6111e", cal_ni_unknown }, @@ -131,7 +132,8 @@ void ni_setup_board(void) return; } } - + //device_status = STATUS_UNKNOWN; + //do_cal = cal_ni_unknown; } void ni_setup_observables(void) @@ -302,14 +304,15 @@ void cal_ni_daqcard_ai_16xe_50(void) postgain_cal(ni_zero_offset_low,ni_zero_offset_high,2); cal1(ni_zero_offset_high,8); cal1(ni_reference_low,0); + cal1(ni_reference_low,1); } void cal_ni_at_mio_16xe_50(void) { postgain_cal(ni_zero_offset_low,ni_zero_offset_high,2); cal1(ni_zero_offset_high,8); + cal1(ni_reference_low,0); cal1(ni_reference_low,1); - //cal1(ni_reference_low,0); /* also might be useful */ if(do_output){ cal1(ni_ao0_zero_offset,6); @@ -319,6 +322,21 @@ void cal_ni_at_mio_16xe_50(void) } } +void cal_ni_pci_mio_16xe_10(void) +{ + postgain_cal(ni_zero_offset_low, ni_zero_offset_high, 2); + cal1(ni_zero_offset_high, 8); + cal1(ni_reference_low, 0); + cal1(ni_reference_low, 1); + + if(do_output){ + cal1(ni_ao0_zero_offset,6); + cal1(ni_ao0_reference,4); + cal1(ni_ao1_zero_offset,7); + cal1(ni_ao1_reference,5); + } +} + void cal_ni_at_mio_16e_1(void) { cal_ni_at_mio_16e_2(); @@ -394,6 +412,19 @@ void cal_ni_pci_6023e(void) cal_ni_pci_6035e(); } +void cal_ni_pci_6025e(void) +{ + postgain_cal(ni_zero_offset_low,ni_zero_offset_high,1); + cal1(ni_zero_offset_high,0); + cal1(ni_reference_low,3); + if(do_output){ + cal1(ni_ao0_zero_offset,4); // guess + cal1(ni_ao0_reference,5); // guess + cal1(ni_ao1_zero_offset,8); // guess + cal1(ni_ao1_reference,9); // guess + } +} + double ni_get_reference(int lsb_loc,int msb_loc) { int lsb,msb; diff --git a/comedi_calibrate/results/at-mio-16xe-50 b/comedi_calibrate/results/at-mio-16xe-50 index db7ad2a..1a0c678 100644 --- a/comedi_calibrate/results/at-mio-16xe-50 +++ b/comedi_calibrate/results/at-mio-16xe-50 @@ -1,9 +1,3 @@ - -Hello Dave, - -I took it from CVS and here is the output: - - Warning: device not fully calibrated due to insufficient information Please send this output to $Id$ @@ -56,7 +50,3 @@ caldac[2] gain=1.5662(11)e-5 V/bit S_min=332.322 dof=254 caldac[5] gain=-1.91787(12)e-4 V/bit S_min=1112.43 dof=254 caldac[7] gain=-3.87472(13)e-4 V/bit S_min=1465.5 dof=254 caldac[8] gain=1.7720(72)e-7 V/bit S_min=304.338 dof=254 - -thanks -norbert - diff --git a/comedi_calibrate/results/pci-6071e b/comedi_calibrate/results/pci-6071e new file mode 100644 index 0000000..0c90cea --- /dev/null +++ b/comedi_calibrate/results/pci-6071e @@ -0,0 +1,16 @@ +Warning: device not fully calibrated due to insufficient information +Please send this output to +$Id$ +Driver name: ni_pcimio +Device name: pci-6071e +Comedi version: 0.7.61 +postgain: ai, bipolar zero offset, low gain; ai, bipolar zero offset, high gain +caldac[1] gain=-7.8199(21)e-4 V/bit S_min=499.462 dof=254 +caldac[1] gain=-3.9085(14)e-6 V/bit S_min=480.297 dof=254 +caldac[1] set to 113.476 +linear: ai, bipolar zero offset, high gain +caldac[0] gain=-8.6007(14)e-6 V/bit S_min=369.586 dof=254 +caldac[0] set to 143.069 +linear: ai, bipolar voltage reference, low gain +caldac[3] gain=-4.7227(21)e-4 V/bit S_min=522.886 dof=254 +caldac[3] set to 149.506 diff --git a/comedi_calibrate/results/pci-6713 b/comedi_calibrate/results/pci-6713 new file mode 100644 index 0000000..655db1d --- /dev/null +++ b/comedi_calibrate/results/pci-6713 @@ -0,0 +1,16 @@ +Warning: device not fully calibrated due to insufficient information +Please send this output to +$Id$ +Driver name: ni_pcimio +Device name: pci-6713 +Comedi version: 0.7.61 +ai, bipolar zero offset, low gain +insn barfed: subdev=0, chan=0, range=255, aref=3, n=128, ret=-1, Invalid argument +barf +offset 0.0( 0)e-2147483648, target 0 +insn barfed: subdev=0, chan=0, range=255, aref=3, n=128, ret=-1, Invalid argument +barf +insn barfed: subdev=0, chan=0, range=255, aref=3, n=128, ret=-1, Invalid argument +barf +insn barfed: subdev=0, chan=0, range=255, aref=3, n=128, ret=-1, Invalid argument +barf diff --git a/comedi_calibrate/results/pci-mio-16xe-10 b/comedi_calibrate/results/pci-mio-16xe-10 new file mode 100644 index 0000000..a08e3cc --- /dev/null +++ b/comedi_calibrate/results/pci-mio-16xe-10 @@ -0,0 +1,61 @@ +Warning: device not fully calibrated due to insufficient information +Please send this output to +$Id$ +Driver name: ni_pcimio +Device name: pci-mio-16xe-10 +Comedi version: 0.7.61 +ai, bipolar zero offset, low gain +offset -6.795(14)e-3, target 0 +caldac[0] gain=1.26(11)e-7 V/bit S_min=235.659 dof=254 +caldac[2] gain=3.96840(14)e-4 V/bit S_min=1390.18 dof=254 +caldac[3] gain=4.348(11)e-6 V/bit S_min=258.75 dof=254 +caldac[8] gain=5.4659(69)e-7 V/bit S_min=386.361 dof=254 +ai, bipolar zero offset, high gain +offset -2.4224(55)e-4, target 0 +caldac[0] gain=3.61(45)e-9 V/bit S_min=247.26 dof=254 +caldac[2] gain=3.96644(48)e-6 V/bit S_min=351.927 dof=254 +caldac[3] gain=4.063(46)e-8 V/bit S_min=272.024 dof=254 +caldac[8] gain=5.46305(30)e-7 V/bit S_min=314.035 dof=254 +ai, bipolar voltage reference, low gain +offset 4.992959(13), target 5 +caldac[0] gain=-4.4928(11)e-5 V/bit S_min=1111.4 dof=254 +caldac[1] gain=-2.792(11)e-6 V/bit S_min=248.971 dof=254 +caldac[2] gain=3.96488(14)e-4 V/bit S_min=1059.18 dof=254 +caldac[3] gain=4.318(11)e-6 V/bit S_min=437.441 dof=254 +caldac[8] gain=5.4810(70)e-7 V/bit S_min=404.213 dof=254 +ai, unipolar zero offset, low gain +offset nan, target 0 +caldac[2] gain=3.96773(39)e-4 V/bit S_min=158.236 dof=107 +ao 0, zero offset, low gain +offset -8.946(13)e-3, target 0.00015259 +caldac[0] gain=1.28(12)e-7 V/bit S_min=309.214 dof=254 +caldac[2] gain=3.96806(14)e-4 V/bit S_min=1051.91 dof=254 +caldac[3] gain=4.258(12)e-6 V/bit S_min=237.016 dof=254 +caldac[4] gain=-6.2(12)e-8 V/bit S_min=256.812 dof=254 +caldac[6] gain=-7.6740(12)e-5 V/bit S_min=754.459 dof=254 +caldac[7] gain=5.3(12)e-8 V/bit S_min=283.48 dof=254 +caldac[8] gain=5.4530(71)e-7 V/bit S_min=431.616 dof=254 +ao 0, reference voltage, low gain +offset -0.011399(15), target -7.62951e-05 +caldac[0] gain=1.09(12)e-7 V/bit S_min=302.48 dof=254 +caldac[2] gain=3.96841(15)e-4 V/bit S_min=1104.72 dof=254 +caldac[3] gain=4.296(12)e-6 V/bit S_min=287.18 dof=254 +caldac[4] gain=3.8964(12)e-5 V/bit S_min=588.472 dof=254 +caldac[6] gain=-7.6724(12)e-5 V/bit S_min=689.86 dof=254 +caldac[8] gain=5.4979(76)e-7 V/bit S_min=280.029 dof=254 +ao 1, zero offset, low gain +offset -7.100(12)e-3, target 0.00015259 +caldac[0] gain=1.25(12)e-7 V/bit S_min=290.836 dof=254 +caldac[2] gain=3.96846(14)e-4 V/bit S_min=1387.23 dof=254 +caldac[3] gain=4.291(11)e-6 V/bit S_min=368.089 dof=254 +caldac[7] gain=-7.7009(11)e-5 V/bit S_min=1231.29 dof=254 +caldac[8] gain=5.4827(70)e-7 V/bit S_min=410.106 dof=254 +ao 1, reference voltage, low gain +offset -2.508609(14), target -7.62951e-05 +caldac[0] gain=2.2683(12)e-5 V/bit S_min=548.448 dof=254 +caldac[1] gain=1.339(12)e-6 V/bit S_min=286.665 dof=254 +caldac[2] gain=3.97015(14)e-4 V/bit S_min=1538.98 dof=254 +caldac[3] gain=4.319(12)e-6 V/bit S_min=333.242 dof=254 +caldac[5] gain=1.9542(12)e-5 V/bit S_min=453.123 dof=254 +caldac[7] gain=-7.6990(12)e-5 V/bit S_min=1390.82 dof=254 +caldac[8] gain=5.5079(73)e-7 V/bit S_min=297.996 dof=254