279
Proyectos de sistemas digitales
6.7. Voltímetro digital Diseñe un voltímetro digital que reciba una señal analógica de entrada comprendida entre 0 y 5V, y represente dicho valor en dos visualizadores de 7 segmentos, con una precisión de décima de voltio.
6.7.1. Diagrama de bloques La solución del problema la hemos dividido en cuatro bloques representados en la figura figura 6.30. Un primer bloque se encargará de la conversión de la señal señal analógica en valores valores digitales. El valor digital obtenido, una vez convertido al formato adecuado mediante un bloque codificador binario a BCD y multiplexado, pasará a un bloque de visualización donde se mostrará el valor de tensión en dos visualizadores de siete segmentos. segmentos. Para controlar las señales de los bloques anteriores y realizar la multiplexación del dato a visualizar, utilizaremos un circuito de control implementado en una GAL22V 10. 10. CLK RST D_OUT [3..0] DB[7..0]
V in
Bloque Conversor
RD
DEC [3..0] [3..0] Codificador UNI [3..0] [3..0] Bloque de Binario Control OE a BCD (GAL22V 10) 10)
Bloque de Visualización SEL_U
WR INTR
SEL_D
FIGURA 6.30. Diagrama de bloques del voltímetro digital.
6.7.2. Conversor A/D CS, / WR WR El conversor utilizado, el ADC 0804, 0804, posee tres entradas de control, / CS RD y una salida / INTR, que facilitan su interconexión con un microprocesador, y / figura 6.31. En la solución que planteamos, la interconexión se realizará con la GAL22V 10 10 como circuito de control.
280
Aplicaciones y problemas de electrónica digital
RD WR
2 3 1
150pF
10k Ω
19 4
V in
+5V
ADC 0804
RD
VCC
20
DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
18 17 16 15 14 13 12 11
WR CS CLKR CLKIN
6 7
VIN+ VIN-
8 9
AGND VREF /2
10
DGND
DB[7..0]
INTR
5
INTR
FIGURA 6.31. Conversor ADC 0804.
La señal / CS es la de habilitación del conversor. En nuestro caso y por simplicidad, hemos conectado dicha entrada directamente a tierra. La señal / WR indica el inicio de una nueva conversión. La señal de salida INTR / nos indica cuándo se ha producido el final de la conversión y existe un nuevo dato disponible. Por último, la señal / RD permite leer el último dato convertido. La figura 6.32 muestra el cronograma de funcionamiento del conversor. El proceso de conversión A/D comienza cuando la señal / WR pasa al nivel bajo (1), momento en el cual la señal / INTR pasa al nivel alto, indicando que se ha iniciado el proceso de conversión y, por tanto, que todavía no hay disponible un dato a la salida. El inicio propiamente dicho de la conversión se produce cuando la señal / WR pasa de nuevo al nivel alto (2). Transcurrido un tiempo de conversión T conv, INTR pasa al nivel bajo, indicando que hay un nuevo dato convertido. la señal / La lectura del dato se lleva a cabo mediante la activación de la señal / RD. Mientras ésta permanece en nivel alto, la salida del conversor se encuentra en alta impedancia. Teniendo en cuenta que durante el proceso de conversión el valor RD permite poner dichas salidas en digital de salida no es el correcto, esta señal / alta impedancia hasta alcanzar el final de la conversión. En el instante en que / RD pasa al nivel bajo, se produce una habilitación de registro paralelo-paralelo interno (4), y en consecuencia se obtiene a la salida el INTR pasa al nivel alto (3), indicando que se dato convertido. A su vez, la señal / ha procedido a leer el dato del conversor. Al desactivar RD / la salida del conversor vuelve a alta impedancia (5).
281
Proyectos de sistemas digitales
/ WR (1)
(2)
/ INTR T conv
(3)
/ RD (5)
(4) DB[0..7]
DATO
FIGURA 6.32. Cronograma de control del conversor.
El ADC 0804 es un conversor de aproximaciones sucesivas que requiere de una señal de reloj para su funcionamiento. El propio conversor dispone de un circuito generador de reloj, cuya frecuencia de oscilación viene fijada por una resistencia y un condensador externos. Para nuestra aplicación, donde la velocidad de adquisición no es crítica, se ha elegido una frecuencia de 640kHz, dada por un valor de resistencia de 10k Ω y un condensador de 150pF, tal y como se representa en la figura 6.31. La tensión fondo de escala, es decir, aquella tensión analógica de entrada para la cual se obtiene el máximo código de salida (FFh), viene fijada por una tensión de referencia (V REF /2), que se introduce externamente al conversor. Si dejamos al aire este pin de entrada del conversor, como es nuestro caso, el conversor entiende que la tensión de referencia es la tensión de alimentación. De esta forma obtendremos un código digital FFh para una tensión de entrada de 5V. El ADC 0804 posee un modo de funcionamiento denominado free-running, que permite que el conversor esté continuamente convirtiendo. Para ello, basta INTR de salida a la entrada / WR. Dicha opción sería válida con conectar la señal / para la aplicación que presentamos, donde no es necesario conocer con precisión el periodo de muestreo. La solución que se va a presentar consiste en el control de dichas señales por parte de la GAL. Esta opción presenta como ventaja una mayor versatilidad a la hora de poder reaprovechar el diseño para otras aplicaciones donde se requiera conocer con precisión la frecuencia de muestreo.
6.7.3. Codificador binario a BCD El resultado proporcionado por el conversor no puede visualizarse directamente en los visualizadores de siete segmentos; es necesario realizar una conversión de código binario a BCD. Para ello, vamos a generar una tabla de conversión almacenada en una memoria EPROM (27C 256), lo que denominaremos LUT (look-up table). El dato binario proporcionado por el
282
Aplicaciones y problemas de electrónica digital
conversor se conectará al bus de direcciones de la memoria, una vez ha sido registrado por un registro 74 HC 573. Dicho dato servirá para seleccionar el código de salida a representar en los visualizadores de siete segmentos, que saldrá por el bus de datos de la EPROM. En la figura 6.33 se ha representado el esquemático del conversor ADC 0804 junto con la EPROM y el registro paralelo/paralelo (74 HC 573), necesario para evitar que mientras el conversor se encuentra en proceso de conversión, la dirección de la EPROM varíe y, en consecuencia, se visualicen datos erróneos. Este registro se habilita con la señal OE generada por el bloque de control, una INTR. vez se ha activado la señal /
/RD /WR
2 3 1
150pF 10k Ω V in
19 4
+5V
ADC 0804 RD
VCC
20
DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
18 17 16 15 14 13 12 11
WR CS CLKR CLKIN
6 7
VIN+ VIN-
8 9
AGND VREF /2
10 DGND
INTR
5
+5V
74 HC 573 2 3 4 5 6 7 8 9 1
1D 2D 3D 4D 5D 6D 7D 8D OE 10 GND
VCC 1Q 2Q 3Q 4Q 5Q 6Q 7Q 8Q C
20 19 18 17 16 15 14 13 12 11
/INTR
27C 256 10 9 8 7 6 5 4 3 25 24 21 23 2 25 27 14
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 GND
VCC DQ1 DQ2 DQ3 DQ4 DQ5 DQ6 DQ7 DQ8
+5V 28 11 12 13 15 16 17 18 19
+5V Vpp CE OE
DEC UNI
1 20 22
OE
FIGURA 6.33. Conversor A/D junto con bloque codificador.
La memoria EPROM almacena los datos representados en la tabla 6.4, comenzando desde la dirección 0000h y terminando en la 00FFh, es decir, los 256 posibles valores dados por el conversor A/D. Dicha memoria tiene una longitud de palabra de 8 bits, de forma que hemos almacenado en la parte baja del byte el valor correspondiente a la décima de voltio ( DEC ), mientras que la parte alta almacena el valor de las unidades ( UNI ). Como es lógico, al tener que representar únicamente 51 valores distintos, y disponer de 256 posiciones de almacenamiento, existirán varios bytes consecutivos de la memoria con el mismo código de salida. La tabla de conversión se obtiene mediante la siguiente ecuación: x( n) =
5,0 255
⋅n
283
Proyectos de sistemas digitales
siendo n la dirección de la memoria EPROM y x el contenido en esa dirección. El valor x(n) se ha truncado a un decimal, ya que el módulo visualizador tan solo dispone de dos visualizadores de siete segmentos: uno correspondiente a las unidades y otro a las décimas de voltio. 0000h
00
00
00
00
00
00
01
01
01
01
01
02
02
02
02
02
0010h
03
03
03
03
03
04
04
04
04
04
05
05
05
05
05
06
0020h
06
06
06
06
07
07
07
07
07
08
08
08
08
08
09
09
0030h
09
09
09
09
10
10
10
10
10
11
11
11
11
11
12
12
0040h
12
12
12
13
13
13
13
13
14
14
14
14
14
15
15
15
0050h
15
15
16
16
16
16
16
17
17
17
17
17
18
18
18
18
0060h
18
19
19
19
19
19
19
20
20
20
20
20
21
21
21
21
0070h
21
22
22
22
22
22
23
23
23
23
23
24
24
24
24
24
0080h
25
25
25
25
25
26
26
26
26
26
27
27
27
27
27
28
0090h
28
28
28
28
29
29
29
29
29
29
30
30
30
30
30
31
00A0h
31
31
31
31
32
32
32
32
32
33
33
33
33
33
34
34
00B0h
34
34
34
35
35
35
35
35
36
36
36
36
36
37
37
37
00C0h
37
37
38
38
38
38
38
39
39
39
39
39
39
40
40
40
000Dh
40
40
41
41
41
41
41
42
42
42
42
42
43
43
43
43
00E0h
43
44
44
44
44
44
45
45
45
45
45
46
46
46
46
46
00F0h
47
47
47
47
47
48
48
48
48
48
49
49
49
49
49
50
TABLA 6.4. Tabla de conversión almacenada en la EPROM.
6.7.4. Bloque de visualización Antes de tratar el bloque de control implementado en la GAL22V 10, vamos a estudiar el bloque de visualización, de modo que tengamos claro las funciones que debe llevar a cabo la citada GAL. Al bloque de visualización le llega un dato en código BCD y dos señales que indican si dicho código debe mostrarse en el visualizador de unidades (SEL_U ) o décimas de voltio (SEL_D). Se ha utilizado un único decodificador con objeto de ahorrar componentes. Ello implica la necesidad de multiplexar las entradas de datos y de utilizar las dos señales de control antes mencionadas.
284
Aplicaciones y problemas de electrónica digital Visualizadores 7 segmentos cátodo común
74 LS49 D_OUT 0
A
D_OUT 1
B
D_OUT 2
C
D_OUT 3
D
R a b c d e f g R’
SEL_U SEL_D
+5V
FIGURA 6.34. Bloque de visualización.
El núcleo fundamental lo constituyen dos visualizadores de siete segmentos en configuración cátodo común. Para mostrar el código BCD en cualquiera de dichos visualizadores es necesario un decodificador BCD a 7 segmentos. Teniendo en cuenta la configuración cátodo común de éstos, será necesario seleccionar uno cuyas salidas sean activas en nivel alto, por ejemplo, el 74 LS49. La configuración se completa con dos transistores NPN que conectarán o desconectarán el cátodo de cada visualizador a tierra. Como sólo recibimos un código BCD, sólo es necesario un decodificador BCD a 7 segmentos, siendo las señales SEL_U y SEL_D las que deciden en cual de los dos visualizadores se visualizará el código BCD. Dichas señales son exclusivas en el sentido que únicamente una de ellas se encuentra habilitada en cada instante. La señal que se encuentre activa saturará el transistor correspondiente, lo que permitirá el paso de corriente por los LEDs que constituyen el visualizador, y en consecuencia, la iluminación del número. Dichas señales se irán alternando de forma que se visualizarán las décimas, luego las unidades, de nuevo las décimas, y así sucesivamente. En cada instante sólo hay un visualizador mostrando un dígito, pero si este proceso se hace lo suficientemente rápido, por ejemplo, 100Hz, la impresión visual que obtendremos es que ambos visualizadores se encuentran iluminados a la vez. Con objeto de limitar la corriente que circula por los LEDs de los visualizadores se han colocado resistencias a la salida del decodificador.
285
Proyectos de sistemas digitales
6.7.5. Bloque de control El bloque de control tiene básicamente tres funciones fundamentales que realizar: el control del conversor A/D, la carga en el registro del bloque de codificación del dato convertido y la multiplexación del dato proporcionado por dicho bloque para su visualización. Respecto al control del conversor, éste se lleva a cabo mediante las señales /WR, /RD y /INTR, tal y como ya hemos mencionado anteriormente. La carga del registro paralelo-paralelo se lleva a cabo mediante la activación de la señal OE. Por último, el bloque de visualización necesita del dato multiplexado a representar denominado D_OUT, y las señales de multiplexado SEL_U y SEL_D. Este bloque de control se ha implementado en una GAL22V 10, cuya codificación ABEL se ha estructurado en torno a una máquina de estados de tres estados. En el primero de ellos ( INI ) da comienzo el proceso de conversión, poniendo tanto la señal nWR como OE en nivel bajo. Posteriormente, tenemos un estado (CONV ), donde se pone en nivel alto la señal nWR, dando comienzo el proceso de conversión. Una vez que estando en dicho estado se activa la señal nINTR, pasamos al último estado ( FIN ), donde habilitamos tanto la señal nRD para la lectura del conversor, como la señal OE para la habilitación del registro paralelo-paralelo (figura 6.35). CLK nWR nINTR OE nRD SEL_U SEL_D ESTADO
INI
CONV
FIN
INI
CONV
FIN
FIGURA 6.35. Cronograma de activación de las señales de la GAL.
286
Aplicaciones y problemas de electrónica digital
La visualización del resultado de la conversión en los visualizadores de siete segmentos se hace de forma alterna, tal y como hemos explicado anteriormente, y llevada a cabo según el siguiente código: SEL_D := !SEL_D; SEL_U := SEL_D; when (SEL_D==1) then D_OUT = D_DEC; else D_OUT = D_UNI;
Las ecuaciones en ABEL se representan en la figura 6.36, donde se han codificado los estados de forma que las variables de estado ( nWR y OE ) coinciden con salidas de control. module voltímetro title 'voltímetro digital'; volt device 'p22v10'; " Entradas CLK, RST D0,D1,D2,D3 D4,D5,D6,D7 nINTR
pin pin pin pin
1,2; 3,4,5,6; 7,8,9,10; 11;
" Salidas Y0,Y1,Y2,Y3 OE,nWR,nRD SEL_D,SEL_U
pin pin pin
22,21,20,19; 23,17,16; 15,14;
" Definiciones D_DEC D_UNI D_OUT ESTADO INI CONV FIN XXX
= = = = = = = =
[D3,D2,D1,D0]; [D7,D6,D5,D4]; [Y3,Y2,Y1,Y0]; [nWR, OE]; [0, 0]; [1, 0]; [1, 1]; [0, 1];
state_diagram ESTADO state INI: goto CONV; state CONV: if (nINTR==0) then FIN else CONV; state FIN: goto INI; state XXX: goto INI; equations nRD = !OE; SEL_D := !SEL_D; SEL_U := SEL_D; when (SEL_D==1) then D_OUT = D_DEC;
287
Proyectos de sistemas digitales else D_OUT = D_UNI; nWR.clk = CLK; nWR.re = RST;
OE.clk = CLK; OE.re = RST;
SEL_U.clk = CLK; SEL_U.re = RST;
SEL_D.clk = CLK; SEL_D.re = RST;
end voltímetro;
FIGURA 6.36. Listado ABEL del voltímetro digital.
6.7.6. Consideraciones temporales Como ya se comentó en la introducción del capítulo 5, la frecuencia de muestreo de una señal analógica para su conversión a digital debe verificar el teorema de muestreo. En esta aplicación que presentamos de diseño de un voltímetro digital, donde un observador lee la tensión en cada instante, la frecuencia de variación de la señal analógica a medir (y, en consecuencia, la frecuencia de muestreo) no puede ser muy alta, puesto que el ojo no será capaz de seguir dichas variaciones (los visualizadores de 7 segmentos cambiarán muy rápidamente, de forma que el ojo, al integrar dichas variaciones, percibiría un resultado ininteligible). Por otra parte, y debido al multiplexado del dato en los visualizadores, la frecuencia de refresco debe ser suficientemente alta como para que no se perciba el parpadeo de los mismos. Como ya hemos comentado anteriormente, una frecuencia de refresco de 100Hz sería más que suficiente. Por tanto, y teniendo presente que hay dos visualizadores, se elige una f CLK de 200Hz para el bloque de control. La tabla 6.5 representa los parámetros temporales del conversor utilizado. Símbolo
Parámetro
Mín
Máx
Uni
f CLK
Frecuencia de reloj
100
800
kHz
T conv
Tiempo de conversión
62
73
TCLK
t W
Anchura del pulso / WR
100
t acc
Tiempo de acceso
200
ns
t 1h , t 0h
Retraso Hi-Z
250
ns
t W , I t RI
Retraso en deshab. / INTR
450
ns
ns
TABLA 6.5. Parámetros temporales del conversor.
288
Aplicaciones y problemas de electrónica digital / WR t W
/ INTR t WI
T conv
t RI
/ RD DB[0..7]
DATO t acc t 1h ,t 0h
FIGURA 6.37. Cronograma de control del conversor.
Analizando los parámetros temporales de la tabla 6.5, correspondientes a las señales del conversor representadas en la figura 6.37, comprobamos que la máquina de estados requiere un único ciclo CONV . Recordemos que el tiempo de conversión máximo T convmax, viene expresado en periodos del reloj interno del conversor, fijado por el circuito RC de la figura 6.33. Como ya se comentó anteriormente, los valores de R y C elegidos proporcionan una frecuencia de 640kHz, de forma que tenemos: T convmax
= 73 ⋅
1 640kH z
= 114 µ s
Si se utiliza un reloj de mayor frecuencia, la conversión duraría más de un ciclo CONV , por ello se ha establecido la condición de salto al estado FIN en función de la señal nINTR.