Valor de entrada analógica de Arduino oscilante, ¿por qué funciona el DMM y Arduino no tanto?

Estoy midiendo la salida de voltaje de un dispositivo con una impedancia de salida de 10 kohm con un pin de entrada analógica arduino. Veo lo que esperaría con un multímetro, pero con el arduino obtengo basura o, en el mejor de los casos, mediciones oscilantes que promedian lo que esperaría.

Sé que la impedancia de los pines analógicos es de 100 Mohms, mientras que en el DMM sería de alrededor de 10 Mohms, por lo que no esperaba que el Arduino fuera inútil mientras el DMM funciona bien.

Finalmente descubrí que cortocircuitar las salidas con un capacitor me da lo que esperaba, pero realmente no entiendo por qué. Las resistencias ayudaron, pero aún vi oscilación, y supuse que, siendo aparentemente un problema con la impedancia, la falta de coincidencia de la resistencia era la culpable.

"la impedancia de los pines analógicos sea de 100 Mohms" es más que poco probable, particularmente cuando se lleva a cabo una conversión. ¿De dónde sacaste esa idea?
Es justo lo que recuerdo de un google precursor: aquí

Respuestas (3)

La MCU en Arduino tiene un ADC de aproximación sucesiva.

Funciona tomando brevemente una muestra de voltaje a través de un multiplexor en un pequeño capacitor de almacenamiento para manejar múltiples canales de entrada con un ADC.

Con una fuente de impedancia alta, es posible que el condensador de muestra/retención no tenga tiempo de cargarse por completo y, por lo tanto, la muestra del voltaje no se parece al voltaje real.

Entonces, la impedancia de un pin de entrada analógica no es de 100 Mohms, ya que momentáneamente está cargando un capacitor de 14pF con una resistencia en serie de 1kohm, y puede haber corriente dentro o fuera del pin.

Por lo tanto, la impedancia de la fuente debe ser lo suficientemente baja como para cargar el capacitor de muestreo/retención dentro de 0,5 recuentos de ADC durante el tiempo de muestreo.

Asumiendo que la MCU en tu Arduino es un AVR, las especificaciones del ADC dicen que funciona mejor cuando la impedancia de la fuente es de 10k o menos. Parece que su sensor tiene una impedancia de salida alta.

Además, si la salida del sensor no puede manejar los tragos de la carga periódica del condensador de muestreo, podría volverse inestable y exhibir un timbre cuando el condensador vacío se conecta repentinamente para cargarse.

Básicamente, lo mismo ocurre cuando tiene un condensador de filtro en la entrada del AVR para tener una impedancia de CA a corto plazo lo suficientemente baja, de modo que pueda tomar una medición sin afectar mucho el valor. Pero si la tapa del filtro se carga con una resistencia de 1 Mohm, seguirá teniendo una alta impedancia de CC a largo plazo, por lo que se tarda mucho en cargar el condensador a su valor original, por lo que tomar medidas con demasiada frecuencia descargará lentamente el condensador del filtro.

Entonces, hay muchas razones por las que las mediciones analógicas realizadas con Arduino no funcionarán en comparación con un multímetro. El Arduino no tiene un acondicionamiento de señal incorporado y almacenamiento en búfer como lo tiene un multímetro. La etapa de entrada analógica requerida debe construirse entre el sensor y la MCU.

> Con una fuente de impedancia alta, es posible que el condensador de muestra/retención no tenga tiempo de cargarse por completo y, por lo tanto, la muestra del voltaje no se parece al voltaje real. Esto parece que lo explica todo. ¿Y la oscilación que estoy viendo es el resultado de que este límite se carga/descarga lentamente?
Podría ser. Bastante difícil de decir sin ver las mediciones del osciloscopio junto con los resultados del ADC, o conocer la frecuencia de muestreo o la impedancia de salida real del sensor, entre otras cosas.

El medidor tendrá un capacitor real o una simulación de software de uno internamente.

Si no fuera así, nunca se mostraría un número estable y sería imposible leerlo.

Puede estar seguro de que esto no tiene nada que ver con ningún 'desajuste de resistencia'.

Una pequeña historia....

Cuando estaba en la universidad, estaba tomando una clase de CMOS: diseñamos circuitos integrados y los fabricamos. Mi equipo decidió hacer un 'voltímetro en un chip' --- Tenía las entradas analógicas y saldría directamente a una pantalla digital LED típica de 7 segmentos. Cuando lo encendimos, decía "888". Por supuesto, estábamos súper desanimados, hasta que alguien sugirió agregar una pequeña gorra a la entrada. De repente funcionó. Entonces, lo que estaba sucediendo es que los números rebotaban tan rápido, todos los segmentos LED se encendían tan rápido que parecían estar encendidos.

Si de alguna manera pudiera operar su Arduino en un entorno sin ruido electromagnético, obtendría lecturas perfectamente estables sin la tapa. Pero tal ambiente no existe. SIEMPRE habrá algo perturbando los cables hasta cierto punto. Entonces el Arduino no te está mintiendo. Está informando lo que ve en los pines. Da la casualidad de que el valor en los pines se está moviendo. Al colocar la tapa allí, se introduce una acción de suavizado en el voltaje, por lo que se vuelve lo suficientemente estable para hacer una lectura.

Dicho esto, debe darle una mano al Arduino haciendo que el voltaje sea lo más estable posible. Por ejemplo, el uso de un cable fuertemente retorcido en lugar de dos conductores separados casi siempre producirá una mejora. La reducción de ruido y las técnicas de conexión a tierra adecuadas no son algo que pueda describir en una publicación breve, podría llenar libros de texto con esas cosas. Pero si simplemente no puede obtener la estabilidad que desea, publicar algunas fotos de su configuración puede brindarle comentarios útiles aquí.

Siguiendo con la respuesta de Kyle B, si no está utilizando un PLANO DE TIERRA, hágalo.

Ayudo a un chico a detectar/digitalizar transitorios de instrumentos musicales.

Durante el último año, él/nosotros hemos aprendido a reducir el error mínimo de 90 milivoltios a alrededor de 0,3 milivoltios.

  • Tener un límite de 0.01uF en la entrada al ADC

  • Tenga un búfer unity_gain antes de ese límite de 0.1uF.

  • No utilice fuentes de alimentación del regulador de conmutación.

  • Si debe usar SwitchRegs, entonces pague por la mejor calificación.

  • Utilice un plano de tierra.

  • Es posible que necesite chokes common_mode, en el cableado VDD/GROUND a SwitchRegs.

  • En el VDD a cualquier búfer opamp, tenga 10 ohmios en serie y derivación de 100 uF.

La gorra que usé tenía que ser de un valor más alto. Aunque no estoy seguro de qué es, lo tenía por ahí, pero creo que está entre los 10 y los 100 uF. Un límite de 10nF no estaba haciendo nada. Si hubiera sabido cuánta frustración habría resultado de no ser un EE, solo habría sido un EE>:( Usar un plano de tierra es un problema porque no sé exactamente cómo se presenta el arduino.
Creo que una vez hice algunos cálculos de que el valor del condensador del filtro debería ser de alrededor de 33 nF en la entrada AVR ADC para proporcionar una lectura estable en las peores condiciones. Y luego, el tiempo entre lecturas depende de cuál sea la impedancia de la fuente real. Las lecturas continuas aún agotarían el condensador si la impedancia de la fuente del sensor es extremadamente alta. Entonces, el 10nF debería haber ayudado si la impedancia de la fuente puede cargarlo entre lecturas.