STM32F303K8 Nucleo Reiniciar ADC para exploraciones continuas (¿utilizando interrupciones?) STM22CubeMX

2

Tengo un proyecto generado desde CubeMX para mi STM32Nucleo F303K8. Mi IDE es SystemWorkbench.

Estoy usando un total de 8 entradas analógicas divididas entre dos ADC

ADC1: 1, 2, 4, 12.

ADC2: 1, 2, 3, 4.

No estoy seguro de cómo leer correctamente estos. Estoy usando DMA y la frecuencia con la que verifico el valor es mucho más lenta que el tiempo de exploración. Pero incluso si no fuera así, no me importaría leer el mismo valor dos veces.

Solo quiero tener un escaneo continuo, cuando uno termina, comienza el siguiente.

Pero sea lo que sea lo que trate de hacer, parece que la única manera de obtener escaneos continuos es iniciar manualmente los escaneos ADC una y otra vez en mi bucle principal usando:

HAL_ADC_Start(&hadc1);
HAL_ADC_Start(&hadc2);

o la variante _IT .

He intentado habilitar la conversión continua y luego iniciar el ADC una vez fuera de mi bucle principal. Pero eso solo hace un escaneo y se detiene allí.

Pensé que tal vez podría usar la interrupción de escaneo completo para reiniciar el escaneo cuando finalice. Esto funciona cuando reinicio solo un ADC dentro de la interrupción. Sin embargo, tan pronto como agrego el segundo a la devolución de llamada, el sistema se bloquea. Obviamente hay una interrupción que no se está manejando en algún lugar.

 /**
 * @brief Callback when an ADC scan completes.
 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if (hadc->Instance == ADC1)
    {
        //HAL_ADC_Start_IT(&hadc1);
    }
    if (hadc->Instance == ADC2)
    {
        //HAL_ADC_Start_IT(&hadc2);
    }

}

Mi código completo está aquí: refid actual: ef11437

enlace

Si alguien tiene alguna idea para mí, eso sería muy apreciado.

    
pregunta Chris

1 respuesta

2

He logrado encontrar una solución. Aunque como menciona PeterJ_01, esto puede ser una solución a un problema mucho más grande.

La causa de mi problema parece ser que tenía el tiempo de ciclo establecido en 61.5 ciclos por canal. Lo que parece ser demasiado rápido cuando se hacen 8 conversiones. Mi sospecha era que estaba saturando el µC. Es por eso que reiniciar solo un ADC en la devolución de llamada funcionaría. pero no ambos. Pero supongo que es algo más profundo que eso.

¡He aumentado el tiempo del ciclo a 601.5 ciclos y todo funciona!

Además, me doy cuenta de que no necesito las interrupciones de ADC habilitadas para reiniciar la conversión. Dado que el DMA adjunta automáticamente HAL_ADC_ConvCpltCallback a la interrupción del DMA de conversión completa.

    
respondido por el Chris

Lea otras preguntas en las etiquetas