diff --git a/comedi_calibrate/cal_common.c b/comedi_calibrate/cal_common.c index 50557ec..4d3ed60 100644 --- a/comedi_calibrate/cal_common.c +++ b/comedi_calibrate/cal_common.c @@ -130,12 +130,12 @@ static void generic_do_dac_channel( calibration_setup_t *setup, const generic_la generic_prep_adc_for_dac( setup, layout, calibration, layout->dac_ground_observable( setup, channel, range ) ); - generic_do_relative( setup, current_cal, layout->dac_ground_observable( setup, channel, range ), - layout->dac_high_observable( setup, channel, range ), layout->dac_gain( channel ) ); + generic_do_relative( setup, current_cal, layout->dac_high_observable( setup, channel, range ), + layout->dac_ground_observable( setup, channel, range ),layout->dac_gain( channel ) ); generic_do_cal( setup, current_cal, layout->dac_ground_observable( setup, channel, range ), layout->dac_offset( channel ) ); - generic_do_relative( setup, current_cal, layout->dac_ground_observable( setup, channel, range ), - layout->dac_high_observable( setup, channel, range ), layout->dac_gain_fine( channel ) ); + generic_do_relative( setup, current_cal, layout->dac_high_observable( setup, channel, range ), + layout->dac_ground_observable( setup, channel, range ), layout->dac_gain_fine( channel ) ); generic_do_cal( setup, current_cal, layout->dac_ground_observable( setup, channel, range ), layout->dac_offset_fine( channel ) ); diff --git a/comedi_calibrate/calib.h b/comedi_calibrate/calib.h index 1625c61..f7bb35a 100644 --- a/comedi_calibrate/calib.h +++ b/comedi_calibrate/calib.h @@ -30,6 +30,8 @@ #define N_OBSERVABLES 128 #define PREOBSERVE_DATA_LEN 10 +static const int caldac_settle_usec = 100000; + typedef struct{ int subdev; int chan; @@ -63,7 +65,8 @@ struct calibration_setup_struct { int eeprom_subdev; int caldac_subdev; int status; - unsigned int settling_time_ns; + unsigned int sv_settling_time_ns; + unsigned int sv_order; observable observables[ N_OBSERVABLES ]; unsigned int n_observables; caldac_t caldacs[ N_CALDACS ]; @@ -212,6 +215,8 @@ typedef struct{ int new_sv_measure(comedi_t *dev, new_sv_t *sv); int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec); +int my_sv_init( new_sv_t *sv, const calibration_setup_t *setup, int subdev, + unsigned int chanspec ); /* saving calibrations to file */ static const int SC_ALL_CHANNELS = -1; diff --git a/comedi_calibrate/comedi_calibrate.c b/comedi_calibrate/comedi_calibrate.c index 6209c03..355e9dc 100644 --- a/comedi_calibrate/comedi_calibrate.c +++ b/comedi_calibrate/comedi_calibrate.c @@ -5,15 +5,6 @@ copyright (C) 1999,2000,2001,2002 by David Schleef copyright (C) 2003 by Frank Mori Hess - A few things need improvement here: - - current system gets "close", but doesn't - do any fine-tuning - - should read (and use) the actual reference - voltage value from eeprom - - statistics would be nice, to show how good - the calibration is. - - doesn't check unipolar ranges - - more portable */ /*************************************************************************** @@ -182,8 +173,9 @@ int main(int argc, char *argv[]) parsed_options_t options; memset( &setup, 0, sizeof( setup ) ); - setup.settling_time_ns = 99999; - + setup.sv_settling_time_ns = 99999; + setup.sv_order = 10; + memset( &options, 0, sizeof( options ) ); options.do_dump = 0; options.do_reset = 0; @@ -361,10 +353,10 @@ static void apply_appropriate_cal( calibration_setup_t *setup, comedi_insn insn return; } if( retval < 0 ) - DPRINT( 0, "failed to apply "); + DPRINT( 1, "failed to apply "); else - DPRINT( 0, "applied "); - DPRINT( 0, "calibration for subdev %i, channel %i, range %i, aref %i\n", insn.subdev, + DPRINT( 1, "applied "); + DPRINT( 1, "calibration for subdev %i, channel %i, range %i, aref %i\n", insn.subdev, CR_CHAN( insn.chanspec ), CR_RANGE( insn.chanspec ), CR_AREF( insn.chanspec ) ); } @@ -427,10 +419,9 @@ void measure_observable( calibration_setup_t *setup, int obs) int n; new_sv_t sv; - new_sv_init(&sv, setup->dev, + my_sv_init(&sv, setup, setup->observables[obs].observe_insn.subdev, setup->observables[obs].observe_insn.chanspec); - sv.settling_time_ns = setup->settling_time_ns; n = new_sv_measure(setup->dev, &sv); sci_sprint_alt(s,sv.average,sv.error); @@ -490,7 +481,7 @@ void postgain_cal( calibration_setup_t *setup, int obs1, int obs2, int dac) a=setup->caldacs[dac].current-a; update_caldac( setup, dac, rint(a) ); - usleep(100000); + usleep(caldac_settle_usec); DPRINT(0,"caldac[%d] set to %g (%g)\n",dac,rint(a),a); @@ -513,7 +504,7 @@ void cal1( calibration_setup_t *setup, int obs, int dac) a=linear_fit_func_x(&l, setup->observables[obs].target); update_caldac( setup, dac, rint(a) ); - usleep(100000); + usleep(caldac_settle_usec); DPRINT(0,"caldac[%d] set to %g (%g)\n",dac,rint(a),a); if(verbose>=3){ @@ -532,7 +523,7 @@ void cal1_fine( calibration_setup_t *setup, int obs, int dac ) a=linear_fit_func_x(&l,setup->observables[obs].target); update_caldac( setup, dac, rint(a) ); - usleep(100000); + usleep(caldac_settle_usec); DPRINT(0,"caldac[%d] set to %g (%g)\n",dac,rint(a),a); if(verbose>=3){ @@ -555,18 +546,17 @@ void cal_binary( calibration_setup_t *setup, int obs, int dac) comedi_set_global_oor_behavior( COMEDI_OOR_NUMBER ); - new_sv_init(&sv, setup->dev, setup->ad_subdev, chanspec); - sv.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv, setup, setup->ad_subdev, chanspec); x0 = setup->caldacs[dac].maxdata; update_caldac( setup, dac, x0 ); - usleep(100000); + usleep(caldac_settle_usec); new_sv_measure( setup->dev, &sv); y0 = sv.average; x1 = x2 = 0; update_caldac( setup, dac, x1 ); - usleep(100000); + usleep(caldac_settle_usec); new_sv_measure( setup->dev, &sv); y1 = y2 = sv.average; @@ -580,7 +570,7 @@ void cal_binary( calibration_setup_t *setup, int obs, int dac) x2 = x1 | bit; update_caldac( setup, dac, x2 ); - usleep(100000); + usleep(caldac_settle_usec); new_sv_measure( setup->dev, &sv); y2 = sv.average; DPRINT(3,"trying %d, result %g, target %g\n",x2,y2,target); @@ -631,21 +621,19 @@ void cal_relative_binary( calibration_setup_t *setup, int obs1, int obs2, int da x0 = setup->caldacs[dac].maxdata; update_caldac( setup, dac, x0 ); - usleep(100000); + usleep(caldac_settle_usec); preobserve( setup, obs1); - new_sv_init(&sv1, setup->dev, setup->ad_subdev,chanspec1); - sv1.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv1, setup, setup->ad_subdev,chanspec1); new_sv_measure( setup->dev, &sv1); preobserve( setup, obs2); - new_sv_init(&sv2, setup->dev, setup->ad_subdev,chanspec2); - sv2.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv2, setup, setup->ad_subdev,chanspec2); new_sv_measure( setup->dev, &sv2); y0 = sv1.average - sv2.average; x1 = x2 = 0; update_caldac( setup, dac, x1 ); - usleep(100000); + usleep(caldac_settle_usec); preobserve( setup, obs1); new_sv_measure( setup->dev, &sv1); @@ -664,7 +652,7 @@ void cal_relative_binary( calibration_setup_t *setup, int obs1, int obs2, int da x2 = x1 | bit; update_caldac( setup, dac, x2 ); - usleep(100000); + usleep(caldac_settle_usec); preobserve( setup, obs1); new_sv_measure( setup->dev, &sv1); @@ -723,28 +711,25 @@ void cal_linearity_binary( calibration_setup_t *setup, int obs1, int obs2, int o x0 = setup->caldacs[dac].maxdata; update_caldac( setup, dac, x0 ); - usleep(100000); + usleep(caldac_settle_usec); preobserve( setup, obs1); - new_sv_init(&sv1, setup->dev, setup->ad_subdev,chanspec1); - sv1.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv1, setup, setup->ad_subdev,chanspec1); new_sv_measure( setup->dev, &sv1); preobserve( setup, obs2); - new_sv_init(&sv2, setup->dev, setup->ad_subdev,chanspec2); - sv2.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv2, setup, setup->ad_subdev,chanspec2); new_sv_measure( setup->dev, &sv2); preobserve( setup, obs3); - new_sv_init(&sv3, setup->dev, setup->ad_subdev,chanspec3); - sv3.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv3, setup, setup->ad_subdev,chanspec3); new_sv_measure( setup->dev, &sv3); y0 = ( sv3.average - sv2.average ) / ( sv2.average - sv1.average ); x1 = x2 = 0; update_caldac( setup, dac, x1 ); - usleep(100000); + usleep(caldac_settle_usec); preobserve( setup, obs1); new_sv_measure( setup->dev, &sv1); @@ -768,7 +753,7 @@ void cal_linearity_binary( calibration_setup_t *setup, int obs1, int obs2, int o x2 = x1 | bit; update_caldac( setup, dac, x2 ); - usleep(100000); + usleep(caldac_settle_usec); preobserve( setup, obs1); new_sv_measure( setup->dev, &sv1); @@ -980,18 +965,17 @@ double check_gain_chan_x( calibration_setup_t *setup, linear_fit_t *l,unsigned i orig = setup->caldacs[cdac].current; - new_sv_init(&sv, setup->dev, setup->ad_subdev,ad_chanspec); - sv.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv, setup, setup->ad_subdev,ad_chanspec); update_caldac( setup, cdac, 0 ); - usleep(100000); + usleep(caldac_settle_usec); new_sv_measure( setup->dev, &sv); sum_err=0; for(i=0;i*stepdev, &sv); @@ -1051,18 +1035,17 @@ double check_gain_chan_fine( calibration_setup_t *setup, linear_fit_t *l,unsigne orig = setup->caldacs[cdac].current; - new_sv_init(&sv, setup->dev, setup->ad_subdev,ad_chanspec); - sv.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv, setup, setup->ad_subdev,ad_chanspec); update_caldac( setup, cdac, 0 ); - usleep(100000); + usleep(caldac_settle_usec); new_sv_measure( setup->dev, &sv); sum_err=0; for(i=0;idev, &sv); @@ -1229,8 +1212,7 @@ double read_chan( calibration_setup_t *setup, int adc,int range) new_sv_t sv; char str[20]; - new_sv_init(&sv, setup->dev, setup->ad_subdev,CR_PACK(adc,range,AREF_OTHER)); - sv.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv, setup, setup->ad_subdev,CR_PACK(adc,range,AREF_OTHER)); n=new_sv_measure( setup->dev, &sv); @@ -1245,8 +1227,7 @@ int read_chan2( calibration_setup_t *setup, char *s,int adc,int range) int n; new_sv_t sv; - new_sv_init(&sv, setup->dev, setup->ad_subdev,CR_PACK(adc,range,AREF_OTHER)); - sv.settling_time_ns = setup->settling_time_ns; + my_sv_init(&sv, setup, setup->ad_subdev,CR_PACK(adc,range,AREF_OTHER)); n=new_sv_measure( setup->dev, &sv); @@ -1266,6 +1247,15 @@ void set_ao(comedi_t *dev,int subdev,int chan,int range,double value) } #endif +int my_sv_init( new_sv_t *sv, const calibration_setup_t *setup, int subdev, + unsigned int chanspec ) +{ + int retval; + retval = new_sv_init( sv, setup->dev, subdev, chanspec ); + sv->settling_time_ns = setup->sv_settling_time_ns; + sv->order = setup->sv_order; + return retval; +} int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec) { @@ -1318,8 +1308,8 @@ int new_sv_measure( comedi_t *dev, new_sv_t *sv) goto out; } - s=0; - s2=0; + s=0.0; + s2=0.0; for(i = 0; i < n; i++){ x = comedi_to_phys(data[i], sv->rng, sv->maxdata); s += x; diff --git a/comedi_calibrate/ni.c b/comedi_calibrate/ni.c index a099cd5..c063cc5 100644 --- a/comedi_calibrate/ni.c +++ b/comedi_calibrate/ni.c @@ -540,7 +540,8 @@ static void ni_setup_observables_611x( calibration_setup_t *setup ) int num_ai_channels, num_ai_ranges; static const int num_ao_channels = 2; - setup->settling_time_ns = 10000000; + setup->sv_settling_time_ns = 10000000; + setup->sv_order = 14; master_reference = ni_get_reference( setup, ni_board( setup )->ref_eeprom_lsb, ni_board( setup )->ref_eeprom_msb );