Full text
Trabajo Fin de Grado Grado de Ingeniería de las Tecnologías Industriales Clasificador de Impedancias borroso utilizando la plataforma Arduino Autor: Carlos Bordons Martínez Tutor: José María Maestre Torreblanca y Juan Manuel Escaño González Dep. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2015
Trabajo Fin de Grado Grado de Ingeniería de las Tecnologías Industriales Clasificador de Impedancias borroso utilizando la plataforma Arduino Autor: Carlos Bordons Martínez Tutor: José María Maestre Torreblanca y Juan Manuel Escaño González Dep. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2015
Trabajo Fin de Grado: Clasificador de Impedancias borroso utilizando la plataforma Arduino Autor: Carlos Bordons Martínez Tutor: José María Maestre Torreblanca y Juan Manuel Escaño González El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha:
A mi familia, amigos y tutores que me han ayudado y apoyado mucho durante toda mi carrera y en particular durante este TFG 1
Índice general Lista de figuras 4 1. Introducción 6 1.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2. Transformada de Fourier 8 2.1. Definición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2. Transformada Discreta de Fourier . . . . . . . . . . . . . . . . 11 2.3. Transformada Rápida de Fourier (FFT) . . . . . . . . . . . . 12 2.4. La Transformada Rápida de Fourier (FFT) y Matlab . . . . . 13 3. Plataforma Arduino 14 3.1. ¿Qué es Arduino? . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.1. Alimentación . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.2. Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.3. Entrada y Salida . . . . . . . . . . . . . . . . . . . . . 18 3.2.4. Comunicación . . . . . . . . . . . . . . . . . . . . . . . 19 3.3. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.4. Modulación por Ancho de Pulsos y programación en Arduino 19 4. Medida de impedancia eléctrica 27 4.1. Medida de la impedancia . . . . . . . . . . . . . . . . . . . . 28 4.1.1. Puente de impedancias . . . . . . . . . . . . . . . . . . 28 4.1.2. Divisor de impedancia . . . . . . . . . . . . . . . . . . 29 4.1.3. Otros: resonancia,I-V. . . . . . . . . . . . . . . . . . . 30 4.2. Análisis de circuitos de corriente alterna y cálculo de la impedancia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 5. Clasificación de impedancias 32 5.1. Variación de la impedancia con la frecuencia . . . . . . . . . . 32 5.1.1. Circuito RC yRL . . . . . . . . . . . . . . . . . . . . 32 2
5.2. Diagrama de Bode . . . . . . . . . . . . . . . . . . . . . . . . 35 5.2.1. Diagrama de Bode para circuitos RC yRL . . . . . . 35 5.3. Método de clasificación . . . . . . . . . . . . . . . . . . . . . . 38 5.3.1. Fuzzy Logic ....................... 38 6. La herramienta matemática Matlab 41 7. Experimentos, resultados y conclusiones 43 7.1. Experimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 7.2. Resultados y conclusiones . . . . . . . . . . . . . . . . . . . . 52 8. Medición de Bioimpedancia 57 8.1. Patrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 8.2. Clasificador de bioimpedancia . . . . . . . . . . . . . . . . . . 59 8.3. Adquisición rápida de datos y correcta clasificación . . . . . . 62 9. Conclusiones 65 Apéndices 67 A. Demostración de la Transformada Discreta de Fourier (DFT) 68 B. Demostración de la Transformada Rápida de Fourier (FFT) 69 C. Código Arduino comentado 71 D. Código Matlab comentado 81 Bibliografía 87 3
Figura 2.1: Principales propiedades de la Transformada de Fourier. 10
2.2. Transformada Discreta de Fourier La transformada de Fourier que se ha presentado en el apartado anterior está definida para sistemas continuos en el tiempo, pero en este proyecto se va a trabajar con señales muestreadas para poder procesarlas con un PC o un microprocesador Arduino, del que se habla en el capítulo 3, y mediante la herramienta Matlab, por esa razón no es posible aplicar la definición de Transformada de Fourier anterior. Por tanto una vez definida la Transformada de Fourier, se presenta la transformada discreta de Fourier o DFT (del inglés, discrete Fourier transform) en la que las operaciones involucradas son sumas y multiplicaciones. Al igual que la transformada de Fourier, transforma una función matemática en otra, obteniendo una representación en el dominio de la frecuencia. Pero a diferencia de la Transformada de Fourier, la DFT requiere que la función de entrada sea una secuencia de datos discreta y de duración finita. Dichas secuencias se generan a partir del muestreo de una función continua, en nuestro caso particular esas señales son las tensiones muestreadas en los puertos de entrada del dispositivo Arduino y que se almacenan en secuencias de N datos [8, 5]. Por tanto la DFT transforma un conjunto de N muestras x(nT) de la señal adquirida con el sistema de adquisición de datos (Arduino) en el mismo número de muestras discretas en frecuencia, X(kF). La DFT es invertible y se habla de la IDFT (Inverse DFT). Las fórmulas que definen estas transformadas son [9]: X(kF) = N−1 X n=0 x(nT)e−i2π Nnk donde F=1 N·T(2.2.1) x(nT) = 1 N N−1 X k=0 X(kF)ei2πnk N(2.2.2) En el Apéndice A se explica un método para llegar a este resultado [10]. Una descripción simple de estas ecuaciones es que los números complejos Xkrepresentan la amplitud y fase de diferentes componentes sinusoidales de la señal de entrada Xn. La DFT calcula Xka partir de Xn, mientras que la IDFT muestra cómo calcular Xncomo la suma de componentes sinusoidales 1 NXke2πikn Ncon una frecuencia de k Nciclos por muestra. Escribiendo las ecuaciones de este modo, estamos haciendo un uso extensivo de la fórmula de Euler para expresar sinusoides en términos de exponentes complejas: eix = cos(x) + isin(x).(2.2.3) 11
Para realizar estos cálculos con un procesador, se requiere una gran cantidad de tiempo de cálculo, motivo por el cual se utliza la transformada rápida de Fourier o FFT (del inglés, Fast Fourier Transform). 2.3. Transformada Rápida de Fourier (FFT) Se trata de un algoritmo que permite calcular la DFT y la IDFT. El algoritmo pone algunas limitaciones en la señal y en el espectro resultante. Mientras la DFT requiere de N2multiplicaciones, si Nes par se puede organizar el cálculo de manera que se realicen dos DFT y una combinación adecuada de ellas; esto reduce el número de multiplicaciones a aproximadamente la mitad, aplicando este proceso sucesivamente se reduce considerablemente el número de multiplicaciones [5]. La FFT se programa en un procesador que realiza todas las operaciones. Toma Nmuestras de la señal que se almacenan en memoria (ventana temporal), procesándose posteriormente para obtener el resultado deseado. El problema computacional para calcular la DFT consiste en calcular la secuencia X(kF) a partir de la secuencia de datos x(nT). X(k) = M−1 X n=0 x(n)Wk M(2.3.1) Donde Wk M=ei2πnk Npara k= 0,1, ...M −1. Dados los datos x(n), n = 1, ..., M, se puede calcular directamente la secuencia X(kF) a partir de la fórmula que define la DFT. Hay que calcular M elementos X(kF), con M sumas complejas para cada elemento. La complejidad del algoritmo directo crece con M2. Resulta un algoritmo ineficiente porque no explota las propiedades de simetría y periodicidad del factor de fase Wk M: Wk+M 2 M=−Wk M Wk+M M=Wk M El algoritmo FFT consigue realizar el mismo cálculo pero su complejidad crece con M logM. En realidad no hay un único algoritmo FFT sino varios. Por concretar, vamos a comentar el primero que se conoció, denominado algoritmo de FFT de Cooley-Tukey (o algoritmo FFT-CT) [11, 12]. Este algoritmo exige que el número de muestras de la señal sea potencia de 2, lo que realmente no es una limitación fundamental para el sistema de adquisición de datos. Un algoritmo FFT-CT se organiza conforme a la iteración de dos operaciones. La primera operación se llama algoritmo de diezmado en el tiempo y 12
consiste en descomponer recursivamente la secuencia x(n) en subsecuencias y calcular la DFT de cada subsecuencia. La segunda operación consiste en combinar las DFTs calculadas hasta obtener la DFT final de la secuencia x(n) original [9]. En el Apéndice B se indica la demostración de este método. 2.4. La Transformada Rápida de Fourier (FFT) y Matlab En este apartado se hará un breve inciso sobre cómo trabaja la herramienta Matlab, Programa de cálculo matemático de la compañía Mathworks [13], a la que dedicaremos parte del capítulo 6, que se usa en este proyecto para el tratamiento de los datos y para obtener la FFT. Matlab es el lenguaje de alto nivel y el entorno interactivo utilizado por millones de ingenieros y científicos en todo el mundo. Le permite explorar y visualizar ideas, así como colaborar interdisciplinarmente en procesamiento de señales e imagen, comunicaciones, sistemas de control y finanzas computacionales [13]. Se trata pues de una herramienta matemática que, entre otras cosas, permite implementar la FFT como una función que trate los datos muestreados y hacer un análisis frecuencial de la señal de entrada. Asimismo, Matlab incluye extensas librerías de funciones matemáticas y entre ellas incluye la función FFT en varias modalidades; se elegirá la que se adapte mejor a nuestro problema. 13
Capítulo 3 Plataforma Arduino Se usará la plataforma Arduino como una tarjeta de adquisición de datos de bajo coste y dimensiones para tomar las muestras necesarias para el cálculo de la FFT comentada en el apartado 2.4. 3.1. ¿Qué es Arduino? Arduino es una plataforma de electrónica abierta (open-source) para la creación de prototipos basada en software y hardware flexibles y fáciles de usar. Se creó para artistas, diseñadores, aficionados y cualquiera interesado en crear entornos u objetos interactivos. Arduino puede tomar información del entorno a través de sus pines de entrada de toda una gama de sensores y puede afectar aquello que le rodea controlando luces, motores y otros actuadores a través de los pines de salida. El microcontrolador en la placa Arduino se programa mediante el lenguaje de programación Arduino (basado en Wiring) y el entorno de desarrollo Arduino (basado en Processing). Los proyectos hechos con Arduino pueden ejecutarse sin necesidad de conectarlo a un ordenador (ser autónomos), si bien tienen la posibilidad de hacerlo y comunicar con diferentes tipos de software en ejecución (p.ej. Flash, Processing, MaxMSP, etc). Figura 3.1: Placa Arduino UNO. 14
Las placas se pueden ensamblar a mano o encargarlas preensambladas y el software puede ser descargado de forma gratuita. Los ficheros de diseño de referencia (CAD) están disponibles bajo una licencia abierta [14, 15]. 15
3.2. Hardware La plataforma Arduino dispone de un buen número de placas diferentes [16]: Arduino Uno Arduino Leonardo Arduino Due Arduino Yún Arduino Micro Arduino Mega ADK Arduino Ethernet Arduino Mega 2560 Arduino Robot Arduino Mini Arduino Nano LilyPad Arduino Simple y SimpleSnap LilyPad Arduino Arduino Pro En nuestro caso vamos a centrarnos en la placa Arduino UNO que tenemos a nuestra disposición para realizar este proyecto. La placa Arduino UNO está basado en el chip ATmega328, un chip microcontrolador creado por Atmel y pertenece a la serie megaAVR. El Atmega328 AVR 8-bit es un circuito integrado de alto rendimiento que está basado un microcontrolador RISC, combinando 32 KB ISP flash, una memoria con la capacidad de lectura y escritura simultáneas, 1 KB de memoria EEPROM, 2 KB de SRAM, 23 lineas de E/S de propósito general, 32 registros de proceso general, tres temporizadores flexibles/contadores con modo de comparación, interrupciones internas y externas, programador de modo USART, una interfase serial orientada a byte de 2 cables, SPI puerto serial, 6-canales 10-bit Conversor A/D , "watchdog timer"programable con oscilador interno, y cinco modos de ahorro de energía seleccionables por software. El dispositivo opera entre 1.8 y 5.5 voltios [17]. 16
La placa Arduino UNO tiene 14 pines entrada/salida digitales (de los cuales 6 pueden ser usados como salidas PWM (Pulse Width Modulation) y 6 entradas analógicas, un oscilador resonador cerámico, una conexión USB, conector de alimentación, una cabecera ICSP, y un botón de reset [18]. 3.2.1. Alimentación El Arduino UNO puede ser alimentado a través de la conexión USB o con un suministro de energía externo. La fuente de energía se selecciona automáticamente. La alimentación externa (no USB) puede venir o desde un adaptador AC-DC o desde una batería. La placa puede operar con un suministro externo de 6 a 20 voltios. Si es suministrada con menos de 7 V, sin embargo, el pin de 5 V puede suministrar menos de cinco voltios y la placa podría ser inestable. Si usa más de 12 V, el regulador de tensión puede sobrecalentarse y dañar la placa. El rango recomendado es de 7 a 12 voltios. Los pines de alimentación son los siguientes [16, 18]: VIN. La entrada de tensión a la placa Arduino cuando está usando una fuente de alimentación externa (al contrario de los 5 voltios de la conexión USB u otra fuente de alimentación regulada). Se puede suministrar tensión a través de este pin, o, si suministra tensión a través del conector de alimentación, acceder a él a través de este pin. 5V. El suministro regulado de energía usado para alimentar al microcontrolador y otros componentes de la placa. Este puede venir o desde VIN a través de un regulador en la placa, o ser suministrado por USB u otro suministro regulado de 5 V. 3V3. Un suministro de 3.3 V generado por el chip FTDI de la placa. La corriente máxima es de 50 mA. GND. Pines de tierra. IOREF. Este pin provee la tensión de referencia con la que opera el microcontrolador. 3.2.2. Memoria El ATmega168 tiene 16 KB de memoria Flash para almacenar código (de los cuales 2 KB se usa para el bootloader). Tiene 1 KB de SRAM y 512 bytes de EEPROM (que puede ser leída y escrita con la librería EEPROM [20]). 17
3.2.3. Entrada y Salida Cada uno de los 14 pines digitales del Diecimila puede ser usado como entrada o salida, usando funciones pinMode(), digitalWrite() y digitalRead() [19]. Operan a 5 voltios. Cada pin puede proporcionar o recibir un máximo de 40 mA y tiene una resistencia interna pull-up (desconectada por defecto) de 20-50 KOhms. Además, algunos pines tienen funciones especiales [16, 18]: Serial: 0 (Rx) y 1 (Tx). Usados para recibir (Rx) y transmitir (Tx) datos TTL en serie. Estos pines estan conectados a los pines correspondientes del chip FTDI USB-a-TTL Serie. Interruptores externos: 2 y 3. Estos pines pueden ser configurados para disparar un interruptor en un valor bajo, un margen creciente o decreciente, o un cambio de valor. PWM: 3, 5, 6, 9, 10 y 11. Proporcionan salida PWM de 8 bits con la función analogWrite(). SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estos pines soportan comunicación SPI, la cual, aunque proporcionada por el hardware subyacente, no está actualmente incluida en el lenguaje Arduino. LED: 13. Hay un LED empotrado conectado al pin digital 13. Cuando el pin está a valor HIGH, el LED está encendido, cuando el pin está a LOW, está apagado. El ArduinoUNO tiene 6 entradas analógicas numeradas de A0 a A5, cada una de las cuales proporciona 10 bits de resolución (1024 valores diferentes). Por defecto miden 5 voltios desde tierra, aunque es posible cambiar el valor más alto de su rango usando el pin ARF y algún código de bajo nivel. Además, algunos pines tienen funcionalidad especializada: I2C: 4 (SDA) y 5 (SCL). Soportan comunicación I2C(TWI) usando la libreria Wire. Hay otro par de pines en la placa: AREF. Voltaje de referencia para las entradas analógicas. Usado con analogReference(). Reset. Pone esta línea a LOW para resetear el microcontrolador. Típicamente usada para añadir un botón de reset a dispositivos que bloquean a la placa principal. 18
3.2.4. Comunicación La placa ArduinoUNO tiene un numero de infraestructuras para comunicarse con un ordenador, otro Arduino, u otros microcontroladores. El ATmega168 provee comunicación serie UART TTL (5 V), la cual está disponible en los pines digitales 0 (Rx) y 1 (Tx). Un ATmega16U2 en la placa canaliza esta comunicación serie al USB y proporciona un puerto de comunicación virtual al software del ordenador. El software Arduino incluye un monitor serie que permite a datos de texto simple ser enviados a y desde la placa Arduino. Una libreria SoftwareSerial permite comunicación serie en cualquiera de los pines digitales del ArduinoUNO. El ATmega168 también soporta comunicación I2C(TWI) y SPI. El software Arduino incluye una librería Wire para simplificar el uso del bus I2C. Para usar la comunicación SPI, consultar el esquema del ATmega168 [21, 16, 18]. 3.3. Software El ArduinoUNO puede ser programado con el software Arduino, será el método empleado en este proyecto [22]. El ATmega168 del ArduinoUNO viene con un bootloader pregrabado para actualizar el código sin usar un programador hardware externo. Se comunica usando el protocolo original STK500. También se puede saltar el bootloader y programar el ATmega168 a través de la cabecera ICSP (In- Circuit Serial Programming). Una vez instalado el software Arduino, y conectada la placa al PC por puerto USB, se crea el puerto serie virtual comentado anteriormente. Se selecciona ese puerto en el programa Arduino que se muestra en la Figura 3.2 y ya se puede cargar código creado o monitorizar los datos enviados por el puerto serie cuando la placa ejecuta el programa cargado. 3.4. Modulación por Ancho de Pulsos y programación en Arduino Se va a utilizar Arduino como tarjeta de adquisición de datos (DAQ), para ello se crea un código cuya función es: 1o. Crear una señal PWM (Pulse Width Modulation) de frecuencia F(Hz) y Duty Cycle (DC) = 50% (no confundir con corriente directa o continua DC). 19
Figura 3.8: Tabla de bits para configurar los PWM [21]. Figura 3.9: Tabla de bits para configurar COM en Fast PWM [21]. Figura 3.10: Tabla de bits para configurar COM en PFC PWM [21]. 26
Capítulo 4 Medida de impedancia eléctrica La impedancia eléctrica es la oposición que experimenta un dispositivo o circuito eléctrico o electrónico a la circulación de corriente eléctrica. Es una propiedad característica de los medios materiales en general y de los elementos de circuito en particular, que describe su comportamiento con respecto a la circulación de una corriente eléctrica a través de ellos cuando se aplica una determinada diferencia de potencial eléctrico entre sus extremos [23]. La amplitud y frecuencia del potencial eléctrico aplicado tienen influencia sobre la respuesta eléctrica del elemento considerado y así aparece el concepto de espectrometría de impedancia eléctrica, técnica que busca determinar el valor de la impedancia eléctrica y su variación en función de la frecuencia y amplitud de la señal aplicada. Cuando una señal se transmite a través de un medio material, se pueden producir alteraciones tanto en la amplitud como en la fase. Por ello, una función que relaciona las señales incidente y transmitida, como es la impedancia, tiene dos componentes que dan cuenta de estos parámetros. Tiene por tanto carácter vectorial y se podrá expresar como un número complejo [25]. Se puede expresar una impedancia como Z=R+jX donde Rrepresenta la parte real y jX la parte imaginaria, siendo R(resistencia o parte resistiva) yX(reactancia o parte reactiva) números reales, o como un fasor Z= |Z|∠φ, según el valor del argumento(φ) la impedancia será : φ= 0 impedancia resistiva φ < 0 impedancia capacitiva φ > 0 impedancia inductiva 27
Figura 4.1: Técnicas de medida en función de la frecuencia. 4.1. Medida de la impedancia La impedancia, como se ha visto en el apartado anterior, tiene carácter vectorial y se expresa como un número complejo. Hay distintos métodos para medir la impedancia de un elemento dependiendo de la frecuencia, tal y como se muestra en la Figura 4.1 [23]: Puente de impedancias Divisor de impedancia Otros:resonancia,I-V... 4.1.1. Puente de impedancias Los puentes utilizan el método de medida de comparación por balanceo y diferencial. Para este caso se hace que un indicador (un galvanómetro o un amperímetro) proporcione una condición de deflexión nula o conocida cuando se compara la cantidad medida con la cantidad patrón. Los puentes se emplean para medida de resistencias, capacidades, inductancias, factor de calidad, ángulo de pérdidas, etc [26]. Un puente de corriente alterna se puede representar por dos ramas como se muestra en la Figura 4.2. Mediante una impedancia variable, se equilibran las dos ramas del puente haciendo que la intensidad que atraviesa el galvanómetro sea 0, de manera que una vez que Ig= 0 se dice que el puente está equilibrado y se cumplen las siguientes relaciones entre los módulos y argumentos de las impedancias: |Z1| · |Z3|=|Z2| · |Z4|(4.1.1) φ1+φ3=φ2+φ4(4.1.2) Estas ecuaciones permiten el cálculo de cualquier impedancia desconocida facilmente conociendo las otras 3 impedancias patrón y ajustando el 28
Figura 4.2: Puente de corriente alterna. Figura 4.3: Montaje divisor de impedancia. galvanómetro o amperímetro de forma que la intensidad sea nula a través de él, aunque normalmente se usa en sensores para medir la variación de una magnitud (temperatura, presión, etc.). 4.1.2. Divisor de impedancia Los divisores de impedancia tienen como misión establecer una comparación entre la señal de referencia y la señal a medir. Para resolver el proceso de medida puede emplearse un montaje sencillo mediante divisor de impedancias como el que se muestra en la Figura 4.3 [26]. Si se supone que Z1y la señal de entrada V1son conocidas, se puede medir la señal de salida V2y calcular el valor de Z2fácilmente despejando de 4.1.3: V2 V1 =Z2 Z1+Z2 (4.1.3) Z2=Z1V2 V1−V2 (4.1.4) donde V1, V2, Z1yZ2son números complejos. A partir de los resultados anteriores se concluye que para medir la impedancia Z2debemos excitar el circuito con corriente alterna (CA, AC en inglés) y medir la señal de salida. 29
4.1.3. Otros: resonancia,I-V. Resonancia: utilizando las propiedades de resonancia de las ondas electromagnéticas permite realizar barridos en frecuencia y obtener el factor de calidad (Q) del circuito, generalmente condensadores y bobinas. El medidor de Qsintoniza un condensador hasta que queda en resonancia con el circuito y eso permite mediante ciertas relaciones conocer la impedancia y la Qdel circuito medido, más información en Medidores de Impedancia y parámetros de componentes pasivos [23] y en Resonancia de ondas electromagnéticas. Medida de la permitividad dieléctrica de líquidos polares [24]. I-V: utiliza una sonda I-V para medir la caída de tensión y la fuerza electromagnética inducida por la corriente y con esa información calcula la impedancia [23]. 4.2. Análisis de circuitos de corriente alterna y cálculo de la impedancia Un circuito lineal de CA es un sistema eléctrico compuesto de componentes lineales, como pueden ser resistencias, inductancias y capacitancias, además de fuentes sinusoidales. Estos sistemas trabajan en régimen sinusoidal. Esto quiere decir que en la ecuación diferencial utilizada para calcular la corriente en función del tiempo la solución homogénea se extingue rápidamente (transitorio), por lo que solo interesa la solución particular. Esta última será sinusoidal si la excitación lo es, puesto que el circuito es lineal. Por tanto, sabemos que en un circuito de CA todas las corrientes y voltajes van a ser sinusoides, con la misma frecuencia w(siendo wla frecuencia de la excitación), aunque distinta amplitud y desfase [27]. Suponemos que la señal de entrada a nuestro circuito es una señal consenoidal v1(t) = Vp1cos(wt+θ), que puede escribirse como el fasor V1=Vp1ejθ . Como es lineal, a la salida del divisor de tensión de la figura 4.3 mediremos la señal v2(t) = Vp2cos(wt +θ+φ) = V2=Vp2ejθ+φ, donde φes el desfase introducido en la señal debido a la impedancia del circuito. Conocido el valor de Z1=R1+jX1, (para simplificar los cálculos se tomará X1= 0 de forma que Z1es una resistencia pura) se puede calcular fácilmente el valor de la impedancia Z2que queremos hallar en función de la frecuencia de la señal de entrada, como ya se comentó en la sección 4. Z2=R1·V2 V1−V2 =R1·Vp2ejθ+φ Vp1ejθ ·Vp2ejθ+φ(4.2.1) 30
La operación no es un cálculo trivial de realizar a mano, pero utilizando las propiedades de los números complejos, la forma fasorial para multiplicaciones y divisiones, y la forma binómica para sumas y restas se puede hallar el resultado fácilmente pasando de una a otra, aunque en nuestro caso usaremos la herramienta matemática Matlab para ayudarnos en las operaciones. El resultado será un numero complejo del tipo Z2=R2+jX2oZ2= |Z2|∠φ2. 31
Capítulo 5 Clasificación de impedancias Como vimos en el apartado anterior 4.2, se puede calcular el valor de una impedancia Zpara el valor de frecuencia de la señal de entrada. No obstante la impedancia tiene una notable dependencia con esa frecuencia. Por tanto es posible clasificar las distintas impedancias calculando su curva de variación a distintas frecuencias mediante un análisis frecuencial y el diagrama de Bode. Con este método se puede clasificar con mayor exactitud las impedancias medidas. Primero estudiaremos como afecta la frecuencia a la impedancia. 5.1. Variación de la impedancia con la frecuencia Las impedancias de condensadores y bobinas varían con la frecuencia en los circuitos de corriente alterna, Comenzaremos con un estudio de circuitos simples RC yRL y estudiaremos su dependencia con la frecuencia. 5.1.1. Circuito RC yRL Circuito RC El condensador es un elemento que al someterse a una diferencia de potencial, genera una intensidad proporcional a la variación de la misma. La ecuación del modelo de este elemento es: dV (t) dt =i(t) C(5.1.1) Se denomica Ca la capacidad del condensador [30]. La impedancia de un condensador en función de la frecuencia f(Hz) es ZC=−j Cw donde w= 2πf es la frecuencia angular y jrepresenta la unidad imaginaria. En corriente alterna también es útil el empleo del concepto de reactancia. La reactancia capacitiva se define como XC=1 Cw y la impedancia puede expresarse ZC=−jXC. 32
Figura 5.1: Circuito RC serie. Sea un circuito RC serie como el que se muestra en la Figura 5.11, la impedancia del circuito será: Z=R+ZC=|Z|e−jφ (5.1.2) donde |Z|=qR2+1 Cw 2ytg(φ) = 1 CwR . Circuito RL Una bobina es un elemento que al ser sometido a una diferencia de potencial genera una variación en la intensidad proporcional a la misma. Las bobinas almacenan energía eléctrica en forma de energía magnética. La ecuación del modelo es la siguiente: V(t) = Ldi(t) dt (5.1.3) Siendo L la constante de autoinducción de la bobina. A continuación se procede a estudiar la impedancia de un circuito RL y cómo afecta una bobina a la impedancia del circuito, ya que su impedancia también varía en función de la frecuencia. La impedancia de una bobina de inductancia Len función de la frecuencia f(Hz) es ZL=jLw, donde w= 2πf es la frecuencia angular y jrepresenta la unidad imaginaria. La reactancia inductiva se define como XL=Lw y la impedancia de la bobina será ZL=jXL. Asimismo, sea un circuito RL serie como el que se muestra en la Figura 5.2, la impedancia del circuito será: Z=R+ZL=|Z|ejφ (5.1.4) 1Imágenes generadas con el programa PSpice versión de estudiante. 33
Figura 5.2: Circuito RL serie. Figura 5.3: Representación gráfica de las impedancias en circuitos RL yRC. donde |Z|=pR2+Lw2ytg(φ) = Lw R. La impedancia del circuito que se mida en bornas del Arduino, se puede representar como suma de fasores, o se puede hacer la suma vectorial en el plano imaginario como el que se representa en la Figura 5.3. Se puede observar cómo afecta a la impedancia total del circuito el efecto de un condensador o de una bobina, y a partir de estos resultados se puede calcular cualquier impedancia como suma de impedancias en serie y paralelo de resistencias, condensadores y bobinas, y representar su impedancia en el plano imaginario, de manera que cada circuito poseerá una impedancia particular en función de la frecuencia de la corriente que lo alimente [29]. 34
5.2. Diagrama de Bode El diagrama de Bode (véase la Figura 5.4) es una representación gráfica que sirve para caracterizar la respuesta en frecuencia de un sistema. Es una herramienta que nos permite representar la variación de una magnitud (la impedancia en este caso) respecto a la frecuencia. En teoría de sistemas es el más utilizado para representar gráficamente la función de transferencia de un sistema y es muy utilizado también en análisis de circuitos. Se representa mediante el conjunto de dos curvas: Curva de Amplitud: traza la amplitud de nuestro sistema, expresado en decibelios (dB), en función de w(en escala logarítmica), en nuestro caso particular 20 ∗log10|Z(w)|. Curva de fase: traza la fase de nuestro sistema en función de w(en escala logarítmica), en nuestro caso arg(Z(w)). Obsérvese que tanto la amplitud como la fase se representan en función de la frecuencia expresada en escala logarítmica. Esto es debido a que, si los sistemas trabajan en un rango amplio de frecuencias, las escalas logarítmicas permiten una mejor representación. En el caso de escalas lineales, si se desea estudiar con detalle las frecuencias bajas, entonces las altas se salen del diagrama, y si se desea incluir las altas, las bajas salen muy comprimidas. Asimismo el logaritmo convierte productos en sumas. La escala logarítmica comprime más cuanto mayor es la frecuencia [30]. En este proyecto se hace uso del diagrama de Bode para obtener una relación de la impedancia de nuestro sistema (aquello que se coloque en las bornas del Arduino) con la frecuencia, y con esa información clasificar ese sistema. 5.2.1. Diagrama de Bode para circuitos RC yRL Tal y como se comentó en el apartado 5.1.1, la impedancia de condensadores y bobinas varía con w. Se puede usar el programa PSpice 2para simular la respuesta de estos circuitos y obtener el diagrama de Bode de cada uno de ellos o Matlab y la función bode. Bode de circuito RC Se conoce la impedancia del condensador ZC=1 jwC . Por tanto la caída de tensión en bornas del condensador (véase Figura 5.1) es: VC= 1 jwC R+1 jwC V1=1 jwCR + 1V1(5.2.1) 2SPICE Es un estándar internacional cuyo objetivo es simular circuitos electrónicos, PSpice pertenece a la empresa OrCAD 35
Figura 6.1: Interfaz de Matlab Figura 6.2: Editor gráfico de gráficos gráficas que permite cambiar las propiedades de cada curva o añadir información como la leyenda o etiquetas, todo esto se puede además modificar desde la ventana de comandos o incluyendo el código en el script, véase la Figura 6.2. En el Apéndice D se muestra el código empleado y comentado. 42
Capítulo 7 Experimentos, resultados y conclusiones Este capítulo muestra la trayectoria seguida durante todo el proceso de investigación, los resultados y las conclusiones que se han obtenido a lo largo del proyecto. El objetivo es aplicar las herramientas y conocimientos teóricos expuestos en los capítulos anteriores a experimentos con impedancias reales, demostrar si es posible conseguir el resultado esperado y las dificultades encontradas. Los experimentos que se van a realizar son medidas de distintas impedancias conocidas, para su posterior clasificación con el clasificador borroso diseñado. En el capítulo 8 en lugar de medir impedancias conocidas se mide la bioimpedancia al interactuar con distintos objetos, para su posterior clasificación. 7.1. Experimentos Durante el proceso de montaje y pruebas con la plataforma Arduino se fueron tomando pequeñas decisiones tales como utilizar un montaje en modo divisor de impedancia y leer tanto la señal de entrada como la de salida. Esto se observa en la Figura 7.1. Aunque se puede medir cualquier impedancia en las bornas de los pines de entrada, para obtener mejores resultados y simplificar los experimentos se usan impedancias conectadas a la protoboard, tal y como puede verse en las figuras 7.2 y 7.3. Una vez hecho el montaje y cargado el programa en Arduino, comienza el experimento. En primer lugar, se lee en los pines analógicos A4 y A5 los valores de tensión, que se envían por puerto serie al PC donde se almacenan en un fichero de texto. El experimento consiste en un barrido de frecuencias. Se ha configurado el código para que incremente la frecuencia en forma logarítmica y para que 43
Figura 7.1: Montaje en modo divisor de tensión. Figura 7.2: Conexión de impedancia con Arduino. Figura 7.3: Ejemplo de medir una impedancia en modo divisor de tensión. 44
Figura 7.4: Transmisión de datos mostrados por la aplicación de Arduino. se tomen 44 puntos o 44 frecuencias distintas. No obstante, este parámetro es configurable, podiendo tomar hasta 2000 puntos. Un valor alto de muestras requerirá mucho tiempo para reconstruir la señal medida y obtener la transformada de Fourier, por lo que se ha decidido leer el máximo número de muestras que permite Arduino en memoria, antes de volcar los datos al PC. En total para cada valor de frecuencia se leen 320 muestras para cada una de las 44 frecuencias en cada pin de entrada (A4 y A5), véase figura 7.4. Una vez leídos todos los datos, el script de Matlab lee el archivo de texto y transforma los valores de entrada leídos de 0-1024 en nuestro voltaje (0-5V para el Arduino UNO). En la figura 7.5 se ve la reconstrucción de las dos señales; Vin corresponde al PWM de entrada y Vout es la caída de tensión en nuestra impedancia (capacitiva en este caso). El tiempo no es necesario debido a que la técnica de la FFT no precisa de información sobre el mismo; sólo necesita los valores de las muestras. De hecho Arduino solo tiene un convertidor analógico-digital (CAD). Por lo que no es posible tomar dos muestras en el mismo tiempo de muestro. Por eso se tomó la decisión de medir ambas señales por separado y luego obtener su valor de amplitud, que es el valor necesario para crear el diagrama de Bode utilizando la transformada de Fourier. A continuación calculamos la FFT de ambas señales, y se obtiene la gráfica de la Figura 7.6, donde aparecen las distintas amplitudes de la señal. Nótase los armónicos de la onda cuadrada. En nuestro caso se selecciona el armónico de mayor amplitud y se desechan los demás. Con esa información ya es posible obtener los valores de amplitud del diagrama de bode para cada frecuencia. El siguiente paso es construir el diagrama de Bode, usando la fórmula 45
Figura 7.5: Señales leídas (Vin(azul) y Vout(rojo)). Figura 7.6: Espectro de frecuencia de Vin 46
Figura 7.7: Diagrama de Bode experimental (azul) frente a la simulación (rojo). (7.1.1) para cada frecuencia. |Z|= 20 ·log |V2| |V1|(7.1.1) Para comprobar que los resultados son precisos se comparan con una simulación generada con el programa PSPice. Como se observa en la Figura 7.7, los datos obtenidos son bastante precisos en el rango de frecuencias en que estamos trabajando. Experimentalmente se comprueba que a medida que aumenta la frecuencia se obtienen datos menos precisos, lo que es debido en gran parte a las limitaciones del convertidor analógico-digital. Una vez obtenidos los diagramas de Bode de los patrones (véase la Figura 7.8, donde aparecen los distintos diagramas para distintas configuraciones de resistencias y condensadores) se almacena esa información para utilizarla en el clasificador donde se compararán los patrones con el diagrama de la impedancia a clasificar. El clasificador muestra por pantalla el grado de pertenencia para cada patrón (siempre que sea mayor que el mínimo fijado, que por defecto se ha seleccionado 0.7) y finalmente a qué patrón pertenece, que sería aquel con mayor grado de pertenencia como se muestra en las figuras 7.9, 7.10 y 7.11, donde se observa que el diagrama es similar a varios patrones, pero tiene mayor afinidad con el patrón 6, y en las figuras 7.12, 7.13 y 7.14 se observan los resultados para los distintos experimentos con otros patrones (patrones 4, 5 y 8). 47
Figura 7.8: Diagrama de Bode de los diferentes experimentos de patrones de impedancia. Figura 7.9: Resultado mostrado por el clasificador. 48
Figura 7.10: Diagrama de Bode experimental clasificado (rojo) frente al patrón 6 (azul). Figura 7.11: Diagrama de Bode experimental (azul *) frente a los demás patrones incluido el patrón 6. 49
Figura 7.12: Simulación para el patrón 4 con grado de pertenencia µ= 0,839. Figura 7.13: Simulación para el patrón 5 con grado de pertenencia µ= 0,74. 50
Figura 7.14: Simulación para el patrón 8 con grado de pertenencia µ= 0,83. 51
Figura 8.1: Montaje del sensor de bioimpedancia. Figura 8.2: Experimento tocando plaquita metálica de prueba. 58
Figura 8.3: Diferentes valores de bioimpedancia. no tocar nada (24) tocar el dedo índice de la otra mano (25) mojar el dedo en el agua con y sin tocar con el resto de la mano el jarrón (26 y 27) coger y tocar botella de plástico con agua (28 y 29) 8.2. Clasificador de bioimpedancia Ahora que hemos conseguido hasta 16 patrones distintos se realizan experimentos para probar el funcionamiento del clasificador de impedancias anterior aplicado a la bioimpedancia. Los resultados obtenidos no son los esperados debido probablemente a que estos experimentos se han realizado en unas condiciones distintas a las de la adquisición de los patrones (distinto día, colocación de la sonda distinta, contacto sonda-piel, humedad al tocar el agua, colocación del resto del cuerpo distinta, distinta ropa y accesorios como un reloj...), lo que afecta mucho a la correcta repetibilidad de los experimentos, siendo muy dificil clasificar correctamente usando los patrones del día anterior, tal y como se muestran en la Figura 8.4. En vista de lo anterior, se decide realizar de nuevo la adquisición de 6 pa- 59
Figura 8.4: Se observa que los diagramas experimentales (*) no coinciden con los patrones. trones 2, para repetir los experimentos intentando mantener las condiciones no medidas lo más constante posible para que no afecten al resultado. En esta ocasión los resultados mostrados en la tabla 8.1, son más favorables logrando clasificar correctamente varios patrones. Nótese que en algunos casos se obtienen resultados muy similares al realizar la medida, lo que dificulta diferenciar correctamente un patrón de otro (caso del patrón 5), véase figuras 8.5, 8.6, 8.7. Patrón 1 2 3 4 5 total aciertos 1 0 1 1 1 0 60% 2 0 1 1 1 1 80% 3 0 1 1 1 0 60% 4 1 1 1 1 0 60% 5 0 0 0 0 0 0% 6 1 1 1 1 1 100% Cuadro 8.1: Resultados de los 5 experimentos sobre los nuevos patrones. 2entiendase por patrón la curva obtenida como referencia, y se demuestra que al hacer varios experimentos el resultado se ajusta a los patrones de referencia 60
Figura 8.5: Se observa que los patrones 5 y 6 son muy similares, por tanto realiza una clasificación errónea Figura 8.6: Se observa que en este caso clasifica correctamente con el patrón correcto 61
Figura 8.7: Se observa que la bioimpedancia medida pertenece al patrón 3 con µ= 0,72, aunque se encuentra entre el 3 y el 4 8.3. Adquisición rápida de datos y correcta clasificación Para terminar se ha realizado un experimento para mejorar la velocidad de adquisición de datos, para lo que se han tomado las siguientes medidas: disminuir el número de puntos de 44 a 20 valores de frecuencia disminuir el rango de frecuencia leído, de 32kHz a 20KHz de frecuencia máxima disminuir el número de muestras para cada frecuencia, de 320 a 68 Con estos cambios se consigue disminuir el tiempo entre experimentos. De 30 segundos por experimento se ha pasado a 8 segundos clasificando correctamente la bioimpedancia. En las figuras 8.8 y 8.9 por ejemplo, se clasifica correctamente entre dos casos, tocar o no tocar un jarrón de cristal con agua, usando este nuevo método más rápido. En la Figura 8.10 se observa claramente la distribución en torno a un patrón u otro de los 5 experimentos realizados y en en la tabla 8.2 se encuentran los resultados. La conclusión de este capítulo es que la bioimpedancia varía mucho en un pequeño rango y depende de factores experimentales difíciles de medir y de mantener constantes. Con todo, si se realizan suficientes experimentos 62
Figura 8.8: Se observa que la bioimpedancia medida pertenece al patrón 1 (no tocar) con grado de pertenencia µ= 0,81. Figura 8.9: Se observa que la bioimpedancia medida pertenece al patrón 2 (tocar cristal) con grado de pertenencia µ= 0,89. 63
Figura 8.10: Se observa que la bioimpedancia medida se distribuye en torno a dos patrones. Patrón 1 2 3 4 5 total aciertos Sin tocar 1 1 1 1 1 100% Tocar cristal 1 1 1 1 1 100 % Cuadro 8.2: Resultados de los 5 experimentos sobre los dos patrones. se ajusta a unos patrones fijos y comunes, lo que permite clasificarla correctamente y diferenciar entre tocar agua, agarrar cristal, tocar un dedo, etc. 64
Capítulo 9 Conclusiones Una vez realizados los experimentos y comprobados los resultados, se concluye que la plataforma Arduino es apta para la adquisición de datos a bajo coste con una precisión aceptable (10 bits de resolución), pero con limitaciones como la frecuencia de reloj máxima (de 16MHz), la baja memoria interna y la existencia de un único convertidor analógico-digital, que además es lento en comparación con cualquier tarjeta de adquisición de datos, lo que limita el rango de frecuencias alcanzable y el rango de impedancias que se pueden clasificar. Una solución a estos problema es añadir un circuito de acondicionamien- to de señal, que coloque la impedancia en el rango de lectura, limitando la intensidad que se le aporta. Algo tan simple como una resistencia variable, permitiría observar un mayor rango de capacidades. Se ha comprobado también la gran versatilidad que añade un clasificador basado en Lógica Borrosa al problema de clasificación de impedancias que nos atañe, lo sencillo que es de implementar y cómo trabaja cuando existe incertidumbre entre los distintos patrones. Durante la realización del proyecto nos hemos encontrado con una serie de dificultades que se han ido solucionando o corrigiendo en mayor o menor medida, las más acusadas son las correspondientes a la plataforma Arduino por las limitaciones técnicas comentadas anteriormente. A pesar del simple circuito que se ha usado en estos experimentos, el circuito de acondicionamiento de señal afecta en parte a los resultados obtenidos, por tanto es un detalle importante a la hora de realizar los experimentos, en proyectos futuros sería importante reducir el impacto del circuito de acondicionamiento al mínimo, ya que afectará esa configuración a experimentos posteriores. Es necesario resaltar la dificultad de una correcta comunicación entre Arduino y Matlab que impide poder procesar los datos en tiempo real desde 65
Matlab, y obliga a recoger primero todos los datos, debido a que el sistema de comunicación no está optimizado como ocurriría con una tarjeta de adquisición de datos y su correspondiente software. Finalmente, como se ha comentado en capítulos anteriores, las condiciones del experimento afectan mucho al resultado al medir la bioimpedancia, es difícil volver a repetir un experimento en las mismas condiciones. En un futuro sería muy recomendable solucionar los problemas de acondicionamiento de señal y diseñar una sonda correcta para mejorar las condiciones al realizar los experimentos y obtener resultados que se ajusten a la realidad. Además de las mejoras de circuito sería muy interesante realizar todo el procesamiento en la plataforma Arduino (quizás utilizando otro método de clasificación con menos requerimiento computacional, como por ejemplo el Análisis de Componentes Principales (P CA)), evitando así problemas de comunicación y convirtiendo el clasificador en una plataforma portátil. Por último comentar que este proyecto se comenzó con la intención de aplicar esa clasificación al campo de la domótica (por ejemplo activar algún elemento de un sistema domótico al diferenciar entre distintos gestos, o materiales), por tanto queda como idea futura implementar algún método de conexión de la plataforma Arduino con alguna interfaz domótica y actuar sobre ella mediante acciones dependientes de la bioimpedancia. 66
Apéndices 67
C=256*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } if (F>250 && F<=500) { TCCR2B = _BV(WGM22) | _BV(CS22) | _BV(CS20) ; //PS=128 C=128*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } if (F>500 && F<=1000) { TCCR2B = _BV(WGM22) | _BV(CS22) ; //PS=64 C=64*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; 74
vx= analogRead(A0); } if (F>1000 && F<=2500) { TCCR2B = _BV(WGM22) | _BV(CS21) | _BV(CS20) ; //PS=32 C=32*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } if (F>2500 && F<=4000) { ADCSRA &= ~PS_128; // elimina el bit puesto por la libreria Arduino // seleccionamos uno de los de arriba // PS_16, PS_32, PS_64 or PS_128 ADCSRA |= PS_64; // set our own prescaler to 64 TCCR2B = _BV(WGM22) | _BV(CS21) | _BV(CS20) ; //PS=32 C=32*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } 75
if (F>4000 && F<=5000) { TCCR2B = _BV(WGM22) | _BV(CS21) ; //PS=8 C=8*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } if (F>5000 && F<=8000) { ADCSRA &= ~PS_64; // PS_16, PS_32, PS_64 or PS_128 ADCSRA |= PS_32; // set our own prescaler to 32 TCCR2B = _BV(WGM22) | _BV(CS21) ; //PS=8 C=8*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } 76
if (F>8000 && F<=18000) { ADCSRA &= ~PS_32; // PS_16, PS_32, PS_64 or PS_128 ADCSRA |= PS_16; // set our own prescaler to 16 TCCR2B = _BV(WGM22) | _BV(CS21) ; //PS=8 C=8*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } if (F>18000 && F<=25000) { TCCR2B = _BV(WGM22) | _BV(CS21) ; //PS=8 C=8*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } 77
if (F>25000 && F<=32000) { TCCR2B = _BV(WGM22) | _BV(CS21) ; //PS=8 C=8*F*2; B=(16000000/C); A=B-1; D=A/2; OCR2A = A; OCR2B = D; vx= analogRead(A0); } analogRead(A5); for( int i=0;i<=N;i++) //bucle for de lectura { vin[i]= analogRead(A5); //leo la señal de entrada por el pin analógico A5 //la almaceno en el vector de daos que envio //por el puerto serie } delay(100); /////////****************************//////////////// analogRead(A0); 78
analogRead(A4); for( int i=0;i<=N;i++) //bucle for de lectura { vout[i]= analogRead(A4); //leo la señal de entrada por el pin analógico A4 } //apaga PWMgen TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); TCCR2B = _BV(WGM22) ; delay(100); for (int i=0; i <= N; i++) //bucle de escritura, //envia por puerto serie una linea con el //valor "i" de cada vector separado por "," { Serial.print(F); Serial.print(","); Serial.print(vin[i]); Serial.print(","); Serial.println(vout[i]); } } delay(100); } 79
80
Apéndice D Código Matlab comentado %%primero introducimos los datos del experimento clear all clc close(’all’) format long g %abrir archivos de texto [archivo,ruta]=uigetfile(’*.txt’,’ABRIR ARCHIVO’); if archivo==0 return; else fid =fopen([ruta archivo],’r’); A=textscan(fid,’%f,%f,%f’); A=cell2mat(A); fclose(fid); end Fard=A(:,1); %frecuencia a la que exigimos que trabaje vin=A(:,2)*5/1024; %valor de tension que aplicamos vout=A(:,3)*5/1024; %valor de tension que leemos %elimina outliers o errores de lectura z=length(vin); for i=2:(z) if(vin(i)>5 || vin(i)<0) 81
vin(i)=vin(i-1); end if(vout(i)>5 || vout(i)<0) vout(i)=vout(i-1); end end %ahora pasamos al calculo del bode, centrarnos solo en la ganancia %P es la frecuencia tope a la que trabajamos en Hz P=31623; %parámetros de diseño para el correcto calculo del bode R=1000; L1=316; L2=15; Fint=4000; per=0.05; %llama a la funcion diagrama de bode [bode,bode1,s1]=Bode10(Fard,vin,vout,P,R,L1,L2,Fint,per); semilogx(bode(:,1),bode(:,2),’*-’,’LineWidth’,2) axis([200 30000 -26 6]) grid figure() %llama a la funcion clasificador [xp, yp]=clasif(bode1); %fin del programa principal %funciones utilizadas 82
function [bode,bode1,s1] = Bode10(Fard,vin,vout,P,R,L1,L2,Fint,per ) i=1; fcont=200; %frecuencia a la que hacemos el calculo m=1; % P es la frecuencia tope de muestras %j es la frecuencia inicial 10^j j=2.3; %L es un parámetro para variar el numero de datos %que se envian a la funcion FFT, se obtiene mayor %precision con L grandes para baja frecuencia y %L pequeña para baja frecuencia L=L1; while Fard(i)<P if Fard(i)==fcont if fcont>Fint L=L2; end % %rango y datos a usar para esta F %la i indica que estamos dentro del rango para esa frecuencia Fard %la h marca el final del rango para que usemos el mismo rango %que el de la frecuencia elegida iran=i+1; fran=iran+L; s1=vin(iran:fran); s2=vout(iran:fran); %calculo de magnitud en dB %calculamos la ganancia de vin y vout para construir el bode X1=fft(s1); [mag1 b]=max(abs(X1(2:end))); X2=fft(s2); [mag2 c]=max(abs(X2(2:end))); 83