added more unipolar observables for ni boards, so unipolar calibrations
authorFrank Mori Hess <fmhess@speakeasy.net>
Mon, 28 Apr 2003 01:00:07 +0000 (01:00 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Mon, 28 Apr 2003 01:00:07 +0000 (01:00 +0000)
can be done.

comedi_calibrate/calib.h
comedi_calibrate/comedi_calibrate.c
comedi_calibrate/ni.c

index 90d4eb22568d3e1488199e4907c4ea0d7f6559df..bdec910b7801d404619b4c1de15f36dca86cace1 100644 (file)
@@ -137,6 +137,7 @@ int cb_actual_source_voltage( comedi_t *dev, unsigned int subdevice,
 int get_bipolar_lowgain(comedi_t *dev,int subdev);
 int get_bipolar_highgain(comedi_t *dev,int subdev);
 int get_unipolar_lowgain(comedi_t *dev,int subdev);
+int get_unipolar_highgain(comedi_t *dev,int subdev);
 
 /* other */
 
index 8914680d74e9d9fa6dc8f4107bbcff771951beff..eca9f51d00631ede14412597957fd7820dbe0410 100644 (file)
@@ -300,9 +300,10 @@ void observe( calibration_setup_t *setup )
        observable *obs;
 
        for( i = 0; i < setup->n_observables; i++){
+               obs = &setup->observables[ i ];
+               if( obs->observe_insn.n == 0 ) continue;
                preobserve( setup, i);
                DPRINT(0,"%s\n", setup->observables[i].name);
-               obs = &setup->observables[ i ];
                if( obs->preobserve_insn.n != 0){
                        apply_appropriate_cal( setup, obs->preobserve_insn );
                }
@@ -933,12 +934,13 @@ int get_unipolar_lowgain(comedi_t *dev,int subdev)
        int ret = -1;
        int i;
        int n_ranges = comedi_get_n_ranges(dev,subdev,0);
-       double max = 0;
+       double max = 0.0;
        comedi_range *range;
 
        for(i=0;i<n_ranges;i++){
                range = comedi_get_range(dev,subdev,0,i);
-               if(range->min != 0)continue;
+               /* This method is better than a direct test, which might fail */
+               if((range->min+range->max)<(range->max*0.99))continue;
                if(range->max>max){
                        ret = i;
                        max=range->max;
@@ -948,6 +950,26 @@ int get_unipolar_lowgain(comedi_t *dev,int subdev)
        return ret;
 }
 
+int get_unipolar_highgain(comedi_t *dev,int subdev)
+{
+       int ret = -1;
+       int i;
+       int n_ranges = comedi_get_n_ranges(dev,subdev,0);
+       double max = HUGE_VAL;
+       comedi_range *range;
+
+       for(i=0;i<n_ranges;i++){
+               range = comedi_get_range(dev,subdev,0,i);
+               /* This method is better than a direct test, which might fail */
+               if((range->min+range->max)<(range->max*0.99))continue;
+               if(range->max < max){
+                       ret = i;
+                       max=range->max;
+               }
+       }
+
+       return ret;
+}
 
 int read_eeprom( calibration_setup_t *setup, int addr)
 {
index 6f4830ddef17d57d532e7ee40b5e93c99946da2c..9ebbd53e2de8b27b39b94d8e5a1adb5c9f243a5e 100644 (file)
@@ -129,7 +129,9 @@ enum observables{
        ni_zero_offset_low = 0,
        ni_zero_offset_high,
        ni_reference_low,
-       ni_unip_offset_low,
+       ni_unip_zero_offset_low,
+       ni_unip_zero_offset_high,
+       ni_unip_reference_low,
        ni_ao0_zero_offset,
        ni_ao0_reference,
        ni_ao1_zero_offset,
@@ -193,12 +195,14 @@ static void ni_setup_observables( calibration_setup_t *setup )
        int bipolar_lowgain;
        int bipolar_highgain;
        int unipolar_lowgain;
+       int unipolar_highgain;
        double voltage_reference;
        observable *o;
 
        bipolar_lowgain = get_bipolar_lowgain( setup->dev, setup->ad_subdev);
        bipolar_highgain = get_bipolar_highgain( setup->dev, setup->ad_subdev);
        unipolar_lowgain = get_unipolar_lowgain( setup->dev, setup->ad_subdev);
+       unipolar_highgain = get_unipolar_highgain( setup->dev, setup->ad_subdev);
 
        voltage_reference = 5.000;
 
@@ -207,7 +211,7 @@ static void ni_setup_observables( calibration_setup_t *setup )
        tmpl.n = 1;
        tmpl.subdev = setup->ad_subdev;
 
-       setup->n_observables = 0;
+       setup->n_observables = 10;
 
        /* 0 offset, low gain */
        o = setup->observables + ni_zero_offset_low;
@@ -217,7 +221,6 @@ static void ni_setup_observables( calibration_setup_t *setup )
                | CR_ALT_SOURCE | CR_ALT_FILTER;
        o->reference_source = REF_GND_GND;
        o->target = 0;
-       setup->n_observables++;
 
        /* 0 offset, high gain */
        o = setup->observables + ni_zero_offset_high;
@@ -227,7 +230,6 @@ static void ni_setup_observables( calibration_setup_t *setup )
                | CR_ALT_SOURCE | CR_ALT_FILTER;
        o->reference_source = REF_GND_GND;
        o->target = 0;
-       setup->n_observables++;
 
        /* voltage reference */
        o = setup->observables + ni_reference_low;
@@ -237,24 +239,18 @@ static void ni_setup_observables( calibration_setup_t *setup )
                | CR_ALT_SOURCE | CR_ALT_FILTER;
        o->reference_source = REF_CALSRC_GND;
        o->target = voltage_reference;
-       setup->n_observables++;
 
        if(unipolar_lowgain>=0){
-               /* unip/bip offset */
-               o = setup->observables + ni_unip_offset_low;
+               o = setup->observables + ni_unip_zero_offset_low;
                o->name = "ai, unipolar zero offset, low gain";
                o->observe_insn = tmpl;
                o->observe_insn.chanspec =
                        CR_PACK(REF_GND_GND,unipolar_lowgain,AREF_OTHER)
                        | CR_ALT_SOURCE | CR_ALT_FILTER;
-
                o->reference_source = REF_GND_GND;
                o->target = 0.0;
-               setup->n_observables++;
 
-#if 0
-               /* unip gain */
-               o = observables + ni_unip_reference_low;
+               o = setup->observables + ni_unip_reference_low;
                o->name = "ai, unipolar voltage reference, low gain";
                o->observe_insn = tmpl;
                o->observe_insn.chanspec =
@@ -262,9 +258,18 @@ static void ni_setup_observables( calibration_setup_t *setup )
                        | CR_ALT_SOURCE | CR_ALT_FILTER;
                o->reference_source = REF_CALSRC_GND;
                o->target = voltage_reference;
-               i++;
-#endif
-               setup->n_observables = ni_unip_offset_low + 1;
+       }
+
+       if(unipolar_highgain >= 0)
+       {
+               o = setup->observables + ni_unip_zero_offset_high;
+               o->name = "ai, unipolar zero offset, high gain";
+               o->observe_insn = tmpl;
+               o->observe_insn.chanspec =
+                       CR_PACK(REF_GND_GND,unipolar_highgain,AREF_OTHER)
+                       | CR_ALT_SOURCE | CR_ALT_FILTER;
+               o->reference_source = REF_GND_GND;
+               o->target = 0.0;
        }
 
        if(setup->da_subdev>=0){
@@ -287,7 +292,6 @@ static void ni_setup_observables( calibration_setup_t *setup )
                        | CR_ALT_SOURCE | CR_ALT_FILTER;
                o->reference_source = REF_DAC0_GND;
                set_target( setup, ni_ao0_zero_offset,0.0);
-               setup->n_observables++;
 
                /* ao 0, gain */
                o = setup->observables + ni_ao0_reference;
@@ -302,7 +306,6 @@ static void ni_setup_observables( calibration_setup_t *setup )
                o->reference_source = REF_DAC0_CALSRC;
                set_target( setup, ni_ao0_reference,5.0);
                o->target -= voltage_reference;
-               setup->n_observables++;
 
                /* ao 1, zero offset */
                o = setup->observables + ni_ao1_zero_offset;
@@ -316,7 +319,6 @@ static void ni_setup_observables( calibration_setup_t *setup )
                        | CR_ALT_SOURCE | CR_ALT_FILTER;
                o->reference_source = REF_DAC1_GND;
                set_target( setup, ni_ao1_zero_offset,0.0);
-               setup->n_observables++;
 
                /* ao 1, gain */
                o = setup->observables + ni_ao1_reference;
@@ -331,7 +333,6 @@ static void ni_setup_observables( calibration_setup_t *setup )
                o->reference_source = REF_DAC1_CALSRC;
                set_target( setup, ni_ao1_reference,5.0);
                o->target -= voltage_reference;
-               setup->n_observables++;
        }
 }
 
@@ -463,7 +464,7 @@ static int cal_ni_at_mio_16e_2(calibration_setup_t *setup)
        postgain_cal( setup, ni_zero_offset_low,ni_zero_offset_high,1);
        cal1( setup, ni_zero_offset_high,0);
        cal1( setup, ni_reference_low,3);
-       cal1( setup, ni_unip_offset_low,2);
+       cal1( setup, ni_unip_zero_offset_low,2);
        if(setup->do_output){
                cal1( setup, ni_ao0_zero_offset,5);
                cal1( setup, ni_ao0_reference,6);
@@ -555,7 +556,7 @@ static int cal_ni_pci_mio_16e_1(calibration_setup_t *setup)
        postgain_cal( setup, ni_zero_offset_low,ni_zero_offset_high,1);
        cal1( setup, ni_zero_offset_high,0);
        cal1( setup, ni_reference_low,3);
-       cal1( setup, ni_unip_offset_low,2);
+       cal1( setup, ni_unip_zero_offset_low,2);
        if(setup->do_output){
                cal1( setup, ni_ao0_zero_offset,5);
                //cal1( setup, ni_ao0_zero_offset,4); /* linearity? */
@@ -641,7 +642,7 @@ static int cal_ni_at_mio_16e_10(calibration_setup_t *setup)
        cal1( setup, ni_zero_offset_high,10);
        cal1( setup, ni_zero_offset_high,0);
        cal1( setup, ni_reference_low,3);
-       cal1( setup, ni_unip_offset_low,2);
+       cal1( setup, ni_unip_zero_offset_low,2);
        if(setup->do_output){
                cal1( setup, ni_ao0_zero_offset,5); // guess
                cal1( setup, ni_ao0_reference,6); // guess
@@ -757,8 +758,8 @@ static int cal_ni_pci_6052e(calibration_setup_t *setup)
        cal_binary( setup, ni_reference_low,4);
        cal1_fine( setup, ni_reference_low,4);
        cal1( setup, ni_reference_low,5);
-       cal1( setup, ni_unip_offset_low,6);
-       cal1_fine( setup, ni_unip_offset_low,6);
+       cal1( setup, ni_unip_zero_offset_low,6);
+       cal1_fine( setup, ni_unip_zero_offset_low,6);
        if(setup->do_output){
                cal1( setup, ni_ao0_zero_offset,12+11);
                cal1_fine( setup, ni_ao0_zero_offset,12+11);
@@ -783,8 +784,8 @@ static int cal_ni_pci_mio_16e_4(calibration_setup_t *setup)
        cal_binary( setup, ni_reference_low,2);
        cal1_fine( setup, ni_reference_low,2);
 
-       cal1( setup, ni_unip_offset_low,7);
-       cal1_fine( setup, ni_unip_offset_low,7);
+       cal1( setup, ni_unip_zero_offset_low,7);
+       cal1_fine( setup, ni_unip_zero_offset_low,7);
 
        if(setup->do_output){
                cal_binary( setup, ni_ao0_zero_offset,6);
@@ -812,7 +813,7 @@ static int cal_ni_daqcard_ai_16e_4(calibration_setup_t *setup)
        cal_binary( setup, ni_reference_low,3);
        cal1_fine( setup, ni_reference_low,3);
 
-       cal1( setup, ni_unip_offset_low,2);
+       cal1( setup, ni_unip_zero_offset_low,2);
 
        return 0;
 }
@@ -846,11 +847,11 @@ static int cal_ni_daqcard_6062e( calibration_setup_t *setup )
        int i, retval;
        enum caldacs
        {
-               ADC_PREGAIN_OFFSET = 0, /* guess */
+               ADC_PREGAIN_OFFSET = 0,
                DAC1_OFFSET = 1,
                ADC_GAIN = 2,
                DAC0_GAIN = 3,
-               ADC_POSTGAIN_OFFSET = 4,        /* guess */
+               ADC_POSTGAIN_OFFSET = 4,
                DAC1_GAIN = 5,
                DAC0_OFFSET = 6,
        };