¿Qué valor usar para convertir el valor de ADC a voltaje?

5

Mientras trabajaba en mi proyecto, llegué a un punto en el que no sé la respuesta. Tengo un ADC de 10 bits (el que está incorporado en el ATMEGA328P) y devuelve valores hasta 1023 (2 10 - 1).

La documentación oficial indica que la ecuación para convertir los valores del ADC a la tensión correspondiente es:

$$ V = \ frac {V_ {en} \ cdot ADC} {2 ^ {10}} $$

Pero, si los valores suben a 1023, ¿no sería mejor reemplazar el 2 10 por 2 10 - 1?

Gracias.

    
pregunta jparenas

5 respuestas

5

Ignorando la dura realidad del rendimiento de los ADC que pueden integrarse de forma económica en las MCU, en el caso ideal, cada recuento de salidas representa un posible rango de voltajes de entrada bien definidos.

Aquí es un ideal (según definición de Atmel ) ADC de 3 bits.

Hay \ $ 2 ^ N \ $ pasos. En el ejemplo anterior, es 8. Con un ADC unipolar ideal, una entrada inferior a \ $ \ frac {V_ {REF}} {2 ^ {N + 1}} \ $ dará una salida de 0- a medida que se puede ver arriba, debajo de 1/16 del voltaje de referencia de 2 V, el código de salida será 0.

Entre \ $ \ frac {V_ {REF}} {16} \ $ y \ $ \ frac {V_ {REF}} {16} + \ frac {V_ {REF}} {8} \ $ el conteo de salida Será 1 y así sucesivamente, con cada paso igual.

Cuando llegue al límite superior, un conteo de \ $ 2 ^ N-1 \ $ (conteo máximo) representará un voltaje mayor que \ $ V_ {REF} \ cdot \ frac {13} {16 PS

Por lo tanto, la mejor suposición (error de minimización) para un conteo dado x (donde \ $ 0 \ lt x \ lt 2 ^ {N-1} \ $) es \ $ x \ frac {V_ {REF}} {2 ^ {N}} \ $, como se indica en la pregunta original.

Por lo general, los ADC de MCU se saturarán, por lo que lo ideal sería que, en el caso especial de x = 0, el voltaje de entrada sea menor que \ $ 0.5 V_ {REF} \ cdot \ frac {1} {2 ^ N} \ $ = \ $ V_ {REF} \ cdot \ frac {1} {2 ^ {N + 1}} \ $ y si x = \ $ 2 ^ {N-1} \ $ entonces el voltaje de entrada es mayor que \ $ V_ {REF} \ cdot \ frac {2 ^ {N + 1} -3} {2 ^ {N + 1}} \ $

Por supuesto, con una MCU típica de 10 bits o más, el error y el ruido de ADC generalmente excederán de 1 LSB, y Vref generalmente tampoco tendrá una precisión de 1 LSB, por lo que no importa mucho.

TL; DR

Usa la ecuación original.

    
respondido por el Spehro Pefhany
2

Tienes razón. El valor digital máximo (1023) representa el voltaje de referencia del ADC. Por lo tanto, la división por (2 ^ (número de bits) - 1) es correcta.

    
respondido por el mic
2

jparenas, esta es una pregunta que vuelve con regularidad, y es una fuente de confusión cuando se trabaja con ADC. Está estrechamente relacionado con la confusión clásica: voltaje de escala completa (FS) versus voltaje de referencia (Vref). Para mantener las cosas simples, considere un hipotético ADC de 3 bits (\ $ N \ $ = 3), sin la compensación de 0,5 LSB en la entrada (como, creo, ocurre en ATmega328p) - en tal caso, los resultados Aquí obtenido no difiere tanto. Tres partes:

(a) Vea la función de transferencia (a) en la imagen a continuación, donde Va es el voltaje analógico y Vd es el valor digital convertido. FS es solo el voltaje que corresponde a la transición al valor digital máximo (7 o \ $ 2 ^ N-1 \ $). Además, hay siete pasos horizontalmente y siete pasos verticalmente, donde cada paso ocurre en múltiplos de 1/7 FS. Sea FS = 4.375 V, luego cada paso analógico es 0.625 V. Tenga en cuenta que la línea discontinua inclinada que conecta las coordenadas (0; 000) a (FS; 111) representa la conversión ideal que todos los ingenieros desearían. Entonces:

$$ Vd = int \ left (\ frac {Va} {FS} \ times 7 \ right) $$

Aquí podemos aislar a Va para encontrar una expresión simple:

$$ Va = \ frac {Vd} {7} \ times FS $$

¡Pero espera! Las cosas no son tan simples: para ser más rigurosos, podemos ver que el voltaje Va realmente puede asumir cualquier valor dentro de un intervalo. Aplicando la definición de \ $ int () \ $ function:

$$ \ frac {Vd} {7} \ times FS \ leq Va < \ frac {(Vd + 1)} {7} \ times FS $$

(b) Ahora vea la función de transferencia que se muestra en (b). Tenga en cuenta que si hubiera otro paso adicional de 1/7 FS, podríamos asociarlo con un valor digital completo de 8 (o \ $ 2 ^ N \ $). Voilá! Llamémoslo Vref:

$$ Vref = \ frac {8} {7} FS $$

Tenga en cuenta que, para nuestro FS = 4.375 V \ $ \ Rightarrow \ $ Vref = 5 V. Consulte la expresión \ $ FS = \ frac {7} {8} Vref \ $. Es otra forma de afirmar que FS se mantiene 1 LSB por debajo de Vref. No importa aquí, pero para los ADC compensados con entrada de 0,5 LSB, FS sería 1,5 LSB por debajo de Vref.

(c) Finalmente, vuelva a escribir todo en base a Vref, eliminando ese paso adicional. Por lo tanto, obtenemos la función de transferencia que se muestra en (c), similar a la que se encuentra en las hojas de datos, basada en su totalidad en el factor \ $ 2 ^ N \ $. ¡Todos están felices! Pero tenga en cuenta que hay 7 pasos verticalmente y 8 pasos horizontalmente. La expresión para Vd se reemplaza a:

$$ Vd = int \ left (\ frac {Va} {Vref} \ times 8 \ right) $$

También:

$$ \ frac {Vd} {8} \ times Vref \ leq Va < \ frac {(Vd + 1)} {8} \ times Vref $$

Funciones de transferencia ADC:

Porlotanto,podemosusar\$(2^N-1)\$o\$2^N\$,yaqueestáncorrectamenteasociadosconlosvaloresdeFSoVref,respectivamente.Deacuerdoconlagráfica(c),lamalanoticiaesquenopodemos"medir" el valor de Vref (de hecho, identificar cuándo se produce la transición a este valor). Por supuesto, podemos superar el problema usando divisores y amplificadores resistivos. ops en la entrada ADC para que coincida con el valor que queremos. Pero esto puede no valer en la práctica: además de que las diferencias son muy pequeñas (para un ADC de 10 bits o más), también existen las no idealidades del convertidor AD. Finalmente, la tolerancia de la resistencia utilizada podría "estropear" todo el asunto.

Una ventaja de usar la división por \ $ 2 ^ N \ $ es que en los microcontroladores simples (particularmente en 8 bits) ni tener una instrucción para la división: esto puede reemplazarse por múltiples cambios a la derecha. La diferencia es que el redondeo para la división con signo es "hacia cero" y para el cambio a la derecha aritmética es "infinito negativo". Los procesadores más sofisticados, como el ARM (que no sea el Cortex-M0), ya incorporan instrucciones para la división en unos pocos ciclos y turnos múltiples de un solo ciclo a través del cambiador de barril nativo, con una pequeña diferencia en el rendimiento.

    
respondido por el Dirceu Rodrigues Jr
0

Tienes razón al asumir ambos casos. Se podría utilizar 1023 o 1024 en la ecuación ya que 0 también está representado. Por lo tanto, hay 1024 valores digitales diferentes para representar su señal analógica, donde 1023 es su máximo y 0 es su mínimo.

Por ejemplo, si tiene un pico en su señal analógica de 5V, este valor que pasa por el ADC se representaría como 1023. Si 0V es su mínimo, 0 sería el valor que sale de su ADC. Al final, solo hace una ligera diferencia. Si realmente necesita una medición precisa y esta ecuación le está causando problemas, probaría con un microprocesador o placa de desarrollo diferente, ya que no es tan rápido y 1024 bits es el promedio para ATMEGA328p ..

    
respondido por el 12Lappie
0

Sin quitarle la respuesta a Spehro, así es como me gusta pensar en ello. La mayoría de los programadores están familiarizados con una situación similar con píxeles:

Tome un monitor teórico que mida 1000 mm de ancho con 1000 píxeles. Cada píxel mide 1000/1000 = 1 mm. Los píxeles son direccionados comenzando desde cero. Por lo tanto, el píxel más a la izquierda es el # 0 y su tamaño en una regla se extendería de 0 mm a 1 mm. El píxel más correcto es el # 999 y su tamaño se extiende desde 999 mm hasta 1000 mm.

Entonces, si desea tomar # 999 como 999mm, tiene una lectura que se escala correctamente pero siempre se redondea hacia abajo.

Sin embargo, si decide que # 999 realmente significa "1000 mm", debe forzar una nueva escala de cada píxel a 1000/999 = 1.001 mm. Aún tiene el error habitual de redondeo de 0.5, pero ahora también aparece el error escala .

Es posible que pueda tolerar este error si no le importa que los valores más altos se redondeen hacia arriba y los valores más bajos se reduzcan hacia abajo.

También tenga en cuenta que la división de enteros también causará un redondeo hacia abajo hasta la n más cercana.

Y, como Spehro ha dicho, el error y el ruido del ADC por lo general excederán de 1 LSB de todos modos.

    
respondido por el carveone

Lea otras preguntas en las etiquetas