Necesita ayuda para calibrar la entrada ADC usando un divisor de voltaje

0

He estado usando la entrada analógica Arduino Nano para medir voltajes, en el rango entre 22-30 voltios. El ADC del Nano espera un rango de 0-5 voltios y tiene 0-1023 como salida.

Siguiendo las instrucciones encontradas aquí:

Lea el voltaje analógico (www.arduino.cc)

Lo que básicamente indica que todo lo que necesito es este código:

int sensorValue = analogRead(A0);
float voltage= sensorValue * (5.0 / 1023.0);

5.0 / 1023 = 0.004888 voltios por incremento en lecturas analógicas. Cambiando eso, la entrada de voltaje dividida por este valor debería darme el valor del sensor.

Mi divisor de voltaje es 1 Mohm (R1) entre la entrada de voltaje y A2, luego 200K (R2) de A2 a tierra

30 voltios mide como 4.2 voltios. 22 voltios mide como 3.1 voltios.

Creo que el rango entre 22 voltios y 30 voltios no presenta una variación suficiente con respecto al ADC: cada cambio de un dígito en el analógicoRead realmente hace una gran diferencia.

El resultado es que me está dando algunas lecturas locas. Definitivamente no es lineal, por lo que estoy teniendo problemas para intentar que sea preciso en ambos extremos de mi rango de medición. Cada ligero incremento de ADC hace una gran diferencia en el voltaje medido porque no estoy usando el rango completo de entrada de 0-5V.

Así que he estado tomando 10 lecturas seguidas, a intervalos de 500 ms, y luego promediando.

Y sin embargo, no está funcionando lo suficientemente bien.

Una cosa que parece importar realmente es la fuente de alimentación. Cuando pongo 4.97 en el Vin, se obtienen lecturas diferentes que si confío en obtener energía de la conexión USB a la Raspberry Pi 3B.

Ayer mismo lo puse en la fuente de alimentación para siempre, había estado confiando en el Pi todo el tiempo. Pero todavía no está dando lecturas precisas.

- EDIT de Respuestas (Gracias por mostrarme dónde buscar)

Impedancia de entrada: estoy intentando 147 / 23.5 para el siguiente intento. Obteniendo 3.0-4.1 para el rango 22-30. Igual que el 1M / 100K, básicamente, pero resistencias más bajas.

El problema del voltaje de referencia: mide 4.36 voltios en la salida de 5 V del Nano. Vin es 5V exactamente.

Aquí hay un artículo que encontré que dice que la fórmula 5/1023 debería usar ese valor real:

Cómo medir el voltaje de CC usando Arduino

Y otro que lo confirma:

Conversión de analógico a digital

AHORA, el problema inmediato es ¿cómo puedo asignar 22-30 voltios a 0-4 o algo así, permitiendo así la utilización de más de un pequeño% de los valores permitidos?

Publicado de forma cruzada en Cómo ¿Puedo calibrar seriamente las lecturas de voltaje ADC con Arduino Nano?

    
pregunta SDsolar

5 respuestas

1

La mejor manera es compensar y reducir la atenuación.

Spec

  • sí, convierta 20 ~ 30 a 0 a 5V con 0.1% de precisión si es posible.

Rev A

  • 22 ~ 30 convertidos en 0 ~ 4 se convierte en Vin * 0.5000 -11.00V = Vout
    • 11.000V = k * 4.380V usando k = 2.5114
    • con un OpAmp no-inv de ganancia 1 + Rf / Rin
  • unidireccional: V + / 2 - 11.00 V usando Vref de precisión o zener programable.
  • usando una matriz R con R coincidente a < 0.1%
  • Esta será 3 veces mejor resolución usando 1/2 en lugar de 1/6 de atenuación
  • asegúrese de que sus conexiones sean de par trenzado y filtradas con una tapa de RF ESR baja

¿Qué suministros están disponibles?

p.s. Crecí admirando a Aurora, persiguiendo rastros de humo que parecían estar a nivel del suelo, observando las olas del cielo como el océano durante horas en la noche y los colores ardientes en Churchill Mb en el campo de investigación de cohetes del NRC para Plasma Physics.

    
respondido por el Tony EE rocketscientist
4

Además de reducir las resistencias del divisor de voltaje, lo cual es necesario, pero no suficiente, debe considerar la referencia si desea lecturas precisas. Para el divisor, 10K es un buen máximo, por lo tanto, si usa una resistencia de 49.9K 1% y una resistencia de 10.0K 1%, estará bastante cerca de la relación deseada y la impedancia de la entrada del ADC se verá como 8.3K. Una tapa de cerámica de 10n-100n en el 10K no hará daño.

El Arduino no tiene una referencia de voltaje ADC , por lo que la lectura será proporcional a la tensión de alimentación. Una diferencia del 5% en la tensión de alimentación significa una diferencia del 5% en la lectura. Hay una referencia de intervalo de banda en el chip ATmega, sin embargo, se especifica en términos generales (+/- 10%), es de voltaje relativamente bajo (1.1 V nominal) y solo se puede utilizar como una entrada al ADC. Si puede medir un voltaje preciso incluso con la lectura ratiométrica, puede corregir el voltaje de suministro con cálculos si el voltaje de suministro se mantiene lo suficientemente constante.

O puede adjuntar un ADC externo de precisión y referencia al Arduino. '

Si desea hacer un cero compensado, puede usar un circuito como este:

simular este circuito : esquema creado usando CircuitLab

Utilice un amplificador operacional RRIO como Microchip MCP6001 .

Si no te gusta mi elección de voltajes de entrada / salida, puedes recalcular R1-R5 para obtener lo que deseas, es simplemente un álgebra simple que cualquiera puede hacer con un poco de paciencia.

R1 / R5 son dos resistencias en lugar de una para obtener la relación 9: 1 con los valores de resistencia estándar de la serie E96. R6 no es crítico, solo asegura que la corriente llegue a D1 para mantener la regulación. Los otros deben ser tipos de precisión.

Dado que se resta una tensión bastante precisa y muy estable de la tensión de entrada, es posible que el uso de la tensión de alimentación sea aceptable como referencia, según cuáles sean sus requisitos reales. La reducción de la sensibilidad es 3: 1 en este caso.

    
respondido por el Spehro Pefhany
2

Como dice JRE en los comentarios, Atmel (ahora Microchip :-(), que fabrica los procesadores en Arduinos, generalmente sugiere no usar ningún circuito con una impedancia de salida superior a 100kOhm en la mayoría de sus procesadores.

De hecho, con una impedancia de 100kOhm, a menudo también sugieren agregar un capacitor, como sigue:

simular este circuito : esquema creado usando CircuitLab

Debido a que el procesador tiene una impedancia de entrada, lo que reducirá el voltaje de lectura (¿o posiblemente aumentará en algunos casos?), lo que probablemente sea más de 10Mohm. Pero también tiene una pequeña capacitancia dentro de la cual usa para "mantener" el voltaje mientras realiza una conversión.

Cuando se conecta esa capacitancia, fluirá una pequeña cantidad de corriente adicional, lo que probablemente sea el culpable de su pérdida de voltaje. Si usa 10k y 2k, la corriente no es lo suficientemente grande como para crear más errores de los que ya se encuentran en el ADC, pero para resistencias más grandes comenzará a notarlo. Con 1MOhm en la parte superior, no estoy seguro de que pueda repararlo por completo con un condensador (la fuga interna probablemente ya se notará), por lo que quizás el centro dorado sea de 100k y un pequeño capacitor.

El capacitor adicional en el caso de una impedancia de 100k amortigua el voltaje todo el tiempo que el ADC no está conectado a su red, y luego, cuando el ADC muestrea su voltaje con su capacitor de retención, el capacitor que agregue proporcionará una gran cantidad de la energía para cargar ese condensador interno de retención, por lo que el error será mucho menor.

    
respondido por el Asmyldof
1

En primer lugar, no encienda su arduino a través de 5 voltios en el pin VIN. Conecte 5V al pin de 5V (si está seguro de que es de 5V) o aliméntelo a través de un voltaje más alto a través del pin VIN. En segundo lugar, recomendaría cambiar el divisor para que funcione con la referencia de voltaje de intervalo de banda de 1.1 voltios (objetivo para 0-1V). Probablemente sea la referencia más precisa (en productos similares tiene un 90 ppm coeficiente de temperatura) a mano y puede calibre el 10% de incertidumbre con un multímetro. Tercero, la asignación del valor de 0 a 1024 a 0V a 30V se puede hacer usando la función de mapa integrada: map(value, 0, 1024, 0, 30000)/1000.0

    
respondido por el Alex
1

Gracias por sus respuestas, hay muchos conocimientos colectivos allí. Me ayudó a encontrar una manera de estabilizar y calibrar este sistema con lo que tenía a mano. La gente de Arduino me ayudó con algunos conceptos sobre el dispositivo en particular, pero es aquí donde veo las respuestas que realmente necesito.

(El mayor problema fue que se asumió que la tensión de referencia y la resolución eran 5/1024, lo cual es completamente incorrecto. A menos que, como alguien señaló, alimenté a los Nanos directamente en el pin de 5 V, que todavía está sobre la mesa, entonces sería 5/1023)

Cambié mi red de resistencia a $$ 147K / 23.5K $$

(Lista de piezas: 1x 100K, 3x 47K)

$$ R1 = \ frac {47K} {47K} = 23.5K $$

$$ R2 = 100K + 47K = 147K $$

También se agregó un electrolítico de 100uF 50V en la entrada del banco de baterías que estoy monitoreando.

Estoy alimentando 5V a Vin. Y he descubierto que la referencia es medible en el pin de 5V, después del regulador, como 4.6V.

Sabiendo que

$$ \ frac {Resolución} {Vref} = \ frac {ADC} {Vin} $$

Me di la vuelta para ser

$$ Vin = \ frac {(ADC * Vref)} {Resolución} $$

O, $$ Vin = A2 * \ frac {4.6} {1023} $$

Usando una fuente de alimentación de laboratorio pude confirmar que con esos ajustes, 22 voltios entraron a 3 voltios y 29.98 entraron a la derecha a 4 voltios.

Entonces

$$ Vbat = A2 * (4.6 / 1023) / (R2 / (R1 + R2)) $$

$$ Vbat = A2 * \ frac {(4.6 / 1023.0)} {(147000/170500)} $$

Ahora está funcionando razonablemente bien.

--UPDATE--   Se cambiaron las resistencias a 100K / 20K para el divisor y se llevó la potencia al pin de 5V, pasando por alto el regulador para una referencia. Mide en 5.02 y es estable.

Está siguiendo bastante bien con la lectura en la pantalla del Controlador de Carga.

(Amarillo significa que el inversor está encendido)

De manera similar, fui a 147K / 47K para el circuito de 11-15 voltios y moví un P / S de mayor calidad al pin de 5V, donde mide 5.03V; Los resultados son mejores allí también.

De todos modos, dejaré esto en paz hasta que pueda resolver un circuito de amplificación operativa.

Gracias a todos por su ayuda

    
respondido por el SDsolar

Lea otras preguntas en las etiquetas