Add README. Add a few boards. Fix: CONFIG_GUESS boards output dump
authorDavid Schleef <ds@schleef.org>
Mon, 14 Jan 2002 21:26:26 +0000 (21:26 +0000)
committerDavid Schleef <ds@schleef.org>
Mon, 14 Jan 2002 21:26:26 +0000 (21:26 +0000)
information.

comedi_calibrate/README [new file with mode: 0644]
comedi_calibrate/comedi_calibrate.c
comedi_calibrate/ni.c
comedi_calibrate/results/at-mio-16xe-50
comedi_calibrate/results/pci-6071e [new file with mode: 0644]
comedi_calibrate/results/pci-6713 [new file with mode: 0644]
comedi_calibrate/results/pci-mio-16xe-10 [new file with mode: 0644]

diff --git a/comedi_calibrate/README b/comedi_calibrate/README
new file mode 100644 (file)
index 0000000..7066421
--- /dev/null
@@ -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 <ds@schleef.org>
+  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);
+  }
+
index 856e9ff2c2ec0be5f01d7ce5218d230ab143907f..36ab4c444cf5e166e72dfce4d0179148e7bc7acb 100644 (file)
@@ -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");
index d52248337728f040e464811c8c2ef4ffbd9e22fd..4c8a184b535cd7e4d8cb03ddbe313c2ce1ea36c4 100644 (file)
@@ -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;
index db7ad2af9e7e262d1c0c30a1bb3f1630f38b27ca..1a0c6787681a307c222e89d63bb606e40e2823c9 100644 (file)
@@ -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 <ds@schleef.org>
 $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 (file)
index 0000000..0c90cea
--- /dev/null
@@ -0,0 +1,16 @@
+Warning: device not fully calibrated due to insufficient information
+Please send this output to <ds@schleef.org>
+$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 (file)
index 0000000..655db1d
--- /dev/null
@@ -0,0 +1,16 @@
+Warning: device not fully calibrated due to insufficient information
+Please send this output to <ds@schleef.org>
+$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 (file)
index 0000000..a08e3cc
--- /dev/null
@@ -0,0 +1,61 @@
+Warning: device not fully calibrated due to insufficient information
+Please send this output to <ds@schleef.org>
+$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