¿El ADC arduino (ATMEGA328P) realmente solo toma muestras periódicamente?

He estado experimentando con el ADC de Arduino y he notado un comportamiento extraño. Me pregunto si es normal o si esto es algo específico (y malo) sobre el Atmel ATMEGA328P en el que se basa el Uno.

Básicamente, parecería que el valor de entrada en el ADC se muestrea a una tasa más baja de lo que el ADC realmente devuelve valores para:

ingrese la descripción de la imagen aquí

En esta imagen puede ver la entrada muestreada funcionando a toda velocidad conectada a un potenciómetro simple. A medida que el potenciómetro pasa de lleno a mínimo, el voltaje de entrada cae. Como puede ver, los valores devueltos por el ADC vienen en pasos, donde devuelve el mismo valor (o similar) para varias llamadas a analogRead(), antes de caer bruscamente.

¿Qué está pasando realmente aquí? ¿La entrada ADC funciona a una velocidad diferente a la salida de datos? ¿El código Arduino está leyendo mal el ADC?

He intentado jugar con el preescalador ADC, y no importa en qué lo configuro (aparte de 1: 2 o 1: 4, donde muere por completo) se lee en pasos como este.

Editar

Se necesitan alrededor de 32 lecturas sucesivas de ADC para que los pasos desaparezcan por completo.

Consulte también la consulta SE relacionada pero no idéntica aquí
Respuesta: No, no lo hace. Es (como siempre) mi código. Pero bueno, era tarde y estaba cansado, a la luz fría de la mañana supe al instante cuál era el problema.
@Majenko ¡No olvides publicar tu comentario como respuesta cuando puedas y aceptarlo!
@Majenko, escriba una respuesta que explique el error para que otros puedan encontrar el problema y la solución.
Los adc tardan en asentarse y capturar en general, esto no es algo instantáneo. necesitan entender qué método están usando para hacer la conversión. Además, ¿cómo vas a volver a lo analógico? ¿Qué sucede si solo almacena un montón de muestras en la memoria y luego las descarga y las grafica, eliminando el impacto en el rendimiento de dac y el impacto en el código?

Respuestas (3)

¿Error de DAC? : Usted dice que el seguimiento del alcance muestra los valores de entrada ADC de Arduino PERO aparentemente está mostrando una señal analógica. Supongo que hay un DAC de algún tipo en el proceso para convertir las lecturas de ADC de nuevo a analógicas.
El rastro da la apariencia de un DAC con un error masivo en un bit de nivel medio. por ejemplo, el bit de dirección A2 del DAC puede tener un valor de resistencia que es, digamos, 10 veces demasiado pequeño.

Prueba: Gire la olla MUY lentamente, ¿se desvanecen los pasos gruesos?
es decir, obtienes un nivel descendente suave.
Si el nivel desciende así a cualquier velocidad de barrido, es probable que tenga un ADC de publicación de error basado en bits.
O, posiblemente, un microcontrolador con un error de bit en el hardware DAC del IC (menos probable).


Velocidad del ADC: en caso de fallar lo anterior -

La sensación general de la web es que puedes hacerlo mejor de lo que estás viendo.
Si ese barrido de potenciómetro es, digamos, de 0,1 segundos, entonces su tasa de paso bruta es de aproximadamente 10 mS.
SIN EMBARGO, parece haber pequeños pasos decrecientes en su forma de onda, tal vez 10 por paso bruto, para un minipaso de, digamos, 1 mS.
Incluso eso es más largo de lo que cabría esperar razonablemente.

Esta discusión sugiere 10's f kHz. - Se menciona 77 kHz.

El alcance basado en Arduino da una idea de la velocidad esperada.

Monitor de energía usando ADC nuevamente, una guía.

Útil

He dormido sobre mi problema y creo que he encontrado la respuesta. El problema es con mi software, no con el ADC. La imagen es dibujada por Arduino y se bloqueará esperando que el dispositivo de video dibuje el marco. Debí haber pensado en eso anoche, ya que diseñé el dispositivo de video. Aunque era tarde...

La razón de la incapacidad de leer el ADC sin problemas se debe a cómo me estaba mostrando.

Han pasado tres años desde que hice esta pregunta (cómo pasa el tiempo) y recientemente la redescubrí después de que alguien la votó a favor, así que tengo que tratar de recordar todo ahora...

Básicamente, estaba leyendo el ADC regularmente, pero la salida de la pantalla se realizaba a través de PAL o VGA (no recuerdo cuál ahora) a una pantalla TFT. Por supuesto, como era tarde en la noche en ese momento, olvidé que dibujar un cuadro si la pantalla lleva tiempo, y que durante ese tiempo no puede muestrear el ADC, de ahí los pasos.

Lección aprendida: dormir sobre un problema hace que la respuesta sea obvia.

Hay un ADC y 6 entradas, muestrea cada entrada 3 veces (creo), luego pasa a la siguiente entrada y así sucesivamente.

¿Puede agregar un poco más de información sobre cómo es este el problema, con un poco más de explicación para aquellos que no entiendan automáticamente su respuesta?