helper function for generating unipolar targets that are close but not zero.
int get_bipolar_highgain(comedi_t *dev,int subdev);
int get_unipolar_lowgain(comedi_t *dev,int subdev);
int get_unipolar_highgain(comedi_t *dev,int subdev);
+double very_low_target( comedi_t *dev, unsigned int subdevice,
+ unsigned int channel, unsigned int range );
+int is_bipolar( comedi_t *dev, unsigned int subdevice,
+ unsigned int channel, unsigned int range );
+int is_unipolar( comedi_t *dev, unsigned int subdevice,
+ unsigned int channel, unsigned int range );
/* other */
}
static double ai_low_target_1xxx( calibration_setup_t *setup,
- unsigned int range_index )
+ unsigned int range )
{
- comedi_range *range;
- int max_data;
-
- range = comedi_get_range( setup->dev, setup->ad_subdev, 0, range_index );
- assert( range != NULL );
- max_data = comedi_get_maxdata( setup->dev, setup->ad_subdev, 0 );
- assert( max_data != 0 );
-
- if( range->min < -0.0001 )
+ if( is_bipolar( setup->dev, setup->ad_subdev, 0, range ) )
return 0.0;
- else // return half a bit above zero for unipolar ranges
- return comedi_to_phys( 1, range, max_data ) / 2.0;
+ else
+ return very_low_target( setup->dev, setup->ad_subdev, 0, range );
}
static int source_eeprom_addr_1xxx( calibration_setup_t *setup, unsigned int range_index )
/* helpers */
+int is_unipolar( comedi_t *dev, unsigned int subdevice,
+ unsigned int channel, unsigned int range )
+{
+ comedi_range *range_ptr;
+
+ range_ptr = comedi_get_range( dev, subdevice, channel, range );
+ assert( range_ptr != NULL );
+ /* This method is better than a direct test, which might fail */
+ if( fabs( range_ptr->min ) < fabs( range_ptr->max * 0.001 ) )
+ return 1;
+ else
+ return 0;
+}
+
+int is_bipolar( comedi_t *dev, unsigned int subdevice,
+ unsigned int channel, unsigned int range )
+{
+ comedi_range *range_ptr;
+
+ range_ptr = comedi_get_range( dev, subdevice, channel, range );
+ assert( range_ptr != NULL );
+ /* This method is better than a direct test, which might fail */
+ if( fabs( range_ptr->max + range_ptr->min ) < fabs( range_ptr->max * 0.001 ) )
+ return 1;
+ else
+ return 0;
+}
+
int get_bipolar_lowgain(comedi_t *dev,int subdev)
{
int ret = -1;
for(i=0;i<n_ranges;i++){
range = comedi_get_range(dev,subdev,0,i);
- /* This method is better than a direct test, which might fail */
- if((range->min+range->max)>(range->max*0.0001))continue;
+ if( is_bipolar( dev, subdev, 0, i ) == 0 ) continue;
if(range->max>max){
ret = i;
max=range->max;
for(i=0;i<n_ranges;i++){
range = comedi_get_range(dev,subdev,0,i);
/* This method is better than a direct test, which might fail */
- if((range->min+range->max)>(range->max*0.0001))continue;
+ if( is_unipolar( dev, subdev, 0, i ) == 0 ) continue;
if(range->max<min){
ret = i;
min=range->max;
return sprintf(s,"%0.*f(%2.0f)e%d",sigfigs-1,mantissa,error,maxsig);
}
+double very_low_target( comedi_t *dev, unsigned int subdevice,
+ unsigned int channel, unsigned int range )
+{
+ comedi_range *range_ptr;
+ int max_data;
+
+ range_ptr = comedi_get_range( dev, subdevice, channel, range );
+ assert( range_ptr != NULL );
+ max_data = comedi_get_maxdata( dev, subdevice, 0 );
+ assert( max_data > 0 );
+
+ return comedi_to_phys( 1, range_ptr, max_data ) / 2.0;
+}
{ "DAQCard-ai-16e-4", STATUS_DONE, cal_ni_daqcard_ai_16e_4, ni_setup_observables, 0x1b5, 0x1b6 },
{ "pci-6110", STATUS_DONE, cal_ni_pci_611x, ni_setup_observables_611x, 0x1d4, 0x1d5 },
{ "pci-6111", STATUS_DONE, cal_ni_pci_611x, ni_setup_observables_611x, 0x1d4, 0x1d5 },
- { "DAQCard-6062E", STATUS_SOME, cal_ni_daqcard_6062e, ni_setup_observables, 0x1a9, 0x1aa },
+ { "DAQCard-6062E", STATUS_DONE, cal_ni_daqcard_6062e, ni_setup_observables, 0x1a9, 0x1aa },
{ "DAQCard-6024E", STATUS_UNKNOWN, NULL, ni_setup_observables, -1, -1 },
{ "at-mio-16de-10", STATUS_UNKNOWN, NULL, ni_setup_observables, 0x1a7, 0x1a8 },
{ "at-mio-16xe-10", STATUS_UNKNOWN, NULL, ni_setup_observables, 0x1b7, 0x1b8 },
o->target = voltage_reference;
if(unipolar_lowgain>=0){
- comedi_range *range;
- int max_data;
-
- range = comedi_get_range( setup->dev, setup->ad_subdev, 0, unipolar_lowgain );
- assert( range != NULL );
- max_data = comedi_get_maxdata( setup->dev, setup->ad_subdev, 0 );
- assert( max_data > 0 );
-
o = setup->observables + ni_unip_zero_offset_low;
o->name = "ai, unipolar zero offset, low gain";
o->observe_insn = tmpl;
CR_PACK(REF_GND_GND,unipolar_lowgain,AREF_OTHER)
| CR_ALT_SOURCE | CR_ALT_FILTER;
o->reference_source = REF_GND_GND;
- o->target = comedi_to_phys( 1, range, max_data ) / 2.0;
+ o->target = very_low_target( setup->dev, setup->ad_subdev, 0, unipolar_lowgain );
o = setup->observables + ni_unip_reference_low;
o->name = "ai, unipolar voltage reference, low gain";
if(unipolar_highgain >= 0)
{
- comedi_range *range;
- int max_data;
-
- range = comedi_get_range( setup->dev, setup->ad_subdev, 0, unipolar_highgain );
- assert( range != NULL );
- max_data = comedi_get_maxdata( setup->dev, setup->ad_subdev, 0 );
- assert( max_data > 0 );
-
o = setup->observables + ni_unip_zero_offset_high;
o->name = "ai, unipolar zero offset, high gain";
o->observe_insn = tmpl;
CR_PACK(REF_GND_GND,unipolar_highgain,AREF_OTHER)
| CR_ALT_SOURCE | CR_ALT_FILTER;
o->reference_source = REF_GND_GND;
- o->target = comedi_to_phys( 1, range, max_data ) / 2.0;
+ o->target = very_low_target( setup->dev, setup->ad_subdev, 0, unipolar_highgain );
}
if(setup->da_subdev>=0){