Estoy intentando leer el ADC de un STM32F4. El código de esqueleto fue generado por CubeMX, se utiliza la biblioteca HAL. Los valores de lectura son factibles pero tienen un ruido periódico, como se ve aquí:
La gráfica fue generada por un bucle que realiza mediciones individuales con un retraso de 10 ms. ¿Se espera un ruido de tal magnitud o algo está mal? Aquí es cómo inicio el ADC:
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
La trama se generó con este código:
for (int i=0; i<128; i++)
{
HAL_ADC_Start(&hadc1);
for (int k=0; k<3; k++)
{
if (HAL_ADC_PollForConversion(&hadc1, 20) == HAL_OK)
{
uint32_t newValInt = HAL_ADC_GetValue(&hadc1);
CanTxMsgTypeDef msg;
msg.StdId = 0x500+i;
msg.IDE = CAN_ID_STD;
msg.RTR = CAN_RTR_DATA;
msg.DLC = 8;
*((uint32_t *)(&(msg.Data[4]))) = newValInt;
can_tx(&msg, 1000);
HAL_ADC_Stop(&hadc1);
HAL_Delay(10);
break;
}
}
}
¿Ustedes tienen alguna idea de cuál podría ser la causa de ese ruido? ¿Configuré algún pin falso (tal vez aparentemente no relacionado)? ¿Hay algún problema con el STM? Por supuesto que podría hacer un promedio, sin embargo, creo que el ruido indica algún problema.
Editar: El problema también se produjo sin demora. Descubrimos que la tensión de alimentación no estaba limpia. Después de aplicar un filtro de circuito, obtenemos valores casi constantes con sigma ~ 1.7. Gracias de todos modos!