Memoria de actividades realizadas por Juan Paulo Robles Balestero 14 de febrero a 14 de Abril de 2002 durante su estancia en el Grupo de Investigación en Instrumentación Electrónica Aplicada y Técnicas de Formación (TIC-168) (Área de Electrónica) Escuela Politécnica Superior de Algeciras Universidad de Cádiz (España) Escuela Politécnica Superior. Avda. Ramón Puyol S/N.11202-Algeciras-Cádiz-Andalucía-España Telf: 00-34-956028020 11 de abril de 2002 AGRADECIMIENTOS Un agradecimiento especial al Profesor Dr. Juan José González de la Rosa, mi Tutor, quien me brindó todo su apoyo y dedicación, para que mis estudios en la Escuela Politécnica de Algeciras, y mi estancia en Algeciras se realizasen de la forma mas provechosa posible y pudiese así incrementar mis conocimientos. Asimismo, agradezco a todas las personas que trabajan en el Grupo de Investigación en Instrumentación Electrónica Aplicada y Técnicas de Formación (Área de Electrónica), por brindarse y hacer que mi estancia sea agradable y con un ambiente muy familiar. A todos, Gracias. Juan Paulo Robles Balestero Universidade Estadual Paulista (UNESP) – Faculdade de Engenharia de Ilha Solteira Ilha Solteira – SP - Brasil Algeciras., a 11 de abril de 2002 1 Índice 1.- Introducción 2. - Formación en el manejo de Test Point: Herramienta de diseño profesional de aplicaciones de adquisición de señales. 2.1.- Aplicaciones de adquisición de señales con Test Point. 3.- Tratamiento de las muestras y Teorema de Nyquist 4.- Conceptos generales sobre instrumentación programable (GPIB) 4.1 Antecedentes e introducción 4.2 Conceptos generales sobre GPIB 4.3 El estándar IEEE-488. Evolución y situación actual 4.4 Especificaciones técnicas. Propiedades del bus 4.5. Líneas de transmisión de señal 4.5.1 Líneas de datos 4.5.2 Líneas de control de transferencia de datos (handshake) 4.5.3 Líneas de control general de la interfaz 4.6 Funcionamiento. Transferencia de datos y cronograma 4.7 Configuraciones y características físicas y eléctricas 4.8 Instrumentos IEEE 488.2 4.9 Tarjeta controladora y aplicación básica de gobierno del bus 5.- Manejo de diversos instrumentos GPIB y de tarjeta controladora 5.1 Manejo del Programmable True RMS Multimeter (Multímetro Programable de verdadero valor eficaz 5.1.1 Comandos generales 5.1.2 Comandos del Display Principal 5.1.3 Comandos de la medida dual. 5.1.4 Comandos del First Level Modifier. 5.2 Manejo de la Programmable Power Supply HM8142 (Fuente de Alimentación Programable). 6.- Diseño de paneles o interfaces de usuario para control de instrumentos GPIB. 6.1 Diseño de paneles o interfaces utilizando el Test Point. 2 6.1.1 Diseño del panel para control del Multímetro 6.1.2 Diseño del panel para control de la Fuente de Alimentación Programable 6.2 Diseño de paneles o interfaces utilizando herramienta de programación C++. 6.2.1Diseño del panel para control del Multímetro. 6.2.2 Diseño del panel del Rastreador de Bus 7.- Conclusiones 8.- Referencias Bibliográficas 3 1. Introducción Este trabajo ha sido desarrollado en el Grupo de Investigación en Instrumentación Electrónica Aplicada y Técnicas de Formación durante el periodo desde el 15 de febrero de 2002 al 14 de abril de 2002, bajo la dirección del Prof. Dr. Juan José González de la Rosa. Se tratan conceptos generales de adquisición de señales mediante tarjetas de adquisición de datos, utilización y el manejo de la herramienta de diseño de instrumentos electrónicos de medida y control GPIB, virtuales (Test Point). Además, se describen los componentes hardware utilizados, que consisten en una tarjeta de adquisición de señales, una tarjeta controladora GPIB, diversa instrumentación programable y otros instrumentos de laboratorio. Inicialmente el trabajo muestra la formación en el manejo de Test Point, herramienta de diseño profesional de aplicaciones de adquisición de señales. Esta contiene algunas aplicaciones, de adquisición de diferentes señales con Test Point, como por ejemplo el sensor de temperatura, que emite una señal analógica. A continuación se exponen conceptos generales de adquisición de señales, enfocando principalmente, los aspectos actuales de la instrumentación programable. El ítem 4 se expone los conceptos generales sobre instrumentación programable (GPIB), como los antecedentes históricos e introducción, los conceptos generales sobre GPIB, el estándar IEEE-488 evolución y situación actual, y principalmente las órdenes y solicitudes (“commands and queries”) comunes a todos los instrumentos de este estándar, las propiedades del bus, incluyendo las líneas de transmisión de señal. En este ítem incluí el funcionamiento, transferencia de datos y cronograma, de la Tarjeta así como configuraciones y características físicas y eléctricas. En el apartado 5 se expone el manejo de diversos instrumentos GPIB, como el Multímetro programable de verdadero valor eficaz modelo TTI 1705; centrándose la exposición en sus comandos. Análogamente se presenta el manejo de la fuente de alimentación programable, modelo HM8142. El diseño de paneles o interfaces de usuario para control de instrumentos GPIB seria indispensable para este trabajo. Fueran diseñados paneles o interfaces utilizando el Test Point para el Multímetro, y para la fuente de Alimentación Programable. Utilizando la herramienta de programación C++, se han diseñado paneles para el Multímetro y el “Rastreador de Bus”. 4 2. - Formación en el manejo de Test Point: Herramienta de diseño profesional de aplicaciones de adquisición de señales TestPoint es una herramienta concebida para, test, medida, y adquisición de datos; y para el control externo de hardware RS232 y GPIB. En el Test Point, el usuario escoge los objetos que intervienen en la aplicación y asocia a cada objeto un conjunto de líneas de acción. Test Point tiene mayor flexibilidad que un lenguaje de programación de alto nivel, y además no es necesario declarar variables. Para crear un programa basta mover los objetos, como los botones, los displays, los gráficos, GPIB devices, A/D boards, objetos matemáticos, y otros que se vayan a utilizar, desde la ventana “stock” hacia el panel de la aplicación: Entonces, arrastra los objetos hacia la lista de acción, y se elige la acción del menú, tal como indican la figuras 2.1 y 2.2: Fig. 2.1. Manejo de Test-Point. Fig. 2.2. Manejo de Test-Point. 5 A continuación se expone el diseño del primer programa con la herramienta Test Point. Éste realizara la lectura de un señale de la entrada externa a través de un conversor A/D, de la tensión y frecuencia. Calculó el valor de la tensión en rms y mostró o gráfico del señale de entrada. El panel juntamente con lo programa se encuentra en la figura 2.3. El programa es realizado, cuando la llave switch esta en la posición “on”. En este momento las líneas de hachones del programa que se encuentra dentro de la llave pasan a ser ejecutadas. Fig. 2.3. Ejemplo. 2.1.- Aplicaciones de adquisición de señales con Test Point. Aplicación.1 - Como primera aplicación se ha diseñado un programa que obtiene el espectro en frecuencia de la señal de entrada, y al lado un display para mostrar el valor de la frecuencia fundamental. El panel se muestra en la figura 2.4: 6 Fig. 2.4. 1ª Aplicación. Para la realización de este se emplea un objeto matemático que realiza la transformada rápida de Fourier (FFT). La FFT (fs, sinal), coge el FFT de una señale real-estimado (vector). El valor devuelto es una lista de tres vectores: las frecuencias, las magnitudes, y las fases (en radianes) de cada componente del espectro. Las partes individuales de este resultado se seleccionan con el comando “select(,)”, separando así los vectores individuales de la FFT. En este ejemplo se han utilizado objetos matemáticos que realizan las funciones de selección de las componentes individuales: select(transformada,0), select(transformada,1). Por otra parte el valor de “samples” debe ser una potencia de dos con el fin de que el algoritmo funcione de forma óptima. Aplicación.2 - Para esta aplicación se emplea, un sensor de temperatura, que emite una señale analógica que varia de 0 a 1 Voltees o de -0.25v a 0.25v, proporcionalmente con la temperatura. El censor puede ser calibrado de forma que trábale con medidas de –10 a 40ºC o de 0 a 100ºC. La coleta de los datos fueran realizadas con la tarjeta de adquisición de datos KPCI-3104. Ha sido desarrollado entonces un programa que transforma los valores de tensión del conversor A/D en proporcionáis valores de temperatura. Los valores actuáis son presentados en un display, y en un grafico van sendo almacenados los valores al largo del tiempo. Los cambios de calibración pueden ser efectuados tamben a través del painel del termómetro con las llaves “Temp.(ºC)”, Tensión(Voltees) que se encuentra en la figura 2.5 juntamente con el programa desarrollado. 7 Fig. 2.5. 2ª Aplicación. 3.- Tratamiento de las muestras y Teorema de Nyquist El procesado digital de señales es una área de la ciencia y ingeniaría que se ha desarrollado rápidamente durante los últimos 30 años. Este rápido desarrollo es el resultado de los avances tecnológicos tanto en los ordenadores digitales como en la fabricación de circuitos integrados. Se entiende que el procesado de señal digital sea la solución apropiada a todos los problemas de procesado de señal. Así, para muchas señales de gran ancho de banda, se requiere procesado en tiempo real. Para tales señales, el procesado analógico o quizás, óptico, son las únicas soluciones validas. Sin embargo cuando los circuitos digitales se encuentran disponibles y tienen la velocidad suficiente, son normalmente preferibles. Los circuitos digitales no solo dan lugar a sistemas para el procesado de señales más baratos y fiables sino que también tienen otras ventajas. En particular, el procesado de señal digital permite operaciones programables. Por medio de software se pueden modificar fácilmente las funciones de procesado de señal para que sean realizadas por el 8 hardware. Por tanto, el hardware digital y el software asociado proporcionan un mayor grado de flexibilidad en el diseño de sistemas. Además, normalmente se consigue mayor precisión con el hardware digital y el software en comparación con los circuitos analógicos y los sistemas de procesado de señales analógicas. Por todas estas razones, se han producido un crecimiento explosivo de la teoría del procesado de señales analógicas. Por todas estas razones, se ha producido un crecimiento explosivo de la teoría del procesado de señales digitales y sus aplicaciones en las ultimas tres décadas. Pero, el procesado digital de señales analógicas tiene algunos inconvenientes. El primero y mas importante, la conversión de una señal analógica en digital, obtenida muestreando la señal y cuantificando las muestras, produce una distorsión que nos impide la reconstrucción de la señal analógica original a partir de las muestras cuantificadas. El control de esta distorsión se logra con la elección apropiada de ala velocidad de muestreo y la precisión del proceso de cuantificación. El teorema de Nyquist, prueba que para que la señal sea reconstruida perfectamente la frecuencia de muestreo debe ser el doble, o mayor que la máxima componente espectral de la señal muestreada. En segundo lugar, existen efectos debidos a la precisión finita que debe ser considerados en el procesado digital de las muestras cuantificadas. la adquisición de datos es realizada a través del conversor A/D, siendo éste la referencia software de la tarjeta de adquisición de datos modelo KPC-3104, que posee una frecuencia de muestreo máxima de 400 KHz y una resolución de 12 bits. El registro de tiempo (Time Span) es la presentación temporal de datos en la pantalla. En la figura 3.1 se indica la relación entre el registro de tiempo, la frecuencia de muestreo y el número de muestras. Ts Fig. 3.1. Registro de tiempo-Time Span Registro o tiempo de pantalla = Ts X Número de muestras. Por ejemplo, para una frecuencia de muestreo Fs = 1000 Hz (Ts= 1ms), entonces por cada 1 ms tenemos una muestra. Esto significa que si quiero ver 10 ms debo hacer 1ms X 10 muestras. 4 Instrumentación programable (GPIB) 4.1 Antecedentes e introducción Los equipos de Instrumentación Electrónica Virtual han permitido diseñar interfaces a medida, definidas por el usuario y orientadas a la aplicación de media o control para la que se conciben. Esta flexibilidad, junto con el desarrollo de protocolos de interconexión de instrumentos y el avance microelectrónico aplicado a los PCs, permite el diseño de redes de instrumentos de medida que operan según los requisitos 9 de un equipo de instrumentación electrónica tradicional, de banco. El bus interfaz de propósito general (GPIB; General Purpose Interface Bus) y su protocolo de comunicaciones asociado se han convertido en elementos integradores de la unidad de instrumentación virtual y los instrumentos tradicionales de banco, originando las redes de instrumentación electrónica. Estos equipos integrados en red cumplen con las tres características esenciales de un equipo de medida: - posibilidad de control remoto, aceptación de la transferencia de datos que permita fiabilidad en la operación, y capacidad de operación en tiempo real. A continuación se describen los conceptos generales sobre GPIB con el fin de introducir paulatinamente su funcionamiento. 4.2 Conceptos generales sobre GPIB El bus GPIB fue inventado por Hewlett Packard a finales de los años 1960. La intención era crear un bus fiable, especialmente diseñado para conectar computadoras e instrumentos en una configuración de red que poseyera las características requeridas por un equipo de medida. El control remoto de los instrumentos es un aspecto relevante del bus, pero hay otros más importantes como el reconocimiento de recepción de datos (“data hardware handshake”), que dota a las operaciones de fiabilidad; o la capacidad de respuesta en tiempo real. El principal objetivo del bus GPIB consiste en gestionar la transferencia de información entre dos o más dispositivos. Antes de enviar los datos hacia los dispositivos (instrumentos conectados al bus) éstos deben configurarse de acuerdo con este protocolo de transmisión de información. Entre los parámetros relativos al protocolo se encuentra la asignación de direcciones a los instrumentos interconectados. La numeración del dispositivo, o asignación de su dirección, se realiza desde el panel frontal o alterando la conexión de los puentes de su tarjeta interfaz, que suele ser accesible desde la parte posterior del instrumento. El elemento controlador del equipo GPIB es único (generalmente la tarjeta controladora instalada en un PC, en cuyo caso se le asigna la dirección 0), supervisa todas las operaciones que se realizan en el bus, y determina el dispositivo que envía la información y el momento en que se realiza su envío. El controlador puede designar un sustituto si en un determinado momento no puede atender los requisitos de control. El nuevo controlador recibe el nombre de controlador activo. El controlador asegura que no pueden haber dos o más instrumentos enviando información al bus simultáneamente. Además, establece los dispositivos que permanecen en estado de recepción o escucha, ya que no todos los instrumentos están siempre interesados en captar la información del bus. Esta función la realiza “despertando” a los dispositivos en estado de “latencia” mediante una solicitud de reafirmación, y mediante órdenes que especifican los nuevos receptores y el nuevo emisor. Cuando el proceso de transmisión-recepción ha finalizado, el controlador del equipo se asegura de que todos los receptores han recibido la información enviada al bus por el emisor mediante el “data hardware handshake” o control de transferencia de datos. Este protocolo permite asegurar la recepción de la información por parte de los dispositivos 10 más lentos. Como consecuencia, el dispositivo más lento limita la velocidad de operación del equipo GPIB. En resumen, se consideraran los siguientes elementos o conceptos más relevantes y específicos, involucrados en un equipo red de instrumentación mediante el protocolo GPIB: - Controlador del equipo controlador activo. Dispositivos conectados al bus. Dispositivo fuente. Dispositivos destino. Comandos y funciones. 4.3 El estándar IEEE-488. Evolución y situación actual El primer equipo de instrumentación basado en bus fue diseñado en 1965 por Hewlett Packard (en la actualidad, la división de Test y Medida con el nombre de “Agilent Technologies”), y recibió el nombre de HP-IB, acrónimo de Hewlett Packard Interface Bus. Su finalidad consistía en conectar su red de instrumentos programables a sus ordenadores de laboratorio. Debido a su elevada velocidad de transferencia (1 Mbyte/s nominal) y a su fiabilidad, este interfaz adquirió popularidad a pasos agigantados. Así, en 1973 se convirtió en un estándar, siendo aceptado por la organización IEEE. Entre 1973 y 1975 recibió el nombre de estándar de comunicaciones IEEE-488, y en 1987 adoptó el nombre de ANSI/IEEE-488.1, como se le conoce en la actualidad, estando más extendida su designación mediante el acrónimo GPIB. En el mismo año, 1987, la designación ANSI/IEEE-488.2 supuso una ampliación del protocolo en la línea de describir con exactitud cómo los controladores y los instrumentos se comunicaban. Se establece entonces el conjunto de órdenes comunes a todos los instrumentos (SCPI; Standard Commands for Programmable Instruments). En paralelo a la evolución del bus GPIB la IEC (International Electronic Comisión), responsable de la estandarización fuera de los Estados Unidos, aprobó el estándar IEC625.1. Este protocolo empleaba un conector DSUB de 25 pines, a diferencia del IEEE-488.1 que empleaba uno similar al Centronics pero de 24 polos. Ésta última versión es la que se emplea hoy día, pero siguen existiendo adaptadores de 25 a 24 polos, con el fin de evitar la obsolescencia de determinados instrumentos. 4.4 Especificaciones técnicas. Propiedades del bus • Direcciones y estructura de la interconexión. Cada dispositivo del equipo GPIB posee una dirección, codificada como un número entre 0 y 30. Es decir, existen 31 direcciones primarias permitidas para instrumentos transmisores de datos (“talkers”) conectados al bus interfaz GPIB. A cada instrumento se le asigna una dirección codificada mediante 7 bits. Pueden haber hasta 15 dispositivos conectados en un bus contiguo, siendo sólo uno de ellos el controlador. Es decir, a una tarjeta controladora pueden conectarse hasta 14 dispositivos encadenando cables IEEE-488 de un 11 dispositivo al siguiente. Algunos dispositivos conectados al bus pueden direccionarse también mediante direcciones secundarias. Éstas hacen referencia a alguno de sus bloques funcionales. Por ejemplo, un osciloscopio con dirección primaria 4 puede tener un módulo de acondicionamiento de señal con dirección secundaria 1. • Velocidad de transferencia máxima: 1 Mbyte por segundo en distancias cortas. Es usual es un valor comprendido entre 250 y 500 kilobytes/segundo. • Longitud del cable. La normativa especifica que pueden usarse hasta 20 metros de cable encadenado en línea, apilando las conexiones; también recomienda no emplear tramos de cable de más de 4 metros de longitud. Una regla práctica consiste en multiplicar el número de dispositivos conectados por 2, comparar el resultado con 20 metros y tomar el menor número. Por ejemplo, si conectamos 8 dispositivos, la línea puede tener hasta 16 metros, y no se puede llegar a 20. Es decir, puede haber hasta 20 metros de cable entre el controlador y el último dispositivo, y entre cada dos dispositivos no puede haber más de 2 metros. La alternativa de conexión en estrella se emplea para aumentar el número de dispositivos interconectados, pero tiene como inconveniente la mayor capacidad parásita de la red, que introduce retardos y, en consecuencia, errores de transmisión. • Modo de transferencia de datos. 8 bits en paralelo. Se dedican pues 8 líneas a datos. Estas líneas son bidireccionales. • Modo de transferencia de mensajes. Transferencia asíncrona de bytes en serie y bits en paralelo. Esta transferencia es controlada por las líneas de “handshake”. • Funciones de la interfaz. Posee 10: 5 funciones de comunicación primarias y 5 especializadas. La norma no exige a todos los instrumentos poseer todas las funciones. • Handshake. La recepción de cada byte de datos es reconocida mediante el handshake. Consta de 3 líneas. • Líneas de control general para necesidades especiales. 5 líneas controlan el flujo de señal en el bus. A continuación se detallan las funciones de las líneas del bus y su funcionamiento, con el fin de mostrar sus posibilidades de diseño fiable. 4.5. Líneas de transmisión de señal La interfaz GPIB consta de 16 líneas. Las 8 restantes del bus (hasta 24) corresponden a líneas de retorno a tierra. De las 16 líneas, 8 son de datos (1 byte) y 8 para mensajes de control y estados de los dispositivos. De estas últimas 8 líneas, 3 son para el control de transferencia de datos (handshake) y 5 para el control general de la interfaz. La figura 1 muestra la estructura de las líneas del bus. 12 8 líneas de datos 3 líneas de handshake GPIB 5 líneas de control de interfaz 8 líneas de retorno de tierra Fig. 4.1. Líneas del bus GPIB. A continuación se describen con detalle las líneas que componen el bus GPIB. 4.5.1 Líneas de datos Las 8 líneas de datos DIO1-DIO8 pueden transportar tanto datos como órdenes. El estado de la línea ATN (una de las 5 de control general) determina si son datos u órdenes. Si está a nivel bajo son órdenes o direcciones y si está a nivel alto son datos. Todas las órdenes y la mayoría de los datos emplean 7 bits codificados en ASCII o ISO. En este caso el octavo bit se emplea para paridad o no se emplea. 4.5.2 Líneas de control de transferencia de datos (handshake) Estas 3 líneas realizan el control asíncrono de las transferencias de los mensajes en forma de byte entre los dispositivos. Este proceso garantiza que la transmisión y la recepción se han realizado sin errores, dotando a la transmisión de información de seguridad. Las líneas son: • NRFD (Not Ready For Data): Indica cuándo un dispositivo está preparado para recibir un byte. La línea es conducida por todos los dispositivos cuando reciben órdenes (cuando actúan como receptores de datos manteniéndose a la escucha), y por el orador o transmisor de datos cuando habilita el protocolo HS488. • NDAC (Not Data Accepted): Indica cuándo un dispositivo ha aceptado un mensaje (en forma de byte). La línea es conducida por todos los dispositivos al recibir órdenes y/o datos, cuando reciben la información. • DAV (Data Valid): Indica cuándo las señales en las líneas de datos se han estabilizado (se consideran válidas) y pueden ser aceptadas con seguridad por los dispositivos. El controlador conduce la línea de datos al enviar órdenes. Los transmisores de datos la conducen cuando envían mensajes de datos. 13 4.5.3 Líneas de control general de la interfaz • • • SRQ (Service ReQuest): Se emplea para solicitar turno al controlador. IFC (InterFace Clear): Realiza un “reset” de los parámetros y direcciones del bus. REN (Remote ENable): Establece el control remoto de un dispositivo deshabilitando su control a través del panel. Es decir, el usuario ya no podrá realizar un control manual. • EOI (End Or Identify): Se emplea como indicador de fin de transferencia de datos. • ATN (ATtentioN): La emplea el controlador para distinguir entre los datos y los mensajes de control. Determina el tipo de información presente en las líneas de datos. 4.6 Funcionamiento. Transferencia de datos y cronograma El estándar IEEE 488.1 establece un “handshake” de 3 líneas de control de datos. La introducción de esta lógica negativa permite la implementación de la función lógica OR mediante cableado. De esta forma, no se transmiten datos hasta que no esté listo el receptor (listener) más lento y queda asegurado que la transmisión sea lo suficientemente lenta como para que al receptor más lento le dé tiempo a aceptar el dato. La línea NRFD es controlada por cada receptor e indica si cada uno de ellos no está listo (nivel bajo) o lo está (nivel alto) para recibir datos. La línea DAV es controlada por el transmisor e indica si los datos en las líneas de datos (DIO) son correctos y, en consecuencia, pueden ser aceptados por los receptores. Finalmente, la línea NDAC es controlada por cada receptor para indicar que no ha recibido los datos (nivel bajo) o que los ha recibido (nivel alto). La figura 2 muestra el diagrama de tiempos de operación. En principio, el transmisor comprueba que las líneas NRFD y NDAC están a nivel bajo. La primera indica que no todos los receptores están listos para recibir datos y la segunda indican que no han aceptado ningún nuevo byte. Observar que la línea NRFD no pasa a nivel alto hasta que todos los receptores están listos. Una vez que el transmisor ha detectado que la línea NRFD está a nivel alto y transcurre cierto retardo, necesario para dar tiempo a estabilizar los niveles de los datos que envía a los receptores, pone la línea DAV a nivel bajo indicando que los datos que envía son válidos (instante 3). Se transfiere así un byte de datos. El receptor más rápido pone la línea NRFD a nivel bajo con el fin de indicar que no está listo para recibir otro byte (instante 4). Los demás harán lo mismo cada uno a su ritmo. Es decir, el receptor más rápido indica al equipo que no mande más información porque él ha tomado ya la que había y tiene que aceptarla o procesarla (es posible que se requiera de él una respuesta). Finalmente, los receptores van aceptando el byte poniendo a nivel alto sus líneas NDAC. Cuando todos han aceptado los datos (instante 6), la línea pasa a nivel alto, el transmisor lo detecta y pone la línea DAV a nivel alto para indicar que ya no valen los datos (instante 7). El primer receptor que detecta que la línea DAV ha pasado a nivel alto pone la línea NDAC a nivel bajo (instante 8). El transmisor pondrá otros datos nuevos en las líneas DIO y comienza otro nuevo ciclo. Un byte pude no transferirse en menos tiempo de la duración de los siguientes eventos: 14 - Propagación del cambio de estado de la línea NRFD hacia el emisor de datos (talker). Propagación de la señal DAV a todos los receptores. Que los receptores acepten el byte y confirmen la línea NDAC (la pasen a nivel alto). Que la señal NDAC regrese al emisor. Que el emisor permita el tiempo de establecimiento de los datos en el bus antes de confirmar la línea DAV (pasarla a nivel bajo). ATN TS DIO Transferencia de 1 byte DAV NRFD Algunos están preparado NDAC 1 2 3 Todos preparados 4 5 Algunos han aceptado los datos 6 7 8 Todos aceptaron datos Fig. 4.2. Diagrama de tiempos de operación. TS es el tiempo de estabilización de los datos. 4.7 Configuraciones y características físicas y eléctricas Los dispositivos suelen conectarse mediante un cable apantallado de 24 polos, con la particularidad que en cada extremo es al mismo tiempo enchufe y receptáculo. Es posible encadenar dispositivos mediante configuraciones lineales, en estrella o utilizando una versión híbrida. La figura 3 muestra las conexiones lineal y en estrella. 15 (a) (b) Fig. 4.3. Conexiones lineal (a) y en estrella (b) de un equipo de dispositivos GPIB. La figura 4 muestra la parte trasera de dos instrumentos reales conectado en serie en un bus GPIB. Fig. 4.4. Conexiones lineal de dos instrumentos GPIB. 4.8 Instrumentos IEEE 488.2 Los instrumentos de este estándar son más fáciles de programar ya que responden a órdenes y solicitudes comunes, empleando un protocolo estándar de intercambio de mensajes. Este protocolo constituye la base del estándar SCPI, que permite la programación de equipos de test y medida incluso de una forma más sencilla. 16 La tabla 1 muestra las órdenes y solicitudes (“commands and queries”) comunes a todos los instrumentos de este estándar. Nemónico *IDN? *RST *TST? *OPC *OPC? *WAI *CLS *ESE *ESE? *ESR? *SRE *SRE? *STB? Grupo de órdenes Datos del equipo Operaciones internas Operaciones internas Sincronización Sincronización Sincronización Estatus y suceso Estatus y suceso Estatus y suceso Estatus y suceso Estatus y suceso Estatus y suceso Estatus y suceso Descripción Solicitud de identificación Reset Solicitud de autocomprobación Operación completa Solicitud de operación completa Esperar a completar Borrar estado (estatus) Habilitación estado suceso Solicitud de habilitación estado de suceso Solicitud de registro de estado de suceso Habilitación de solicitud de servicio Petición de habilitación de servicio Solicitud de lectura de byte de estado Tabla 1. Órdenes y solicitudes comunes a todos los instrumentos IEEE488-2. 4.9 Tarjeta controladora y aplicación básica de gobierno del bus La figura 4muestra una tarjeta controladora GPIB con conexión PCI al PC. La figura 5 muestra la ventana MSDOS de la aplicación básica de programación incluida por el fabricante. En ella se observa el empleo de la función send para enviar a un instrumento que tiene asignada la dirección 1 la secuencia de órdenes del campo “data”. Fig. 4. Tarjeta controladora GPIB con conexión PCI. 17 Fig. 4.5. Aplicación “TRTEST” para control GPIB diseñada por CEC. 5.- Manejo de diversos instrumentos GPIB y de tarjeta controladora. En principio con el fin de conocer el repertorio de órdenes propio de cada instrumento, empleamos la aplicación de control asociada a la tarjeta Keithley-488. Esta aplicación es bajo MS-DOS. Con el MS-DOS , los datos del GPIB son enviados e recibidos, respectivamente a través de las funciones que se adjuntan en la siguiente figura 5.1: 18 Fig. 5.1. funciones Las funciones utilizadas en esto trabajo son las siguientes: !"I) Initialize: Esta función ira reiniciar la Tarjeta de Adquisición GPI. myaddr: De 1 a 30, dar la dirección de GPIB para ser usada por su board. Esta dirección debe ser diferente de la dirección de todos dispositivos conectados en lo ordenador. Level: Cuando cero especifica la tarjeta como controlador del equipo, e 2 para especificar que la tarjeta GPIB, es uno dispositivo. 19 S) Send: Función utilizada para enviar comandos (Data), para uno instrumento, con la dirección deseada (GPIB address), como muestra la siguiente figura: E) Enter: Con esta función, lo usuario tendrá una variable string que contendrá los últimos datos recibidos. La dirección deseada también es definida por lo GPIB address, En el Maxlen se pone el valor que especifica el numero máximo de los caracteres que lo usuario desea recibir. !"SP) Spoll Result = 00, el bus no esta ocupado Result distinto de 00, el bus esta ocupado Será mostrado ahora, el controle con la tarjeta GPIB de los instrumentos Tti Programmable True RMS Multimeter ( Multímetro Programable), y el Programable Power Supply HM8142 (Fuente de tensión y Corriente Programable) 20 5.1 Manejo Programable) del Programmable True RMS Multimeter (Multímetro Para el manejo del Multímetro programable son enviados los comandos al Multímetro, a través de la funcione send. Los comandos mas utilizados son mostrados de abajo: 5.1.1) Comandos Generales !"*IDN?: Busca la identificación del instrumento. !"READ?: Realiza la lectura del Display principal. !"READ2?: Realiza la lectura del Display secundario. !"EVERY / STOP: Realiza la lectura del Display hasta recibir lo comando STOP. !"*RST: Reinicia el Multímetro. 5.1.2) Comandos del Display Principal Estas órdenes predisponen el Display para realizar distintos tipos de medidas Cuando utilizados estos comandos pone Principal en para. !"VDC [<string>]: !"VAC [<string>]: !"VACDC [<string>]: !"IDC [<string>]: !"IAC [<string>]: !"IACDC [<string>]: !"OHMS [<string>]: !"CONT !"DIODE !"CAP !"FREQ 21 !"AUTO / MAN 5.1.3) Comandos de la medida dual. !"VDC2 !"VAC2 !"IDC2 [<string>]: !"IAC2 [<string>]: !"FREQ2 5.1.4) Comandos del First Level Modifier. !"NULL / NULLOFF: Anula el Display principal, y pasa para el manual, hasta recibir el comando NULLOFF !"HOLD / HOLD OFF: Mantiene el Display principal con lo ultimo resultado. !"DB / DBOFF [<string>]: Pone el Display principal para mostrar lo valor en db. 5.2 Manejo de la Programmable Power Supply HM8142 (Fuente de Alimentación Programable). Para el manejo del Fuente de alimentación son enviados los comandos a través de la funcione send. Los comandos mas utilizados son mostrados de abajo, respectivamente con sus funciones: !"RM1/RMO: Remote on/off !"LK1/LKO: Local on/off 22 !"SU1: Set voltage 1 !"SU2: Set voltage 2 !"SI1: Set corrent 1 !"SI2: Set corrent 2 !"RU1: Recall voltage 1 (hace la lectura de la tensión de la salida) !"RU2: Recall voltaje 2 (hace la lectura de la tensión de la salida) !"RI1: Recall current 1 (hace la lectura de la corriente de la salida) !"RI2: Recall current 2 (hace la lectura de la corriente de la salida) !"MU1: Measure voltaje 1 (hace la lectura de la tensión del Display) !"MU2: Measure voltaje 2 (hace la lectura de la tensión del Display) !"MI1: Measure current 1 (hace la lectura de la corriente del Display) !"MI2: Measure current 2 (hace la lectura de la corriente del Display) !"MX1/MXO: Mixed Mode on/off (Modo mixto del comando) !"OP1/OPO: Output on/off !"TRU: Track Voltage (envía la misma tensión para las dos salidas) !"TRI: Track Current (envía la misma corriente para las dos salidas) !"SR1/SRO: Sevice request on/off !"ABT / ABX: Arbitrary Wave Forme (Mode/Exit) !"RUN / STOP: Arbitrary on/off !"VER: Get Version !"ID?: Get Identifier !"STA: Get Status - Utilizando lo comando STA, tendrás una respuesta con la situación de los comandos: OP1/O SQ1/O ERO/1 CV1/CC1 CV2/CC2 RMO/1 23 6- Diseño de paneles o interfaces de usuario para control de instrumentos GPIB. Como ha sido visto, para hacer los diseños de paneles o interfaces de usuario para control de instrumentos GPIB, son utilizados varias herramientas de control, tais como BASIC (Visual o Quik-), Pascal o Delph y otras herramientas mas, pero utilizando los mismos pasos. En este trabajo estos diseño de paneles, ha sido desarrollado con la herramienta de diseño Test Point, y la herramienta de programación C++. 6.1 Diseño de paneles o interfaces utilizando el Test Point. Con el Test Point, los datos del GPIB son enviados e recibidos, respectivamente a través de los comandos que se adjuntan en la siguiente figura 6.1: Fig. 6.1. Funciones Estos comandos realizan las siguientes funciones: !"Output to : Envia el comando (with) al GPIB !"Enter From : Recebe el dato enviado por el GPIB !"Trigger !"Clear: Borra las operaciones, y reinicia el instrumento. !"Serial Poll !"Parallel Poll !"Local !"Transmit GPIB commands 24 6.1.1 Diseño del panel para control del Multímetro Cuando la llave on esta encendida el programa empieza a trabajar, luego a partir del comando generales el programa realiza sus funciones. Como muestra la figura 6.2 el comando generales está en READ?, consecuentemente la pantalla read muestra el valor de la lectura de la pantalla principal del Multímetro, y el grafico muestra el valor temporal de esta medida. Como anteriormente se tendría hecho una lectura con read2?, el valor de este se mantuvo en la pantalla. Fig. 6.2. Panel para control del Multímetro. 6.1.2 Diseño del panel para control de la Fuente de Alimentación Programable. Inicialmente el usuario tendrá que elegir el comando que será enviado al instrumento. En el sitio “Valor”, ira poner el valor de la tensión o corriente que desea enviar. Al clicar la tecla enter el valor será echado al instrumento. Utilizando la tecla “send”, el usuario tambiem echará los datos, y además, estará realizando una lectura de todas pantallas del instrumento. 25 Fig. 6.3. Panel para control de la Fuente de alimentación. 6.2 Diseño de paneles o programación C++. interfaces utilizando herramienta de El C++ contiene varias modificaciones menores sobre el C original. Normalmente se trata de aumentar la capacidad del lenguaje y la facilidad de programación en un conjunto de detalles concretos basados en la experiencia de muchos años. En cualquier caso, se trata de modificaciones que facilitan el uso del lenguaje, pero que no cambian su naturaleza. Hay que indicar que el C++ mantiene compatibilidad casi completa con C, de forma que el viejo estilo de hacer las cosas en C es también permitido en C++, aunque éste disponga de una mejor forma de realizar esas tareas. Esta herramienta de programación, foie utilizada, en esto trabajo, para el desarrollo de programas para, testes, medidas, adquisición e aplicación de datos, incluyendo principalmente lo programa para el control del Multímetro TTi. 26 Para hacer el programa, debe-se inicialmente adicionar la libraría “ieee-c.h” y en seguida adicionar lo comando: #include "ieee-c.h" Cuándo compilar su programa, necesitará proporcionar la biblioteca dependiendo de su sistema operativo: !" !" !" DOS, use: 16-bit con windows, use: 32-bit con windws, use: !" 16-bit OS/2, use: apropiada, IEE488.LIB WIN488.LIB IEEE_32M.LIB(Para Microsft), ou IEEE_32M.LIB(para Borland) IEEEOS2.LIB Con el C++, utilizando Initialize, send, and Enter juntos produce un programa completo para obtener los datos de un dispositivo: initialize(my.address,level); !" !"my.address: De 1 a 30, dar la dirección de GPIB para ser usada por su board. Esta dirección debe ser diferente de la dirección de todos dispositivos conectados en lo ordenador. !"level: Cuando cero especifica la tarjeta como controlador del equipo, e 2 para especificar que la tarjeta GPIB, es uno dispositivo. Como ejemplo de la función initialize: initialize(0,0); send(address,"info",&status); !" !"address: Es una cadena que contén los dados recibidos !"info: Especifica el valor del máximo número del caracteres que usted desea recibir. !"status: indica si la transferencia fue buena (0=ok, 8=timeout). Como ejemplo de la función send: send(1,"READ?",&status); send(1,"HOLD",&status); send(1,"EVERY",&status); send(1,"*IDN?",&status); 27 enter(recv,maxlength,length,address,&status); !" !"recv: Es una cadena que contén los dados recibidos !"maxlength: Especifica el valor del máximo número del caracteres que usted desea recibir. !"Length: Contendrá el número verdadero de caracteres recibidos !"Address: Dirección de lo GPIB. !"Status: indica si la transferencia fue buena (0=ok, 8=timeout). Como ejemplo de la función enter: enter(r,80,&l,1,&status); 6.2.1 Diseño del panel para control del Multímetro Ha sido desarrollado un panel para el controle del Multímetro a través del GPIB. Los comandos básicos del Multímetro fueran puestos en este painel bajo la programación en C++. La pantalla principal fue extraída cuando el Multímetro se encontraba en la dirección 10, con una medida de 0.01 mV DC en la pantalla principal, y 22.20 mV AC en la pantalla secundaria. Fig. 6.4. Funciones 28 El programa código fuente del Multímetro se muestra a continuación: #include <vcl\vcl.h> #pragma hdrstop #include "uni_mul.h" #include "ieee-c.h" //--------------------------------------------------------------------------#pragma resource "*.dfm" TMultimetro *Multimetro; //--------------------------------------------------------------------------__fastcall TMultimetro::TMultimetro(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TMultimetro::InitializeClick(TObject *Sender) { initialize(0,0); } //--------------------------------------------------------------------------void __fastcall TMultimetro::identidadClick(TObject *Sender) { STOP->Checked = true; 29 send(i,"*IDN?",&status); enter(r,80,&l,i,&status); MAIN->Text = r; secund->Text = r; } //--------------------------------------------------------------------------- void __fastcall TMultimetro::PrincipaleChange(TObject *Sender) { STOP->Checked = true; AnsiString comandoA; comandoA = Principale->Text; send(1,comandoA.c_str(),&status); // convierte el contenido de comando a char } //--------------------------------------------------------------------------void __fastcall TMultimetro::secChange(TObject *Sender) { STOP->Checked = true; AnsiString comandoB; comandoB = Principale->Text; send(1,comandoB.c_str(),&status); } //--------------------------------------------------------------------------void __fastcall TMultimetro::READClick(TObject *Sender) 30 { send(1,"READ?",&status); enter(r,80,&l,1,&status); MAIN->Text = r; } //--------------------------------------------------------------------------void __fastcall TMultimetro::READ2Click(TObject *Sender) { send(1,"READ2?",&status); enter(r,80,&l,1,&status); secund->Text = r; } //--------------------------------------------------------------------------void __fastcall TMultimetro::ResetClick(TObject *Sender) { send(1,"*RST",&status); } //--------------------------------------------------------------------------void __fastcall TMultimetro::ONClick(TObject *Sender) { send(1,"HOLD",&status); } //--------------------------------------------------------------------------- 31 void __fastcall TMultimetro::OFFClick(TObject *Sender) { send(1,"HOLDOFF",&status); } //--- ------------------------------------------------------------------------ void __fastcall TMultimetro::NULLOFFClick(TObject *Sender) { send(1,"NULLOFF",&status); } //--------------------------------------------------------------------------void __fastcall TMultimetro::NULLONClick(TObject *Sender) { send(1,"NULL",&status); } //--------------------------------------------------------------------------void __fastcall TMultimetro::STOPClick(TObject *Sender) { Timerevery->Enabled = false; } //--------------------------------------------------------------------------void __fastcall TMultimetro::EVERYClick(TObject *Sender) { Timerevery->Enabled = true; } 32 //--------------------------------------------------------------------------- void __fastcall TMultimetro::TimereveryTimer(TObject *Sender) { send(1,"READ?",&status); enter(r,80,&l,1,&status); MAIN->Text = r; } //--------------------------------------------------------------------------void __fastcall TMultimetro::DbClick(TObject *Sender) { send(1,"DB",&status); } //--------------------------------------------------------------------------void __fastcall TMultimetro::DBOFFClick(TObject *Sender) { send(1,"DBOFF",&status); } //--------------------------------------------------------------------------void __fastcall TMultimetro::DirChange(TObject *Sender) { i = StrToFloat(Dir->Text); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------- 33 #ifndef uni_mulH #define uni_mulH //--------------------------------------------------------------------------#include <vcl\Classes.hpp> #include <vcl\Controls.hpp> #include <vcl\StdCtrls.hpp> #include <vcl\Forms.hpp> #include <vcl\ExtCtrls.hpp> //--------------------------------------------------------------------------class TMultimetro : public TForm { __published: // IDE-managed Components TButton *Initialize; TEdit *MAIN; TButton *identidad; TEdit *secund; TComboBox *Principale; TComboBox *sec; TButton *READ; TButton *READ2; TButton *Reset; TRadioButton *ON; TRadioButton *OFF; TGroupBox *HOLD; TRadioButton *NULLOFF; 34 TRadioButton *NULLON; TRadioButton *EVERY; TRadioButton *STOP; TGroupBox *EVERY1; TTimer *Timerevery; TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TGroupBox *GroupBox1; TRadioButton *Db; TRadioButton *DBOFF; TEdit *Dir; void __fastcall InitializeClick(TObject *Sender); void __fastcall identidadClick(TObject *Sender); void __fastcall PrincipaleChange(TObject *Sender); void __fastcall secChange(TObject *Sender); void __fastcall READClick(TObject *Sender); void __fastcall READ2Click(TObject *Sender); void __fastcall ResetClick(TObject *Sender); void __fastcall ONClick(TObject *Sender); void __fastcall OFFClick(TObject *Sender); void __fastcall NULLOFFClick(TObject *Sender); void __fastcall NULLONClick(TObject *Sender); void __fastcall EVERYClick(TObject *Sender); 35 void __fastcall STOPClick(TObject *Sender); void __fastcall TimereveryTimer(TObject *Sender); void __fastcall DbClick(TObject *Sender); void __fastcall DBOFFClick(TObject *Sender); void __fastcall DirChange(TObject *Sender); private: // User declarations int status,l,i; char r[80]; public: // User declarations __fastcall TMultimetro(TComponent* Owner); }; //--------------------------------------------------------------------------extern TMultimetro *Multimetro; //--------------------------------------------------------------------------#endif 36 6.2.2 Diseño del panel del Rastreador de Bus El Rastreador de Bus, ira hacer una busca en todas las direcciones, y grabar en lo “direbox”, las direcciones de los instrumentos que eston en el bus. En la caja Dir, muestra la dirección, y la caja Dispositivo muestra el dispositivo de la dirección. La figura muestra el painel principal del Rastreador del Bus, en lo momento que la dirección 10 estaba conectado el Multímetro Tti. Fig. 6.5. Rastreador de Bus. El programa código fuente del Rastreador de bus se muestra a continuación: //------------------------------------------------------------------------------------------------------- include <vcl\vcl.h> #pragma hdrstop 37 #include "rasbus.h" #include "ieee-c.h" //--------------------------------------------------------------------------#pragma resource "*.dfm" TBus *Bus; //--------------------------------------------------------------------------__fastcall TBus::TBus(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TBus::DirecionClick(TObject *Sender) { i=0; Timerdo->Enabled = true; ShowMessage("Aguarde"); } //--------------------------------------------------------------------------void __fastcall TBus::initializeClick(TObject *Sender) { initialize(0,0); } //--------------------------------------------------------------------------void __fastcall TBus::TimerdoTimer(TObject *Sender) 38 { if (i < 31) { send(i,"*IDN?",&status); if (status == 0) { enter(r,80,&l,i,&status); direciones->Text = i; disp->Text = r; direbox->Items->Add(i); } else { direciones->Text = i; disp->Text = "Sin Dispositivo"; } i+=1; } else { Timerdo->Enabled = false; ShowMessage("Fim"); } } //--------------------------------------------------------------------------void __fastcall TBus::direboxChange(TObject *Sender) { 39 AnsiString a; a=direbox->Text; direciones->Text = a; } //--------------------------------------------------------------------------- void __fastcall TBus::FimClick(TObject *Sender) { Timerdo->Enabled = false; ShowMessage("Fim"); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------#ifndef rasbusH #define rasbusH //--------------------------------------------------------------------------#include <vcl\Classes.hpp> #include <vcl\Controls.hpp> #include <vcl\StdCtrls.hpp> #include <vcl\Forms.hpp> #include <vcl\ExtCtrls.hpp> //--------------------------------------------------------------------------class TBus : public TForm { __published: // IDE-managed Components 40 TEdit *direciones; TButton *Direcion; TTimer *Timerdo; TButton *initialize; TEdit *disp; TLabel *Dir; TLabel *Dispositivo; TComboBox *direbox; TButton *Fim; void __fastcall DirecionClick(TObject *Sender); void __fastcall initializeClick(TObject *Sender); void __fastcall TimerdoTimer(TObject *Sender); void __fastcall direboxChange(TObject *Sender); void __fastcall FimClick(TObject *Sender); private: // User declarations int status,i,l; char r[80], buf[50]; public: // User declarations __fastcall TBus(TComponent* Owner); }; //--------------------------------------------------------------------------extern TBus *Bus; //--------------------------------------------------------------------------#endif 41 7.- Conclusiones Con el desarrollo del trabajo se concluye que el procesado digital de señal es la solución apropiada a todos los problemas de procesado de señal. Los circuitos digitales no solo dan lugar a sistemas para el procesado de señales más baratos y fiables sino que también tienen otras ventajas. En particular, el procesado de señal digital permite operaciones programables. Por medio de software se pueden modificar fácilmente las funciones de procesado de señal para que sean realizadas por el hardware. Por tanto, el hardware digital y el software asociado proporcionan un mayor grado de flexibilidad en el diseño de sistemas. Pero, para muchas señales de gran ancho de banda, se requiere procesado en tiempo real. Para tales señales, el procesado analógico o quizás, óptico, son las únicas soluciones validas. Los equipos de Instrumentación Electrónica Virtual han permitido diseñar interfaces a medida, definidas por el usuario y orientadas a la aplicación de media o control para la que se conciben. Teniendo en cuenta que para hacer los diseños de paneles o interfaces de usuario para control de instrumentos, son utilizados varias herramientas de control, tais como BASIC (Visual o Quik-), Pascal o Delph y otras herramientas mas, aún que en este trabajo los diseño de paneles, han sido desarrollado con la herramienta Test Point, y la herramienta de programación C++. El bus interfaz de propósito general (GPIB; General Purpose Interface Bus) y su protocolo de comunicaciones asociado se han convertido en elementos integradores de la unidad de instrumentación virtual y los instrumentos tradicionales de banco, originando las redes de instrumentación electrónica. La gran ventaja es que estos equipos integrados en red cumplen características esenciales de un equipo de medida, como la posibilidad de control remoto, aceptación de la transferencia de datos que permita fiabilidad en la operación, y capacidad de operación en tiempo real. Con el desarrollo del trabajo observase también, que el usuario de Instrumentación Electrónica Virtual es permitido diseñar interfaces definidas por el, pero debe atentar a varios problemas que pueden pasar con el proyecto. Por ejemplo, la elección apropiada de la velocidad de muestreo y la precisión del proceso de cuantificación al tempo de controle de timeout, para solicitud del srq. Pues puede haber un grave conflicto de informaciones en el Bus. Además para hacer el programa en C++, el usuario debe inicialmente adicionar las librerías adecuadas en el programa. Concluye entonces, que es indispensables la utilización del manual del usuario de los programas inclusos en este trabajo, de los instrumentos y del GPIB. 42 8.- Referencias Bibliográficas [1] Keithley Instruments Inc. IEEE-488 Interface Boards. User´s Manual. Cleveland, Ohio, EE.UU, 2002. [2] E. Mandado, P. Mariño, y A. Lago. Instrumentación Electrónica. Marcombo, Boixareu Editores, Barcelona, 1995. [3] R. Pallás Areny. Instrumentación Electrónica Básica. Marcombo, Boixareu Editores, Barcelona, 1987. [4] R. Pallás Areny. Adquisición y Distribución de Señales. Marcombo, Boixareu Editores, Barcelona, 1993. [5] S. Wolf. y R.F.M. Smith. Guía para Mediciones Electrónicas y Prácticas de Laboratorio. Edición ampliada y actualizada. Prentice-Hall Hispanoamericana. México, etc, 1992. [6] John G.Proakis, Dimitris G. Manolakis Tratamiento digital de señales : [principios, algoritmos y aplicaciones] / 43