Interfaz A/D por puerto paralelo
<keywords content="TTL 74Ls164N, electronica, circuito, pic, NE555, PIC BASIC, PIC SIMULATOR IDE, esquema, circuito impreso, proyecto, gratis, download, programa, CMOS, pin, e/s, i/o, ucontrol, PIC, 16F628a, 16f84a" /> <center>
| Inicio | Foro | Revista uControl | Circuiteca | Microcontroladores | Electrónica Básica | Herramientas y Software | Tutoriales | Colaboradores | Enlaces |
|
¿Ya descargaste los ejemplares GRATUITOS de la Revista uControl? ¡No te los pierdas!. | |||||||||
|
wikipage=Dado electrónico con PIC
tooltip=Dado electrónico con PIC
img_src=Image:dado100.jpg
img_width=150px
img_alt=Dado electrónico con PIC
</linkedimage> |
wikipage=Como trucar un servo
tooltip=Como trucar un servo
img_src=Image:trucaservo150.jpg
img_width=150px
img_alt=Como trucar un servo
</linkedimage> |
wikipage=Comunicación inalámbrica entre PICs
tooltip=Comunicación inalámbrica entre PICs
img_src=Image:TXRX150.jpg
img_width=150px
img_alt=Comunicación inalámbrica entre PICs
</linkedimage> |
wikipage=CCS - Libreria de gráficos para GLCD K0108
tooltip=CCS - Libreria de gráficos para GLCD K0108
img_src=Image:GLCD-100.gif
img_width=150px
img_alt=CCS - Libreria de gráficos para GLCD K0108
</linkedimage> |
wikipage=Funcionamiento de una matriz de LEDs
tooltip=Funcionamiento de una matriz de LEDs
img_src=Image:GNUxx.jpg
img_width=150px
img_alt=Funcionamiento de una matriz de LEDs
</linkedimage> |
![]() |
Todos los articulos y proyectos de uControl tienen su lugar en el foro. Si tienes dudas o comentarios, busca o crea el hilo correspondiente, y tendrás una rapida respuesta.
|
![]() |
|
Construye tu propia interfaz Analógico/Digital para tu ordenador (por puerto paralelo).
| ||||||||||
IntroducciónNo resulta muy complicado hacer que nuestro ordenador sea capaz de “percibir” el mundo real mediante el uso de los puertos serie o paralelo. Estos puertos, originalmente pensados para la comunicación con una impresora o un mouse, pueden ser utilizados para otros fines, con resultados muchas veces sorprendentes.
IntroducciónEn este documento veremos la forma en que un ordenador es capaz de obtener datos de su entorno, e interactuar con él. Aprenderemos lo básico sobre el puerto paralelo, desde el punto de vista del hardware y el software, para luego construir un circuito práctico. Concretamente, abordaremos la construcción de un conversor analógico digital, basado en el popular circuito integrado ADC0804 de National Semiconductor.
Conversión analógico/digitalEl proceso de transformar una señal analógica en una serie de ceros y unos que la representen recibe el nombre de conversión analógico/digital o "A/D". Esta transformación puede ser más o menos exacta, dependiendo de la cantidad de dígitos binarios que se usen para representar al valor medido. Valores de 5, 8 o 12 bits son los usuales, pero en realidad no hay limitaciones teóricas que determinen un número máximo de bits por muestra. Cuando mayor sea la cantidad de bits empleada, mayor será la "resolución" del conversor. Existen dos tipos básicos de conversores, si los clasificamos según la forma en que entregan los datos digitalizados: Seriales y paralelos. Los conversores seriales tienen menos cantidad de pines, ya que leemos los bits del valor medido de uno en uno, por un solo pin. La computadora debería ir enviando pulsos de reloj a una determinada velocidad por un pin del circuito integrado, y en otro irían apareciendo los datos medidos. Este sistema permite realizar plaquetas con menor cantidad de pistas, o poner los sensores mas lejos de ellas (las formas seriales de comunicación tienen menos problemas cuando los cableados son muy extensos) Un conversor paralelo dispone de un pin por cada bit del valor digitalizado, por lo que es posible leer de una sola vez lo que estamos midiendo. Cada uno de estos sistemas tiene sus ventajas y desventajas. Como nos interesa mantener simple el software necesario para interrogar al conversor, y asumimos que la placa estará cerca de la PC, hemos elegido un chip que efectúa la digitalización y luego presenta los datos en paralelo: el ADC0804. El circuitoEl circuito que construiremos nos permitirá leer por el puerto paralelo de la PC un numero entre 0 y 255, correspondientes a 0 y 5 voltios respectivamente. Permite la conexión de varios tipos de sensores en su entrada, como por ejemplo un LM335 que transforma temperaturas en tensión, un MPX2200AP que lee humedad relativa ambiente, etc. Para no complicar o encarecer el montaje, reemplazaremos estos sensores por una resistencia variable (potenciómetro) de 100k, lo que nos permitirá hacer pruebas con la placa. El circuito es bien simple. Consta del circuito integrado ADC0804 encargado de la conversión en si misma, una resistencia y un capacitor que fijan la velocidad de la conversión, y el potenciómetro que hará las veces de sensor. Para montar todo construiremos una plaqueta de circuito impreso según los pasos explicados en uControl, o bien utilizaremos una placa para prototipos que ya vienen agujereadas y con las pistas impresas (solo hay que hacer una serie de puentes). También necesitaremos una fuente de 5 volts de corriente continua. Utilizaremos una ficha DB25 y un trozo de cable de datos de al menos 12 hilos, que puede ser aprovechado de algún cable de impresora en desuso.
![]() Esquema eléctrico. También figura el conexionado de la ficha DB25 y el cable soldado entre el negativo de la placa y algún pin de masa del puerto de la PC
ConstrucciónUna vez que tengamos el circuito impreso listo, procederemos a soldar sobre el los componentes. La resistencia de 10k y el capacitor será lo primero que fijemos, cortando luego el pedazo sobrante de sus terminales. El circuito integrado puede soldarse directamente o utilizar un zócalo (esto puede facilitar el recambio del chip en caso de necesidad). Si no utilizamos un zócalo, nos conviene esperar unos segundos entre la soldadura de un pin y el siguiente, para darle tiempo a que el chip se enfríe entre soldaduras. Por ultimo, soldaremos un extremo del cable a la placa de circuito impreso y el otro la ficha DB25, teniendo cuidado de respetar los números del esquema eléctrico (los cables deberían ser de diferentes colores, así que no hay como equivocarse). No debemos olvidar soldar un cablecito entre el negativo de la placa de circuito impreso y el pin 18 de la ficha DB25, para que las masas de la PC y de nuestro proyecto estén igualadas.
![]() Este es el trazado de las pistas del circuito impreso.
![]() En la foto vemos la placa con los componentes ya montados.
ComponentesSolo necesitamos unos pocos elementos para este proyecto:
El softwareAlgoritmo a emplearDesde el punto de vista del software, debemos construir un programa que sea capaz de poner en los pines 1,2 y 3 del chip ADC0804 en los estados adecuados para realizar la conversión, y luego leer en pines 11 al 18 los datos generados. El siguiente diagrama de flujo ilustra los pasos a seguir:
![]()
El código fuenteEl siguiente programa en Visual Basic 6.0 se ajusta al diagrama de flujo mostrado. Esta comentado como para que no nos queden dudas de que hace en cada momento. También podemos ver el formulario en que se ejecuta este programa. Necesitaremos también la librería “IO.DLL” que es la que permite a VB manejar el puerto paralelo tanto en Windows 98 como en Windows XP. Esta librería debe ser copiada a la carpeta “system” o “system32” que esta dentro de “Windows”. Esta librería esta dentro del archivo RAR que contiene el fuente y ejecutable del soft. Es freeware y la encontrarás rápidamente con Google.
'variable que contiene la dirección base del puerto
Private DIR_PUERTO As Integer
'
'Declaración de funciones:
'Lee un bit de uno de los registros del puerto
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
'
'Verifique que la librería IO este cargada en memoria
Private Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean
'
'Pone en 1 un bit de uno de los registros del puerto
Private Declare Function SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
'
'Cambia el estado de un bit de uno de los registros del puerto
Private Declare Function NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
'
'Pone en 0 un bit de uno de los registros del puerto
Private Declare Function ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
'
'
Private Sub Form_Load()
'Veo si cargo el driver
If IsDriverInstalled() = True Then
DIR_PUERTO = &H378
Else
MsgBox "Driver no instalado.", vbInformation + vbOKOnly + vbSystemModal, "Problemas!"
End
End If
End Sub
'
Private Sub LeerP_Click()
'Limpio el estado del puerto
For X = 0 To 7 Step 1
aux = SetPortBit(DIR_PUERTO, X)
aux = ClrPortBit(DIR_PUERTO, X)
Next
'
'Configuro el puerto paralelo como entrada
'poniendo el BIT 5 del port de control en 1
aux = SetPortBit(DIR_PUERTO + 2, 5)
'
'--- Ordeno la conversion A/D----
'Pongo WR (pin 3 del chip) bajo: C2=0 (pin 16 del LPT)
aux = SetPortBit(DIR_PUERTO + 2, 2)
'
'Espero al menos 100 ns
For X = 0 To 100000
Next
'
'Pongo WR (pin 3 del chip) en alto: C2=1 (pin 16 LPT)
aux = ClrPortBit(DIR_PUERTO + 2, 2)
'Leo y muestro Bits de control
For X = 0 To 7 Step 1
If GetPortBit(DIR_PUERTO + 2, X) = True Then
Text3(X).Text = CStr(1)
Else
Text3(X).Text = CStr(0)
End If
Next
'
'Le doy tiempo a que INTR (pin 5 del chip) se ponga en alto
'Espero al menos 100 ns
For X = 0 To 100000
Next
'
'Pongo RD (pin 2 del chip) en bajo: C3=1 (pin 1 LPT)
aux = ClrPortBit(DIR_PUERTO + 2, 3)
'
'Espera al menos 200 ns
For X = 0 To 200000
Next
'
'Leo los 8 bits del puerto (datos y control)
ValorD = 0
For X = 0 To 7 Step 1
'Bits de datos
If GetPortBit(DIR_PUERTO, X) = True Then
Text1(X).Text = CStr(1)
ValorD = ValorD + 2 ^ (7 - X)
Else
Text1(X).Text = CStr(0)
End If
'
'Bits de control
If GetPortBit(DIR_PUERTO + 2, X) = True Then
Text3(X).Text = CStr(1)
Else
Text3(X).Text = CStr(0)
End If
'
Next X
'
'Calculo el valor porcentual, etc
ValorP = ValorD / 256 * 100
ValorV = ValorD / 256 * 5
'
End Sub
'
'
Private Sub LimpiarP_Click()
'Limpio el estado del puerto
aux = ClrPortBit(DIR_PUERTO + 2, 5)
'
For X = 0 To 7 Step 1
aux = SetPortBit(DIR_PUERTO, X)
aux = ClrPortBit(DIR_PUERTO, X)
aux = ClrPortBit(DIR_PUERTO + 2, X)
Next
'
'Leo los 8 bits del puerto
ValorD = 0
For X = 0 To 7 Step 1
'Bits de datos
If GetPortBit(DIR_PUERTO, X) = True Then
Text1(X).Text = CStr(1)
ValorD = ValorD + 2 ^ X
Else
Text1(X).Text = CStr(0)
End If
'Bits de control
'
If GetPortBit(DIR_PUERTO + 2, X) = True Then
Text3(X).Text = CStr(1)
Else
Text3(X).Text = CStr(0)
End If
'
'
Next
End Sub
![]() Formulario en que se ejecuta el código VB. El boton “Leer Puerto” es el que lee el valor digitalizado.
AplicacionesMuy bien: ya leímos este artículo, construimos la plaqueta y el software, y vemos que cuando variamos la posición del cursor y presionamos el botón “leer puerto” aparece un valor en la pantalla. Eso es todo? No! Lo interesante de este proyecto es reemplazar el potenciómetro por un sensor, por ejemplo, que “lea” la temperatura ambiente. Pueden usar el LM35 o alguno similar y ver que pasa. Es muy importante animarnos a modificar estos circuitos sencillos para ir aprendiendo. Eso si, recordemos que un error en la placa puede terminar con la salud de nuestro puerto paralelo.
Apéndices:Resolución del conversor A/D, y métodos de conversiónCuando se lleva a cabo la discretizacion de la señal analógica, el circuito encargado de dicha tarea realiza internamente aproximaciones sucesivas hasta llegar al valor correcto. La precisión teórica de este valor esta dado por la cantidad de bits que se generan en la salida. Cuando mayor es el numero de bits, mayor la preedición. La cantidad de valores diferentes que puede discriminar el conversor se obtiene elevando 2 al numero de bits implicados (2^Nro. de bits). Si tomamos como ejemplo un conversor A/D de 12 bits, y una señal de entrada que varíe entre 0 y 4 volts, podríamos discernir 2^12 (4096) valores diferentes. Y si dividimos la amplitud de la señal (4v - 0v = 4v) por este valor vemos que podemos medir hasta aproximadamente una milésima de volt. Existen dos métodos de conversión A/D: Método SecuencialEste método es el mas sencillo pero lento a la vez. Consiste en ir incrementando un valor digital interno (generado en el mismo chip conversor) comenzando de 0 y terminando una vez que un comparador determina que la salida del amplificador es igual a la entrada analógica. Este valor digital será el resultado de la conversión. El problema es que la velocidad de conversión se alarga a medida que la entrada analógica es mas elevada. Es decir, para convertir una señal equivalente a 10 (00001010 en binario) se necesitarán 10 pasos de testeos, en cambio con una señal equivalente a 127 (10000000) se necesitarán 127 comparaciones antes de detectar el valor correcto.
Método de Aproximaciones SucesivasEste método es el mas usado y veloz, aunque requiere una programación algo mas compleja. Consiste en ir poniendo a "1" cada bit comenzando por el mas significativo. Por lo tanto, considerando que trabajamos con 8 bits de resolución, el primer paso es colocar a 1 el bit 7 (sería 10000000 = 128 en decimal) y realizar la comparación. Si por ejemplo, el comparador indicase que la entrada analógica es menor que la salida del amplificador, significará que el valor es inferior a 128 con lo cual ya sabemos que estamos en la mitad inferior del byte (0 a 127) y por lo tanto el bit 7 debe ser apagado (poner a 0), esto ya evita tener que comprar la mitad superior (128 a 255). El paso siguiente será poner a 1 el bit 6 y de esta forma comprobaremos si el valor está entre 0 y 63 o entre 64 y 127. Dependiendo de la salida del comparador se dejará en 1 o en 0 el bit 6. Y así sucesivamente se irán verificando los restantes bits (0 a 5). El resultado será el valor digital correspondiente a la conversión. Este método solo requiere de 8 comparaciones (trabajando con resoluciones de 8 bits) para detectar cualquier valor de entrada a diferencia del método secuencial que requería de 256 comparaciones en el caso extremo. Autor
| ||||||||||
|
Este contenido se rige por la licencia de Creative Commons "Licencia Creative Commons Atribución-No Comercial-Sin Obras Derivadas 3.0". Para más información, véase la licencia en su forma reducida y completa. |






