Control remoto de instrumentación para radiocomunicación mediante Python
Abstract
La finalidad de este proyecto es el diseño de un código en lenguaje Python que se encargue de automatizar medidas en instrumentos para radiocomunicación mediante control remoto. Posteriormente, para comprobar que esta tarea es eficiente se caracterizan de manera experimental una serie de dispositivos no lineales mediante la generación de un tono. Además, se hará una investigación acerca de las prestaciones que ofrece Python en este campo.
Full text
Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Control remoto de instrumentación para radiocomunicación mediante Python Autor: Iván Pulido Muñoz Tutor: María José Madero Ayora Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2017
iii Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Control remoto de instrumentación para radiocomunicación mediante Python Autor: Iván Pulido Muñoz Tutor: María José Madero Ayora Profesor titular Dep. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2017
v Proyecto Fin de Carrera: Control remoto de instrumentación para radiocomunicación mediante Python Autor: Iván Pulido Muñoz Tutor: María José Madero Ayora El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2017
El Secretario del Tribunal
vii A mi familia y amigos A mis maestros
ix Agradecimientos En primer lugar, agradecer a mis padres todo lo que han hecho por mí, siempre supieron cómo motivarme para seguir adelante. A Laura y mi familia por su apoyo incondicional durante estos años. En segundo lugar, me gustaría darle las gracias a mis amigos y compañeros que me han ayudado y apoyado en todo lo que han podido. Para finalizar hacer una especial mención a mi tutora, María José Madero Ayora, que supo transmitirme la motivación y el interés necesario para afrontar el trabajo. Iván Pulido Muñoz Trabajo Fin de Grado en Ingeniería de las Tecnologías de Telecomunicación Sevilla, 2017
3.8.5. Comandos SCPI 20 3.9. Funcionamiento. Transferencia de datos 20 3.9.1. Síntesis 20 3.9.2. Esquema de envío de información en GPIB 21 3.10. Otros métodos de control remoto 21 3.10.1. LAN 21 3.10.2. PXI 23 3.10.3. Comparativa de métodos de control remoto 24 4 Python 25 4.1. Introducción 25 4.2. Definición 25 4.2.1. Evolución histórica 25 4.3. Características y ventajas para su uso 26 4.4. Formas de trabajo en Python 27 4.5. Tipos básicos 27 4.5.1. Números 27 4.5.2. Cadenas 28 4.5.3. Booleanos 29 4.6. Colecciones 30 4.6.1. Listas 30 4.6.2. Tuplas 31 4.6.3. Diccionarios 31 4.7. Control de flujo 32 4.7.1. Sentencias condicionales 32 4.7.2. Bucles 33 4.8. Funciones 34 4.9. Orientación a objetos 35 4.9.1. Clases y objetos 35 4.9.2. Herencia 35 4.9.3. Polimorfismo 36 4.9.4. Encapsulación 36 4.10. Programación funcional 36 4.10.1. Funciones de orden superior 36 4.10.2. Funciones Lambda 37 4.10.3. Generadores 37 4.10.4. Decoradores 37 4.11. Módulos y paquetes 37 4.11.1. Módulos 37 4.11.2. Paquetes 38 4.12. Manejo de archivos 38 4.12.1. Entrada estándar 38 4.12.2. Parámetros de línea de comando 38 4.12.3. Salida estándar 39 4.12.4. Archivos 39 4.13. Control remoto con Python 40 4.13.1. Python vs. Matlab para el control remoto 40 4.13.2. PyVISA 42 4.14. Entorno de trabajo: Anaconda 42 5 Laboratorio de radiocomunicación 45 5.1. Instrumentación 45 5.1.1. Analizador vectorial de señales 45 5.1.2. Generador de señal 46 5.2. Problema de la no linealidad 47
xvii 5.2.1. Introducción 47 5.2.2. Distorsión armónica 47 5.2.3. Punto de compresión de 1 dB 48 5.2.4. Productos de intermodulación 48 5.2.5. Punto de intercepto de tercer orden, IP3 48 5.2.6. ACPR 49 6 Desarrollo del código 51 6.1. Introducción 51 6.2. Conexión remota 51 6.3. Lectura y escritura en el instrumento 52 6.4. Tipos de barrido 53 6.4.1. Barrido de potencia 55 6.4.2. Barrido de frecuencia 56 6.5. Lectura de potencia 57 6.6. Impresión de resultados 61 6.6.1. Archivo de valores finales 61 6.6.2. Gráficas 62 7 Resultados experimentales 63 7.1. Introducción 63 7.2. Consideraciones previas 63 7.3. Primera prueba: Comportamiento de un amplificador de potencia 64 7.3.1. Introducción 64 7.3.2. Montaje 64 7.3.3. Medidas previas 65 7.3.4. Ejecución y resultados: Barrido de potencia 66 7.3.5. Ejecución y resultados: Barrido de frecuencia 68 7.4. Segunda prueba: Comportamiento de un mezclador 69 7.4.1. Introducción 69 7.4.2. Montaje 70 7.4.3. Medidas previas 71 7.4.4. Ejecución y resultados: Barrido de potencia 72 7.4.5. Ejecución y resultados: Barrido de frecuencia 73 8 Conclusiones y líneas futuras de trabajo 77 Referencias 79 Glosario 81 Anexo 1 85 Anexo 2 87 Anexo 3 89
xix ÍNDICE DE TABLAS Tabla 3–1. Mensajes de comando en el bus GPIB. 14 Tabla 3–2. Naturaleza de cada comando. 18 Tabla 4–1. Operadores aritméticos. 28 Tabla 4–2. Operadores a nivel de bit. 28 Tabla 4–3. Operadores lógicos o condicionales. 29 Tabla 4–4. Operadores relacionales. 30 Tabla 4–5. Especificadores. 39 Tabla 6–1. Valores de “rlevel” para cada armónico. 61 Tabla 7–1. Pérdidas de los cables en el escenario de la primera prueba. 66 Tabla 7–2. Valores introducidos en el barrido de potencia de la primera prueba. 67 Tabla 7–3. Valores introducidos en el barrido de frecuencia de la primera prueba. 68 Tabla 7–4. Pérdida de los cables a la entrada en el escenario de la segunda prueba. 71 Tabla 7–5. Pérdidas de los cables a la salida en el escenario de la segunda prueba. 72 Tabla 7–6. Valores introducidos en el barrido de potencia de la segunda prueba. 72 Tabla 7–7. Valores introducidos en el barrido de frecuencia de la segunda prueba. 74 Tabla 7–8. Valores de fluctuación por los que se obtiene un pico abrupto. 75
xxi ÍNDICE DE FIGURAS Figura 2-1. Instrumentos tradicionales frente a instrumentos virtuales. 4 Figura 3-1. Bus GPIB. 7 Figura 3-2. Ejemplo de configuración en estrella. 9 Figura 3-3. Ejemplo de configuración lineal. 9 Figura 3-4. Diagrama de interconexión a través del bus GPIB. 10 Figura 3-5. Líneas del bus GPIB. 12 Figura 3-6. Conector GPIB norma americana (izquierda) y norma europea (derecha). 13 Figura 3-7. Diagrama de tiempos de operación. TS es el tiempo de estabilización de los datos. 20 Figura 3-8. Esquema de una Red de Área Local (LAN). 22 Figura 3-9. Sistema PXI con controlador embebido. 24 Figura 4-1. Popularidad de los lenguajes de programación (IEEE Spectrum 2015). 26 Figura 4-2. Ejemplo de numeración compleja. 27 Figura 4-3. Ejemplo de cadena. 29 Figura 4-4. Concatenación de cadenas. 29 Figura 4-5. Ejemplo de lista. 30 Figura 4-6. Ejemplo de tupla. 31 Figura 4-7. Ejemplo de diccionario. 31 Figura 4-8. Ejemplo de sentencia condicional. 32 Figura 4-9. Ejemplo de bucle While. 33 Figura 4-10. Ejemplo de bucle for. 33 Figura 4-11. Ejemplo de función. 35 Figura 4-12. Diagrama que muestra las diferencias de ecosistema entre Matlab y Python. 41 Figura 4-13. Navegador de Anaconda. 43 Figura 4-14. Herramienta Spyder. 43 Figura 5-1. Analizador de señal. 45 Figura 5-2. Generador de señal. 46 Figura 5-3. Punto de compresión de 1 dB. 48 Figura 5-4. Punto de intercepto de tercer orden. 49 Figura 5-5. Figura tomada de un analizador de espectro en modo medición de potencia de canal adyacente. 50 Figura 6-1. Apertura de conexión remota en Python. 51 Figura 6-2. Apertura de conexión con listado de instrumentos posibles. 51 Figura 6-3. Ejemplo de modificación del timeout y chunk_size. 52 Figura 6-4. Formato de órdenes No Query, utilizada en la función send_command.py. 52
Figura 6-5. Formato de órdenes Only Query, utilizada en la función send_query.py. 53 Figura 6-6. Tipos de barrido. 53 Figura 6-7. Parámetros comunes a los dos tipos de barrido. 54 Figura 6-8. Barrido de potencia. 55 Figura 6-9. Procesamiento de las variables en caso de barrido de potencia. 55 Figura 6-10. Procesamiento de las variables en caso de barrido de frecuencia. 56 Figura 6-11. Barrido de frecuencia. 57 Figura 6-12. Apertura de la conexión con el generador de señales. 58 Figura 6-13. Configuración del generador de señales con los valores de frecuencia y potencia. 58 Figura 6-14. Llamada a la función medida.py en el bucle del script medida_1tono_sinDC.py. 58 Figura 6-15. Configuración del analizador de señales con los parámetros pasados como argumento. 60 Figura 6-16. Lectura del valor de potencia. 60 Figura 6-17. Matriz de valores de potencia corregidos. 61 Figura 6-18. Generación del documento de resultados para un barrido de potencia. 62 Figura 6-19. Generación de la gráfica de resultados para un barrido de frecuencia. 62 Figura 7-1. Amplificador de potencia ZLJ-6G+. 64 Figura 7-2. Escenario de la prueba 1. 64 Figura 7-3. Cable SMA hembra (izquierda) y macho (derecha). 65 Figura 7-4. Resultado del barrido de potencia de la primera prueba. 67 Figura 7-5. Resultado del barrido de frecuencia de la primera prueba. 69 Figura 7-6. Mezclador MCA1-60+. 70 Figura 7-7. Escenario de la prueba 2. 70 Figura 7-8. Resultado del barrido de potencia de la segunda prueba. 73 Figura 7-9. Resultado del barrido de frecuencia de la segunda prueba. 74
1 1 INTRODUCCIÓN n la actualidad, cada vez son más comunes los sistemas que intercambian información utilizando el espectro radioeléctrico como medio de transmisión, es decir, los sistemas de radiocomunicación. Debido a su expansión, sobre todo en comunicaciones móviles, resulta de un gran interés realizar medidas para observar y controlar el comportamiento de los dispositivos que usan estas tecnologías. Esto se lleva a cabo con la ayuda de la instrumentación de laboratorio, para ello es necesario realizar miles de medidas con tiempos de ejecución de horas e incluso días en algunos casos. El objetivo de este proyecto es hacer más eficientes estas tareas. Mediante el lenguaje de programación Python es posible diseñar programas que automatizan una medida en un instrumento de forma remota. La ejecución de los mismos permite controlar y conseguir datos de los equipos en cuestión de minutos. 1.1. Objetivos y alcance Como se acaba de comentar, la automatización de medidas es un trabajo muy tedioso de hacer manualmente ya que se requieren unos tiempos de ejecución elevados para cada prueba. Debido a ello, se pretenden facilitar estas tareas mediante el diseño de un programa que realice medidas experimentales usando los instrumentos del laboratorio mediante control remoto. Específicamente, el objetivo de este proyecto es el diseño de un código en lenguaje Python que caracterice dispositvos no lineales a través de la generación de un tono y con ello comprobar la eficiencia con la que se obtienen los resultados, tanto en formato numérico como gráfico, para poder trabajar con ellos. Además, debido a que es la primera vez que se usa Python para realizar tareas de automatización, se quieren estudiar las posibilidades y prestaciones que ofrece. 1.2. Organización y metodología La memoria de este Trabajo Fin de Grado se ha organizado en tres bloques de contenidos que se indican a continuación brevemente resumidos: - En los primeros capítulos se realiza un desarrollo teórico de todo concepto y material necesario para la realización del proyecto (desde el 2 al 5, ambos incluidos). Se comienza con una explicación de la Instrumentación Virtual, particularizando en el estándar VISA, para seguidamente introducir el bus GPIB, que utiliza VISA y permite realizar una comunicación entre varios instrumentos. Luego se profundiza en el lenguaje de programación utilizado para controlar y realizar las funciones que marcan este trabajo, Python, haciendo una sinopsis del mismo, para a posteriori, explicar cómo se puede llevar a cabo el control remoto de equipos y los diferentes paquetes a utilizar para esta labor. Finalmente, se nombran los equipos con los que se trabaja en el laboratorio comentando brevemente su utilidad y se describen los tipos de problemas no lineales que se pueden encontrar en los elementos a caracterizar. - En segundo lugar, se ha realizado un desarrollo del código diseñado destacando las partes más importantes que han permitido conseguir el objetivo del trabajo y obtener medidas de potencia de un dispositivo no lineal. - Por último, se han analizado los escenarios de ejemplo que se han utilizado para comprobar el correcto funcionamiento del código, comentando los resultados obtenidos en cada una de las pruebas hechas. E
Introducción 2 Cabe destacar que en el desarrollo de los conceptos teóricos, Capítulos 2, 3, 4 y 5, donde se ilustra al lector con información de las herramientas y los fundamentos empleados, lógicamente, no se pretende publicar un manual de referencia de todos los recursos utilizados, sino una introducción y breve descripción de cada uno de ellos. De esta forma, se busca asentar las bases que permitirán comprender mejor el proceso de investigación, estudio, aprendizaje y puesta en funcionamiento realizado en este Trabajo Fin de Grado.
3 2 INSTRUMENTACIÓN VIRTUAL 2.1. Introducción La instrumentación virtual es un concepto introducido por la compañía Nacional Instruments. En el año 1983, Truchard y Kodosky, decidieron enfrentar el problema de crear un software que permitiera utilizar el ordenador personal como instrumento para realizar mediciones. Tres años fueron necesarios para elaborar la primera versión del software que permitió, de una manera gráfica y sencilla, diseñar un instrumento en el ordenador. De esta manera surge el concepto de instrumento virtual, como lo definieron en National Instruments: “un instrumento que no es real, se ejecuta en una computadora y tiene sus funciones definidas por software”. A este software le dieron el nombre de laboratory virtual instrument engineering workbench, más comúnmente conocido por las siglas LabVIEW. A partir del concepto de instrumento virtual, se define la instrumentación virtual como un sistema de medición, análisis y control de señales físicas con un ordenador personal por medio de instrumentos virtuales. LabVIEW, por tanto, fue el primer software empleado para diseñar instrumentos en el ordenador personal y emplea una metodología de programación gráfica, a diferencia de los lenguajes de programación tradicionales. Su código no se realiza mediante secuencias de texto, sino en forma gráfica, similar a un diagrama de flujo. Dicho concepto nace a partir del uso del ordenador como forma de reemplazar equipos físicos. El usuario opera un instrumento que no es real, realiza mediciones con él, que se ejecutan en un ordenador, pero realiza las mismas funciones que un instrumento real. El concepto de la instrumentación virtual es el de reemplazar elementos hardware por software obteniendo sus mejores ventajas e incluso mejorándolas. De esta manera el usuario final del sistema solo ve la representación gráfica de las variables manipuladas en el sistema y botones de control virtuales en la pantalla del ordenador. La instrumentación virtual implica la adquisición de señales, el procesamiento, análisis, almacenamiento, distribución y despliegue de los datos e información relacionados con la medición de una o varias señales, la interfaz hombre-máquina, la visualización, monitorización y supervisión remota del proceso, la comunicación con otros equipos, etc. Un sistema de instrumentación virtual está enfocado a los instrumentos encargados de medir señales, registrar datos y decidir las acciones de control. Evidentemente, se requiere de una etapa de actuación, que conforma la interfaz entre el ordenador y el sistema a controlar. Además, existen otras etapas auxiliares que no intervienen en el proceso de medida, como es el caso del subsistema de alimentación. En los últimos 20 años, el auge en el uso de los ordenadores ha generado un cambio en la instrumentación de ensayos, mediciones y automatización, por ello, la instrumentación virtual ofrece grandes ventajas a científicos e ingenieros que requieran mayor calidad, rendimiento y eficiencia para desempeñar su trabajo. Resumiendo lo anteriormente explicado, un instrumento virtual consiste en el conjunto de un ordenador personal o una estación de trabajo, software de instrumentación, hardware (dependiendo de la tarea en particular) y los drivers que permitan al sistema operativo interactuar con los periféricos. Es decir, el PC comienza a ser utilizado para realizar mediciones de fenómenos físicos representados en señales de corriente y/o voltaje y con la instrumentación virtual se consigue involucrar la interfaz hombre-máquina, las funciones de análisis y procesamiento de señales, las rutinas de almacenamiento de datos y la comunicación con otros equipos. 2.2. Evolución de la tecnología En sus orígenes, estos equipos, compuestos de una tarjeta de adquisición de datos con acondicionamiento de señales y el software apropiado estaban orientados a laboratorios, donde sus prestaciones eran muy requeridas por la gran precisión y capacidad de adecuar sus capacidades y cálculos de forma acorde al proceso que se estaba analizando. Con el tiempo, se fueron obteniendo cada vez soluciones y prestaciones más robustas en PC
Bus GPIB 10 3.3.1. Especificaciones La funcionalidad del estándar GPIB ha ido evolucionando a lo largo de la historia y se encuentra descrita en las siguientes especificaciones: - IEEE 488.1 (1975): Especificación que define las características de nivel físico (mecánico y eléctrico), así como sus características funcionales básicas. - IEEE 488.2 (1987): Especificación que define las configuraciones mínimas, los comandos y formatos de datos básicos y comunes a todos los equipos, el manejo de errores y los protocolos que se siguen en las comunicaciones. - SCPI, comandos estándar para instrumentos programables (Standard Commands for Programmable Instrumentation): Especificación construida sobre el estándar IEEE 488.2 que define una estructura de comandos estándar aceptados por múltiples instrumentos de muchos fabricantes. - VISA: Librería que puede ser usada para desarrollar aplicaciones y drivers de entrada/salida, I/O, de forma que el software de diferentes empresas pueda trabajar conjuntamente sobre el mismo sistema y puedan ser instalados en conjunción con drivers VXI plug&play utilizando simultáneamente varios medios de comunicación (GPIB, VXI, RS232, LAN, etc.) y en aplicaciones desarrolladas con diferentes lenguajes (C, C++, VisualBasic, etc.). 3.3.2. Restricciones Es de primordial importancia impedir que se transmitan 2 o más informaciones simultáneas a un dispositivo. Para cumplir con esas condiciones tenemos los siguientes elementos: Figura 3-4. Diagrama de interconexión a través del bus GPIB. - Transmisor (TALKER): Todo instrumento o dispositivo capaz de transmitir datos a través del bus, un ejemplo puede ser un voltímetro o un frecuencímetro. En cada bus pueden existir uno o varios equipos con capacidad de enviar datos a otros equipos por el bus, pero en cada instante sólo uno de ellos puede ser establecido por el controller para que opere como talker. Es el único equipo con capacidad de establecer el estado de las líneas DAV, dato válido (Data Valid). El equipo talker
11 Control remoto de instrumentación para radiocomunicación mediante Python sólo puede enviar un dato si todos los equipos que se encuentran en modo listener están en disposición de leerlo (Línea NRFD, dato no preparado (Not Ready For Data) a valor lógico FALSE). - Receptor (LISTENER): Todo instrumento o dispositivo capaz de recibir datos digitales a través del bus, por ejemplo, una fuente programable. En cada bus pueden existir uno o varios equipos con capacidad de recibir datos desde el bus, y uno o varios de ellos se puede encontrar simultáneamente en modo listen. Todos los equipos que se encuentran en estado listen reciben simultáneamente todos los datos que son transferidos por el bus. - Idler: Sin ninguna capacidad respecto del bus. - Controlador (CONTROLLER): Todo instrumento o dispositivo capaz de administrar las comunicaciones a través del bus, designar los dispositivos que han de transmitir o recibir datos durante cada secuencia de medición, e interrumpir y ordenar acciones internas específicas en los dispositivos. Las tarjetas de interfaz GPIB son estos controladores. Logran gobernar el flujo de información mandando comandos a los instrumentos para que se comuniquen entre sí o respondan a pedidos de servicio de los dispositivos. Puede haber más de un controlador en un bus. Un controlador puede pasar el control del bus de sí mismo a otro controlador, pero solo uno puede tener el control del bus. Un sistema construido sobre el bus GPIB puede ser configurado en uno de los siguientes tres modos: Sin uso de controller: En esta configuración uno de los equipos debe tener capacidad para actuar como talker únicamente, y los restantes solo como listener. La transferencia de datos posibles es desde el talker a todos los listener simultáneamente. Con controller único: En esta configuración las transferencias de datos posibles son desde el controller a los equipos en modo comando y datos, de un equipo al controller solo en modo datos, y de un equipo a otro equipo solo en modo datos. Con múltiples controller: En este caso tiene las mismas capacidades que la configuración anterior, solo que en ésta también es posible la transferencia entre equipos de la capacidad de operar como controller activo. 3.4. Transmisión de señal en el bus GPIB 3.4.1. Señales lógicas Todas las líneas del GPIB operan con niveles de tensión TTL, lógica transistor a transistor (Transistor- Transistor Logic), y utilizando una lógica negativa. Quiere decir esto que un nivel de tensión que no supere el valor de 0.8 Voltios corresponde a un estado lógico TRUE, y un nivel de tensión superior a 2.5 Voltios corresponde a un estado lógico FALSE. Las puertas de salida en cada equipo sobre una línea del bus utilizan la tecnología open-collector, esto hace que una línea del bus estará en estado TRUE lógico (tensión baja) si ese es el valor de salida que corresponde para esa línea en algún equipo y en el estado FALSE lógico (tensión alta) si el valor corresponde en todos los equipos. Algunas interfaces GPIB utilizan una tecnología tri-state para el control de las líneas del bus, pero siguiendo la misma funcionalidad que con la tecnología open-collector. Con esta tecnología se pueden conseguir mayores velocidades de transferencia de datos. Dada la tecnología de control de líneas que se utiliza, aunque funcionalmente podrían conectarse a un bus más de 15 equipos (siempre que algunos de ellos sean sólo Listener), las prestaciones dinámicas del bus podrían deteriorarse con ello. 3.4.2. 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
Bus GPIB 12 la interfaz. La Figura 3-5 muestra la estructura de las líneas del bus. Figura 3-5. Líneas del bus GPIB. A continuación, se describen con detalle las líneas que componen el bus GPIB: - Líneas de datos: Las 8 líneas de datos DIO1-DIO8 pueden transportar tanto datos como órdenes. El estado de la línea de atención, ATN, (una de las 5 de control general) determina si son datos u órdenes los presentes en el bus, 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, código estándar estadounidense para el intercambio de la información (American Standard Code for Information Interchange), o ISO, organización internacional de estandarización (International Organization for Standardization). En este caso el octavo bit se emplea para paridad o no se emplea. Permiten que el único equipo establecido como transmisor envíe un byte en paralelo hacia todos aquellos equipos que en ese instante estén definidos como receptor. - 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: Indica cuándo un dispositivo está preparado para recibir un byte. La línea es conducida por todos los dispositivos cuando reciben órdenes y por el transmisor de datos cuando habilita el protocolo HS488. Gobernada por los equipos establecidos en escucha. Cuando esta línea está a nivel de tensión bajo, significa que algún equipo de entre los receptores no está aún dispuesto para aceptar nuevos datos. En esta situación la línea inhibe al equipo transmisor a que inicie el envío de un nuevo dato. El que esta línea esté a nivel de tensión alto, significa que todos los equipos receptores se encuentran a la espera de un nuevo dato, momento en el que el transmisor puede establecer el dato en el bus. NDAC, dato no aceptado (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 a recibir órdenes y/o datos cuando reciben la información y es gobernada por los equipos que están establecidos en escucha. Cuando se encuentra a nivel de tensión bajo, significa que alguno de los equipos establecidos como receptor aún está pendiente de leer un dato, en consecuencia, el transmisor debe esperar aún para retirar los datos. Cuando esta línea se encuentra a nivel de tensión alto significa que todos los equipos receptores han leído el dato transferido y por tanto el transmisor puede retirar el dato del bus. DAV: 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 y los transmisores la conducen cuando envían mensajes de datos, además es gobernada por ellos. Un nivel bajo de tensión en esta línea significa que el equipo establecido como transmisor activo ha establecido unos datos
13 Control remoto de instrumentación para radiocomunicación mediante Python válidos sobre el bus de datos que deberán ser leídos por todos los equipos que están en escucha. - Líneas de control general de la interfaz. A dicho grupo pertenecen: SQR, petición de servicio (Service Request): Se emplea para solicitar turno al controlador. Cuando el controlador detecta una petición en esta línea, debe iniciar una encuesta (polling) para determinar qué equipo causó el requerimiento, y en el caso de que proceda, satisfacer su demanda. IFC, reseteo de interfaz (Interface Clear): Realiza un reset (puesta a valor nulo) de los parámetros y direcciones del bus cuando en la línea se establece un nivel de tensión baja, además todos ellos deben pasar a su estado base. Bajo el exclusivo control del system controller. REN, habilitación remota (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, fin de identidad (End Or Identity): Se emplea por el transmisor como indicador de fin de transferencia de datos. Además, esta línea es utilizada por el controlador para iniciar una encuesta paralela. Debe poner simultáneamente a un nivel de tensión bajo las señales ATN y EOI, y como respuesta a ello, los equipos que previamente hayan sido configurados para participar en la encuesta paralela transfieren su bit de status sobre el bus. ATN, línea de atención (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. Cuando la línea toma un nivel de tensión bajo equivale a que el dato que se envía por el bus de datos es un comando enviado por el controlador. Mientras que si toma un nivel alto indica que el byte del bus de datos debe ser considerado como un dato. 3.5. Normas internacionales del bus GPIB En este apartado se va a mostrar mediante la Figura 3-6 las diferencias entre los diferentes tipos de buses GPIB que se usan en la actualidad. Figura 3-6. Conector GPIB norma americana (izquierda) y norma europea (derecha).
Bus GPIB 14 Los mensajes utilizados para el diálogo de comunicación entre los diferentes dispositivos a través del bus sí son universales y se muestran en la Tabla 3-1. Más adelante, en el apartado 3.8. Comandos, se explica brevemente la utilidad de cada uno y su respectiva división en categorías dependiendo de la funcionalidad que pueden tener. Tabla 3–1. Mensajes de comando en el bus GPIB. MNEMONIC MESSAGE DESCRIPTION COMMENTS ATN Attention Received DAC Data accepted Received or Sent DAV Data Valid Receivedor Sent DCL Device Clear Received GET Group Executive Trigger Received IFC Interface Clear Received MLA My Listen Address Received MTA My Talk Address Received OTA Other Talk Address Received RFD Ready For Data Received or Sent SDC Selected Device Clear Received SPD Serial Poll Disable Received SPE Serial Poll Enable Received SRQ Service Request Sent UNL Unlisten Received UNT Untalk Received 3.6. Componentes que se utilizan en el control de la instrumentación por GPIB - Equipo: Instrumento del entorno que se controla. Debe estar dotado con una tarjeta hardware de conexión al bus GPIB. Para su control dispone de software interno de control que interpreta los mensajes que recibe por el bus GPIB e interacciona con el firmware propio del equipo. El parser es el hilo de gestión del intercambio de mensajes por el bus GPIB. - Nivel Físico (IEEE 488.1) : La comunicación entre los equipos se basa en un bus físico, compuesto por un conjunto de líneas con niveles lógicos bien definidos y con protocolos de comunicación basados en los estados lógicos de las líneas. - Nivel Operativo (IEEE 488.2): El protocolo operativo básico dentro del que se encuadra el
15 Control remoto de instrumentación para radiocomunicación mediante Python intercambio de información, datos e instrucciones básicas de control. - Driver GPIB (SCPI): El ordenador interacciona con el bus GPIB a través de una tarjeta de control hardware que resuelve y atiende los dos protocolos anteriores. El propio fabricante ofrece una interfaz software implementada por un conjunto de funciones que permiten el acceso de los programas a la funcionalidad del bus. Puede ofertar una interfaz constituida por una librería de funciones que corresponde al lenguaje SCPI. - Driver VISA: Estándar de driver que ofrece un conjunto de librerías estandarizadas que permiten integrar equipos conectados por diferentes medios de comunicación. 3.7. Protocolos del GPIB 3.7.1. Introducción En informática y telecomunicaciones, un protocolo es una convención, o acuerdo entre partes que regulan la conexión, la comunicación y la transferencia de datos entre dos sistemas. En su forma más simple, un protocolo se puede definir como las reglas que gobiernan la semántica, la sintáxis y la sincronización de la comunicación. Los protocolos pueden estar implementados bien en hardware, software o una combinación de ambos. 3.7.2. Registros de Estado La norma contempla tres registros de estado. Además, cada uno de ellos tiene un registro de habilitación/deshabilitación que permite enmascarar ciertos bits. Los tres registros son: - Standard Event Status Register (8 bits), contiene las siguientes informaciones: Operation Complete (operación completa). Request Complete (petición completa). Query Error (error de pregunta). Device Error (error de dispositivo). Execution Error (ejecución de error). Command Error (comando de error). Power On (alimentación encendida o apagada). - Questionable Data (16 bits), contiene las siguientes informaciones: Voltage Overload (caso de sobretensión). Current Overload (caso de sobrecorriente). Ohms Overload (sobreresistencia). Limit Test Fail LO (fallo de la prueba de límite inferior). Limit Test Fail HI (fallo de la prueba de límite superior). - Status Byte (8 bits), registro de estado ya existente en la forma IEEE 488.1 que contiene los siguientes bits: Questionable Data: Si alguno de los bits del registro Questionable Data está activo y habilitado. Message Avaliable: Si hay un mensaje que el instrumento quiere enviar. Tiene una cola de salida (output buffer) donde están los posibles mensajes a enviar.
Bus GPIB 16 Standard Event: Si alguno de los bits del registro Standard Event Status Register está activo y habilitado. Request Service (bit sin máscara): Si el instrumento ha perdido o no una petición al controlador. 3.7.3. Protocolo básico Se indican a continuación algunas consideraciones del equipo y controlador de un sistema de bus GPIB: - Los comandos son ejecutados en el orden en que han sido recibidos. - El equipo y el controlador se comunican intercambiando mensajes de órdenes y de respuesta. Esto significa que el controlador siempre debe terminar un mensaje de órdenes, antes de intentar leer una respuesta. - Equipo: La regla básica del protocolo es: El equipo solo habla cuando está dispuesto a ello, y en ese caso, tiene que hablar antes de que se le ordene hacer una cosa nueva. Solo habla como respuesta de una orden de requerimiento. Cuando se enciende el equipo, o cuando recibe una orden de inicialización (*CLS), se inicializan los buffers de entrada y de salida, y el parser se inicializa a la raíz de su árbol de órdenes. - Controlador: Envía los mensajes de órdenes y pueden ser de dos tipos: Órdenes de control: requieren un cambio de estado del equipo, pero no requieren ninguna respuesta. Órdenes de requerimiento: solicitan información sobre el estado del equipo o sobre información que posee. Puede enviar un mensaje conteniendo múltiples órdenes de requerimientos. A esto se le denomina un requerimiento compuesto. Los diferentes requerimientos dentro del mensaje deben estar separados por el delimitador „;‟. Los mensajes de respuesta son encolados en la cola de salida, separados entre sí también por el delimitador „;‟. Solo admite un mensaje de salida (respuesta de una orden de requerimiento), y lo requiere antes de enviar un nuevo mensaje de órdenes. En caso contrario se genera una situación de bloqueo. Si el equipo envía un mensaje de respuesta, el controlador debe leer siempre de forma completa el mensaje, antes de que envíe un nuevo mensaje de órdenes al equipo. 3.7.4. Protocolos de excepción Cuando se produce un error en el proceso de intercambio de la información, éste no termina en la forma normal, sino que sigue un protocolo de excepción. En las siguientes líneas se indican los diferentes casos por los que puede dar problemas y la forma de acabar que tiene el sistema: - Equipo direccionado para hablar sin nada en la cola: Si es consecuencia de que el equipo no haya recibido una orden de requerimiento, el equipo indicará un error de encolamiento, y no enviará ningún byte por el bus. Si es como consecuencia de que la orden de requerimiento previa no se ejecutó debido a un error, el equipo no indica ningún error de encolamiento, sino que espera a recibir el siguiente mensaje del controlador.
17 Control remoto de instrumentación para radiocomunicación mediante Python - Equipo direccionado para hablar sin que ninguno escuche: Esperará o bien a que algún equipo escuche, o a que el controlador tome el control. - Error de orden: Se genera cuando se detecta un fallo de sintaxis o una orden no reconocible. - Error de ejecución: Se genera si un parámetro está fuera de rango, o si el equipo se encuentra en un estado que no permita la ejecución del comando requerido. - Error específico del equipo: Se produce cuando el equipo es incapaz de ejecutar una orden, como consecuencia de una razón estrictamente dependiente de él, y no del protocolo seguido por el bus. - Error de encolamiento: Se genera si no se sigue el protocolo de lectura de los datos de la cola de salida. - Condición inconclusa: Si el controlador intenta leer un mensaje de respuesta antes de que el programa haya concluido de ejecutar la orden que los genera. En este caso el parser se inicializa a sí mismo, la respuesta ya elaborada es limpiada de la cola de salida y ningún dato es transferido por el bus. - Condición interrumpida: Si el controlador no lee completamente el mensaje generado por un mensaje de requerimiento, y envía otro mensaje de orden, el equipo genera un error de encolamiento, y el segmento de mensaje de salida no leído es eliminado. La orden que interrumpe es inafectada. - Bloqueo de buffer: El equipo alcanza un estado de bloqueo si el buffer de entrada está lleno y también resulta llena la cola de salida. Esta situación ocurre si se envía un mensaje muy largo que contiene órdenes de requerimiento, y genera un mensaje de salida superior al que puede contener la cola. El controlador no puede terminar de enviar el mensaje de entrada porque no cabe y el buffer de entrada no se vacía porque espera que su cola de salida sea vaciada para concluir la orden en ejecución. En este caso el equipo rompe el bloqueo, limpiando la cola de salida y generando un error de encolamiento. 3.7.5. Estado de un equipo El estándar IEEE 488.2 ofrece un mecanismo estandarizado de presentar y mostrar el estado interno del equipo. A través de este mecanismo, se puede tener información de si el equipo tiene un dato dispuesto para transferir, así como si ha ocurrido algún tipo de error. El mecanismo se basa en cuatro registros: - SBR, registro de estado de bytes (Status Byte Register): Cada bit está asociado con un tipo de estado específico del instrumento. Cuando el estado cambia, el instrumento establece el correspondiente bit a 1. Se puede habilitar e inhibir el efecto de cada bit del SBR a efectos de requerir atención (bit SQR), con el correspondiente bit del registro SRER. Se puede determinar qué eventos han ocurrido leyendo los establecidos en el registro SBR. - SRER, registro de solicitud de servicio (Service Request Enable Register): Máscara de los bits correspondientes del registro SBR que va a determinar si se establece el Request Service (bit SQR). - ESR, registro de evento de estado (Event Status Register): Cada bit está asociado con un tipo específico de evento. Cuando un evento ocurre, el instrumento establece el correspondiente bit a 1. Se pueden habilitar o inhibir los eventos que van a ser proyectados sobre el bit ESR a través de los correspondientes bits de máscara de registro ESER. Se puede leer el evento que ha ocurrido leyendo el contenido del registro ESR. - ESER, registro de habilitación de estados (Event Status Enable Register): Máscara de los bits del registro ESR que van a requerir el servicio a través del registro SBR.
Bus GPIB 18 3.8. Comandos Los comandos de bus son siempre enviados desde el controlador a los otros equipos para sincronizar su estado de operación o para establecer su estado de operación. En los comandos de bus se envían datos por el bus de datos, si es necesario, de igual modo que en la transferencia de datos, solo que en estos casos la señal ATN es establecida a nivel de tensión bajo por el controlador para indicar que es un comando, y todos los equipos con independencia de que sean transmisores o receptores reciben el comando. El controlador puede enviar cinco tipos de comandos de bus a los otros equipos: addressed, listen, talk, universal y secondary. Solo los 7 bits menos significativos del bus son utilizados en los comandos de bus. Los tres bits b7, b6 y b5, definen la naturaleza de cada comando. Tabla 3–2. Naturaleza de cada comando. b7 b6 b5 Tipo Comando 0 0 0 Addressed 0 1 x Listen 1 0 x Talk 0 0 1 Universal 1 1 x Secondary Los equipos conectados al bus GPIB tienen asignado un código o dirección de bus comprendido entre 0 y 30, este código debe ser establecido en cada equipo. De tal forma que el código 31 queda reservado para hacer referencia a todos los equipos del bus simultáneamente. Normalmente, los cinco bits menos significativos de la línea de datos se utilizan en un comando para establecer a qué equipos hace referencia un comando. 3.8.1. Comandos Addressed Van destinados y afectan únicamente a aquellos equipos que previamente han sido establecidos como receptores: - GTL (Go To Local): Retorna el control de los paneles a todos los equipos en estado Listen. - SDC (Select Device Clear): Inicializa las interfaces hardware/software en los equipos en estado Listen. - PPC (Parallel Poll Configure): Configura la respuesta a una encuesta paralela de los equipos en estado Listen. Los equipos quedan a la espera de un comando MSA. - MSA (My Secondary Address): Establece la línea y el estado con la que responden en una encuesta paralela de los equipos receptores. - GET (Group Trigger): Dispara el Trigger de los equipos en estado Listen. - TCT (Take Control): Establece como controlador activo al equipo que está establecido como receptor. 3.8.2. Comandos Talk/Listen Este grupo está formado por los siguientes commandos:
19 Control remoto de instrumentación para radiocomunicación mediante Python - MTA (My Talk Address): Establece el modo Talker en el equipo indicado en la dirección binaria del comando. - UNT (UnTalk): El equipo en modo Talker pasa a modo Idler. - MLA (My Listen Address): Establece el modo Listen en el equipo indicado. - UNL (UNListen): Todos los equipos en modo Listen pasan a modo Idler. 3.8.3. Comandos Universal Mensajes enviados por el controlador a todos los equipos: - LLO (Local Lockout): Se deshabilitan los paneles de control de todos los equipos conectados al bus. - DCL (Device Clear): Inicializa las interfaces hardware/software de los equipos. - PPU (Parallel Poll Unconfigure): Se cancela la programación previa de los equipos a fin de responder en la encuesta paralela. - SPE (Serial Poll Enable): Habilita a todos los equipos a fin de que respondan a la encuesta serie. - SPD (Serial Poll Disable): Deshabilita el modo de encuesta serie. 3.8.4. Comandos Comunes Los comandos comunes son todos aquellos que son iguales para todos los dispositivos y los especiales son diferentes para cada uno. - CLS (Clear Status Command): Despeja el registro de estado y los registros de incidencia. - ESE (Event Status Enable Command): Habilita bits del registro de habilitación de incidencias. - ESE? (Event Status Enable Query): Interroga el registro de habilitación de incidencias estándar. - ESR? (Event Status Register Query): Interroga el registro de incidencias estándar. - IDN? (Identification Query): Identifica el tipo de instrumento y versión software. - LRN? (Learn Device Setup Query): Requiere el estado actual del equipo. - OPC (Operation Complete Command): Fija el bit de “Operacin Completa” del registro estndar. - OPC? (Operation Complete Query): Responde con „1‟ si se han ejecutado rdenes previas. - OPT? (Option Identification Query): Requiere la opción instalada en el equipo. - RCL (Recall Command): Restaura el estado del equipo del registro save/recall. - RST (Reset Command): Sitúa al equipo en el estado básico de referencia. - SAV (Save Command): Almacena el estado actual en un registro save/recall. - SRE (Service Request Enable Command): Habilita los bits del registro de habilitación de Byte de estado. - SRE? (Service Request Enable Query): Requiere el contenido del registro SER de habilitación del Byte de estado. - STB? (Read Status Byte Query): Requiere el estado del registro resumido del Byte de estado. - TRG (Trigger Command): Arranca o dispara la operación del equipo de forma remota. - TST? (Selft-Test Query): Requiere el resultado del autoset del equipo. - WAI (Wait-to-Continue Command): Espera a que se realicen todas las operaciones pendientes.
Python 26 llegado a ser uno de los idiomas de programación más usados. En la siguiente imagen se puede observar la evolución que ha experimentado en los últimos años. Figura 4-1. Popularidad de los lenguajes de programación (IEEE Spectrum 2015). 4.3. Características y ventajas para su uso Se ha utilizado Python debido a que posee las siguientes características que lo hacen muy interesante para la realización de tareas de control remoto: - Lenguaje de programación fácil de aprender con ciclos de desarrollo cortos. Sintaxis simple, clara y sencilla que permite realizar programas compactos y legibles. - Lenguaje interpretado, ahorra mucho tiempo durante el desarrollo ya que no es necesario compilar ni enlazar. El intérprete puede usarse interactivamente, lo que facilita experimentar con características del lenguaje, escribir programas descartables o probar funciones cuando se hace desarrollo de programas de abajo hacia arriba. - Representa un alto nivel de abstracción, que encaja perfectamente en el nivel de abstracción de los programas de medición. - Tiene tipado dinámico, por lo que no es necesario declarar el tipo de dato que va a contener una determinada variable, sino que su tipo se determinará en tiempo de ejecución según el tipo del valor al que se asigne. A su vez, el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo posteriormente. - Fuertemente tipado: No se permite tratar a una variable como si fuera de un tipo distinto al que tiene, es necesario convertir de forma explícita dicha variable al nuevo tipo previamente. - Multiplataforma: El intérprete de Python está disponible en multitud de plataformas (UNIX, Linux, Windows, Mac OS, etc.) por lo que si no utilizamos librerías específicas de cada plataforma nuestro programa podrá correr en todos estos sistemas sin grandes cambios. - Posee un gestor de memoria. - Python es extensible: quiere decir que se puede agregar una nueva función o módulo al intérprete, ya sea para realizar operaciones críticas a velocidad máxima, o para enlazar programas Python con bibliotecas que tal vez sólo estén disponibles en forma binaria. - Tiene un muy amplio conjunto de bibliotecas nativas, incluyendo módulos numéricos y de trazado para el análisis de datos y visualización.
27 Control remoto de instrumentación para radiocomunicación mediante Python - Hay disponible un gran conjunto de libros y publicaciones. 4.4. Formas de trabajo en Python En este apartado se indican las principales formas de trabajo por parte de los usuarios de este lenguaje de programación: - Con el intérprete directamente. - Con un procesador de texto, que se utiliza para ir creando scripts (.py). Las instrucciones se interpretan una a una por el terminal, en caso de producirse algún error salta. - Lanzando el script como un programa. Para que esta técnica funcione hay que dar permisos de ejecución al script que queremos lanzar. 4.5. Tipos básicos Las variables, como se ha indicado en una de las características anteriores, no tienen tipo, éste se le asigna cuando se declara y puede cambiar sobre la marcha. Las variables son objetos realmente. En las siguientes líneas se explican los tipos más comunes. 4.5.1. Números En Python se pueden representar números enteros, reales y complejos: - Enteros: Se representan mediante el tipo int o el tipo long. La única diferencia es que el tipo long permite almacenar números de mayor tamaño. Es aconsejable no utilizar este último a menos que sea necesario, para no malgastar memoria. El tipo long permite almacenar números de cualquier precisión, estando limitados solo por la memoria disponible en la máquina. Al asignar un número a una variable pasará a tener tipo int a menos que el número sea tan grande como para requerir el uso del tipo long. - Reales: Son los que tienen decimales, se expresan mediante el tipo float. Python implementa este tipo a bajo nivel mediante una variable de tipo double de C, es decir, utilizando 64 bits, luego en Python siempre se utiliza doble precisión de la siguiente forma: 1 bit para el signo, 11 para el exponente, y 52 para la mantisa. Desde Python 2.4 también se tiene el tipo decimal, para elcaso de que se necesite representar fracciones de forma más precisa. Para representar un número real, por tanto, se escribe primero la parte entera, seguido de un punto y por último la parte decimal. También se puede hacer mediante notación científica añadiendo el carácter “e” para indicar un exponente en base 10. - Complejos: Se representan con el tipo llamado complex, también se almacenan usando coma flotante, debido a que estos números son una extensión de los números reales. Figura 4-2. Ejemplo de numeración compleja. - Operadores. En este apartado se ve qué se puede hacer con los tipos de números vistos
Python 28 anteriormente usando los operadores por defecto. Para operaciones más complejas podemos recurrir al módulo math. Operadores aritméticos: Tabla 4–1. Operadores aritméticos. Operador Descripción + Suma - Resta - Negación * Multiplicación ** Exponente / División // División entera % Módulo Operadores a nivel de bit: Tabla 4–2. Operadores a nivel de bit. Operador Descripción & And | Or ^ Xor ~ Not << Desplazamiento izq. >> Desplazamiento der. 4.5.2. Cadenas Las cadenas están formadas por texto encerrado entre comillas simples o dobles. Dentro de las comillas se pueden añadir caracteres especiales escapándolos con “\”; como, por ejemplo: “\n”: nueva lnea, “\t”: tabulación, etc. Una cadena puede estar precedida por el carcter „u‟ o „r‟, los cuales indican, respectivamente, que se trata de una cadena que utiliza codificación Unicode o una cadena raw. Las cadenas raw se distinguen de las normales en que los caracteres escapados mediante la barra invertida (\) no se sustituyen por sus contrapartidas. También es posible encerrar una cadena entre comillas triples, con ellas se puede escribir el texto en varias
29 Control remoto de instrumentación para radiocomunicación mediante Python líneas y al imprimir la cadena se respetan los saltos de línea que se introdujeron sin tener que recurrir al carcter “\n”, as como las comillas sin tener que escaparlas. Figura 4-3. Ejemplo de cadena. Características de las cadenas: Se pueden utilizar algunos de los operadores aritméticos para realizar diferentes tareas con las cadenas, sobre todo es especialmente útil para la concatenación de las mismas. En el siguiente ejemplo se aprecia este último caso: Figura 4-4. Concatenación de cadenas. 4.5.3. Booleanos Una variable de tipo booleano sólo puede tener dos valores: True (cierto) y False (falso). Estos valores son muy significativos para las expresiones condicionales y los bucles. En las siguientes tablas se ven los distintos tipos de operadores con los que se pueden trabajar con los valores booleanos, conocidos como operadores lógicos o condicionales: Tabla 4–3. Operadores lógicos o condicionales. Operador Descripción And ¿Se cumplen ambos? Or ¿Se cumple alguno? Not Negación al término Los valores booleanos son el resultado de expresiones de comparación entre valores, utilizan los operadores relacionales de la Tabla 4-4:
Python 30 Tabla 4–4. Operadores relacionales. Operador Descripción == ¿Son iguales? != ¿Son distintos? < ¿Es menor que? > ¿Es mayor que? <= ¿Es menor o igual que? >= ¿Es mayor o igual que? 4.6. Colecciones En este apartado se ven algunos tipos de colecciones de datos como son: listas, tuplas y diccionarios. 4.6.1. Listas Son un tipo de colección ordenada. Es equivalente a lo que, en otros lenguajes como C, se conoce por arrays, o vectores. Pueden contener cualquier tipo de dato: números, cadenas, booleanos e incluso otras listas. Para crear una lista hay que indicar entre corchetes y separados por comas, los valores que queremos incluir en ella. Se puede acceder a cada uno de los elementos de la lista escribiendo el nombre de la lista e indicando el índice del elemento entre corchetes, sabiendo que el primer elemento siempre viende dado por el número 0. Se puede utilizar este operador para modificar un elemento de la lista si se coloca en la parte izquierda de una asignación. El operador “[]” de Python con el que se definen las listas tiene varias curiosidades: - Se pueden utilizar también como índice números negativos. Esto se traduce en que el índice empieza a contar desde el final hacia la izquierda, es decir, con [-1] accederíamos al último elemento de la lista, con [-2] al penúltimo, y así sucesivamente. - Otra particularidad de este operador es lo que en Python se conoce como slicing o particionado, que consiste en ampliar este mecanismo para permitir seleccionar porciones de la lista. Si en lugar de un número escribimos dos, inicio y fin, separados por dos puntos (inicio: fin) Python interpretará que queremos una lista que vaya desde la posición inicio a la posición fin, sin incluir este último. Figura 4-5. Ejemplo de lista. Operaciones a realizar con listas: - lista[i]: Devuelve el elmento que está en la posicin “i” de la lista. - lista.pop(i): Devuelve el elemento en la posicin “i” de una lista y posteriormente lo elimina.
31 Control remoto de instrumentación para radiocomunicación mediante Python - lista.append(elemento): Añade elemento al final de la lista. - lista.insert(i, elemento): Inserta elemento en la posicin “i”. - lista.extend(lista2): Fusiona lista con lista2. - lista.remove(elemento): Elimina la primera vez que aparece elemento. 4.6.2. Tuplas Para las tuplas se puede aplicar todo lo dicho en el apartado anterior sobre las listas a excepción de la forma de definirlas, para lo que se utilizan paréntesis en lugar de corchetes. Además, hay que tener en cuenta que es necesario añadir una coma para las tuplas de un solo elemento, para diferenciarlo de un elemento cualquiera entre paréntesis. Para referirnos al elemento de una tupla, como en una lista, se usa el operador “[]”. Se puede utilizar dicho operador debido a que las tuplas, al igual que las listas, forman parte de un tipo de objetos llamados secuencias. Las tuplas son inmutables, es decir, sus valores no se pueden modificar una vez creadas, además tienen un tamaño fijo. A cambio de estas limitaciones son más ligeras que las listas desde el punto de vista del procesador de la máquina, por lo que, si el uso que le vamos a dar a una colección es muy básico se pueden utilizar tuplas en lugar de listas y ahorrar memoria. Figura 4-6. Ejemplo de tupla. 4.6.3. Diccionarios Los diccionarios, también conocidos como matrices asociativas, deben su nombre a que son colecciones que relacionan una clave con un determinado valor. Como clave se puede utilizar cualquier valor inmutable: números, cadenas, booleanos, tuplas, ... pero no listas o diccionarios, dado que son mutables. A los valores almacenados en un diccionario no se accede por su índice (como se hace en listas y tuplas), sino por su clave, utilizando el operador “[]”. Esto es as porque los diccionarios no tienen orden. Tampoco se puede utilizar slicing, porque los diccionarios no son secuencias, si no mappings (mapeados, asociaciones). Figura 4-7. Ejemplo de diccionario. Operaciones a realizar con diccionarios: Similares a las listas, con el matiz de que los diccionarios no tienen orden, por tanto, no tienen funciones en las que se tenga en cuenta la posición. - Diccionario.get(„clave‟): Devuelve el valor que corresponde con la clave introducida. - Diccionario.pop(„clave‟): Devuelve el valor que corresponde con la clave introducida, y después borra la clave y el valor.
Python 32 - “clave” en diccionario: Devuelve verdadero (True) o falso (False) si la clave (no los valores) existe en el diccionario. - “definicion” en diccionario.values(): Devuelve verdadero (True) o falso (False) si definicion existe en el diccionario (no como clave). 4.7. Control de flujo En esta sección se van a explicar las estructuras condicionales y los bucles. 4.7.1. Sentencias condicionales Los condicionales permiten comprobar condiciones y hacer que un programa se comporte de una forma o de otra, que ejecute un fragmento de código u otro, dependiendo de la condición anterior. En este apartado van a cobrar importancia el tipo booleano y los operadores lógicos y relacionales que se explicaron anteriormente. if La forma más simple de una sentencia condicional es el if seguido de la condición a evaluar, dos puntos y en la siguiente línea e indentado, el código a ejecutar en caso de que se cumpla dicha condición. Es importante en Python indentar el código, es decir, pulsar tabulación antes de las órdenes de ejecución, dado que es la forma de hacerle saber al intérprete que se quieren ejecutar dichas órdenes solo en el caso de que se cumpla la condición. if…else Se usa para ejecutar ciertas órdenes en el caso de que la primera condición no se cumpliera. Sustituye el funcionamiento anterior del if en dos ocasiones. En vez de colocar dos estructuras iguales la segunda condición se sustituye por un else (con una traducción del estilo: si no, en caso contrario). if…elif…elif…else Se sigue el mismo procedimiento anterior en reiteradas ocasiones, elif es una contracción de else if. Una síntesis de su patrón de ejecución sería el siguiente: Se evalúa la condición del if, si es cierta, se ejecuta su código y se continúa ejecutando el código posterior al condicional; si no se cumple, se evalúa la condición del elif. Si se cumple la condición del elif se ejecuta su código y se continúa ejecutando el código posterior al condicional; si no se cumple y hay más de un elif se continúa con el siguiente en orden de aparición. Si no se cumple la condición del if ni de ninguno de los elif, se ejecuta el código del else. Figura 4-8. Ejemplo de sentencia condicional.
33 Control remoto de instrumentación para radiocomunicación mediante Python 4.7.2. Bucles Permiten ejecutar un mismo fragmento de código un cierto número de veces, mientras se cumpla una determinada condición. while Ejecuta un fragmento de código mientras se cumpla una condición. Posee dos palabras claves que tienen la siguiente funcionalidad: - Break: Sale del bucle en el que estamos, muy útil para casos de bucles infinitos (los cuales se repiten indefinidamente hasta que se ejecute esta orden). - Continue: Pasa directamente a la siguiente iteración del bucle. Figura 4-9. Ejemplo de bucle While. for…in En Python se utiliza como una forma genérica de iterar sobre una secuencia, como, por ejemplo, una lista. Como si de lenguaje natural se tratara la cabecera de un bucle for sera: “para cada elemento de la secuencia indicada”. Y esto es exactamente lo que hace el bucle: para cada elemento que tengamos en la secuencia, ejecuta las líneas de código introducidas posteriormente. Python proporciona una función llamada range que permite generar una lista que vaya desde el primer número que le indiquemos al segundo. En el siguiente apartado de funciones se explican todas ellas con más detenimiento. Figura 4-10. Ejemplo de bucle for.
Python 34 4.8. Funciones Son fragmentos de código con un nombre asociado que realizan una serie de tareas y devuelven un valor, conocidos por el nombre de procedimientos. En Python no existen los procedimientos, ya que cuando el programador no especifica un valor de retorno la función devuelve el valor None, equivalente al Null de otros lenguajes de programación. Para la declaración de las funciones se sigue el siguiente procedimiento: La palabra clave def seguida del nombre de la función y entre paréntesis los argumentos separados por comas. A continuación, indentadas, se tendrían las líneas que conforman el código a ejecutar. Al declarar una función se está asociaciando un nombre al fragmento de código que la conforma, de esta manera es posible ejecutar dicho código más tarde referenciándolo por su nombre. Se puede utilizar una cadena de texto como primera línea del cuerpo de la función, estas cadenas se conocen con el nombre de docstring (cadena de documentación) y sirven, como su nombre indica, a modo de documentación de la función. Todos los objetos pueden tener docstrings, no solo las funciones. Para ejecutar una función se escribe el nombre de la función que se va a ejecutar seguido de los valores que se pasan como parámetros entre paréntesis. La asociación de los parámetros y los valores pasados a la función se hace normalmente de izquierda a derecha, aunque es posible modificar el orden de los parámetros indicando el nombre del parámetro al que asociar el valor a la hora de llamar a la función. El número de valores que se pasan como parámetros al llamar a una función tiene que coincidir con el número de parámetros que la función acepta según su declaración. También es posible definir funciones con un número variable de argumentos y asignar valores por defecto a los parámetros para el caso de que no se indique ningún valor para los mismos al llamar a la función. Los valores por defecto se definen escribiendo un signo igual después del nombre del parámetro precedido del dato. Para definir funciones con un número variable de argumentos se coloca un último parámetro en la función cuyo nombre se precede del carácter „*‟, esta sintaxis funciona creando una tupla en la que se almacenan los valores de todos los parámetros extra pasados como argumento. También se puede preceder el nombre del ltimo parmetro con „**‟, en cuyo caso en lugar de una tupla se utiliza un diccionario. En Python, en el paso por referencia lo que se pasa como argumento es un puntero a la variable, es decir, la dirección de memoria en la que se encuentra el contenido de la variable, y no el contenido en sí. En el paso por valor se pasa como argumento el valor que contiene la variable. La diferencia entre ambos está en que en el paso por valor los cambios que se hagan sobre el parámetro no se ven fuera de la función ya que en realidad lo que se le pasa a la función son copias de los valores y no las variables en sí. No todos los cambios que se le hagan a los parámetros de una función en Python se reflejan fuera de ésta, ya que hay que tener en cuenta que existen objetos inmutables, como las tuplas, por lo que si intentamos modificar una tupla pasada como parámetro lo que ocurre en realidad es que se crea una nueva instancia, por lo que los cambios no se ven fuera de la función. En resumen, los valores mutables se comportan como paso por referencia, los inmutables como paso por valor. Para finalizar con las funciones se explica cómo se devuelven valores en ellas, para lo que se utiliza la palabra clave return. Las funciones en Python no pueden devolver varios valores, lo que ocurre en realidad es que Python crea una tupla cuyos elementos son los valores a retornar y esta única variable es la que se devuelve.
35 Control remoto de instrumentación para radiocomunicación mediante Python Figura 4-11. Ejemplo de función. 4.9. Orientación a objetos Python es un lenguaje multiparadigma en el se puede trabajar con programación estructurada (como se ha trabajado en los ejemplos de los apartados anteriores) o programación orientada a objetos, también llamada programación funcional. Con la Programación Orientada a Objetos el problema a resolver se modela a través de clases y objetos, donde un programa consiste en una serie de interacciones entre estos objetos. Hay tres conceptos que son básicos para cualquier lenguaje de programación orientado a objetos: herencia, polimorfismo y encapsulamiento, se explican en los siguientes apartados. 4.9.1. Clases y objetos Una clase es una plantilla genérica a partir de la cuál se instancian los objetos, plantilla que define qué atributos y métodos tendrán los objetos de esa clase. Un objeto es una entidad que agrupa un estado y una funcionalidad relacionadas. El estado del objeto se define a través de variables llamadas atributos, mientras que la funcionalidad se modela a través de funciones a las que se les conoce con el nombre de métodos del objeto. Las clases se definen mediante la palabra reservada class seguida del nombre de la clase, dos puntos y el cuerpo de la clase indentado. Como en el caso de las funciones, si la primera línea del cuerpo se trata de una cadena de texto, esta será la cadena de documentación de la clase o docstring. El método “__init__”, con doble guion bajo al principio y al final, se ejecuta justo después de crear un nuevo objeto a partir de la clase, proceso que se conoce con el nombre de instanciación. El primer parámetro de “__init__” y del resto de métodos de la clase es siempre self. Este mecanismo es necesario para poder acceder a los atributos y métodos del objeto diferenciando, por ejemplo, una variable local de un atributo del objeto. Para crear un objeto se escribe el nombre de la clase seguido de cualquier parámetro que sea necesario entre paréntesis. Estos parámetros se pasan al método “__init__”, que como se ha explicado es el método que se llama al instanciar la clase. Para acceder a los atributos y métodos de un objeto ya creado se utilizan las siguientes sintaxis: objeto.atributo y objeto.metodo(). 4.9.2. Herencia En un lenguaje orientado a objetos cuando se hace que una clase (subclase) herede de otra clase (superclase) se provoca que la subclase contenga todos los atributos y métodos que tenía la superclase. Para indicar que una
Python 42 - Definiciones de clases y función: Funciones y clases se pueden definir en cualquier lugar. Además, en un archivo se pueden diseñar tantas funciones y clases como se desee. - Grandes herramientas GUI, interfaz gráfica de usuario (Graphical User Interface): Se puede elegir cualquiera de las principales herramientas GUI. 4.13.2. PyVISA Paquete de Python más usado en el control remoto de instrumentación, se apoya en el estándar VISA explicado en el apartado 2.5 de este trabajo. Su finalidad es el control de dispositivos de medición y equipos de prueba a través de GPIB, RS232, Ethernet o USB. VISA y Python: Python tiene varias características que lo hacen muy interesante para el control de medidas: - Es un lenguaje de programación fácil de aprender con ciclos de desarrollo cortos. - Representa un alto nivel de abstracción que encaja en el nivel de abstracción de los programas de medición. - Tiene un amplio conjunto de bibliotecas nativas, incluyendo módulos numéricos y de trazado para el análisis de datos y visualización. - Tiene disponible un gran conjunto de libros y publicaciones. Uso: En primer lugar, se importa el paquete VISA para posteriormente crear un objeto ResourceManager. Si se llama sin argumentos, PyVISA utilizará el servidor por defecto (NI), que trata de encontrar la biblioteca compartida VISA. En algunos casos, PyVISA no es capaz de encontrar la biblioteca que se requiere, lo que tiene como resultado un OSError. Para su solución hay que encontrar la ruta de la biblioteca manualmente para pasársela a ResourceManager, aunque también se puede especificar en un archivo de configuración. Una vez que se obtiene el ResourceManager se listan los recursos utilizando el método list_resources, cuya salida es una tupla que enumera los nombres de los recursos de VISA. Para finalizar se consulta el dispositivo con el mensaje “\*IDN?”, el cual significa: “¿qué eres?”. A partir de este momento comienza la comunicación entre los dos dispositivos en cuestión. 4.14. Entorno de trabajo: Anaconda Anaconda es la plataforma de trabajo utilizada para la realización de todos los programas en lenguaje Python que forman parte de este trabajo. En la Figura 4-13 se muestra gráficamente cómo es dicho entorno tras su instalación.
43 Control remoto de instrumentación para radiocomunicación mediante Python Figura 4-13. Navegador de Anaconda. En particular, se ha trabajado con la herramienta llamada “spyder” que se aprecia en la parte superior derecha de la Figura 4-13. Spyder es el entorno perteneciente a Anaconda en el que se pueden realizar tanto los archivos de texto (.py) como su ejecución. En la Figura 4-14 se puede ver que la parte de la izquierda de esta herramienta es la que se dedica a la realización de los scripts y en la de la derecha se sitúa la consola. Figura 4-14. Herramienta Spyder.
45 5 LABORATORIO DE RADIOCOMUNICACIÓN n este capítulo se presenta al lector la instrumentación usada en el laboratorio de radiocomunicación como ayuda para la realización de este trabajo. Posteriormente se definen los distintos tipos de errores no lineales que se pueden encontrar analizando dispositivos en el laboratorio. 5.1. Instrumentación 5.1.1. Analizador vectorial de señales Los VSA, analizador vectorial de señales (del inglés Vector Signal Analyzer), combinan tecnología superheterodina (usada en los analizadores de barrido de espectro analógicos) con convertidores analógicodigitales (ADC) de alta velocidad y procesamiento digital ofreciendo medidas de alta resolución espectral, demodulación de señales y técnicas avanzadas de análisis en el dominio temporal. Este equipo puede ser controlado de forma remota desde el ordenador usando secuencias de instrucciones en Python. Éste se encuentra conectado al ordenador a través de una conexión mediante el bus GPIB. Figura 5-1. Analizador de señal. La principal diferencia respecto a los analizadores analógicos es que su etapa de frecuencia intermedia está formada por una sección digital que implementa algoritmos FFT y de procesado digital. Los analizadores de señal son sistemas que usan señales digitales y algoritmos matemáticos para efectuar el análisis, sus funciones de mezclado, filtrado y demodulación son ejecutadas de forma digital. Una de sus características más notables es que están diseñados para medir y manipular señales complejas. El proceso de medida de un analizador de señal simula un banco de filtros en paralelo y posteriormente realiza un procesado de todas las frecuencias simultáneamente. Este proceso se realiza en tiempo real, es decir, sin perder ninguna parte de la señal de entrada. Los VSA poseen una pequeña fuente de almacenamiento que adquiere temporalmente señal para su posterior procesamiento o repetición. Esta aplicación es análoga a la de un osciloscopio de alta frecuencia, sin embargo, los VSA poseen una ventaja ante ellos, que es el mayor rango dinámico que son capaces de adquirir y la mejor relación señal a ruido. E
Laboratorio de radiocomunicación 46 El demodulador vectorial permite medir un amplio rango de estándares actuales como WCDMA, GSM, LTE, etc. Medida del VSA: El funcionamiento del VSA consiste en digitalizar la señal de entrada para computar las medidas posteriormente. Éstos implementan análisis FFT con técnicas que permiten eliminar los errores potenciales inherentes a las técnicas digitales de FFT. A continuación, se muestran las etapas que realiza el analizador de señal en el proceso de medidas: - Acondicionamiento de señal y traslado de frecuencia. - Conversión analógico-digital. - Detección en cuadratura. - Filtrado de la señal y remuestreo. - Enventanado de la señal. - Análisis FFT o vectorial. 5.1.2. Generador de señal Los generadores de señal son capaces de crear señales periódicas o no periódicas en dominio tanto digital como analógico. Es uno de los equipos electrónicos más importantes de un laboratorio de radiocomunicaciones ya que el diseño electrónico, el test de circuitos y la reparación de equipos requieren señales controlables para simular su operación normal. Al igual que los analizadores de señal, pueden ser controlados de forma remota. Para hacer posible esta tarea es necesario establecer una conexión GPIB entre el ordenador y el generador. Para la comunicación entre ambos se emplean secuencias de instrucciones en Python. A cada uno de los botones del panel frontal, le corresponde una secuencia de instrucciones. Figura 5-2. Generador de señal. Hay varios tipos de generadores de señal según el propósito y la aplicación: - Generador de señales de microondas y radiofrecuencias: Se emplea en el test de componentes en un amplio rango de aplicaciones entre las que se incluyen: comunicaciones móviles, señales de audio y vídeo, comunicaciones por satélite, etc.
47 Control remoto de instrumentación para radiocomunicación mediante Python - Generador de funciones: Genera funciones de tipo sinusoidal, triangular, 'diente de sierra' y rectangular. Puede incluir algún tipo de modulación en amplitud, fase, o frecuencia FM, aunque está limitado a un reducido conjunto de salidas. Este dispositivo incorpora un oscilador electrónico, circuitos capaces de producir señales repetitivas en el tiempo y un segundo oscilador capaz de mezclar la señal generada. - Generador de ondas arbitrarias: Permite producir cualquier forma de onda a la salida dentro de unos límites de potencia, frecuencia y precisión. La forma de onda se suele definir como una secuencia de puntos entre los que el generador va saltando de uno a otro, o implementa algún método de interpolación para suavizar las transiciones. Sintetiza las formas de onda usando técnicas de procesamiento digital de señales. Trabaja con atenuadoras variables para producir diferentes niveles de potencia a la salida y varios métodos de modulación. 5.2. Problema de la no linealidad 5.2.1. Introducción Los sistemas no lineales se caracterizan por tener un comportamiento que no es expresable como la suma de los comportamientos de los subsistemas que lo forman. Más formalmente, un sistema es no lineal cuando las ecuaciones de movimiento o evolución que regulan su comportamiento son no lineales. En particular, el comportamiento de sistemas no lineales no está sujeto al principio de superposición, como lo es en un sistema lineal. En este proyecto se trabaja con elementos no lineales como es el amplificador 5 . El comportamiento no lineal se hace notar a medida que se aumenta la potencia de trabajo de los equipos: a mayor potencia, mayor es el efecto de la no linealidad en el sistema. Además, los sistemas reales son no lineales en su totalidad y, por tanto, el resultado a la salida no es proporcional a la entrada. Por otra parte, la señal obtenida a la salida contendrá un conjunto de componentes no deseadas en diferentes frecuencias que deben estudiarse para caracterizar el sistema. Si se introduce un tono, a la salida se añadirían otros tonos en frecuencias distintas. La relación entre la entrada 𝑥 y las componentes que se añaden a la salida 𝑦 tiene la siguiente expresión polinómica: 𝑦=𝑎0+ 𝑎1𝑥+𝑎2𝑥2+𝑎3𝑥3+⋯ Observando la ecuación, se puede ver cómo aparecen nuevos componentes de continua que se suman a unos términos de distorsión que son a su vez potencias consecutivas de la señal de entrada. A este efecto se le conoce como distorsión y se manifiesta con la aparición de distorsión armónica y productos de intermodulación. 5.2.2. Distorsión armónica Si en un sistema no lineal se introduce un tono con frecuencia central 𝑓0, a la salida se obtiene, además del tono amplificado, otros tonos de distinta frecuencia en 2𝑓0, 3𝑓0, 4𝑓0… Estas componentes reciben el nombre de armónicos. La aparición de armónicos modifica la señal deseada distorsionándola. La eliminación de estas componentes se realiza mediante el uso de filtros, permitiendo con ellos que solo se deje pasar el tono fundamental que se desee obtener a la salida. 5 Su diseño basado en transistores BJT o FET, entre otros, hace que sea un dispositivo no lineal y presente los efectos característicos de los mismos.
Laboratorio de radiocomunicación 48 5.2.3. Punto de compresión de 𝟏 𝒅𝑩 En un sistema no lineal, a medida que la potencia de entrada aumenta, la ganancia se reduce produciéndose una “compresin de la ganancia”. Siendo el punto de compresin de 1 𝑑𝐵 el instante en el que la potencia de salida es 1 𝑑𝐵 inferior a la que idealmente se tendría en un sistema lineal. Figura 5-3. Punto de compresión de 1 𝑑𝐵. 5.2.4. Productos de intermodulación Al introducir dos o más señales en un dispositivo no lineal aparecen, además de las componentes de entrada y los armónicos, unas componentes de mezcla. Por ejemplo, si se introducen dos tonos de frecuencia 𝑓1 y 𝑓2, a su salida se verán los productos de intermodulación en las frecuencias suma y diferencia de múltiplos de las frecuencias originales, es decir, como se observa en la siguiente ecuación: 𝑓𝑖𝑛𝑡 =𝑎𝑓1±𝑏𝑓2, siendo 𝑎 y 𝑏 números enteros mayores que uno, ya que en los casos donde cualquiera de estos factores es igual a cero se produce la distorsión armónica explicada en el apartado anterior. En una señal multicanal donde existan muchas más señales con diferentes frecuencias, los productos de intermodulación pueden caer encima de las frecuencias de interés resultando imposible su filtrado. Este tipo de problemas suele causar dificultades en la práctica a la hora de obtener un resultado deseado. 5.2.5. Punto de intercepto de tercer orden, 𝑰𝑷𝟑 Punto de corte de la potencia de salida lineal (del tono fundamental) y la potencia del producto de intermodulación de tercer orden (TOI, del inglés Third Order Input).
49 Control remoto de instrumentación para radiocomunicación mediante Python Figura 5-4. Punto de intercepto de tercer orden. En este apartado cabe destacar la relación de protección (RP), que viene dada por la distancia mínima entre la potencia de salida del tono fundamental y la potencia del producto de intermodulación de tercer orden. Se representa mediante la siguiente ecuación: 𝐼𝑃3 𝑜𝑢𝑡(𝑑𝐵𝑚)=3𝑃1,𝑠𝑎𝑙𝑖𝑑𝑎(𝑑𝐵𝑚)−𝑃𝑖,3(𝑑𝐵𝑚) 2 𝑃1,𝑠𝑎𝑙𝑖𝑑𝑎(𝑑𝐵𝑚)−𝑃𝑖,3(𝑑𝐵𝑚)=2(𝐼𝑃3 𝑜𝑢𝑡(𝑑𝐵𝑚)−𝑃1,𝑠𝑎𝑙𝑖𝑑𝑎(𝑑𝐵𝑚))≥𝑅𝑃(𝑑𝐵) 5.2.6. ACPR Una de las figuras de mérito que los investigadores utilizan para saber si existe una respuesta no lineal en un dispositivo es la distorsión fuera de banda. Los sistemas no lineales generan dicha distorsión, que es detectable en el recrecimiento espectral de los canales de comunicación adyacentes. El recrecimiento espectral puede ser cuantificado por medio de la relación de potencia de canal adyacente (ACPR) , usualmente definida como: 𝐴𝐶𝑃𝑅= 𝑃𝑎𝑑𝑗 𝑃𝑖𝑛𝑏𝑎𝑛𝑑, donde 𝑃𝑎𝑑 es la potencia total en el canal adyacente y 𝑃𝑖𝑛 𝑎𝑛𝑑 es la potencia en el canal deseado. La mayoría de los analizadores de espectro o analizadores de señales vectoriales incluyen módulos para el cálculo de esta figura de mérito, siendo el resultado similar al que se muestra en la Figura 5-5. En esta figura, se puede ver el canal central, que contiene la información deseada a transmitir y los canales adyacentes. Como sólo son preocupantes los canales adyacentes inferior o superior, es necesario especificar de qué manera se sabe qué canal está implicado en el cálculo de la ACPR. En las fórmulas que prosiguen, 𝐴𝐶𝑃𝑅𝑙 está referenciado al canal adyacente inferior y 𝐴𝐶𝑃𝑅𝑢 al canal adyacente superior. 𝐴𝐶𝑃𝑅𝑙=𝑃𝑎𝑑 ,𝑙 𝑃𝑖𝑛 𝑎𝑛𝑑 y, 𝐴𝐶𝑃𝑅𝑢=𝑃𝑎𝑑𝑗,𝑢 𝑃𝑖𝑛𝑏𝑎𝑛𝑑,
Laboratorio de radiocomunicación 50 donde 𝑃𝑎𝑑 ,𝑙 y 𝑃𝑎𝑑 ,𝑢 son la potencia del canal adyacente inferior y superior, respectivamente. En el dominio de la frecuencia, cualquiera de los valores de potencia anteriores (representado por {·}) se puede calcular como: 𝑃*·+ =∫𝑆*·+(𝑓)𝑑𝑓 𝑓2 𝑓1, donde 𝑓1 y 𝑓2 son los límites izquierdo y derecho del canal considerado, respectivamente, siendo 𝑆(𝑓) la densidad espectral de potencia. Figura 5-5. Figura tomada de un analizador de espectro en modo medición de potencia de canal adyacente.
51 6 DESARROLLO DEL CÓDIGO n este capítulo se detalla la funcionalidad de cada parte del código realizado durante el trabajo (el código se incluye completo en el Anexo 3), cuya finalidad es la generación y posterior análisis de la salida, posiblemente no lineal, del dispositivo bajo prueba ante una excitación de un tono. Con dicho ejercicio, se han llevado a cabo dos pruebas, que se analizan en el Capítulo 7 de esta memoria. 6.1. Introducción Se comienza el capítulo analizando cómo ha de generarse la conexión remota entre el ordenador y un instrumento de laboratorio mediante el método PyVISA, con el uso de objetos. A continuación, se ven las funciones de lectura y escritura creadas para facilitar las comunicaciones que hay que llevar a cabo en el trabajo. Posteriormente, se analizan los tipos de medidas que se pueden hacer describiendo cuáles son las configuraciones que se controlan tanto en el analizador de espectro como en el generador de señal, detallando los parámetros que podemos modificar y cómo jugar con las distintas opciones para estudiar las características de los dispositivos. Por último, se definen las funciones comunes a todos los tipos de medidas, como son las de extraer los valores de potencia máxima en el analizador, guardar los resultados en un archivo externo e imprimir la gráfica de resultados. 6.2. Conexión remota Para abrir una conexión entre un instrumento del laboratorio y un ordenador mediante Python se usan las órdenes de la Figura 6-1. Figura 6-1. Apertura de conexión remota en Python. En el caso del ejemplo de la Figura 6-1, la comunicación que se está iniciando es con el puerto 18 de un bus GPIB, que en este trabajo pertenece al analizador de señal porque así lo tiene asignado. En caso de tener varios instrumentos conectados en el mismo instante y no saber qué puerto de conexión posee cada uno, hay que listarlos todos, iniciar la conexión y hacerles preguntas para que se identifiquen y así saber con quién se quiere trabajar. Eso se realiza mediente el siguiente código. Figura 6-2. Apertura de conexión con listado de instrumentos posibles. E
Desarrollo del código 58 Cada una de las iteraciones del bucle son los valores del vector que se crea al principio del programa al indicar el tipo de barrido, “P” para un barrido de potencia y “Fi” para uno de frecuencia. Las variables anteriores corresponden con el rango de potencias y frecuencias configurado por el ususario una vez se sabe el tipo de análisis que se quiere llevar a cabo. Para realizar la lectura de potencia en cada punto, al comienzo de cada iteración es necesario configurar el generador vectorial de señales para que active la señal de un tono adecuada, que se aplicará a la entrada del dispositivo bajo prueba. Para ello, se utiliza la función un_tono_SMIQ.py, cuyas partes más significativas se muestran es las Figuras 6-12 y 6-13. Figura 6-12. Apertura de la conexión con el generador de señales. Figura 6-13. Configuración del generador de señales con los valores de frecuencia y potencia. Para la configuración del generador de señales, como se aprecia en las imágenes anteriores, hay que seguir los siguientes pasos: - En primer lugar, abrir una conexión remota con el instrumento (generador de señales, SMIQ) para poder mandarle los comandos SCPI. En el caso de este proyecto con el puerto 28 del bus GPIB, ya que es al que está relacionado el generador del laboratorio de radiocomunicación con el que se ha trabajado. - Posteriormente, configurar en el mismo los valores de frecuencia y potencia a los que el usuario quiere realizar la medida mediante órdenes de escritura en el objeto donde se guarda comunicación. Cabe destacar que la última orden que se aprecia en la Figura 6-13 equivale a pulsar la tecla RF On en el equipo, es decir, con ella se activa la salida de RF del mismo. Una vez configurado el generador, hay que hacer lo mismo con el analizador de espectro para poder leer la medida de potencia de manera correcta. Esto se realiza mediante la función medida.py, cuya llamada en el programa principal se realiza es usando la sintaxis del siguiente ejemplo: Figura 6-14. Llamada a la función medida.py en el bucle del script medida_1tono_sinDC.py. La variable “medida_1t” es la asociada a la matriz de resultados nombrada con anterioridad, de la forma:
59 Control remoto de instrumentación para radiocomunicación mediante Python ( 𝑃𝐴11 𝑃𝐴21 ⋯ 𝑃𝐴𝑛1 𝑃𝐴12 ⋮ 𝑃𝐴1𝑚 𝑃𝐴22 ⋯ 𝑃𝐴𝑛2 ⋮ ⋱ 𝑃𝐴𝑛3 𝑃𝐴2𝑚 ⋯ 𝑃𝐴𝑛𝑚 ) , donde 𝑃𝐴𝑛𝑚 es la potencia medida en el analizador en cada iteración en el armónico n y con las condiciones del barrido del tono en la posición m. En la función medida.py se trabaja con el analizador, modificando en el mismo los 5 parámetros que se le pasa: - “Fova”: Valor de la frecuencia a la salida del dispositivo bajo prueba que se desea medir, que será la frecuencia fundamental o uno de sus armónicos. Este valor se configurará como frecuencia central en el analizador de espectro para poder visualizar correctamente el tono a medir. - “span”: El parámetro span indica la anchura del segmento de espectro mostrada en el analizador. El valor de este parámetro se selecciona experimentalmente, de forma que solo se visualice un tono en el analizador de espectro para medir correctamente. También se tiene en cuenta fijar un valor lo suficientemente pequeño de span para facilitar la selección del ancho de banda de resolución que produce la medida con la precisión adecuada. - “rlevel”: Nivel de referencia, que representa el mayor nivel de potencia que muestra el analizador de espectro de pantalla. El nivel de referencia debe escogerse de manera que el tono a medir se visualice en pantalla, para lo cual rlevel debe ser mayor que la potencia esperada del tono. Por otro lado, rlevel no debe distar demasiado del valor de potencia a medir porque se perdería precisión en la medida. Los valores a asignar a este parámetro se eligen de forma experimental atendiendo a los dos criterios anteriores. Por ejemplo, para medir el tono a la frecuencia fundamental, el valor adecuado de rlevel debe ser mayor que la potencia generada por el dispositivo a su salida. En cambio, para los armónicos rlevel tendrá una corrección negativa con respecto al valor que tomaría para la frecuencia fundamental porque la potencia a medir es menor. - “BWres”: Ancho de banda de resolucin. Este parámetro está relacionado con la capacidad del analizador de espectro de medir potencias que pueden ser muy débiles, ya que permite reducir el fondo de ruido de la medida. Su valor se fija experimentalmente para cada uno de los armónicos a medir, teniendo en cuenta cuáles de ellos podrían ser señales muy débiles. - “ade”: Variable en la que se guarda el objeto de la comunicacin con el analizador de seal. El ejemplo de llamada a la función de la Figura 6-14 se corresponde con la medida de la potencia que hay a la salida del dispositivo para la frecuencia fundamental. En este caso, la estimación que se realiza para el nivel de referencia tiene en cuenta el valor de la potencia aplicada a la entrada del dispositivo, dado por el vector de potencias guardado en la variable “P”, corregido con la ganancia y un pequeño margen: 𝑟𝑙𝑒𝑣𝑒𝑙=𝑃𝑣𝑎+𝑔𝑎𝑖𝑛+15 dB Tras un estudio de comportamiento de los armónicos en el laboratorio, se llegó a la conclusión de cómo deben ser los valores a configurar en el analizador para conseguir los resultados correctos. Para la configuración del span y ancho de banda de resolución se ha observado que el valor que hace que la medida sea fiable es el resultado de las siguientes operaciones: 𝑠𝑝𝑎𝑛=𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙 100 𝐵𝑊𝑟𝑒𝑠=𝑠𝑝𝑎𝑛 500
Desarrollo del código 60 Modificación de los cinco parámetros comentados anteriormente en el analizador de espectro: Figura 6-15. Configuración del analizador de señales con los parámetros pasados como argumento. Por último, tras configurar el analizador, solo queda realizar la medida de la máxima potencia que se observa en la pantalla del equipo, es decir, el valor de potencia que se busca. Para ello se ejecuta la línea de código de la Figura 6-16. Figura 6-16. Lectura del valor de potencia. El segundo valor que devuelve la orden de la Figura 6-16, “potencia”, es el que entrega la funcin medida.py. Esta cifra varía a medida que se ejecuta el bucle while y va siendo almacenada en la variable “medida_1t” hasta completar la matriz de resultados. La cantidad de datos no nulos en ella (valores en los que se ha leído potencia) depende del número de armónicos introducidos por pantalla. Hay que tener en cuenta que la línea de código de la Figura 6-14 es para obtener la medida de potencia en caso de que el número de armónicos sea igual o superior a 1. Para una mayor cantidad de armónicos (en el código se tiene en cuenta hasta el quinto) la orden cambia levemente su llamada. Los dos parámetros que van cambiando a medida que sube el orden del armónico a medir son la frecuencia de salida, “Fova”, y el valor de reference level, “rlevel”. Como se ha comentado anteriormente los armónicos van a estar situados en las frecuencias 𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙, 2𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙, 3𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙, 4𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙 y 5𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙, por tanto, el valor de la variable “Fova” que se pasa a la funcin medida.py se va multiplicando de esta misma manera para situar el analizador de espectro en el lugar correcto para hacer la medida. En cuanto a “rlevel” es algo más complejo ya que varía dependiendo del armónico. Como ya se ha mencionado, inicialmente se determina como el valor de la potencia aplicada a la entrada del dispositivo corrregido con la ganancia y un margen de 15 dB. Inicialmente se determina un valor resultado de sumar 25 𝑑𝐵 a la potencia del tono que se está evaluando. Partiendo de este nivel inicial, el valor de reference level para cada ármonico viene dado según se indica en la Tabla 6-1.
61 Control remoto de instrumentación para radiocomunicación mediante Python Tabla 6–1. Valores de “rlevel” para cada armnico. Número de armónico Valor de “rlevel” Primero o tono fundamental 𝑟𝑙𝑒𝑣𝑒𝑙𝑖𝑛𝑖𝑐𝑖𝑎𝑙 Segundo 𝑟𝑙𝑒𝑣𝑒𝑙𝑖𝑛𝑖𝑐𝑖𝑎𝑙 −10 𝑑𝐵 Tercero 𝑟𝑙𝑒𝑣𝑒𝑙𝑖𝑛𝑖𝑐𝑖𝑎𝑙 −15 𝑑𝐵 Cuarto 𝑟𝑙𝑒𝑣𝑒𝑙𝑖𝑛𝑖𝑐𝑖𝑎𝑙 −20 𝑑𝐵 Quinto 𝑟𝑙𝑒𝑣𝑒𝑙𝑖𝑛𝑖𝑐𝑖𝑎𝑙 −25 𝑑𝐵 Finalmente, cuando se ha obtenido la matriz con todos los valores de potencia de la prueba realizada, es necesario hacer las correciones debidas a las pérdidas en la salida. Figura 6-17. Matriz de valores de potencia corregidos. 6.6. Impresión de resultados Los resultados en el trabajo se imprimen de dos formas distintas, mediante una gráfica y en un archivo aparte con el nombre y en el directorio que indique el usuario. Cada uno de los dos tipos se puede diferenciar a su vez dependiendo del barrido que se realice. A continuación, se muestran imágenes del código con el que se han realizado estos formatos. 6.6.1. Archivo de valores finales En el caso de un barrido de potencia, el que se aprecia en la Figura 6-18, se guarda en el documento de resultados el vector de potencias de entrada (con las correcciones por las pérdidas de los cables a la entrada) y la matriz de valores de potencia corregidos. En el de un barrido de frecuencia se guardan los vectores de frecuencia de entrada y de salida y la matriz de valores de potencia corregidos.
Desarrollo del código 62 Figura 6-18. Generación del documento de resultados para un barrido de potencia. 6.6.2. Gráficas Figura 6-19. Generación de la gráfica de resultados para un barrido de frecuencia. En el caso de un barrido de frecuencia, el que se aprecia en la Figura 6-19, se representan los valores de potencia de salida (la matriz de resultados corregida) frente a los de frecuencia de salida. En el de un barrido de potencia se representan los valores de potencia de salida, al igual que en el de frecuencia, pero frente a los valores de potencia de entrada (con la corrección de las pérdidas a la entrada).
63 7 RESULTADOS EXPERIMENTALES 7.1. Introducción Una vez explicado el código realizado y su comportamiento es interesante comprobar el correcto funcionamiento del mismo. Para ello, se han realizado dos pruebas con distintos dispositivos a caracterizar (un amplificador de potencia y un mezclador). En los siguientes apartados se explican los resultados de un barrido de potencia y otro de frecuencia en cada uno de ellos. La hoja de características del amplificador y mezclador usados se facilita en los anexos 1 y 2 de esta memoria respectivamente. Los pasos a seguir para la configuración de cualquier medida en el código son los siguientes: - Ejecutar el programa principal que hace uso del resto de funciones, medida_1tono_sinDC.py. - Indicar si se quiere realizar un barrido de potencia o de frecuencia por teclado. - Introducir todos los parámetros que se piden por pantalla para cada tipo de medida teniendo en cuenta el elemento conectado entre el generador y el analizador de señal. - Salvar los resultados en un documento si se desea, facilitando el directorio en el que guardarlos y el nombre que se le quiere poner al archivo. - Finalmente aparecerá la gráfica de resultados en la consola de Python para que se pueda analizar el comportamiento de cada armónico a la salida del dispositivo con el que se esté simulando. 7.2. Consideraciones previas En la realización de estas pruebas se tuvieron que tener en cuenta las limitaciones de los equipos antes de ejecutar el código: - La frecuencia máxima con la que se configura el analizador no puede ser mayor que su frecuencia de trabajo, 26.5 𝐺𝐻𝑧. Esta frecuencia máxima se corresponde con la equivalente al quinto armónico que se quiere estudiar. Debido a ello, se debe cumplir la siguiente ecuación: 9 𝑘𝐻𝑧 < 𝑓𝑐𝑒𝑛𝑡𝑟𝑎𝑙𝑎𝑛𝑎𝑙𝑖𝑧𝑎𝑑𝑜𝑟 < 26.5 𝐺𝐻𝑧 𝑛𝑎𝑟𝑚ó𝑛𝑖𝑐𝑜𝑠 º - Como potencia final a la salida del dispositivo a medir no se puede escoger un valor superior al máximo que permite el analizador de espectro (30 𝑑𝐵𝑚). - El generador de señal R&S SMIQ02B tiene un rango de frecuencias de trabajo que se encuentra entre 300 𝑘𝐻𝑧−2.2 𝐺𝐻𝑧. - El generador de señal R&S SMIQ02B tiene una potencia máxima de aproximandamente 15 𝑑𝐵𝑚 (el valor de la misma depende de la frecuencia de trabajo). - El generador de señal R&S SMR20 tiene un rango de frecuencias de trabajo que oscila entre 1 𝐺𝐻𝑧−20 𝐺𝐻𝑧. Para interpretar las gráficas de resultados hay que considerar que siempre se van a obtener las trazas de la componente fundamental o primer armónico (línea negra), segundo armónico (línea azul), tercer armónico (línea roja), cuarto armónico (línea violeta) y quinto armónico (línea verde).
Resultados experimentales 64 7.3. Primera prueba: Comportamiento de un amplificador de potencia 7.3.1. Introducción El amplificador que se va a usar para caracterizar su comportamiento no lineal es el modelo ZJL-6G+ del fabricante Mini-Circuits. Sus principales características son: - Amplificador RF de baja potencia. - Trabaja con frecuencias en el rango de 20 𝑀𝐻𝑧−6000 𝑀𝐻𝑧. - Valor típico de ganancia de 13 𝑑𝐵 con un margen de ±1.6 𝑑𝐵. - Alimentación de 12 𝑉. Figura 7-1. Amplificador de potencia ZLJ-6G+. 7.3.2. Montaje El proceso de esta aplicación consiste en introducir una señal a la entrada del amplificador mediante el generador SMIQ02B y observar cómo se comporta a su salida mediante el analizador de espectros EXA N9010A. Para llevar a cabo esta tarea es necesario alimentar el dispositivo con una fuente de tensión. Figura 7-2. Escenario de la prueba 1.
65 Control remoto de instrumentación para radiocomunicación mediante Python Figura 7-3. Cable SMA hembra (izquierda) y macho (derecha). Conexiones presentes en el escenario de la Figura 7-2: - Ordenador con código en Python con analizador de señal Agilent EXA N9010A. Se realiza mediante una interfaz USB-GPIB Agilent 82357B. El ordenador se puede conectar indistintamente al analizador o al generador, se ha hecho de esta manera en particular por existir mayor espacio en el laboratorio. - Analizador de señal Agilent EXA N9010A con generador de señal R&S SMIQ02B. Se conectan mediante bus GPIB estándar. - Fuente de alimentación con amplificador ZLJ-6G+. La conexión se realiza mediante los cables banana-cocodrilo que se aprecian en la Figura 7-2 (cables rojo y negro conectados a la fuente de alimentación). - Generador de señal R&S SMIQ02B con amplificador ZLJ-6G+ mediante un cable coaxial con conectores SMA 7 macho en los dos extremos. La salida RF-OUT del generador se conecta con la entrada IN del amplificador, ambos poseen conectores SMA hembra. En la Figura 7-3 se aprecia la diferencia entre los conectores SMA hembra y macho. - Amplificador ZLJ-6G+ con analizador de señal Agilent EXA N9010A mediante un cable coaxial con conectores SMA macho en los dos extremos. La salida OUT del amplificador se conecta con la entrada RF-INPUT del analizador de espectro, ambos poseen conectores SMA hembra. 7.3.3. Medidas previas Previamente a la ejecución de la aplicación, hay que analizar las pérdidas existentes en el circuito en cuanto a cables y conectores se refiere para obtener así un resultado más preciso y fiable en la caracterización del amplificador. Para ello, hay que montar un escenario muy simple entre el analizador y el generador, conectando ambos (sin el amplificador) con uno de los cables SMA que se va a utilizar en el ejercicio. Es importante tener en cuenta para esta tarea las limitaciones de frecuencia de trabajo de los dos generadores de señal disponibles. Siguiendo el siguiente proceso se obtienen las perdidas de los cables a la entrada y a la salida en las frecuencias de los cinco primeros armónicos. Los valores de frecuencia y potencia que se indican a continuación son los que se han usado para este ejercicio. - Generar un tono en el generador de señal con una frecuencia de 600 𝑀𝐻𝑧 y una potencia de −25 𝑑𝐵𝑚. 7 Del inglés SubMiniature version A. Es un tipo de conector roscado para cable coaxial utilizado en microondas.
Resultados experimentales 66 - Configurar el generador de señal a una frecuencia central de 600 𝑀𝐻𝑧 y con un span de 10 𝑀𝐻𝑧 para que se pueda apreciar el tono. - Calcular el valor de las pérdidas de los cables con la ecuación que procede. 𝐿𝑐𝑎 𝑙𝑒 =𝑃𝑔𝑒𝑛𝑒𝑟𝑎𝑑𝑜𝑟 −𝑃𝑎𝑛𝑎𝑙𝑖𝑧𝑎𝑑𝑜𝑟 - Repetir los pasos anteriores para las frecuencias en las que se sitúan los armónicos, es decir, para 1200 𝑀𝐻𝑧, 1800 𝑀𝐻𝑧, 2400 𝑀𝐻𝑧 y 3000 𝑀𝐻𝑧. Tras realizar este procedimiento se obtienen los siguientes valores de pérdidas con los que se van a trabajar: Tabla 7–1. Pérdidas de los cables en el escenario de la primera prueba. Componente 𝑳𝒄𝒂𝒃𝒍𝒆(𝒅𝑩) Componente Fundamental (600 MHz) 0.9 Segundo armónico (1200 MHz) 1.84 Tercer armónico (1800 MHz) 2.48 Cuarto armónico (2400 MHz) 2.28 Quinto armónico (3000 MHz) 2.5 7.3.4. Ejecución y resultados: Barrido de potencia Los valores que se introdujeron durante la ejecución de esta aplicación vienen indicados en la Tabla 7-2.
67 Control remoto de instrumentación para radiocomunicación mediante Python Tabla 7–2. Valores introducidos en el barrido de potencia de la primera prueba. Parámetro Valor introducido Tipo barrido 1 Conversión de frecuencias 0 Potencia inicial (dBm) -25 Potencia final (dBm) 12 Incremento de potencia (dBm) 0.1 Frecuencia central (MHz) 600 Ganancia esperada (dB) 15 Número de armónicos 5 Pérdidas a la entrada (dB) 0.9 Pérdidas a la salida (dB) [0.9, 1.84, 2.48, 2.28, 2.5] Tras la ejecución del programa se obtiene la gráfica de la Figura 7-4: Figura 7-4. Resultado del barrido de potencia de la primera prueba. Observando la Figura 7-4 se aprecia cómo la componente fundamental queda amplificada a la salida del amplificador, de la manera deseada, además tiene un comportamiento prácticamente lineal hasta un punto de potencia de entrada (aproximandamente −5 𝑑𝐵𝑚). En ese punto el amplificador comienza a saturar y la salida
Resultados experimentales 74 Tabla 7–7. Valores introducidos en el barrido de frecuencia de la segunda prueba. Parámetro Valor introducido Tipo barrido 2 Conversión de frecuencias !0 Potencia a la entrada (dBm) 15 Frecuencia inicial (MHz) 1800 Frecuencia final (MHz) 2200 Incremento de frecuencia (MHz) 20 Frecuencia del OL (MHz) 1600 Down-converter !0 Ganancia esperada (dB) 0 Número de armónicos 5 Pérdidas a la entrada (dB) 2.28 Pérdidas a la salida (dB) [0.73, 1.11, 1.94, 2.28, 2.26] Tras la ejecución del programa se obtiene la gráfica de la Figura 7-9. Figura 7-9. Resultado del barrido de frecuencia de la segunda prueba.
75 Control remoto de instrumentación para radiocomunicación mediante Python De la Figura 7-9 lo más significativo que se puede extraer es que, a 400 𝑀𝐻𝑧, en el segundo, tercer, cuarto y quinto armónico de la frecuencia intermedia de salida hay alguna suma de componentes errónea por la cual se generan unos picos muy abruptos. En la siguiente tabla se muestra la fluctuación de potencia que se obtuvo en el laboratorio en dichos armónicos: Tabla 7–8. Valores de fluctuación por los que se obtiene un pico abrupto. Armónico Valor máximo (dBm) Valor mínimo (dBm) Segundo -30 -64 Tercero -19 -25.61 Cuarto -20.73 -25.66 Quinto -2.68 -7.23 Tras el análisis de los valores de la Tabla 7-8 se halló que el principal problema se encontraba en las frecuencias del cuarto y quinto armónico. En la frecuencia del cuarto se representa la suma del residuo del oscilador local y el propio cuarto armónico. Mientras que en la frecuencia del quinto se dibuja la suma del residuo de radiofrecuencia (RF leakage 9 ) con el propio quinto armónico. Por lo tanto, se producen unos errores que no dejan apreciar el resultado con claridad, provocando los picos abruptos mencionados en el párrafo anterior. 9 Fuga de residuos en radiofrecuencia.
77 8 CONCLUSIONES Y LÍNEAS FUTURAS DE TRABAJO lo largo de este proyecto se demuestra que el lenguaje de programación Python ofrece una herramienta de trabajo muy eficiente para llevar a cabo tareas de control remoto con equipamiento de radiocomunicación. Como ya se advirtió en el capítulo de resumen, se ha diseñado un código que facilita la realización de medidas con el fin de caracterizar dispositivos no lineales de radiofrecuencia. Con su ayuda, el usuario final no tiene que interactuar directamente con el instrumento, pudiendo configurar los parámetros necesarios a través de la consola de Spyder (herramienta utilizada para programar en Python). El aspecto más destacado de hacer tareas de control remoto con Python es el tiempo que ahorra en realizar medidas que necesitan una gran cantidad de configuraciones en los equipos. Como ejemplo de ello se toma la primera prueba de este proyecto, en la que se hace un barrido de potencia desde −25 𝑑𝐵𝑚 hasta 12 𝑑𝐵𝑚 con saltos de 0.1 𝑑𝐵𝑚. Para obtener su resultado hacen falta ejecutar 370 bloques de configuraciones, que de no usar el programa diseñado habría que realizar manualmente. Además, este método en comparación con otras formas de control remoto más habituales, como puede ser utilizando Matlab o LabVIEW, realiza las mediciones en los equipos en un tiempo sensiblemente más reducido. Teniendo en cuenta los contenidos y la finalidad de este proyecto se pueden afrontar nuevos objetivos para explotar con más profundidad esta técnica de control remoto. Un ejemplo de ello puede ser realizar un programa que se encargue del estudio de una medida ACPR, brevemente definida en el apartado 5.2.6 de esta memoria. Otra línea de trabajo posible es la caracterización de la predistorsión u otras técnicas de linealización para el diseño de amplificadores, algo que sería de gran utilidad en los sistemas de radiocomunicación actuales. A
79 REFERENCIAS [1] Ingenieriaelectronica.org. Introducción de instrumentación virtual. [online] Disponible en: https://ingenieriaelectronica.org/instrumentacion-virtual-hardwares-y-beneficios/ [2] Emb.cl. Evolución de la tecnología. [online] Disponible en: http://www.emb.cl/electroindustria/articulo.mvc?xid=471 [3] Ocw.ehu.eus. Comparación entre instrumentación virtual y tradicional. [online] Disponible en: https://ocw.ehu.eus/file.php/54/GENERAL/Comparacion_IV_IT.pdf [4] Monografias.com. Instrumentos virtuales. [online] Disponible en: http://www.monografias.com/trabajos38/instrumentacion-virtual-industrial/instrumentacion-virtual- industrial2.shtml#calibrac [5] PyVISA. Estándar VISA. [online] Disponible en: https://pyvisa.readthedocs.io/en/stable/ [6] Wikipedia.org. Estándar VISA. [online] Disponible en: https://en.wikipedia.org/wiki/Virtual_Instrument_Software_Architecture [7] Academia.edu. Bus GPIB. [online] Disponible en: http://www.academia.edu/6737142/BUS_GPIB [8] Prezi.com. Bus GPIB. [online] Disponible en: https://prezi.com/pwdfft63mxp_/bus-de-instrumentacion- de-proposito-general-gpib-ieee-488/ [9] Magaly Sierra Vite, «Aplicaciones didácticas del GPIB a nivel licenciatura y postgrado para la UAEH», Tesis Doctoral, Marzo 2007. [10] Instrumentación electrónica, Práctica 3, UPC, «Control de instrumentos a bajo nivel. Peticiones de servicio», Versión 1.0, Septiembre 1998. [11] Juan José González de la Rosa, «Instrumentos electrónicos programables», UCA. [12] National Instruments. Red de Área Local. [online] Disponible en: http://www.ni.com/whitepaper/2922/en/ [13] National Instruments. Red de Área Local. [online] Disponible en: http://www.ni.com/whitepaper/3518/en/#toc2 [14] María España Borrero Serrano, «Herramienta software para el control remoto de una fuente de alimentación mediante una interfaz gráfica.», Trabajo Fin de Grado, Capítulos 1 y 2, Julio 2011. [15] National Instruments. PXI. [online] Disponible en: http://www.ni.com/pxi/whatis/esa/ [16] PyVISA. Python. [online] Disponible en: https://pypi.python.org/pypi/PyVISA [17] Guido Van Rossum, Fred L. Drake, Jr., «Python», Septiembre 2009.
Referencias 80 [18] Pythonmania.net. Python. [online] Disponible en: https://www.pythonmania.net/es/ [19] Gaël Varoquaux, Emmanuelle Gouillart, Olaf Vahtras, «Scipy Lecture Notes», 2015. [20] Kang-Jing Huang, «Introduction to Instrument Control Using Python». [21] Daniel Contreras Solórzano, «Plataforma experimental para la evaluación de modelos de comportamiento en amplificadores de potencia.», Proyecto fin de grado, Capítulo 2, Material y Método, Julio 2011. [22] Agilent Technologies, «Agilent X-Series signal analyzer», Manual del analizador de señal. [23] Rohde & Schwarz, «Vector signal generator», Manual del generador de señal, Volumen 2, Capítulo 3. [24] Ignacio Pérez Lupiáñez, «Plataforma para la caracterización experimental de dispositivos de RF.», Trabajo Fin de Grado, Capítulos 5 y 6, 2016. [25] Michel Allegue Martínez, «Modeling and Compensation of Non-linear Effects in Wireless Communications Systems», Tesis Doctoral, Capítulo 3, 2012. [26] Minicircuits. Amplificador ZJL-6G+. [online] Disponible en: https://ww2.minicircuits.com/pdfs/ZJL- 6G+.pdf [27] Minicircuits. Mezclador MCA1-60+. [online] Disponible en: https://ww2.minicircuits.com/pdfs/MCA1- 60+.pdf
81 GLOSARIO ACPR: relación de potencia de canal adyacente (Adjacent Channel Power Ratio) 49, 77 ADC: convertidor analógico-digital (Analog-to-Digital Converter) 45 ANSI: instituto de estandarización americano (American National Standards Institute) 8 API: interfaz de programación de aplicaciones (Application Programming Interface) 6 ASCII: código estándar estadounidense para el intercambio de la información (American Standard Code for Information Interchange) 12 ATN: línea de atención (Attention) 12, 13, 18 BJT: transistor de unión bipolar (Bipolar Junction Transistor) 47 CLS: -comando común de GPIB - (Clear Status Command) 16, 19 CNRI: corporación para iniciativas nacionales de inversigación (Corporation for National Research Initiatives) 25 CPU: unidad central de procesamiento (Central Processing Unit) 23 DAV: dato válido (Data Valid) 10, 12, 20, 21 DCL: -comando universal de GPIB - (Device Clear) 19 DIO: línea de dato entrada/salida (Data IO) 12, 20, 21 DLL: biblioteca de enlace dinámico (Dinamic Link Library) 6 EOI: fin de identidad (End Or Identity) 13 ESE: -comando común de GPIB - (Event Status Enable Command) 19 ESE?: -comando común de GPIB - (Event Status Enable Query) 19 ESER: registro de habilitación de estados (Event Status Enable Register) 17 ESR: registro de evento de estado (Event Status Register) 17 ESR?: -comando común de GPIB - (Event Status Register Query) 19 FET: transistor de efecto de campo (Field-Effect Transistor) 47 FFT: transformada rápida de Fourier (Fast Fourier Transform) 45, 46 FM: frecuencia modulada (Modulated Frecuency) 47 GET: -comando addressed de GPIB - (Group Trigger) 18 GPIB: bus de datos de propósito general (General-Purpose Instrumentation Bus) 1, 5, 6, 7, 8, 10, 11, 13, 14, 16, 18, 21, 24, 42, 45, 46, 65, 70, 89, 90 GSM: sistema global para comunicaciones móviles (Global System for Mobile communications) 46 GTL: -comando addressed de GPIB- (Go To Local) 18 GUI: interfaz gráfica de usuario (Graphical User Interface) 42 HP: Hewlett Packard 7 HP-IB: bus de datos de Hewlett Packard ( del inglés Hewlett Packard Instrument Bus) 7 HTML: lenguaje de marcados para hipertextos (HyperText Markup Language) 23 I/O: entrada/salida (In/Out) 10 IDE: entorno de desarrollo integrado (Integrated Development Environment) 41
Glosario 82 IDN?: -comando común de GPIB - (Identification Query) 19, 42, 52 IEC: comisión electrónica internacional (International Electrotechnical Commission) 8 IEEE: instituto de ingenieros eléctricos y electrónicos (Institute of Electrical and Electronics Engineers) 7, 8, 10, 14, 15, 17, 20, 21, 23, 26 IFC: reseteo de interfaz (Interface Clear) 13 IP: protocolo de internet (Internet Protocol) 21, 22, 23 ISO: organización internacional de estandarización (International Organization for Standardization) 12 IT: tecnología de la información (Information Technology) 23 LabVIEW: software de ingeniería en sistemas (Laboratory Virtual Instrument Engineering Workbench) 3 LAN: red de área local (Local Area Network) 10, 21, 22, 23, 24 LLO: -comando universal de GPIB - (Local Lockout) 19 LRN?: -comando común de GPIB - (Learn Device Setup Query) 19 LTE: evolución a largo plazo (Long Term Evolution) 46 LXI: extensión de red de área local para instrumentación (LAN eXtensions for Instrumentation) 23 MLA: -comando talk/listen de GPIB - (My Listen Address) 19 MSA: -comando addressed de GPIB - (My Secondary Address) 18 MTA: -comando talk/listen de GPIB - (My Talk Address) 19 NDAC: dato no aceptado (Not Data Accepted) 12, 20, 21 NRFD: dato no preparado (Not Ready For Data) 11, 12, 20, 21 OPC: -comando común de GPIB - (Operation Complete Command) 19 OPC?: -comando común de GPIB - (Operation Complete Query) 19 OPT?: -comando común de GPIB - (Option Identification Query) 19 PC: ordenador personal (Personal Computer) 3, 6, 21, 24 PCI: interconexión de componentes periféricos (Peripheral Component Interconnect) 23 PPC: -comando addressed de GPIB - (Parallel Poll Configure) 18 PPU: -comando universal de GPIB - (Parallel Poll Unconfigure) 19 RCL: -comando común de GPIB - (Recall Command) 19 REN: habilitación remota (Remote Enable) 13 RS232: estándar recomendado 232 (Recommended Standard 232) 6, 42 RST: -comando común de GPIB - (Reset Command) 19 SAV: -comando común de GPIB - (Save Command) 19 SBR: registro de estado de bytes (Status Byte Register) 17 SCPI: comandos estándar para instrumentos programables (Standard Commands for Programmable Instrumentation) 10, 15, 20, 52, 53, 58 SDC: -comando addressed de GPIB- (Select Device Clear) 18 SMA: tipo de conector roscado para cable coaxial (SubMiniature version A) 65, 71 SPD: -comando universal de GPIB - (Serial Poll Disable) 19 SPE: -comando universal de GPIB - (Serial Poll Enable) 19 SQR: petición de servicio (Service Request) 13, 17
83 Control remoto de instrumentación para radiocomunicación mediante Python SRE: -comando común de GPIB - (Service Request Enable Command) 19 SRE?: -comando común de GPIB - (Service Request Enable Query) 19 SRER: registro de solicitud de servicio (Service Request Enable Register) 17 STB?: -comando común de GPIB - (Read Status Byte Query) 19 TCP: protocolo de control de transmisión (Transmission Control Protocol) 22, 23 TCT: -comando addressed de GPIB - (Take Control) 18 TOI: tercer producto de intermodulación (Third Order Input) 48 TRG: -comando común de GPIB - (Trigger Command) 19 TST?: -comando común de GPIB - (Selft-Test Query) 19 TTL: lógica transistor a transistor (Transistor-Transistor Logic) 11 UNL: -comando talk/listen de GPIB - (UNListen) 19 UNT: -comando talk/listen de GPIB - (UnTalk) 19 USB: bus serie universal (Universal Serial Bus) 6, 9, 42, 65, 70 VISA: software de instrumentación virtual (Virtual Instrument Software Architecture) 1, 6, 10, 15, 42 VME: extensiones de modo virtual (Virtual Mode Extensions) 10 VSA: analizador vectorial de señales (Vector Signal Analyzer) 45, 46 VXI: extensiones VME para instrumentación (VME Extensions for Instrumentation) 10, 22 WAI: -comando común de GPIB - (Wait-to-Continue Command) 19, 52 WCDMA: acceso múltiple por división de código de banda ancha (Wideband Code Division Multiple Access) 46
Anexo 3 90 build_GPIB_object.py: Crea el objeto para la comunicación mediante el bus GPIB. send_command.py: Escribe el comando pasado como argumento en el objeto que se le indica (generador vectorial de señales o analizador de señal).
91 Control remoto de instrumentación para radiocomunicación mediante Python send_query.py: Escribe el comando pasado como argumento en el objeto que se le indica y recoge el resultado generado por el mismo (generador vectorial de señales o analizador de señal). un_tono_SMIQ.py: Crea el objeto con el generador de señales y le manda las órdenes requeridas por teclado relacionadas con el mismo.
Anexo 3 92 resultados.py: Imprime los resultados del ejercicio en un archivo independiente.
93 Control remoto de instrumentación para radiocomunicación mediante Python medida.py: Realiza la medición de la potencia del máximo en el analizador de señal.
Anexo 3 94 medida_1tono_sinDC.py: Programa principal, utiliza las demás funciones para obtener el resultado de potencia corregido, objetivo de este trabajo.
95 Control remoto de instrumentación para radiocomunicación mediante Python