From e22777159bd06885c0eb9b8535f693ba1a6d14c4 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Thu, 1 Mar 2001 21:54:08 +0000 Subject: [PATCH] fixes for DAQCard-AI-16XE-50 and new pci-6023e better dumping support better statistics --- comedi_calibrate/comedi_calibrate.c | 128 +++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 23 deletions(-) diff --git a/comedi_calibrate/comedi_calibrate.c b/comedi_calibrate/comedi_calibrate.c index bd1516e..beb3910 100644 --- a/comedi_calibrate/comedi_calibrate.c +++ b/comedi_calibrate/comedi_calibrate.c @@ -20,6 +20,8 @@ - more portable */ +#define _GNU_SOURCE + #include #include #include @@ -57,7 +59,7 @@ void write_caldac(comedi_t *dev,int subdev,int addr,int val); void check_gain(int ad_chan,int range); double check_gain_chan(int ad_chan,int range,int cdac); -int dump_flag; +int dump_flag = 1; void update_caldac(int i); @@ -86,6 +88,8 @@ typedef struct { /* stats */ double s1,sx,sy,sxy,sxx; + double min,max; + /* results */ double ave_x; double ave_y; @@ -190,6 +194,8 @@ void cal_ni_mio_E(void) boardname=comedi_get_board_name(dev); + reset_caldacs(); + if(!strcmp(boardname,"at-mio-16e-1") || !strcmp(boardname,"at-mio-16e-2") || !strcmp(boardname,"at-mio-64e-3") || @@ -294,7 +300,7 @@ void cal_ni_mio_E(void) } if(!strcmp(boardname,"pci-mio-16xe-10")){ /* - * results of channel dependence test: + * results of channel dependency test: * * [0] [1] [2] [3] [8] * offset, lo 1.9e-4* 2.2e-6 2.4e-7 @@ -353,7 +359,7 @@ void cal_ni_mio_E(void) } if(!strcmp(boardname,"DAQCard-ai-16xe-50")){ /* - * results of channel dependence test: + * results of channel dependency test: * * [0] [1] [2] [3] [8] * offset, lo -2.2e-6 1.5e-4* 2.5e-7 @@ -386,19 +392,19 @@ void cal_ni_mio_E(void) reset_caldacs(); printf("postgain offset\n"); - ni_mio_ai_postgain_cal_2(0,2,0,7,200.0); + ni_mio_ai_postgain_cal_2(0,2,0,3,100.0); printf("pregain offset\n"); - chan_cal(0,8,7,0.0); - chan_cal(0,8,7,0.0); + chan_cal(0,8,3,0.0); + chan_cal(0,8,3,0.0); printf("unipolar offset\n"); - chan_cal(0,0,8,0.0); - chan_cal(0,0,8,0.0); + chan_cal(0,0,4,0.0); + chan_cal(0,0,4,0.0); printf("gain offset\n"); - chan_cal(5,1,0,5.0); - chan_cal(5,1,0,5.0); + chan_cal(5,1,0,ref); + chan_cal(5,1,0,ref); printf("results (offset)\n"); for(i=0;i<16;i++){ @@ -409,7 +415,7 @@ void cal_ni_mio_E(void) } if(!strcmp(boardname,"pci-mio-16xe-50")){ /* - * results of channel dependence test: + * results of channel dependency test: * * [0] [1] [2] [3] [8] * offset, lo 1.6e-5 2.0e-7 @@ -466,8 +472,69 @@ void cal_ni_mio_E(void) return; } + if(!strcmp(boardname,"pci-6023e")){ +/* + * results of channel dependency test: + * + * [0] [1] [3] [10] + * offset, lo -2.8e-9 -7.6e-4 + * offset, hi -2.0e-6 -3.8e-6 -1.4e-6 + * offset, unip 1.0e-1* + * ref -7.6e-7 -7.6e-4 -5.6e-4 -6.2e-8 + * ref2 -6.3e-8 -7.5e-4 -5.6e-4 -1.5e-8 + * + * 0 is pregain offset + * 1 is postgain offset + * 3 is gain + * + * layout + * + * 0 AI pregain offset -2.0e-6 + * 1 AI postgain offset -7.6e-4 + * 2 unknown + * 3 AI gain -5.6e-4 + * 4 AO + * 5 AO + * 6 AO + * 7 AO + * 8 unknown + * 9 unknown + * 10 AI ? + * 11 unknown + */ + int offset_ad = 0; + int unipolar_offset_ad = 1; + int gain_ad = 5; + int pregain_offset_dac = 0; + int postgain_offset_dac = 1; + int gain_dac = 3; + + printf("last factory calibration %02d/%02d/%02d\n", + read_eeprom(508),read_eeprom(507),read_eeprom(506)); + + ref=ni_get_reference(444,443); + + reset_caldacs(); + + printf("postgain offset\n"); + ni_mio_ai_postgain_cal_2(offset_ad,postgain_offset_dac,0,3,200.0); + + printf("pregain offset\n"); + chan_cal(offset_ad,pregain_offset_dac,3,0.0); + chan_cal(offset_ad,pregain_offset_dac,3,0.0); + + printf("gain offset\n"); + chan_cal(gain_ad,gain_dac,0,5.0); + chan_cal(gain_ad,gain_dac,0,5.0); + + printf("results (offset)\n"); + for(i=0;i<16;i++){ + read_chan(0,i); + } + + //return; + } -#if 0 { int n_ranges; @@ -494,12 +561,11 @@ void cal_ni_mio_E(void) channel_dependence(5,0); } -#endif #if 0 { int n_ranges; - printf("please send this output to \n"); + printf("please send this output to \n"); printf("%s\n",comedi_get_board_name(dev)); n_ranges=comedi_get_n_ranges(dev,ad_subdev,0); @@ -710,20 +776,22 @@ double check_gain_chan_x(linear_fit_t *l,int ad_chan,int range,int cdac) n=caldacs[cdac].maxdata+1; memset(l,0,sizeof(*l)); - l->y_data=malloc(n*sizeof(double)); - - orig=caldacs[cdac].current; - - new_sv_init(&sv,dev,0,ad_chan,range,AREF_OTHER); step=n/256; if(step<1)step=1; l->n=0; + l->y_data=malloc(n*sizeof(double)/step); + + orig=caldacs[cdac].current; + + new_sv_init(&sv,dev,0,ad_chan,range,AREF_OTHER); + caldacs[cdac].current=0; update_caldac(cdac); new_sv_measure(&sv); + usleep(100000); sum_err=0; for(i=0;i*stepslope,l->err_slope,l->S_min,l->dof); + printf("caldac[%d] gain=%g V/bit err=%g S_min=%g dof=%g min=%g max=%g\n", + cdac,l->slope,l->err_slope,l->S_min,l->dof,l->min,l->max); //printf("--> %g\n",fabs(l.slope/l.err_slope)); if(dump_flag){ - for(i=0;iy_data[i]); + static int dump_number=0; + double x,y; + + printf("start dump %d\n",dump_number); + for(i=0;in;i++){ + x=l->x0+i*l->dx-l->ave_x; + y=l->y_data[i]; + printf("D%d: %d %g %g %g\n",dump_number,i,y, + l->ave_y+l->slope*x, + l->ave_y+l->slope*x-y); } + printf("end dump\n"); + dump_number++; } @@ -924,6 +1002,8 @@ int linear_fit_monotonic(linear_fit_t *l) double sxp; int i; + l->min=INFINITY; + l->max=-INFINITY; l->s1=0; l->sx=0; l->sy=0; @@ -935,6 +1015,8 @@ int linear_fit_monotonic(linear_fit_t *l) if(isnan(y))continue; + if(l->y_data[i]min)l->min=l->y_data[i]; + if(l->y_data[i]>l->max)l->max=l->y_data[i]; l->s1+=1; l->sx+=x; l->sy+=y;