STM32F103 - Modo de conversión continua de un solo canal

1

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.

    
pregunta Gutenberg

0 respuestas

Lea otras preguntas en las etiquetas