Changed new_sv to use chanspec. Updated 6052e. Changed ni.c to
use CR_ALT_SOURCE for one observable.
This commit is contained in:
parent
a915ab1206
commit
45f3cb25a7
5 changed files with 83 additions and 41 deletions
|
@ -7,7 +7,7 @@ LDFLAGS += -L../lib/ -lcomedi -lm
|
|||
|
||||
|
||||
BINS = comedi_calibrate
|
||||
objs = comedi_calibrate.o ni.o cb.o
|
||||
objs = comedi_calibrate.o ni.o cb.o other.o
|
||||
|
||||
all: $(BINS)
|
||||
|
||||
|
|
|
@ -122,6 +122,10 @@ 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);
|
||||
|
||||
/* other */
|
||||
|
||||
void comedi_nanodelay(comedi_t *dev, unsigned int delay);
|
||||
|
||||
/* printing scientific numbers */
|
||||
|
||||
int sci_sprint(char *s,double x,double y);
|
||||
|
@ -169,11 +173,8 @@ typedef struct{
|
|||
|
||||
int maxdata;
|
||||
int order;
|
||||
int aref;
|
||||
int range;
|
||||
int subd;
|
||||
int chan;
|
||||
int cr_flags;
|
||||
unsigned int chanspec;
|
||||
|
||||
comedi_range *rng;
|
||||
|
||||
|
@ -184,7 +185,7 @@ typedef struct{
|
|||
}new_sv_t;
|
||||
|
||||
int new_sv_measure(comedi_t *dev, new_sv_t *sv);
|
||||
int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,int chan,int range,int aref);
|
||||
int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -208,10 +208,12 @@ void set_target( calibration_setup_t *setup, int obs,double target)
|
|||
comedi_range *range;
|
||||
lsampl_t maxdata, data;
|
||||
|
||||
range = comedi_get_range(setup->dev, setup->observables[obs].preobserve_insn.subdev,
|
||||
range = comedi_get_range(setup->dev,
|
||||
setup->observables[obs].preobserve_insn.subdev,
|
||||
CR_CHAN( setup->observables[obs].preobserve_insn.chanspec ),
|
||||
CR_RANGE( setup->observables[obs].preobserve_insn.chanspec ));
|
||||
maxdata = comedi_get_maxdata( setup->dev, setup->observables[obs].preobserve_insn.subdev,
|
||||
maxdata = comedi_get_maxdata( setup->dev,
|
||||
setup->observables[obs].preobserve_insn.subdev,
|
||||
CR_CHAN(setup->observables[obs].preobserve_insn.chanspec));
|
||||
|
||||
data = comedi_from_phys(target,range,maxdata);
|
||||
|
@ -256,12 +258,11 @@ void measure_observable( calibration_setup_t *setup, int obs)
|
|||
|
||||
new_sv_init(&sv, setup->dev,
|
||||
setup->observables[obs].observe_insn.subdev,
|
||||
CR_CHAN( setup->observables[obs].observe_insn.chanspec),
|
||||
CR_RANGE( setup->observables[obs].observe_insn.chanspec),
|
||||
CR_AREF( setup->observables[obs].observe_insn.chanspec));
|
||||
setup->observables[obs].observe_insn.chanspec);
|
||||
sv.order=7;
|
||||
// read internal calibration source and turn on dithering
|
||||
sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE;
|
||||
//sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE;
|
||||
//sv.cr_flags = CR_ALT_FILTER;
|
||||
n = new_sv_measure(setup->dev, &sv);
|
||||
|
||||
sci_sprint_alt(s,sv.average,sv.error);
|
||||
|
@ -529,12 +530,10 @@ 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,0,
|
||||
CR_CHAN(ad_chanspec),
|
||||
CR_RANGE(ad_chanspec),
|
||||
CR_AREF(ad_chanspec));
|
||||
new_sv_init(&sv, setup->dev,0,ad_chanspec);
|
||||
// read internal calibration source and turn on dithering
|
||||
sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE;
|
||||
//sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE;
|
||||
//sv.cr_flags = CR_ALT_FILTER;
|
||||
|
||||
setup->caldacs[cdac].current=0;
|
||||
update_caldac( setup, cdac );
|
||||
|
@ -607,12 +606,10 @@ 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,0,
|
||||
CR_CHAN(ad_chanspec),
|
||||
CR_RANGE(ad_chanspec),
|
||||
CR_AREF(ad_chanspec));
|
||||
new_sv_init(&sv, setup->dev,0,ad_chanspec);
|
||||
// read internal calibration source and turn on dithering
|
||||
sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE;
|
||||
//sv.cr_flags = CR_ALT_FILTER | CR_ALT_SOURCE;
|
||||
//sv.cr_flags = CR_ALT_FILTER;
|
||||
|
||||
setup->caldacs[cdac].current=0;
|
||||
update_caldac( setup, cdac );
|
||||
|
@ -741,9 +738,9 @@ double read_chan( calibration_setup_t *setup, int adc,int range)
|
|||
new_sv_t sv;
|
||||
char str[20];
|
||||
|
||||
new_sv_init(&sv, setup->dev, 0,adc,range,AREF_OTHER);
|
||||
new_sv_init(&sv, setup->dev, 0,CR_PACK(adc,range,AREF_OTHER));
|
||||
sv.order=7;
|
||||
sv.cr_flags = CR_ALT_FILTER;
|
||||
//sv.cr_flags = CR_ALT_FILTER;
|
||||
|
||||
n=new_sv_measure( setup->dev, &sv);
|
||||
|
||||
|
@ -758,10 +755,10 @@ 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,0,adc,range,AREF_OTHER);
|
||||
new_sv_init(&sv, setup->dev,0,CR_PACK(adc,range,AREF_OTHER));
|
||||
sv.order=7;
|
||||
// turn on dithering
|
||||
sv.cr_flags = CR_ALT_FILTER;
|
||||
//sv.cr_flags = CR_ALT_FILTER;
|
||||
|
||||
n=new_sv_measure( setup->dev, &sv);
|
||||
|
||||
|
@ -782,20 +779,19 @@ void set_ao(comedi_t *dev,int subdev,int chan,int range,double value)
|
|||
#endif
|
||||
|
||||
|
||||
int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,int chan,int range,int aref)
|
||||
int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,unsigned int chanspec)
|
||||
{
|
||||
memset(sv,0,sizeof(*sv));
|
||||
|
||||
sv->subd=subdev;
|
||||
//sv->t.flags=TRIG_DITHER;
|
||||
sv->chan=chan;
|
||||
sv->range=range;
|
||||
sv->aref=aref;
|
||||
sv->chanspec = chanspec;
|
||||
|
||||
//sv->chanlist[0]=CR_PACK(chan,range,aref);
|
||||
|
||||
sv->maxdata=comedi_get_maxdata(dev,subdev,chan);
|
||||
sv->rng=comedi_get_range(dev,subdev,chan,range);
|
||||
sv->maxdata=comedi_get_maxdata(dev,subdev,CR_CHAN(chanspec));
|
||||
sv->rng=comedi_get_range(dev,subdev,
|
||||
CR_CHAN(chanspec), CR_RANGE(chanspec));
|
||||
|
||||
sv->order=7;
|
||||
|
||||
|
@ -818,16 +814,15 @@ int new_sv_measure( comedi_t *dev, new_sv_t *sv)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
ret = comedi_data_read_hint(dev, sv->subd, sv->chan | sv->cr_flags, sv->range,
|
||||
sv->aref);
|
||||
ret = comedi_data_read_hint(dev, sv->subd, sv->chanspec, 0, 0);
|
||||
if(ret<0){
|
||||
printf("hint barf\n");
|
||||
goto out;
|
||||
}
|
||||
usleep( 1000 );
|
||||
comedi_nanodelay(dev, 1000*99);
|
||||
//usleep( 1000 );
|
||||
|
||||
ret = comedi_data_read_n(dev, sv->subd, sv->chan | sv->cr_flags, sv->range,
|
||||
sv->aref, data, n);
|
||||
ret = comedi_data_read_n(dev, sv->subd, sv->chanspec, 0, 0, data, n);
|
||||
if(ret<0){
|
||||
printf("barf\n");
|
||||
goto out;
|
||||
|
@ -868,8 +863,7 @@ int new_sv_measure_order( comedi_t *dev, new_sv_t *sv,int order)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
ret = comedi_data_read_n(dev, sv->subd, sv->chan | sv->cr_flags, sv->range,
|
||||
sv->aref, data, n);
|
||||
ret = comedi_data_read_n(dev, sv->subd, sv->chanspec, 0, 0, data, n);
|
||||
if(ret<0){
|
||||
printf("barf order\n");
|
||||
goto out;
|
||||
|
@ -1051,3 +1045,4 @@ int sci_sprint_alt(char *s,double x,double y)
|
|||
return sprintf(s,"%0.*f(%2.0f)e%d",sigfigs-1,mantissa,error,maxsig);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -143,6 +143,7 @@ int ni_setup_board( calibration_setup_t *setup, const char *device_name )
|
|||
void ni_setup_observables( calibration_setup_t *setup )
|
||||
{
|
||||
comedi_insn tmpl;
|
||||
comedi_insn po_tmpl2;
|
||||
int bipolar_lowgain;
|
||||
int bipolar_highgain;
|
||||
int unipolar_lowgain;
|
||||
|
@ -160,11 +161,20 @@ void ni_setup_observables( calibration_setup_t *setup )
|
|||
tmpl.n = 1;
|
||||
tmpl.subdev = ad_subdev;
|
||||
|
||||
memset(&po_tmpl2,0,sizeof(tmpl));
|
||||
po_tmpl2.insn = INSN_CONFIG;
|
||||
po_tmpl2.n = 2;
|
||||
po_tmpl2.subdev = ad_subdev;
|
||||
|
||||
/* 0 offset, low gain */
|
||||
o = setup->observables + ni_zero_offset_low;
|
||||
o->name = "ai, bipolar zero offset, low gain";
|
||||
o->preobserve_insn = po_tmpl2;
|
||||
o->preobserve_insn.data = o->preobserve_data;
|
||||
o->preobserve_insn.data[0] = INSN_CONFIG_ALT_SOURCE;
|
||||
o->preobserve_insn.data[1] = CR_PACK(0,0,0);
|
||||
o->observe_insn = tmpl;
|
||||
o->observe_insn.chanspec = CR_PACK(0,bipolar_lowgain,AREF_OTHER);
|
||||
o->observe_insn.chanspec = CR_ALT_SOURCE;
|
||||
o->target = 0;
|
||||
|
||||
/* 0 offset, high gain */
|
||||
|
@ -231,7 +241,7 @@ void ni_setup_observables( calibration_setup_t *setup )
|
|||
o->preobserve_insn.chanspec = CR_PACK(0,0,0);
|
||||
o->preobserve_insn.data = o->preobserve_data;
|
||||
o->observe_insn = tmpl;
|
||||
o->observe_insn.chanspec =
|
||||
o->observe_insn.chanspec =
|
||||
CR_PACK(6,bipolar_lowgain,AREF_OTHER);
|
||||
set_target( setup, ni_ao0_reference,5.0);
|
||||
o->target -= voltage_reference;
|
||||
|
|
36
comedi_calibrate/other.c
Normal file
36
comedi_calibrate/other.c
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
comedi_calibrate/other.c - functions that might move to the library
|
||||
Copyright (C) 2002 David A. Schleef <ds@schleef.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
#include <comedilib.h>
|
||||
|
||||
|
||||
/* Note that this silently fails if delay >= 100000 */
|
||||
|
||||
void comedi_nanodelay(comedi_t *dev, unsigned int delay)
|
||||
{
|
||||
comedi_insn insn;
|
||||
|
||||
memset(&insn, 0, sizeof(insn));
|
||||
insn.insn = INSN_WAIT;
|
||||
insn.n = 1;
|
||||
insn.data = &delay;
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Reference in a new issue