Actualmente estoy intentando usar el modo de conversión continua en un solo canal del ADC de STM32F103RB (ADC1, Channel_10 en GPIOC pin0) como se describe here en la página 6.
Aquí está mi función de configuración para el ADC. Acabo de tomar la función de configuración para el modo de conversión única y la cambié por "ContinuousConvMode = ENABLE;"
void vHIL_ADC_Configuration(void)
{
int n;
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = PIN_ADC;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//ADC1 Config
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);
// Calibrate ADC before start
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
// Buffer init
for(n=0;n<CURRENT_BUFFER_LENGTH; n++)
{
f32_CurrentBuffer[n]=0.0 ;
}
}
¿Cómo puedo obtener el último valor de ADC sin usar DMA? (Ya que no puedo usar la misma función que el modo de conversión individual como se muestra a continuación)
void vHIL_ADC_readADC1(void)
{
int i ;
static int BufferCounter = 0 ;
static int CurrentBufferOldVal = 0 ;
static float f32_readCurrent = 0.0 ;
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);
// Start the conversion
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// Wait for EOC
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
// Get the conversion value
f32_readCurrent=(((5.0*(float)ADC_GetConversionValue(ADC1)/4096.0)));
if(BufferCounter < CURRENT_BUFFER_LENGTH)
{
f32_CurrentBuffer[BufferCounter]=f32_readCurrent ;
BufferCounter++ ;
f32_CurrentMean = 0.0 ;
for(i=0;i<BufferCounter;i++)
{
f32_CurrentMean += f32_CurrentBuffer[i] ;
}
f32_CurrentMean=f32_CurrentMean/BufferCounter ;
}
else
{
f32_CurrentMean=(f32_CurrentMean+(f32_readCurrent-f32_CurrentBuffer[CurrentBufferOldVal])/10.0) ;
f32_CurrentBuffer[CurrentBufferOldVal] = f32_readCurrent;
CurrentBufferOldVal++ ;
if (CurrentBufferOldVal>=CURRENT_BUFFER_LENGTH)
{
CurrentBufferOldVal=0 ;
}
f32_CurrentMean=f32_CurrentMean/(float)CURRENT_BUFFER_LENGTH ;
}
}
Gracias de antemano.