c = getopt_long(argc, argv, "f:vq", options, &index);
if (c == -1)break;
switch (c) {
+ case 0:
+ continue;
case 'f':
fn = optarg;
break;
devicename = optarg;
break;
default:
- printf("bad option\n");
+ printf("bad option %d\n",c);
exit(1);
}
}
if(device_status<STATUS_DONE){
printf("Warning: device not fully calibrated due to insufficient information\n");
printf("Please send this output to <ds@schleef.org>\n");
- if(verbose<0)verbose=0;
+ if(verbose<1)verbose=1;
if(device_status==STATUS_UNKNOWN){
do_reset=1;
do_dump=1;
preobserve(i);
DPRINT(0,"%s\n",observables[i].name);
measure_observable(i);
- observable_dependence(i);
+ if(verbose>=1){
+ observable_dependence(i);
+ }
}
}
n=new_sv_measure(&sv);
sci_sprint_alt(s,sv.average,sv.error);
- printf("offset %s, target %g\n",s,observables[obs].target);
+ DPRINT(0,"offset %s, target %g\n",s,observables[obs].target);
}
void observable_dependence(int obs)
double gain;
comedi_range *range1,*range2;
- DPRINT(0,"postgain calibration\n");
+ DPRINT(0,"postgain: %s; %s\n",observables[obs1].name,
+ observables[obs2].name);
preobserve(obs1);
check_gain_chan_x(&l,observables[obs1].observe_insn.chanspec,dac);
offset1=linear_fit_func_y(&l,caldacs[dac].current);
- DPRINT(1,"obs1: [%d] offset %g\n",obs1,offset1);
+ DPRINT(2,"obs1: [%d] offset %g\n",obs1,offset1);
range1 = comedi_get_range(dev,observables[obs1].observe_insn.subdev,
CR_CHAN(observables[obs1].observe_insn.chanspec),
CR_RANGE(observables[obs1].observe_insn.chanspec));
preobserve(obs2);
check_gain_chan_x(&l,observables[obs2].observe_insn.chanspec,dac);
offset2=linear_fit_func_y(&l,caldacs[dac].current);
- DPRINT(1,"obs2: [%d] offset %g\n",obs2,offset2);
+ DPRINT(2,"obs2: [%d] offset %g\n",obs2,offset2);
range2 = comedi_get_range(dev,observables[obs2].observe_insn.subdev,
CR_CHAN(observables[obs2].observe_insn.chanspec),
CR_RANGE(observables[obs2].observe_insn.chanspec));
slope2=l.slope;
gain = (range1->max-range1->min)/(range2->max-range2->min);
- DPRINT(3,"range1 %g range2 %g\n", range1->max-range1->min,
+ DPRINT(4,"range1 %g range2 %g\n", range1->max-range1->min,
range2->max-range2->min);
- DPRINT(2,"gain: %g\n",gain);
+ DPRINT(3,"gain: %g\n",gain);
- DPRINT(2,"difference: %g\n",offset2-offset1);
+ DPRINT(3,"difference: %g\n",offset2-offset1);
a = (offset1-offset2)/(slope1-slope2);
a=caldacs[dac].current-a;
void cal1(int obs, int dac)
{
linear_fit_t l;
- double offset;
- double target;
- double gain;
double a;
- DPRINT(0,"cal1\n");
+ DPRINT(0,"linear: %s\n",observables[obs].name);
preobserve(obs);
check_gain_chan_x(&l,observables[obs].observe_insn.chanspec,dac);
- offset=linear_fit_func_y(&l,caldacs[dac].current);
- gain=l.slope;
-
- target = observables[obs].target;
- a=caldacs[dac].current+(target-offset)/gain;
+ a=linear_fit_func_x(&l,observables[obs].target);
caldacs[dac].current=rint(a);
update_caldac(dac);
usleep(100000);
DPRINT(0,"caldac[%d] set to %g\n",dac,a);
- if(verbose>=2){
+ if(verbose>=3){
measure_observable(obs);
}
}
+#if 0
void chan_cal(int adc,int cdac,int range,double target)
{
linear_fit_t l;
update_caldac(cdac);
read_chan2(s,adc,range);
- DPRINT(0,"caldac[%d] set to %g, offset=%s\n",cdac,a,s);
+ DPRINT(1,"caldac[%d] set to %g, offset=%s\n",cdac,a,s);
}
+#endif
-
+#if 0
void channel_dependence(int adc,int range)
{
int i;
gain=check_gain_chan(adc,range,i);
}
}
+#endif
+#if 0
void caldac_dependence(int caldac)
{
int i;
gain=check_gain_chan(i,0,caldac);
}
}
+#endif
+#if 0
void dump_curve(int adc,int caldac)
{
linear_fit_t l;
check_gain_chan_x(&l,CR_PACK(adc,0,AREF_OTHER),caldac);
}
+#endif
void setup_caldacs(void)
{
int ret;
- DPRINT(3,"update %d %d %d\n",caldacs[i].subdev,caldacs[i].chan,caldacs[i].current);
+ DPRINT(4,"update %d %d %d\n",caldacs[i].subdev,caldacs[i].chan,caldacs[i].current);
if(caldacs[i].current<0){
- DPRINT(0,"caldac set out of range (%d<0)\n",caldacs[i].current);
+ DPRINT(1,"caldac set out of range (%d<0)\n",caldacs[i].current);
caldacs[i].current=0;
}
if(caldacs[i].current>caldacs[i].maxdata){
- DPRINT(0,"caldac set out of range (%d>%d)\n",
+ DPRINT(1,"caldac set out of range (%d>%d)\n",
caldacs[i].current,caldacs[i].maxdata);
caldacs[i].current=caldacs[i].maxdata;
}
if(ret<0)perror("update_caldac()");
}
-
+#if 0
void check_gain(int ad_chan,int range)
{
int i;
check_gain_chan(ad_chan,range,i);
}
}
+#endif
+#if 0
double check_gain_chan(int ad_chan,int range,int cdac)
{
linear_fit_t l;
return check_gain_chan_x(&l,CR_PACK(ad_chan,range,AREF_OTHER),cdac);
}
+#endif
double check_gain_chan_x(linear_fit_t *l,unsigned int ad_chanspec,int cdac)
{
linear_fit_monotonic(l);
- if(verbose>=1 || (verbose>=0 && fabs(l->slope/l->err_slope)>4.0)){
+ if(verbose>=2 || (verbose>=1 && fabs(l->slope/l->err_slope)>4.0)){
sci_sprint_alt(str,l->slope,l->err_slope);
printf("caldac[%d] gain=%s V/bit S_min=%g dof=%g\n",
cdac,str,l->S_min,l->dof);
//printf("--> %g\n",fabs(l.slope/l.err_slope));
}
- if(verbose>=2){
+ if(verbose>=3){
static int dump_number=0;
double x,y;
return sci_sprint_alt(s,sv.average,sv.error);
}
+#if 0
void set_ao(comedi_t *dev,int subdev,int chan,int range,double value)
{
comedi_range *r = comedi_get_range(dev,subdev,chan,range);
comedi_data_write(dev,subdev,chan,range,AREF_GROUND,data);
}
+#endif
int new_sv_init(new_sv_t *sv,comedi_t *dev,int subdev,int chan,int range,int aref)
return l->ave_y+l->slope*(x-l->ave_x);
}
+double linear_fit_func_x(linear_fit_t *l,double y)
+{
+ return l->ave_x+(y-l->ave_y)/l->slope;
+}
+
/* printing of scientific numbers (with errors) */
void ni_setup_board(void);
void ni_setup_observables(void);
-void cal_ni_16e_1(void);
+void cal_ni_at_mio_16e_2(void);
void cal_ni_daqcard_ai_16xe_50(void);
-void cal_ni_6035e(void);
-void cal_ni_6071e(void);
-void cal_ni_16e_10(void);
-void cal_ni_16xe_50(void);
+void cal_ni_at_mio_16e_1(void);
+void cal_ni_pci_mio_16e_1(void);
+void cal_ni_pci_6035e(void);
+void cal_ni_pci_6071e(void);
+void cal_ni_pxi_6071e(void);
+void cal_ni_at_mio_16e_10(void);
+void cal_ni_pci_mio_16xe_50(void);
+void cal_ni_pci_6023e(void);
struct board_struct boards[]={
- { "at-mio-16e-2", STATUS_DONE, cal_ni_16e_1 },
+ { "at-mio-16e-2", STATUS_SOME, cal_ni_at_mio_16e_2 },
{ "DAQCard-ai-16xe-50", STATUS_DONE, cal_ni_daqcard_ai_16xe_50 },
- { "at-mio-16e-1", STATUS_SOME, cal_ni_16e_1 },
- { "pci-mio-16e-1", STATUS_SOME, cal_ni_16e_1 },
- { "pci-6035e", STATUS_GUESS, cal_ni_6035e },
- { "pci-6071e", STATUS_GUESS, cal_ni_6071e },
- { "pxi-6071e", STATUS_GUESS, cal_ni_6071e },
- { "at-mio-16e-10", STATUS_GUESS, cal_ni_16e_10 },
- { "pci-mio-16xe-50", STATUS_GUESS, cal_ni_16xe_50 },
- { "pci-6023e", STATUS_GUESS, cal_ni_6035e },
+ { "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-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 },
#if 0
// { "at-mio-16de-10", cal_ni_unknown },
{ "at-mio-64e-3", cal_ni_16e_1 },
o->observe_insn.chanspec = CR_PACK(5,bipolar_lowgain,AREF_OTHER);
o->target = voltage_reference;
+ n_observables = ni_reference_low + 1;
+
if(unipolar_lowgain>=0){
/* unip/bip offset */
o = observables + ni_unip_offset_low;
o->target = voltage_reference;
i++;
#endif
+ n_observables = ni_unip_offset_low + 1;
}
if(da_subdev>=0){
set_target(ni_ao1_reference,5.0);
o->target -= voltage_reference;
+ n_observables = ni_ao1_reference + 1;
}
- n_observables = ni_ao1_reference + 1;
}
-void cal_ni_daqcard_ai_16xe_50(void)
+void cal_ni_at_mio_16e_2(void)
{
- // daqcard
- postgain_cal(ni_zero_offset_low,ni_zero_offset_high,2);
- cal1(ni_zero_offset_high,8);
- cal1(ni_reference_low,0);
-}
-
-void cal_ni_16e_1(void)
-{
- // 16e-2
postgain_cal(ni_zero_offset_low,ni_zero_offset_high,1);
cal1(ni_zero_offset_high,0);
cal1(ni_reference_low,3);
}
}
-void cal_ni_16e_10(void)
+/*
+ * Device name: DAQCard-ai-16xe-50
+ * Comedi version: 0.7.60
+ * ai, bipolar zero offset, low gain
+ * offset 5.87(63)e-3, target 0
+ * caldac[0] gain=-2.243(21)e-6 V/bit S_min=208.079 dof=254
+ * caldac[2] gain=1.56378(22)e-4 V/bit S_min=1782.91 dof=254
+ * caldac[8] gain=2.499(14)e-7 V/bit S_min=234.915 dof=254
+ * ai, bipolar zero offset, high gain
+ * offset 4.251(49)e-5, target 0
+ * caldac[0] gain=-2.396(30)e-8 V/bit S_min=231.387 dof=254
+ * caldac[2] gain=1.56428(28)e-6 V/bit S_min=829.096 dof=254
+ * caldac[8] gain=2.61244(18)e-7 V/bit S_min=773.092 dof=254
+ * ai, bipolar voltage reference, low gain
+ * offset 4.99650(81), target 5
+ * caldac[0] gain=-3.78250(23)e-4 V/bit S_min=12207.6 dof=254
+ * caldac[1] gain=-9.878(22)e-6 V/bit S_min=346.795 dof=254
+ * caldac[2] gain=1.57172(23)e-4 V/bit S_min=969.526 dof=254
+ * caldac[8] gain=2.795(14)e-7 V/bit S_min=245.703 dof=254
+ * ai, unipolar zero offset, low gain
+ * offset 0.0133(14), target 0
+ * caldac[0] gain=3.73923(29)e-4 V/bit S_min=2855.79 dof=151
+ * caldac[1] gain=9.784(11)e-6 V/bit S_min=727.295 dof=254
+ * caldac[2] gain=7.8670(11)e-5 V/bit S_min=903.291 dof=254
+ * caldac[8] gain=2.7732(74)e-7 V/bit S_min=415.399 dof=254
+ */
+void cal_ni_daqcard_ai_16xe_50(void)
{
- // 16e-10 (old)
+ postgain_cal(ni_zero_offset_low,ni_zero_offset_high,2);
+ cal1(ni_zero_offset_high,8);
+ cal1(ni_reference_low,0);
+}
+
+void cal_ni_at_mio_16e_1(void)
+{
+ cal_ni_at_mio_16e_2();
+}
+
+void cal_ni_pci_mio_16e_1(void)
+{
+ cal_ni_at_mio_16e_2();
+}
+
+void cal_ni_pci_6035e(void)
+{
+ // 6035e (old)
postgain_cal(ni_zero_offset_low,ni_zero_offset_high,1);
- cal1(ni_zero_offset_high,10);
cal1(ni_zero_offset_high,0);
cal1(ni_reference_low,3);
- cal1(ni_unip_offset_low,2);
if(do_output){
- cal1(ni_ao0_zero_offset,5); // guess
- cal1(ni_ao0_reference,6); // guess
- cal1(ni_ao0_zero_offset,8); // guess
- cal1(ni_ao0_reference,9); // guess
+ // unknown
}
}
-void cal_ni_16xe_50(void)
+void cal_ni_pci_6071e(void)
{
- // 16xe-50 (old) (same as daqcard?)
- postgain_cal(ni_zero_offset_low,ni_zero_offset_high,2);
- cal1(ni_zero_offset_high,8);
- cal1(ni_reference_low,0);
+ // 6071e (old)
+ 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){
// unknown
}
}
-void cal_ni_6035e(void)
+void cal_ni_pxi_6071e(void)
{
- // 6035e (old)
+ // 6071e (old)
postgain_cal(ni_zero_offset_low,ni_zero_offset_high,1);
cal1(ni_zero_offset_high,0);
cal1(ni_reference_low,3);
}
}
-void cal_ni_6071e(void)
+void cal_ni_at_mio_16e_10(void)
{
- // 6071e (old)
+ // 16e-10 (old)
postgain_cal(ni_zero_offset_low,ni_zero_offset_high,1);
+ cal1(ni_zero_offset_high,10);
cal1(ni_zero_offset_high,0);
cal1(ni_reference_low,3);
+ cal1(ni_unip_offset_low,2);
+ if(do_output){
+ cal1(ni_ao0_zero_offset,5); // guess
+ cal1(ni_ao0_reference,6); // guess
+ cal1(ni_ao0_zero_offset,8); // guess
+ cal1(ni_ao0_reference,9); // guess
+ }
+}
+
+void cal_ni_pci_mio_16xe_50(void)
+{
+ // 16xe-50 (old) (same as daqcard?)
+ postgain_cal(ni_zero_offset_low,ni_zero_offset_high,2);
+ cal1(ni_zero_offset_high,8);
+ cal1(ni_reference_low,0);
if(do_output){
// unknown
}
}
+void cal_ni_pci_6023e(void)
+{
+ cal_ni_pci_6035e();
+}
double ni_get_reference(int lsb_loc,int msb_loc)
{
return ref;
}
-void cal_ni_unknown(void)
-{
- comedi_range *range;
- int bipolar_lowgain;
- int bipolar_highgain;
- int unipolar_lowgain;
- int have_ao = 1;
-
- reset_caldacs();
- printf("Warning: device not calibrated due to insufficient information\n");
- printf("Please send this output to <ds@schleef.org>\n");
- printf("$Id$\n");
- printf("Device name: %s\n",comedi_get_board_name(dev));
- printf("Comedi version: %d.%d.%d\n",
- (comedi_get_version_code(dev)>>16)&0xff,
- (comedi_get_version_code(dev)>>8)&0xff,
- (comedi_get_version_code(dev))&0xff);
-
- bipolar_lowgain = get_bipolar_lowgain(dev,ad_subdev);
- bipolar_highgain = get_bipolar_highgain(dev,ad_subdev);
- unipolar_lowgain = get_unipolar_lowgain(dev,ad_subdev);
-
- /* 0 offset, low gain */
- range = comedi_get_range(dev,ad_subdev,0,bipolar_lowgain);
- DPRINT(0,"bipolar zero offset, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(0,bipolar_lowgain);
-
- /* 0 offset, high gain */
- range = comedi_get_range(dev,ad_subdev,0,bipolar_highgain);
- DPRINT(0,"bipolar zero offset, high gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(0,bipolar_highgain);
-
- /* unip/bip offset */
- range = comedi_get_range(dev,ad_subdev,0,unipolar_lowgain);
- DPRINT(0,"unipolar zero offset, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(0,unipolar_lowgain);
-
- /* voltage reference */
- range = comedi_get_range(dev,ad_subdev,0,bipolar_lowgain);
- DPRINT(0,"bipolar voltage reference, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(5,bipolar_lowgain);
-
- have_ao = (comedi_get_subdevice_type(dev,da_subdev)==COMEDI_SUBD_AO);
- if(have_ao){
- int ao_chan;
-
- /* ao 0, zero offset */
- ao_chan = 0;
- set_ao(dev,da_subdev,ao_chan,0,0.0);
- range = comedi_get_range(dev,ad_subdev,0,bipolar_lowgain);
- DPRINT(0,"ao 0, zero offset, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(2,bipolar_lowgain);
-
- /* ao 0, gain */
- ao_chan = 0;
- set_ao(dev,da_subdev,ao_chan,0,5.0);
- range = comedi_get_range(dev,ad_subdev,0,bipolar_lowgain);
- DPRINT(0,"ao 0, gain, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(6,bipolar_lowgain);
-
- /* ao 1, zero offset */
- ao_chan = 1;
- set_ao(dev,da_subdev,ao_chan,0,0.0);
- range = comedi_get_range(dev,ad_subdev,0,bipolar_lowgain);
- DPRINT(0,"ao 1, zero offset, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(3,bipolar_lowgain);
-
- /* ao 1, gain */
- ao_chan = 1;
- set_ao(dev,da_subdev,ao_chan,0,5.0);
- range = comedi_get_range(dev,ad_subdev,0,bipolar_lowgain);
- DPRINT(0,"ao 1, gain, low gain [%g,%g]\n",
- range->min,range->max);
- channel_dependence(7,bipolar_lowgain);
- }
-
- cal_ni_results();
-}
-
+#if 0
void cal_ni_results(void)
{
comedi_range *range;
}
-#if 0
void ni_mio_ai_postgain_cal(void)
{
linear_fit_t l;