#ifndef CALIBRATE_H #define CALIBRATE_H #define ADC_CLAMP_MIN 256 #define ADC_CLAMP_MAX 1792 #define OVERSAMPLE_COUNT 256 #define DAC_MIN DAC_LOW #define DAC_MAX DAC_HIGH #define SEEK_MAX_STEPS 1000 #define SEEK_FUZZ_ADC 100 #define SEEK_FUZZ_DAC (1+((DAC_RANGE * 5) / 65536)) #define CALIBRATE_ADC_ZERO 1024 #define CALIBRATE_ADC_LOW 512 #define CALIBRATE_ADC_HIGH 1536 /* Initialize. Assume some relatively-safe scaling if no calibration is run */ void calibrate_init(void); /* Given the current DAC and ADC values d1 and a1, compute a new DAC value d2 to give the desired ADC value a2 */ uint16_t adc_to_dac(uint16_t d1, int16_t a1, int16_t a2, float scale); /* Calculate a new scale factor given two DAC and ADC points */ float calculate_scale(uint16_t d1, float a1, uint16_t d2, float a2); /* Seek with the DAC to reach a specific ADC value, using current scaling as a starting point. */ uint16_t seek(uint16_t starting_dac, int16_t desired_adc); /* Perform calibration */ uint16_t do_calibrate(void); /* Oversample to get a nice ADC value */ float oversample(uint16_t dac); extern float g_scale; /* delta(DAC) / delta(ADC) */ #endif