|
|
|
por Mauricio M. Pagano
Palabras clave: ADC08832, ADC08831, CAD, puerto paralelo, conversor analógico digital, lenguaje C.
Revisión: A. (Abril de 2004)
Versión PDF. Bajar Codigo Fuente
INTRODUCCIÓN:
El objetivo de este artículo es mostrar una manera rápida de obtener muestras de 8 bits a través del puerto paralelo de la PC, utilizando un CAD tipo serie de National, el ADC08831/32, un conversor económico y de fácil disponibilidad en el mercado. Aquí encontrará la conexión del conversor con el puerto paralelo de la PC y el software asociado para controlar el dispositivo. Estos tipo de conversores al tener una interfaz serie pueden ser controlados con unas pocas señales digitales. El ADC08832 es un CAD de dos canales pudiendo utilizar los dos pines de las entradas de estos canales como una única entrada del tipo diferencial. Una desventaja de este modelo es que la tensión de referencia debe ser únicamente la tensión de Vcc; no es este el caso del modelo ADC08831 el cual posee una única entrada diferencial y puede usarse una referencia distinta de Vcc. Este artículo explica el uso de ADC08832 pudiendo modificarse fácilmente para la otra versión.
EL
CIRCUITO:
Fig. 1. Conexión del CAD al puerto paralelo de la PC

¿CÓMO MANEJAR EL CONVERSOR?:
Este
conversor ADC08832 posee dos canales multiplexados los cuales deben configurarse
antes de cada conversión, esto se logra ingresando la palabra de configuración
a través de la línea DI del dispositivo (pin 5) como indica el diagrama
temporal de la Fig.2 extraído de la hoja de datos del fabricante, luego
de bajar #CS, en cada flanco ascendente del CLK (pin 7) se lee la entrada DI en
el primer pulso debe haber un bit de start, luego debe ingresarse el modo de
funcionamiento de las entradas seleccionando entre SGL/#DIF (simple/diferencial)
en el ejemplo esta seleccionado #DIF (modo diferencial) y el conversor tomara la
resta entre las entradas, este modo es preferible, entre otros motivos, en
lugares donde el ruido sea un problema, ya que al ser el ruido común en ambas
entradas en teoría se elimina al hacer la resta. Luego de elegir entre SGL/#DIF
el próximo bit se interpreta como indica la Tabla 1. : Si el bit
anterior en DI fue 1 (Single-Ended MUX Mode) con un cero selecciono el canal 0 y con un uno el canal 1, en cambio si el bit anterior
en DI fue un 0 (Differential MUX Mode) con un cero el conversor hará la resta,
canal 0 menos canal 1, e ingresando un uno el conversor hará la resta, canal 1
menos canal 0. En el ejemplo se hará la resta, canal 1 menos canal 0. Luego de
este último flanco ascendente (pulso 3 de CLK) en medio pulso la señal será
muestreada y retenida por lo tanto en este lapso la señal de entrada no debe
cambiar, luego de esto después de cada flanco descendente aparecerá en DO (pin
6) el bit más significativo del dato hasta el pulso 11 donde estará completo
el dato de 8 bits. En los pulsos siguientes sigue apareciendo el mismo dato pero
comenzando por el bit menos significativo, lo cual se puede aprovechar para
verificar la correcta lectura, es decir comparo los bit que ya leí con estos
que deberían ser iguales.

Fig.
2. Diagrama temporal.

Tabla
1. Configuración de los canales.
EL SOFTWARE:
//-----------------
Función Ep -----------------------------------------------
void
Ep(unsigned int Puerto,unsigned char Dato,unsigned int Bit)
{
//
descripción: Escribe un Bit de un puerto de 8 bits
//
Entradas: Puerto = # de puerto
//
Dato = 0,1
//
Bit = Posición del bit
//
Salidas: Nada.
unsigned
char DatoTemp;
DatoTemp=inportb(Puerto);
if(
Dato == 1 && Bit < 8 )
DatoTemp = DatoTemp | (0x01 << Bit);
else
{
if( Dato == 0 && Bit < 8 )
DatoTemp = DatoTemp & ~(0x01 << Bit);
}
}
//-----------------
Funcion Lp -----------------------------------------------
// descripcion: Lee
un Bit de un puerto de 8 bits
// Entradas: Puerto =
# de puerto
// Bit = Posici¢n
del bit
// Salidas: 0,1 o -1
en caso de error;
int
Lp(unsigned int Puerto,unsigned int Bit)
{
unsigned
char DatoTempL;
if( Bit < 8 )
{
DatoTempL = inportb(Puerto);
DatoTempL = DatoTempL & (0x01 <<
Bit);
DatoTempL = DatoTempL >> Bit;
return DatoTempL;
}
}
//-----------------
Funcion Cad08832 -----------------------------------------
//
descripcion: Maneja un CAD ADC08832 conectado en LPT
//
Entradas: canal = # de canal 0,1.
//
Salida = Dato de 8 bits, error = -1.
int Cad08832( unsigned char
canal)
{
unsigned char
i=0,DatoMSB=0,DatoLSB=0,DatTemp=0;
CLK(1);
// Estado inicial de las lineas del MicroWire
CS(1);
DI(1);
CLK(0);
// Bajo CS
CS(0);
DI(1);
// Bit de Start
CLK(1);
CLK(0);
DI(1);
// SGL/#DIF
CLK(1);
CLK(0);
DI(canal);
// # de canal
CLK(1);
CLK(0);
CLK(1);
for(i = 8 ; i > 0 ; i--)
{
CLK(0);
DatTemp = DO;
DatoMSB = DatoMSB | (DatTemp <<
(i-1));
CLK(1);
}
DatoLSB = DO;
for( i = 1 ; i < 8 ; i++ )
{
CLK(0);
DatTemp = DO;
DatoLSB = DatoLSB | (DatTemp << i);
CLK(1);
}
CS(1);
return DatoMSB;
return (-1);
}
[Versión PDF.] [volver a artículos técnicos] [Bajar Codigo Fuente]