Saltar al contenido

Conversión de ADC STM32 usando HAL

Andrés, miembro de este equipo, nos hizo el favor de crear esta reseña porque controla muy bien el tema.

Solución:

En su código original, desactive la Selección de fin de conversión.

 hadc1.Init.EOCSelection = DISABLE;

Resultó que #define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000) el valor es igual a DISABLE. Entonces, en realidad, la EOCSelection debe configurarse como: ingrese la descripción de la imagen aquí

para poder sondear el ADC varias veces.

Luego puede leer el ADC continuamente sin detener e iniciar el ADC:

int main(void)

    HAL_Init();
    SystemClock_Config();
    ConfigureADC();

    HAL_ADC_Start(&hadc1);
    while(1)
    
        if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
        
            ADCValue = HAL_ADC_GetValue(&hadc1);
        
    

De esta manera funcionó bien para mí.

Dado que HAL es una biblioteca bastante nueva, no hay muchos recursos para encontrar, pero no es imposible. Aprendí mucho de este tutorial, demuestra todo el uso posible de ADC paso a paso; desde un simple sondeo hasta el uso de interrupciones y DMA.

Me gustaría agregar que para mi configuración (nucleo-h743) no fue suficiente configurar:

hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;

También tuve que habilitar la configuración de desbordamiento:

hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;

Sin esto, HAL_ADC_PollForConversion todavía estaba bloqueando. No entiendo completamente por qué esto fue necesario, pero me permite sondear en modo continuo.

Hm… Encontré un par de tutoriales que usaban HAL_ADC_Stop(&hadc1) para finalizar la conversión… Estaba mirando estos tutoriales antes y pensé que esta es una forma bastante bárbara, parece que desactiva ADC por completo, así que pensé que debería haber método diferente. Pero parece que esto realmente funciona bien.
Sea bienvenido a publicar una respuesta si hay una forma más elegante de hacerlo, ya que creo que usar HAL_ADC_Stop() es bastante horrible, pero puede usarse con fines de aprendizaje.

while (1)
  
        HAL_ADC_Start(&hadc1);
        if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
        
            ADCValue = HAL_ADC_GetValue(&hadc1);
                        sprintf(str, "%d", ADCValue);
                        BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
        
        HAL_ADC_Stop(&hadc1);

  

Si tienes algún titubeo o disposición de limar nuestro noticia eres capaz de dejar un exégesis y con gusto lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *