From 37bee1dcbcc404896bffe76e947fb810aeba2710 Mon Sep 17 00:00:00 2001 From: jflyper Date: Wed, 7 Nov 2018 17:39:01 +0900 Subject: [PATCH] Configurable ADC internal sensor calibration values There are MCUs without calibration values for VREFINT and temperature sensors. Also changed adcTSSlopeK to signed, to handle negative slope case. --- src/main/drivers/adc.c | 2 +- src/main/drivers/adc.h | 2 +- src/main/drivers/adc_stm32f4xx.c | 11 ++++++----- src/main/interface/settings.c | 3 +++ src/main/pg/adc.c | 3 +++ src/main/pg/adc.h | 4 ++++ 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/drivers/adc.c b/src/main/drivers/adc.c index f0035e8d6..d75489c8a 100644 --- a/src/main/drivers/adc.c +++ b/src/main/drivers/adc.c @@ -44,7 +44,7 @@ volatile uint16_t adcValues[ADC_CHANNEL_COUNT]; #ifdef USE_ADC_INTERNAL uint16_t adcTSCAL1; uint16_t adcTSCAL2; -uint16_t adcTSSlopeK; +int16_t adcTSSlopeK; uint16_t adcVREFINTCAL; #endif diff --git a/src/main/drivers/adc.h b/src/main/drivers/adc.h index befbd244e..860a0bff3 100644 --- a/src/main/drivers/adc.h +++ b/src/main/drivers/adc.h @@ -83,7 +83,7 @@ uint16_t adcGetChannel(uint8_t channel); extern uint16_t adcVREFINTCAL; extern uint16_t adcTSCAL1; extern uint16_t adcTSCAL2; -extern uint16_t adcTSSlopeK; +extern int16_t adcTSSlopeK; bool adcInternalIsBusy(void); void adcInternalStartConversion(void); diff --git a/src/main/drivers/adc_stm32f4xx.c b/src/main/drivers/adc_stm32f4xx.c index f3340f448..15af9b9be 100644 --- a/src/main/drivers/adc_stm32f4xx.c +++ b/src/main/drivers/adc_stm32f4xx.c @@ -133,7 +133,7 @@ void adcInitDevice(ADC_TypeDef *adcdev, int channelCount) } #ifdef USE_ADC_INTERNAL -void adcInitInternalInjected(void) +void adcInitInternalInjected(const adcConfig_t *config) { ADC_TempSensorVrefintCmd(ENABLE); 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_TempSensor, 2, ADC_SampleTime_480Cycles); - adcVREFINTCAL = *(uint16_t *)VREFINT_CAL_ADDR; - adcTSCAL1 = *(uint16_t *)TS_CAL1_ADDR; - adcTSCAL2 = *(uint16_t *)TS_CAL2_ADDR; + adcVREFINTCAL = config->vrefIntCalibration ? config->vrefIntCalibration : *(uint16_t *)VREFINT_CAL_ADDR; + adcTSCAL1 = config->tempSensorCalibration1 ? config->tempSensorCalibration1 : *(uint16_t *)TS_CAL1_ADDR; + adcTSCAL2 = config->tempSensorCalibration2 ? config->tempSensorCalibration2 : *(uint16_t *)TS_CAL2_ADDR; + adcTSSlopeK = (110 - 30) * 1000 / (adcTSCAL2 - adcTSCAL1); } @@ -258,7 +259,7 @@ void adcInit(const adcConfig_t *config) } // Initialize for injected conversion - adcInitInternalInjected(); + adcInitInternalInjected(config); if (!adcActive) { return; diff --git a/src/main/interface/settings.c b/src/main/interface/settings.c index d692d9905..8da8d947c 100644 --- a/src/main/interface/settings.c +++ b/src/main/interface/settings.c @@ -646,6 +646,9 @@ const clivalue_t valueTable[] = { // PG_ADC_CONFIG #if defined(USE_ADC) { "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 // PG_PWM_CONFIG diff --git a/src/main/pg/adc.c b/src/main/pg/adc.c index ab6276288..493929b9e 100644 --- a/src/main/pg/adc.c +++ b/src/main/pg/adc.c @@ -60,5 +60,8 @@ void pgResetFn_adcConfig(adcConfig_t *adcConfig) adcConfig->rssi.ioTag = IO_TAG(RSSI_ADC_PIN); #endif + adcConfig->vrefIntCalibration = 0; + adcConfig->tempSensorCalibration1 = 0; + adcConfig->tempSensorCalibration2 = 0; } #endif // USE_ADC diff --git a/src/main/pg/adc.h b/src/main/pg/adc.h index 7bdfdfe5f..5061959b5 100644 --- a/src/main/pg/adc.h +++ b/src/main/pg/adc.h @@ -37,6 +37,10 @@ typedef struct adcConfig_s { adcChannelConfig_t current; adcChannelConfig_t external1; int8_t device; // ADCDevice + + uint16_t vrefIntCalibration; + uint16_t tempSensorCalibration1; + uint16_t tempSensorCalibration2; } adcConfig_t; PG_DECLARE(adcConfig_t, adcConfig);