1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 12:25:20 +03:00

Configurable ADC

This commit is contained in:
jflyper 2017-08-20 00:53:03 +09:00
parent bad2b7a949
commit 7a57468c8c
13 changed files with 231 additions and 154 deletions

View file

@ -34,60 +34,63 @@
#include "adc.h"
#include "adc_impl.h"
#ifndef ADC_INSTANCE
#define ADC_INSTANCE ADC1
#endif
#ifndef ADC1_DMA_STREAM
#define ADC1_DMA_STREAM DMA2_Stream4
#endif
const adcDevice_t adcHardware[] = {
{ .ADCx = ADC1, .rccADC = RCC_APB2(ADC1), .DMAy_Streamx = ADC1_DMA_STREAM, .channel = DMA_Channel_0 },
//{ .ADCx = ADC2, .rccADC = RCC_APB2(ADC2), .DMAy_Streamx = DMA2_Stream1, .channel = DMA_Channel_0 }
#if !defined(STM32F411xE)
{ .ADCx = ADC2, .rccADC = RCC_APB2(ADC2), .DMAy_Streamx = ADC2_DMA_STREAM, .channel = DMA_Channel_1 },
{ .ADCx = ADC3, .rccADC = RCC_APB2(ADC3), .DMAy_Streamx = ADC3_DMA_STREAM, .channel = DMA_Channel_2 }
#endif
};
/* note these could be packed up for saving space */
const adcTagMap_t adcTagMap[] = {
/*
{ DEFIO_TAG_E__PF3, ADC_Channel_9 },
{ DEFIO_TAG_E__PF4, ADC_Channel_14 },
{ DEFIO_TAG_E__PF5, ADC_Channel_15 },
{ DEFIO_TAG_E__PF6, ADC_Channel_4 },
{ DEFIO_TAG_E__PF7, ADC_Channel_5 },
{ DEFIO_TAG_E__PF8, ADC_Channel_6 },
{ DEFIO_TAG_E__PF9, ADC_Channel_7 },
{ DEFIO_TAG_E__PF10, ADC_Channel_8 },
{ DEFIO_TAG_E__PF3, ADC_DEVICES_3, ADC_Channel_9 },
{ DEFIO_TAG_E__PF4, ADC_DEVICES_3, ADC_Channel_14 },
{ DEFIO_TAG_E__PF5, ADC_DEVICES_3, ADC_Channel_15 },
{ DEFIO_TAG_E__PF6, ADC_DEVICES_3, ADC_Channel_4 },
{ DEFIO_TAG_E__PF7, ADC_DEVICES_3, ADC_Channel_5 },
{ DEFIO_TAG_E__PF8, ADC_DEVICES_3, ADC_Channel_6 },
{ DEFIO_TAG_E__PF9, ADC_DEVICES_3, ADC_Channel_7 },
{ DEFIO_TAG_E__PF10,ADC_DEVICES_3, ADC_Channel_8 },
*/
{ DEFIO_TAG_E__PC0, ADC_Channel_10 },
{ DEFIO_TAG_E__PC1, ADC_Channel_11 },
{ DEFIO_TAG_E__PC2, ADC_Channel_12 },
{ DEFIO_TAG_E__PC3, ADC_Channel_13 },
{ DEFIO_TAG_E__PC4, ADC_Channel_14 },
{ DEFIO_TAG_E__PC5, ADC_Channel_15 },
{ DEFIO_TAG_E__PB0, ADC_Channel_8 },
{ DEFIO_TAG_E__PB1, ADC_Channel_9 },
{ DEFIO_TAG_E__PA0, ADC_Channel_0 },
{ DEFIO_TAG_E__PA1, ADC_Channel_1 },
{ DEFIO_TAG_E__PA2, ADC_Channel_2 },
{ DEFIO_TAG_E__PA3, ADC_Channel_3 },
{ DEFIO_TAG_E__PA4, ADC_Channel_4 },
{ DEFIO_TAG_E__PA5, ADC_Channel_5 },
{ DEFIO_TAG_E__PA6, ADC_Channel_6 },
{ DEFIO_TAG_E__PA7, ADC_Channel_7 },
#if defined(STM32F411xE)
{ DEFIO_TAG_E__PC0, ADC_DEVICES_1, ADC_Channel_10 },
{ DEFIO_TAG_E__PC1, ADC_DEVICES_1, ADC_Channel_11 },
{ DEFIO_TAG_E__PC2, ADC_DEVICES_1, ADC_Channel_12 },
{ DEFIO_TAG_E__PC3, ADC_DEVICES_1, ADC_Channel_13 },
{ DEFIO_TAG_E__PC4, ADC_DEVICES_1, ADC_Channel_14 },
{ DEFIO_TAG_E__PC5, ADC_DEVICES_1, ADC_Channel_15 },
{ DEFIO_TAG_E__PB0, ADC_DEVICES_1, ADC_Channel_8 },
{ DEFIO_TAG_E__PB1, ADC_DEVICES_1, ADC_Channel_9 },
{ DEFIO_TAG_E__PA0, ADC_DEVICES_1, ADC_Channel_0 },
{ DEFIO_TAG_E__PA1, ADC_DEVICES_1, ADC_Channel_1 },
{ DEFIO_TAG_E__PA2, ADC_DEVICES_1, ADC_Channel_2 },
{ DEFIO_TAG_E__PA3, ADC_DEVICES_1, ADC_Channel_3 },
{ DEFIO_TAG_E__PA4, ADC_DEVICES_1, ADC_Channel_4 },
{ DEFIO_TAG_E__PA5, ADC_DEVICES_1, ADC_Channel_5 },
{ DEFIO_TAG_E__PA6, ADC_DEVICES_1, ADC_Channel_6 },
{ DEFIO_TAG_E__PA7, ADC_DEVICES_1, ADC_Channel_7 },
#else
{ DEFIO_TAG_E__PC0, ADC_DEVICES_123, ADC_Channel_10 },
{ DEFIO_TAG_E__PC1, ADC_DEVICES_123, ADC_Channel_11 },
{ DEFIO_TAG_E__PC2, ADC_DEVICES_123, ADC_Channel_12 },
{ DEFIO_TAG_E__PC3, ADC_DEVICES_123, ADC_Channel_13 },
{ DEFIO_TAG_E__PC4, ADC_DEVICES_12, ADC_Channel_14 },
{ DEFIO_TAG_E__PC5, ADC_DEVICES_12, ADC_Channel_15 },
{ DEFIO_TAG_E__PB0, ADC_DEVICES_12, ADC_Channel_8 },
{ DEFIO_TAG_E__PB1, ADC_DEVICES_12, ADC_Channel_9 },
{ DEFIO_TAG_E__PA0, ADC_DEVICES_123, ADC_Channel_0 },
{ DEFIO_TAG_E__PA1, ADC_DEVICES_123, ADC_Channel_1 },
{ DEFIO_TAG_E__PA2, ADC_DEVICES_123, ADC_Channel_2 },
{ DEFIO_TAG_E__PA3, ADC_DEVICES_123, ADC_Channel_3 },
{ DEFIO_TAG_E__PA4, ADC_DEVICES_12, ADC_Channel_4 },
{ DEFIO_TAG_E__PA5, ADC_DEVICES_12, ADC_Channel_5 },
{ DEFIO_TAG_E__PA6, ADC_DEVICES_12, ADC_Channel_6 },
{ DEFIO_TAG_E__PA7, ADC_DEVICES_12, ADC_Channel_7 },
#endif
};
ADCDevice adcDeviceByInstance(ADC_TypeDef *instance)
{
if (instance == ADC1)
return ADCDEV_1;
/*
if (instance == ADC2) // TODO add ADC2 and 3
return ADCDEV_2;
*/
return ADCINVALID;
}
void adcInit(const adcConfig_t *config)
{
ADC_InitTypeDef ADC_InitStructure;
@ -114,7 +117,7 @@ void adcInit(const adcConfig_t *config)
adcOperatingConfig[ADC_CURRENT].tag = config->current.ioTag; //CURRENT_METER_ADC_CHANNEL;
}
ADCDevice device = adcDeviceByInstance(ADC_INSTANCE);
ADCDevice device = ADC_CFG_TO_DEV(config->device);
if (device == ADCINVALID)
return;
@ -122,8 +125,9 @@ void adcInit(const adcConfig_t *config)
bool adcActive = false;
for (int i = 0; i < ADC_CHANNEL_COUNT; i++) {
if (!adcOperatingConfig[i].tag)
if (!adcVerifyPin(adcOperatingConfig[i].tag, device)) {
continue;
}
adcActive = true;
IOInit(IOGetByTag(adcOperatingConfig[i].tag), OWNER_ADC_BATT + i, 0);