43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
#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
|