Una pregunta sobre la representación de ADC de 16 bits [duplicado]

0

Para un ADC de 16 bits con un rango de entrada analógica de -10V a + 10V, he leído lo siguiente:

La resolución \ $ \ text {delta} = \ dfrac {20V} {2 ^ {16}} \ $

16 bit 0000000000000000 corresponde al decimal 0 y esto significa que el voltaje leído por el ADC está entre -10V y -9 999.695V.

Similarmente, el bit 111111111111111111 corresponde al decimal 65535 y esto significa que el voltaje leído por el ADC está entre +9 999.695V y +10 000.

Pero tengo un par de preguntas aquí donde me confundo:

1-) Si el ADC muestrea un voltaje de +9 999V, ¿se registrará como 65535 o 65534?

2-) ¿Qué tal 32767 y 32768? ¿Ambos representan VO? Me parece que 32767 está registrado si el voltaje está entre -20 / 2 ^ 16V y 0V; y 32768 se registra si el voltaje está entre + 20/2 ^ 16V y 0V. Es eso correcto. Si es así, significa que para 0 V hay dos pasos, a diferencia de otras lecturas de voltaje.

3-) ¿Es la resolución \ $ \ dfrac {20V} {2 ^ {16}} \ $ o \ $ \ dfrac {20V} {2 ^ {16} -1} \ $?

EDIT:

Graficé en Python la cuantización de una sinusoide para un ADC de 3 bits.

La siguiente gráfica representa mejor un convertidor ADC de 3 bits que cuantifica una entrada sinusoidal de 10V 1Hz en este caso muestreada a una velocidad de 512Hz:

3 es el número de bits.

A continuación, llámelo Plot 1, el número de niveles es impar, es decir (2 ^ 3) -1:

Yacontinuación,llámeloPlot2,elnúmerodenivelesespar,esdecir,2^3:

¿CuáldelasanterioresrepresentamejorunacuantificacióndeADC?

EDIT2:

EnrespuestaaDirceuRodriguesJrylafuncióndetransferenciaqueproporcionóensurespuesta,tratéderepresentarloenPython(ADCde3bitsparaentradade-10a+10Venlugardecódigobinarioendecimal):

importnumpyasnpimportmatplotlib.pyplotasplt#ANALOGSIGNAL:va=np.linspace(-10,10,10000)#Analoginputfrom-10Vto+10Vfs_p=10.0fs_n=-10.0#DIGITALOUTPUTCODE:n=3#ADCresolutionvd=((va-fs_n)/(fs_p-fs_n))*(2**n)#Transferfunctionvd=(vd).astype(int)#outputcodeplt.plot(va,vd,'.b')plt.plot(va,vd,'-g')plt.xlabel('Va(Analoginput)')plt.ylabel('Vd(Outputcode)')plt.show()plt.grid()

Aquíestálasalida:

    
pregunta user164567

4 respuestas

1

atomant: La pregunta sobre \ $ 2 ^ N \ $ o \ $ 2 ^ N-1 \ $ en la fórmula de conversión, 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). Vea mi respuesta en (la discusión es de 3 bits, por lo que debe adaptarla a 16 bits):

enlace

EDIT 1:

Respondiendo a su edición sobre qué gráfico representa el error de cuantificación "menor", digo, de acuerdo con mi publicación: No hay dos gráficos, solo uno. El uso de los factores \ $ 2 ^ N \ $ o \ $ 2 ^ N-1 \ $ depende de la interpretación del Voltaje de escala completa (FS) y del Voltaje de referencia (Vref). Ambos conducen a la misma fórmula de conversión. Repito aquí un tratamiento similar que utilicé en mi otra respuesta (por favor, revísela con más cuidado), simplemente adaptándolo a "dos referencias" ADC, en lugar de "referencia única" ADC: Por motivos de simplicidad, considere un ADC de "dos referencias" de 3 bits con función de transferencia (incluido un factor \ $ 2 ^ N-1 \ $): $$ V_d = int (\ frac {V_a-V_ {FS -}} {V_ {FS +} - V_ {FS -}} \ times7) $$

Los \ $ V_ {FS +} \ $ y \ $ V_ {FS -} \ $ son los voltajes de escala completa positivos y negativos. Aplicando la definición de la función int () :

$$ V_d \ leq (\ frac {V_a-V_ {FS -}} {V_ {FS +} - V_ {FS -}} \ times7) < V_d + 1 $$

o

$$ \ frac {(V_ {FS +} - V_ {FS -}) \ times V_d} {7} + V_ {FS-} \ leq V_a < \ frac {(V_ {FS +} - V_ {FS -}) \ times (V_d + 1)} {7} + V_ {FS-} $$

¿Cómo \ $ V_ {REF +} \ $ y \ $ V_ {REF -} \ $ están relacionados con \ $ V_ {FS +} \ $ y \ $ V_ {FS -} \ $? Tenga en cuenta que los valores más bajos de \ $ V_a \ Rightarrow V_ {REF -} \ $ y superiores \ $ V_a \ Rightarrow V_ {REF +} \ $. Reemplazando \ $ V_d \ $ igual a 000 y 111 en estos dos casos:

$$ V_ {REF +} = (V_ {FS +} - V_ {FS -}) \ times \ frac {8} {7} + V_ {FS-} $$ $$ V_ {REF -} = V_ {FS-} $$

Restando estas expresiones y aislando:

$$ V_ {FS +} - V_ {FS -} = \ frac {7} {8} \ times (V_ {REF +} - V_ {REF -}) $$ Devolviendo estos valores a la función de transferencia original:

$$ V_d = int (\ frac {V_a-V_ {REF -}} {V_ {REF +} - V_ {REF -}} \ times8) $$

Este formulario es la expresión que se encuentra regularmente en las hojas de datos de ADC. Hay una cuestión de confusión con \ $ V_ {REF} \ $ y \ $ V_ {FS} \ $. Proceder de manera similar:

$$ \ frac {(V_ {REF +} - V_ {REF -}) \ times V_d} {8} + V_ {REF-} \ leq V_a < \ frac {(V_ {REF +} - V_ {REF -}) \ times (V_d + 1)} {8} + V_ {REF-} $$

Si \ $ V_ {REF -} \ $ = -10 V y \ $ V_ {REF +} \ $ = +10 V, entonces:

1 LSB = \ $ \ frac {V_ {REF +} - V_ {REF -}} {8} \ $ = 2.5 V

\ $ V_d \ $ = 000, corresponde a \ $ V_a \ $ = -10 V

\ $ V_d \ $ = 111, corresponde a \ $ V_a \ $ = \ $ \ frac {7} {8} \ veces (V_ {REF +} - V_ {REF -}) + V_ {REF -} \ $ = +7.5 V

\ $ V_ {FS -} \ $ = -10 V

\ $ V_ {FS +} \ $ = +7.5 V

El gráfico resultante (función de transferencia):

EDIT2:

RespondiendosunuevapreguntasobreelgráficoenPython.Comodijeantes,nohaydosfuncionesdetransferencia,solouna.Además,sólounafórmula.Elfactorqueinvolucraa\$2^N-1\$tienelaforma(quereemplazalosvalorescalculadosmásarriba):

$$V_d=int(\frac{V_a-V_{FS-}}{V_{FS+}-V_{FS-}}\times7)=int(\frac{V_a+10}{17.5}\times7)$$Queinvolucre\$2^N\$factortienelaforma:$$V_d=int(\frac{V_a-V_{REF-}}{V_{REF+}-V_{REF-}}\times8)=int(\frac{V_a+10}{20}\times8)$$

Tengaencuentaque7/17.5=8/20.Además,\$V_{FS+}\$marcalaúltimatransiciónperceptible.Noesposiblemedircuandoseproduceunatransicióna\$V_{REF+}\$(loidealseríaquesucedieracon\$Vd\$=1000(unvalorde4bitsimposible).Veamiotrarespuesta(enlacearriba)quediscuteunbitde3ADCteóricode"referencia única" sin compensación de entrada de 0,5 LSB (para simplificar).

    
respondido por el Dirceu Rodrigues Jr
2

1) Es probable que los errores de compensación y ganancia sean mayores que la diferencia entre 65535 y 65534. Es posible que ni siquiera veas ninguno de esos con el voltaje de entrada preciso.

2) Es probable que el error de desplazamiento sea mayor que la diferencia entre 32767 y 32768. Es posible que ni siquiera veas ninguno de esos con el voltaje de entrada preciso.

3) Es probable que el error de ganancia sea mayor que la diferencia entre 20V / 65536 y 20V / 65535. Es posible que la resolución no sea exactamente una de esas cifras.

Si tiene un ADC teórico, estas preguntas son fáciles de responder consultando las definiciones en el modelo. Si tiene un ADC real, debe leer las especificaciones cuidadosamente, ver cómo se definen los términos para ese número de pieza y ver qué distribución de valores puede esperar para una entrada cero, una entrada de escala completa, etc.

Una vez que te hayas vinculado a una parte específica con especificaciones publicadas, podemos completar las cifras adecuadas en lugar de usar frases vagas como "probablemente sea más grande".

    
respondido por el Neil_UK
1
  

1-) Si el ADC muestrea un voltaje de +9 999V, se registrará como 65535   o 65534?

Ninguno. Suponiendo que te refieres a 9.999000 voltios, probablemente se registrará como 65532, que es nominalmente 9.999084.

  

2-) ¿Qué tal 32767 y 32768? ¿Ambos representan VO? Parece   me 32767 se registra si el voltaje está entre -20 / 2 ^ 16V y 0V; y   Se registra 32768 si el voltaje está entre + 20/2 ^ 16V y 0V. Es   que correcto. Si es así significa que para 0V hay dos pasos diferentes a otros   lecturas de voltaje.

Esta es en realidad una pregunta más fundamental que solo un ADC. Cualquier ADC con un número par de estados que sea simétrico alrededor de cero tendrá dos salidas más cercanas a cero: una positiva y la otra negativa. En las representaciones binarias que intentan tratar los números bipolares tomando un número sin signo, tratándolo como positivo y luego agregando un bit de signo, inevitablemente se producirá +0 y -0. Esto no es remotamente útil. Two-complement toma sus códigos ADC, agrega uno e invierte el signo. Esto produce un cero único (& h0000), mientras produce un rango asimétrico. Los números negativos van desde 8FFF a FFFF, mientras que los números positivos (no cero) van desde 0001 a 7FFF. En otras palabras, hay un número negativo más que positivo.

En su caso, como se indica, NO hay cero. Sólo hay los dos números más cercanos. 32767 será nominalmente -0.000153, mientras que 32768 será 0.000153. Si desea representar un cero "real", debe compensar el negativo de ADC en .000153 para obtener 8000. Esto se denomina binario de compensación. Algunos ADC invertirán el MSB para obtener 0000 a cero voltios, y esto se llama binario de compensación complementaria (COB). Tales codificaciones de salida requieren un ajuste cuidadoso de la ganancia y el desplazamiento.

  

3-) ¿La resolución es 20V216 o 20V216−1?

Técnicamente, la resolución es 20 / ((2 ^ 16) -1). Esta es la separación entre cada salida distinta (suponiendo un ADC ideal). Confundir la primera opción con la segunda se denomina "error de poste de cerca".

    
respondido por el WhatRoughBeast
0

Para darle una respuesta directa, el esquema numérico que describe es offset binary . La matemática es clara. Normalmente, 0x0000 es -FS y 0x0001 es -FS + 1LSB. 0x8000 (es decir, 1000000000000000) corresponde a cero, y 0x8001 a +1 LSB. Esto hace que 0xFFFF + FS - 1LSB.

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas