TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: juaperser1 en 03 de Noviembre de 2019, 17:06:39

Título: Se me quedan bloqueados los adc.
Publicado por: juaperser1 en 03 de Noviembre de 2019, 17:06:39
Buenas, estoy trabajando con un stm32G030, el sistema monitoriza una sonda de temperatura y actua en consecuencia, pero me he dado cuenta que en algunas ocasiones el adc deja de medir.

Por ejemplo, si la temperatura esta subiendo, pues se queda en 25 y ya no sube mas (esto es completamente aleatorio, no se para siempre ni en el mismo sitio). Todo los demñás sigue funcionando sin problemas, el display, los pulsadores el RTC etc. Al reiniciar vuelve a funcionar sin problemas.

¿Como puedo arreglar esto? ¿ Alguien sabe el motivo? Puede ser que se quede bloqueado por el ruido de los reles, compresores o algo por el estilo?

un saludo y gracias.
Título: Re:Se me quedan bloqueados los adc.
Publicado por: KILLERJC en 03 de Noviembre de 2019, 19:01:08
Creo que esto ya pasa mas por el funcionamiento del micro, y deberia ser preguntado y respondido por la gente de ST.

Especialmente si podes proveer un ejemplo sencillo donde esto ocurra.
¿Probaste otros micros y siguen haciendo lo mismo?
Título: Re:Se me quedan bloqueados los adc.
Publicado por: juaperser1 en 04 de Noviembre de 2019, 03:17:58
Creo que esto ya pasa mas por el funcionamiento del micro, y deberia ser preguntado y respondido por la gente de ST.

Especialmente si podes proveer un ejemplo sencillo donde esto ocurra.
¿Probaste otros micros y siguen haciendo lo mismo?

Creo recordar que en los STM32F030 a un compañero también le ocurría esto, y lo resolvió para salir del paso haciendo que un reset por software una vez al día.

Voy a intentar preguntar al servicio técnico de ST aunque no espero gran cosa. De momento se me ocurre colocar unas variables para comparar los valores del ADC, si este se repite varias veces deshabilitar y volver a inicializar el ST a ver si esto lo arregla.

Citar
Especialmente si podes proveer un ejemplo sencillo donde esto ocurra.

Es aleatorio, lo mismo se pega 2 días funcionando sin problemas que lo mismo a las 2 horas se queda parado

Título: Re:Se me quedan bloqueados los adc.
Publicado por: Carlos_Diaz en 21 de Noviembre de 2019, 01:45:10
Hola Juanjo,

¿Estas revisando lo que retornan las funciones de la HAL cuando intentas medir los canales del ADC?
¿Cuantos canales de ADC estas leyendo?

Yo tuve problemas con el F130 (o algo asi), trataba de leer un canal y me resultaba en un HardFault.

Saludos
Título: Re:Se me quedan bloqueados los adc.
Publicado por: juaperser1 en 21 de Noviembre de 2019, 14:10:16
Hola Juanjo,

¿Estas revisando lo que retornan las funciones de la HAL cuando intentas medir los canales del ADC?
¿Cuantos canales de ADC estas leyendo?

Yo tuve problemas con el F130 (o algo asi), trataba de leer un canal y me resultaba en un HardFault.

Saludos

Me dan correcto, estoy leyendo dos canales del adc por DMA, el problema que tengo es complemente aleatorio, por ello no puedo verlo en debug.

Escribí al servicio técnico a ver si me decian por que pasaba esto, pero sin respuesta. Para arreglarlo he tenido que crear algo así como un watchdog para revisar cuando se han quedado pillados los adc, y resetear el periférico.
Título: Re:Se me quedan bloqueados los adc.
Publicado por: cristian_elect en 24 de Noviembre de 2019, 20:35:30
Yo tenía problemas con el ADC del stm32f030F4 como modo normal con el tiempo mas corto de conversión sin optimización funcionaba bien pero con optimización >O0 fallaba salía cualquier valor, en modo interrupción fallaba con optimización o sin el. La única manera que me funcionara bien es subir el "ADC_SAMPLETIME_71CYCLES_5" y ya funciona bien con cualquier modo de optimización.
Título: Re:Se me quedan bloqueados los adc.
Publicado por: Carlos_Diaz en 24 de Abril de 2020, 16:48:41
Hola,

Tuve el mismo problema, o uno muy similar, a principios de esta semana y recordé este tema, lo resolvi haciendo HAL_ADC_Start antes de polear la conversión y HAL_ADC_Stop al terminarla.

Código: [Seleccionar]
for (size_t sample_idx = 0; sample_idx < ADC_SAMPLES_MAX; sample_idx++) {

    HAL_ADC_Start(&hadc1);

    HAL_StatusTypeDef ret = HAL_ADC_PollForConversion(&hadc1, 1000);

    if (HAL_OK != ret) {
        printf("Error de conversion: %d", ret);
    } else {
        /* Sumamos el resultado obtenido al acumulado */
        sum_sensors[SENSOR_A] += (uint16_t) HAL_ADC_GetValue(&hadc1);
    }

    ret = HAL_ADC_PollForConversion(&hadc1, 1000);

    if (HAL_OK != ret) {
        printf("Error de conversion: %d", ret);
    } else {
        /* Sumamos el resultado obtenido al acumulado */
        sum_sensors[SENSOR_B] += (uint16_t) HAL_ADC_GetValue(&hadc1);
    }

    HAL_ADC_Stop(&hadc1);
}