Merge pull request #7058 from jflyper/bfdev-configurable-internal-ADC-sensor-calibration-values
[ADC] Configurable ADC internal sensor calibration values
This commit is contained in:
commit
b776bf3a9e
|
@ -44,7 +44,7 @@ volatile uint16_t adcValues[ADC_CHANNEL_COUNT];
|
||||||
#ifdef USE_ADC_INTERNAL
|
#ifdef USE_ADC_INTERNAL
|
||||||
uint16_t adcTSCAL1;
|
uint16_t adcTSCAL1;
|
||||||
uint16_t adcTSCAL2;
|
uint16_t adcTSCAL2;
|
||||||
uint16_t adcTSSlopeK;
|
int16_t adcTSSlopeK;
|
||||||
uint16_t adcVREFINTCAL;
|
uint16_t adcVREFINTCAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ uint16_t adcGetChannel(uint8_t channel);
|
||||||
extern uint16_t adcVREFINTCAL;
|
extern uint16_t adcVREFINTCAL;
|
||||||
extern uint16_t adcTSCAL1;
|
extern uint16_t adcTSCAL1;
|
||||||
extern uint16_t adcTSCAL2;
|
extern uint16_t adcTSCAL2;
|
||||||
extern uint16_t adcTSSlopeK;
|
extern int16_t adcTSSlopeK;
|
||||||
|
|
||||||
bool adcInternalIsBusy(void);
|
bool adcInternalIsBusy(void);
|
||||||
void adcInternalStartConversion(void);
|
void adcInternalStartConversion(void);
|
||||||
|
|
|
@ -133,7 +133,7 @@ void adcInitDevice(ADC_TypeDef *adcdev, int channelCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_ADC_INTERNAL
|
#ifdef USE_ADC_INTERNAL
|
||||||
void adcInitInternalInjected(void)
|
void adcInitInternalInjected(const adcConfig_t *config)
|
||||||
{
|
{
|
||||||
ADC_TempSensorVrefintCmd(ENABLE);
|
ADC_TempSensorVrefintCmd(ENABLE);
|
||||||
ADC_InjectedDiscModeCmd(ADC1, DISABLE);
|
ADC_InjectedDiscModeCmd(ADC1, DISABLE);
|
||||||
|
@ -141,9 +141,10 @@ void adcInitInternalInjected(void)
|
||||||
ADC_InjectedChannelConfig(ADC1, ADC_Channel_Vrefint, 1, ADC_SampleTime_480Cycles);
|
ADC_InjectedChannelConfig(ADC1, ADC_Channel_Vrefint, 1, ADC_SampleTime_480Cycles);
|
||||||
ADC_InjectedChannelConfig(ADC1, ADC_Channel_TempSensor, 2, ADC_SampleTime_480Cycles);
|
ADC_InjectedChannelConfig(ADC1, ADC_Channel_TempSensor, 2, ADC_SampleTime_480Cycles);
|
||||||
|
|
||||||
adcVREFINTCAL = *(uint16_t *)VREFINT_CAL_ADDR;
|
adcVREFINTCAL = config->vrefIntCalibration ? config->vrefIntCalibration : *(uint16_t *)VREFINT_CAL_ADDR;
|
||||||
adcTSCAL1 = *(uint16_t *)TS_CAL1_ADDR;
|
adcTSCAL1 = config->tempSensorCalibration1 ? config->tempSensorCalibration1 : *(uint16_t *)TS_CAL1_ADDR;
|
||||||
adcTSCAL2 = *(uint16_t *)TS_CAL2_ADDR;
|
adcTSCAL2 = config->tempSensorCalibration2 ? config->tempSensorCalibration2 : *(uint16_t *)TS_CAL2_ADDR;
|
||||||
|
|
||||||
adcTSSlopeK = (110 - 30) * 1000 / (adcTSCAL2 - adcTSCAL1);
|
adcTSSlopeK = (110 - 30) * 1000 / (adcTSCAL2 - adcTSCAL1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,7 +259,7 @@ void adcInit(const adcConfig_t *config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize for injected conversion
|
// Initialize for injected conversion
|
||||||
adcInitInternalInjected();
|
adcInitInternalInjected(config);
|
||||||
|
|
||||||
if (!adcActive) {
|
if (!adcActive) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -646,6 +646,9 @@ const clivalue_t valueTable[] = {
|
||||||
// PG_ADC_CONFIG
|
// PG_ADC_CONFIG
|
||||||
#if defined(USE_ADC)
|
#if defined(USE_ADC)
|
||||||
{ "adc_device", VAR_INT8 | MASTER_VALUE, .config.minmax = { 0, ADCDEV_COUNT }, PG_ADC_CONFIG, offsetof(adcConfig_t, device) },
|
{ "adc_device", VAR_INT8 | MASTER_VALUE, .config.minmax = { 0, ADCDEV_COUNT }, PG_ADC_CONFIG, offsetof(adcConfig_t, device) },
|
||||||
|
{ "adc_vrefint_calibration", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, 2000 }, PG_ADC_CONFIG, offsetof(adcConfig_t, vrefIntCalibration) },
|
||||||
|
{ "adc_tempsensor_calibration30", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, 2000 }, PG_ADC_CONFIG, offsetof(adcConfig_t, tempSensorCalibration1) },
|
||||||
|
{ "adc_tempsensor_calibration110", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, 2000 }, PG_ADC_CONFIG, offsetof(adcConfig_t, tempSensorCalibration2) },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// PG_PWM_CONFIG
|
// PG_PWM_CONFIG
|
||||||
|
|
|
@ -60,5 +60,8 @@ void pgResetFn_adcConfig(adcConfig_t *adcConfig)
|
||||||
adcConfig->rssi.ioTag = IO_TAG(RSSI_ADC_PIN);
|
adcConfig->rssi.ioTag = IO_TAG(RSSI_ADC_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
adcConfig->vrefIntCalibration = 0;
|
||||||
|
adcConfig->tempSensorCalibration1 = 0;
|
||||||
|
adcConfig->tempSensorCalibration2 = 0;
|
||||||
}
|
}
|
||||||
#endif // USE_ADC
|
#endif // USE_ADC
|
||||||
|
|
|
@ -37,6 +37,10 @@ typedef struct adcConfig_s {
|
||||||
adcChannelConfig_t current;
|
adcChannelConfig_t current;
|
||||||
adcChannelConfig_t external1;
|
adcChannelConfig_t external1;
|
||||||
int8_t device; // ADCDevice
|
int8_t device; // ADCDevice
|
||||||
|
|
||||||
|
uint16_t vrefIntCalibration;
|
||||||
|
uint16_t tempSensorCalibration1;
|
||||||
|
uint16_t tempSensorCalibration2;
|
||||||
} adcConfig_t;
|
} adcConfig_t;
|
||||||
|
|
||||||
PG_DECLARE(adcConfig_t, adcConfig);
|
PG_DECLARE(adcConfig_t, adcConfig);
|
||||||
|
|
Loading…
Reference in New Issue