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
*/
/***************************************************************************
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;
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 ) );
}
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);
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);
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){
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){
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;
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);
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);
x2 = x1 | bit;
update_caldac( setup, dac, x2 );
- usleep(100000);
+ usleep(caldac_settle_usec);
preobserve( setup, obs1);
new_sv_measure( setup->dev, &sv1);
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);
x2 = x1 | bit;
update_caldac( setup, dac, x2 );
- usleep(100000);
+ usleep(caldac_settle_usec);
preobserve( setup, obs1);
new_sv_measure( setup->dev, &sv1);
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*step<n;i++){
update_caldac( setup, cdac, i*step );
- //usleep(100000);
+ //usleep(caldac_settle_usec);
new_sv_measure( setup->dev, &sv);
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<n;i++){
update_caldac( setup, cdac, i+orig-fine_size );
- usleep(100000);
+ usleep(caldac_settle_usec);
new_sv_measure( setup->dev, &sv);
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);
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);
}
#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)
{
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;