L I C E N C I A T U R A E N I N G E N I E R Í A B I O M ...148.206.53.84/tesiuami/UAMI10611.pdf ·...

27
UNIVERSIDAD AUTÓNOMA METROPOLITANA I Z T A P A L A P A D I V I S I Ó N C I E N C I A S B Á S I C A S E I N G E N I E R Í A L I C E N C I A T U R A E N I N G E N I E R Í A B I O M É D I C A S E M I N A R I O D E P R O Y E C T O S I I P R O Y E C T O U N I D A D D E M O N I T O R E O DOCENTE: DONACIANO JIMENEZ VAZQUEZ. ALUMNOS: AGUILAR MARTINEZ RICARDO. MORALES VILLALOBOS LEOBARDO MEXICO D.F. ABRIL DEL 2000 TRIMESTRE OO-i.

Transcript of L I C E N C I A T U R A E N I N G E N I E R Í A B I O M ...148.206.53.84/tesiuami/UAMI10611.pdf ·...

UNIVERSIDAD AUTÓNOMA METROPOLITANA

I Z T A P A L A P A

D I V I S I Ó N

C I E N C I A S B Á S I C A S E I N G E N I E R Í A

L I C E N C I A T U R A E N I N G E N I E R Í A B I O M É D I C AS E M I N A R I O D E

P R O Y E C T O S I I

P R O Y E C T O

U N I D A D D E

M O N I T O R E O

DOCENTE: DONACIANO JIMENEZ VAZQUEZ.

ALUMNOS:ð AGUILAR MARTINEZ RICARDO.

ð MORALES VILLALOBOS LEOBARDO

MEXICO D.F.

ABRIL DEL 2000 TRIMESTRE OO-i.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

INTRODUCCIÓN

Dentro del desarrollo de los instrumentos y equipo médicos, una área importante de desarrollo se encuentra el monitoreo de las seriales fisiológicas, por lo cual muchos sistemas se encuentran enfocados a obtener avance y mejoría de tales instrumentos.

En el desarrollo de la tecnología, en el mercado, se encuentran sistemas independientes los cuales solo realizan una única función que es el monitoreo, es por el 10 la importancia de realizar un enfoque o aplicar el uso de las computadoras personales, las cuales permitirían realizar otras aplicaciones aparte del monitoreo, así como obtener mejores y de fácil uso, interfaces de usuario o presentación del mismo sistema.

El aplicar computadoras personales en los instrumentos o equipos médicos, es importante saber la necesidad de utilizar los lenguajes de programación para el manejo de la PC; los cuales dentro del mundo de la computación son los conocidos como: Pascual, Turbo C, Borland C, C++ , LabWindows, entre otros. Es por ello que el desarrollo del proyecto se requería la investigación y aplicación de los conocimientos adquiridos sobre todo en programación de computadoras, además de la instrumentación medica electrónica.

En este proyecto, nosotros mostramos una forma "sencilla" para diseñar un instrumento de monitoreo por medio de un PC, el cual se enfoca a utilizar infraestructura encontrada en la Universidad, las seriales fisiológicas las obtenemos de los módulos de adquisición de Nihon Koden, las cuales se acoplan a la PC por medio de una tarjeta de conversión analógico/digital para obtener seriales digitales y estas puedan ser procesadas y presentadas en el monitor de la propia computadora; se realiza la implementación de filtros digitales para obtener el valor de la Frecuencia Cardiaca en tiempo real.

El ambiente en que se presentan estas seriales fisiológicas es Lab Windows. Su implementación es fácil, ya que si nosotros queremos colocar una ventana, un botón de inicio de adquisición o de terminación de aplicación, solo se tiene que elegir este y colocarlo en el programa (archivo.UIR, archivo.H) y mandar el código al programa fuente ( Archivo.C).

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

Objetivo general : Monitoreo de las señales fisiológicas de ECG, pletismografía, en tiempo real

utilizando una tarjeta de conversión A/D y una computadora personal.

Objetivos particulares: Utilizar los módulos de adquisición de Nihon Koden, para poder adquirir las

señales fisiológicas de ECG y pletismografía. Realizar la conversión A/D de las señales fisiológicas por medio de la tarjeta

PGL-812PG. Utilizar un nuevo lenguaje de programación Lab Windows, para presentar las

señales fisiológicas en la pantalla de la computadora. Realizar el procesamiento de las señales adquiridas para mostrar el periodo

cardiaco entre cada complejo QRS.

MARCO CLÍNICO.

Como es conocido el cuerpo humano se encuentra constituido por una serie de sistemas especializados en tareas determinadas para dar un funcionamiento adecuado del cuerpo. Tales sistemas (cardiovascular, digestivo, tegumentario, nervioso, etc.) son importantes por lo que desde tiempo atrás se han desarrollado estudios y análisis de cada uno de ellos, por lo que ha existido la necesidad de crear instrumentos que ayuden en el desarrollo del estudio.

Uno de los sistemas anatómicos que se encuentran mas estudiados es el cardiovascular, cuya función es de transporte de gases respiratorios, sustancias nutricionales, desechos y hormonas; protege contra enfermedades y perdidas de liquido; ayuda a regular la temperatura corporal y el equilibrio acido-basico del cuerpo. Por ello la importancia de estudio y su análisis del sistema.

Uno de los órganos indispensables del sistema circulatorio es el corazón, que actúa como bomba, haciendo posible el movimiento de la sangre dentro de los vasos; es un órgano muscular hueco, con cuatro cámaras (dos aurículas: izquierda y derecha, y dos ventrículos: izquierdo y derecho), encontrado en la parte torácica. La sangre Ilena ambas aurículas, a lIenarse se contraen y se vacían hacia su correspondiente ventrículo, luego realizan lo mismo los ventrículos, pero ahora para impulsar la sangre hacia ya sea la aorta o hacia el tronco pulmonar. (6)

El corazón al estar constituido por fibras musculares, las cuales tienen presentes dos fenómenos fisiológicos: contracción y relajación, tales fenómenos los realiza en forma automática y ordenada. Dado que las fibras musculares están constituidas por células excitables muestran una actividad electroquimica (despolarización y repolarización de las membranas celulares) que es la causante de los fenómenos mencionados, esta cualidad es una característica importante de estudio y análisis del funcionamiento cardiaco. (5)

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

Dada la actividad electroquímica presentada por las células de las fibras musculares y dado que el cuerpo se comporta como conductor, de volumen homogéneo la actividad electroquímica puede detectarse desde el exterior del cuerpo; además se puede considerar que el corazón tiene un comportamiento de un dipolo, es decir, movimiento de polarización desde la vista dos puntos opuestos, lo cual se observa en el registro gráfico de la actividad eléctrica del corazón, Electrocardiograma, las diferencias de potencial generadas por la despolarización y repolarización son las observadas en el trazo:

Figura 1. Muestra las ondas P, T, y el complejo QRS.

Como se observa en la figura 1, la actividad eléctrica normal de un corazón, en el cual muestra la onda P, que representa la despolarización auricular (conducción de las aurículas). El complejo QRS es el registro de la despolarización ventricular, y la onda T es la repolarización ventricular. El segmento corto aplanado entre S y T representa el estado refractario del miocardio ventricular; el que esta entre P y Q des una fase no conductora del no do atrio-ventricular (tiempo refractario entre la despolarización de atrios y ventrículos), durante la cual se puede completar la contracción auricular. Cabe mencionar que la actividad eléctrica le sigue la actividad mecánica, es decir, al realizarce una despolarización provoca una contracción y la repolarización una relajación muscular, por 10 que se da a notar la importancia que presenta el trazo eléctrico que sirve para I predecir la acción mecánica. (4)

Por lo que existe una definición del triángulo compuesto por la proyección del piano frontal del cuerpo (visto el cuerpo como un cubo regular), denominado Triángulo de Einthoven (el cual hace referencia de realizar mediciones bipolares), el cual presenta diferentes proyecciones de la actividad eléctrica del corazón las cuales se presentan gráficamente en la figura 2. (6)

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

En donde se puede apreciar que la proyección D2 es la de mayor amplitud, dado que es la suma vectorial de las proyecciones D1+D3.

En general existen análisis de los trazos electrocardiográficos que determinan si existe o no algún tipo de problemas, como por ejemplo hipertrofia, isquemia, infarto del miocardio, etc.

Por otro lado, otro de los componentes del sistema circulatorio: los vasos sanguíneos, que son los ductos por los cuales se transporta y se irriga la sangre a todo el cuerpo, son también parte de estudio y análisis. Existen dos ramificaciones de ellos: la parte arterial (que transporta la sangre oxigenada, con nutrientes) y la parte venosa (que transporta la sangre con desechos metabólicos del cuerpo), por lo cual un parámetro de interés de estudio es la presión que existe dentro de los vasos (dado que existen referencia sobre algunos valores que pueden deducir algún problema vascular). Es por ello que la medición de la presión ha sido uno de los parámetros de análisis. Existen varios métodos para la medición de la presión sanguínea: utilizando métodos invasivos, y métodos no invasivos; en la actualidad se dan mayor uso las técnicas no invasivas dada su baja o nula agresividad hacia el paciente.

Una de las técnicas de la medición de la presión, es la utilizada por la técnica de medición relativa de la presión, por medio de la medición del pulso. En muchos casos no es necesario medir el valor absoluto de la presión arterial y todo 10 que se requiere es un indicador del flujo sanguíneo a través del cuerpo. (6)

Si el flujo sanguíneo a través del cuerpo disminuyera por alguna razón, por ejemplo aumento de Rc (aumento de resistencia hidráulica), las primeras áreas del cuerpo afectadas por esta disminución serian los dedos en manos y pies, por lo tanto, si se monitorea el flujo sanguíneo normal en estos puntos es de esperase que en el resto del cuerpo se presente igualmente un flujo normal.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

El pulso es consecuencia de la elasticidad arterial. Esta elasticidad en la aorta, es la que le permite aligerar el trabajo del corazón, pues con la contracción del ventrículo la aorta aumenta su diámetro, contrayendoce durante la relajación del ventrículo, con lo cual se impulsa adicionalmente sangre hacia el tronco arterial. La función de la aorta alivia el trabajo del corazón, puesto que la velocidad de la sangre no decrece hasta cero. La onda de pulso que se origina, nos muestra una marcada similitud con la onda de presión:

Figura 3. Muestra la onda de pulso.

A partir de la gráfica del pulso, como se muestra en la figura 3, es posible obtener los siguientes parámetros clínicos: frecuencia cardiaca, regularidad, Intensidad de pulso velocidad de desarrollo.

Uno de los métodos para obtener la serial de pulso, es por medio del método pletismográfico con sensor fotoresistivo o fototransistor, tal método es de uso común en muchas unidades de monitoreo.

El método utiliza una fuente luminosa que radia o atraviesa con luz el tejido corporal. La modulación de la corriente luminosa debida al pulso es recogida por un transductor eléctrico y enviada al registrador:

Los transductores se colocan principalmente en la punta de los dedos de la mano y en el lóbulo del oído. Para no generar ninguna interferencia con la medición, es recomendable impedir la incidencia de luz externa a su interior. Esta sensibilidad a la luz puede reducirse si se emplean fotodetectores en la región del infrarrojo con una longitud de onda cercana a los 800 nm. El detector es recubierto por un filtro óptico que elimina la radiación visible. (4)

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

MARCO TEÓRICO.

Características de la tarjeta PCL-812PG:

Convertidor Analógico/Digital de 12 bits.

16 canales analógicos de entrada.

5 rangos programables por software (t 5, t 2.5, t 1.25, t 0.625, ± 0.3125).

Cuenta con 2 timers internos, con una frecuencia de 2 MHz.

16 canales de salida digitales.

Conversión A/D, es por el método de aproximaciones sucesivas.

Velocidad de conversión es de 30 KHz máximo.

Linealidad de ±1 bit.

Características de la PC.

Computadora con microprocesador 486 con procesador matemático.

Monitor VGA.

Memoria RAM de 16 MBytes.

La velocidad de la microprocesador es de 100 MHz.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

RESULTADOS PRELIMINARES.

La experiencia que nosotros tenemos para la implementación y diseño de nuestro proyecto, es la siguiente:

Colocación de electrodos para las diferentes derivaciones que existen.

Utilización de las módulos Nihon Koden.

Conversión A/D de la tarjeta PCL-812PG.

Lenguaje de alto nivel coma Turbo C, Borland C.

Manejo de Lab-Windows/CVI.

MATERIAL

Electrodos para la adquisición de la serial de ECG.

Transductor de pletismografía.

Módulos de Adquisición de Nihon Koden.

Tarjeta de conversión A/D PCL-812PG.

Una computadora Personal.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

PLAN DE TRABAJO a) Sección General

UNIDAD DE MONITOREO

Figura 4. Diagrama a bloques de la unidad de monitoreo. b) Descripción particular.

La experiencia que se tiene en la colocación de electrodos, de los diferentes tipos de derivaciones como las monopolares ( aVL, aVR, aVF ) , las bipolares ( DI, DII, DIII), las precordiales (V1, V2, V3, V4, V5, V6), son importantes, para nosotros. Para nuestro proyecto solo vamos a utilizar la derivación bipolar, es especial nos interesa la derivación DII, ya que es la de mayor amplitud y además es la suma vectorial de DI + DIII. Esto nos ayuda a poder detectar mejor el complejo QRS en cada latido del corazón y poder obtener un periodo cardiaco mas exacto entre cada latido.

Los módulos de adquisición de Nihon Koden, son de gran importancia para nuestro proyecto, ya que con estos podemos adquirir las señales fisiológicas de ECG, y de la onda de pulso (Pletismografía), que nosotros vamos a monitorizar de nuestro paciente, y para obtener la salida analógica de estas señales.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

Vamos a utilizar la Tarjeta de conversión A/D PCL-812PG, para poder adquirir por dos de sus canales las seriales fisiológicas ya mencionadas, y convertirlas de seriales analógicas a seriales digitales, y de esta forma poder procesarlas y presentarlas en la pantalla de la Computadora Personal.

El lenguaje de alto nivel que nosotros vamos a utilizar es el compilador de Turbo G, y/o el compilador de Borland C, para poder hacer los algoritmos que detecten el complejo QRS, en cada latido del corazón. Otra de la ventaja de utilizar estos compiladores es que son compatibles con el software de Lab-Windows.

El procesamiento que le vamos a dar a la serial, que obtenemos de la tarjeta es el siguiente:

Vamos a pasar la serial por una serie de filtros ( implementados por software ).

Primero va a pasar la serial por un filtro pasa bajas, luego por un filtro pasa altas, después por un derivador, luego la elevamos al cuadrado, y por ultimo la pasaremos por un integrador, todo este proceso es para eliminar las demás componentes de la serial y solo quedarnos con el complejo QRS.

INFRAESTRUCTURA.

La infraestructura que utilizamos para este proyecto es la siguiente:

/ Electrodos para la adquisición de la serial de ECG. / Transductor de pletismografía. / Módulos de Adquisición de Nihon Koden. / Tarjeta de conversión A/D PGL-812PG. / Lenguajes de alto nivel (Turbo G, Borland G, Lab Windows) / Una computadora Personal.

Todo el material, los dispositivos, el software y el equipo de computo fue prestado por el laboratorio de docencia de Ingeniería Biomédica.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

JUSTIFICACIÓN.

Escogimos este proyecto, porque nos pareció importante aplicar los conocimientos que adquirimos durante nuestra formación universitaria, y además es un proyecto que se encuentra relacionado con la carrera de Ingeniería Biomédica. Por esta razón decidimos implementar una unidad de monitoreo y hacer la conversión A I D de dos seriales fisiológicas: la del electrocardiograma y la onda de pulso (pletismografía ), por un método no invasivo, para esto se tuvo que realizar la interface entre la PC y los módulos de adquisición Nihon Koden, para desplegar estas seriales en el monitor de la PC, para poder presentarse bajo el ambiente de LabWindows.

La idea principal era darle uso a las PC. 486 con procesador matemático que prácticamente son de deshecho en la mayoría de los hospitales y que puedan ser usadas como unidades de monitoreo con sus respectivas limitaciones.

ALGORITMOS.

Adquisición de la tarjeta PCL-812PG. Desplegar las seriales fisiológicas en la PC. Filtro pasa bajas. Filtro pasa altas. Filtro derivador. Filtro integrador.

DISPOSITIVOS.

Simulador de paciente Nevada Inc. ™

AMBIENTES.

Ambiente MS-DOS. Ambiente Turbo C. Ambiente Windows 3.1. Ambiente Lab Windows.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

RESULTADOS.

◊ Se realizaron pruebas en modo MSDOS, que permitió comprobar el funcionamiento de la tarjeta de adquisición. A continuación se muestran algunos resultados obtenidos:

Figura 4. Pantalla que se obtiene en MSDOS con una frecuencia de muestreo de 250 Hz con una frecuencia cardiaca del simulador de ECG de 60 lat/min.

Figura 5. Pantalla que se obtiene en MSDOS con una frecuencia de muestreo de 500 Hz, con una frecuencia cardiaca del simulador de ECG de 60 lat/min.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

◊ Se realizo 1a adquisición del ECG (por medio de un simulador Nevada Inc. ™) y la

adquisición simultanea de la señal de pulso (utilizando el modulo de pletismografía de Nihon Koden TM).

◊ Se aplicaron cuatro filtros definidos en el inicio del proyecto, utilizados para la detección de la frecuencia cardiaca, se tuvo el problema de no obtener un valor real.

◊ Se utilizaron diferentes frecuencias de muestreo, y la presentación en la pantalla fue de 1000 puntos (0 muestras), a continuación se muestran los resultados obtenidos en la interface gráfica que construyo en Lab Windows.

Figura 6. Pantalla que se obtiene en Lab-Windows, con una frecuencia de muestreo de 1 KHz, con una frecuencia cardiaca del simulador de ECG de 60 lat/min.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

NOTA: Los algoritmos utilizados para la adquisición de la serial tanto en MSDOS y LabWindows se encuentran dentro del Apéndice A.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

DISCUSIÓN.

Uno de los problemas encontrados durante el desarrollo del proyecto fue la dependencia total del ambiente de trabajo (Windows 3.1™, y Lab Windows, el cual era la presentación del ambiente del proyecto), dado que el tiempo de la realización del despliegue al monitor era relativamente lento, lo cual implica una lentitud en el procesamiento al aplicarse el filtrado de la serial, además es por ello la perdida de información en la adquisición, pudiéndose pensar en el error encontrado en la frecuencia cardiaca, cosa que era mínima en MSDOS.

Puede mostrarse que la adquisición de la serial, mostraba ruido en forma de picos, lo cual pueda deducir que influía en el cálculo de la frecuencia, dado que los filtros realizan la detección de cada complejo QRS, es decir, el ruido de la señal influía en el valor de los complejos detectados durante un tiempo determinado.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

☺ CONCLUSIONES.

La mayoría de los objetivos se cumplieron, excepto el obtener bajo procesamiento de la señal el valor de la frecuencia cardiaca en tiempo real.

La adquisición de la señal se realizó en intervalos pequeños de 130

muestras, pero cuando realizaba el procesamiento y calculo de la frecuencia cardiaca, el equipo de computo realizaba la operación en un tiempo largo, lo cual influía en el valor de la frecuencia y de la adquisición.

En general el sistema funciona, con la limitante de no mostrar el valor

correcto de la frecuencia cardiaca real. Pero se puede encontrar un mejor algoritmo de procesamiento, lo cual

permitiría al sistema ser optimo y poderse desarrollar en el monitoreo y medición de muchas más variables fisiológicas, dado que la tarjeta permite la adquisición de hasta 12 canales analógicos.

El ambiente de presentación utilizado fue amigable y facilitaba la

implementación de la programación necesaria para el sistema.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

BIBLIOGRAFíA. Manual de usuario de la tarjeta PCL-812PG Manual de usuario de LabWindows/CVI. National Semiconductor. Tomo # 1.

IEEE Transaction on biomedical Ingineering. Vol 32, No.3, March 1985. Paginas ( 230-235 ).

Principles of Appiled Biomedical Instrumentation 3" edición. L.A. Geddes, L.E. Baker. Editorial Wiley Interscience, 1989 USA. Paginas ( 693-708, 124-139).

Transducer for biomedical measurements principles and application. Richard S.C. Cobbold. 1976. Cap.10.

Teoria y problemas de Anatomía y Fisiología Humanas. Kent M. Van de Graaff, R. Ward Rhees. Editorial Interamericana Mc Graw Hill, 1990. Cap. 14.

UUUNNNIIIDDDAAADDD DDDEEE MMMOOONNNIIITTTOOORRREEEOOO

IIINNNGGGEEENNNIIIEEERRRÍÍÍAAA BBBIIIOOOMMMÉÉÉDDDIIICCCAAA

1

/**************************************************************************/ /* */ /* PROGRAMA PARA PROBAR LA TARJETA PCL 812 */ /* EN MODO MS-DOS */ /* */ /* */ /**************************************************************************/ #include <graphics. h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <time.h> #include <dos. h>

#define base Ox300 #define valor_max 4095

int MSB=16; unsigned char CANAL=O; void iniciaadq(int canal); void ini_tarjeta (void); int adquiere(void); void ini_mod_graf (void); void grafica(int ,int, int*, int, int ); int main (void){ int x = 0, i, xmax, ymax,valor; ini_targeta (); ini_mod_graf (); xmax=getmaxx(); ymax=getmaxy(); do{ for(i=1 ;i<=2;i++ ) { iniciaadq(i); MSB=adquiere(); grafica(MSB,i, &x,xmax, ymax);} } while(!kbhit()); setcolor (WHITE); restorecrtmode(); I* restablece el modo de video */ return (); } void iniciaadq(int canal) { outportb(base+10,canal); outportb(base+9,0); outportb(base+11,6); }

2

int adquiere(void) { int nolisto,MSB,LS8,Dato; do { nolisto=inportb(base+5); nolisto=nolisto&0x10;} while (nolisto); MSB=inportb(base+5); LS8=inportb(base+4 ); Dato=(MS8«8)ILS8; return(Dato); } void ini_tarjeta (void){ outportb (base+3, 0x74); /* Inicializacion de los timers */ outportb (base+1, 0x14); /* Divide/10, T1, parte baja */ outportb (base+1. 0x0); /* Parte alta, T1 */ outportb (base+3. 0xB4); /* T2 */ outportb (base+2, 0xC8); /* Divide 1200, T2, parte baja */ outportb (base+2, 0x0); /* Parte alta de T2*/ } void ini_mod_graf (void){ int gdriver = DETECT, gmode, errorcode; /* se pide autodeteccion */ initgraph(&gdriver, &gmode, “”); /* inicializa el modo grafico */ errorcode = graphresult(); /* lee el resultado de la inicializacion */ if ( errorcode != grOk) /* a ocurrido un error */ { printf(',\n\n\n\n\nError grafico : %s\n", grapherrormsg(errorcode)); printf("\n\t Pulsa cualquier tecla para terminar."); getch(); exit(1 ); /* regresa con codigo de error */ } } void grafica(int valor_leido,int var, int* x, int xmax, int ymax){ if(*x == xmax + 1){ /*LLEGO FIN DE PANTALLA*/ cleardevice(); *x = 0; } valor_leido = ymax * (1 –valor_leido*1.0/valor_max); //TRANSFORMACION A PANT. if (var==1 ) putpixel(*x. valor_leido-50, BLUE); else putpixel(*x, valor_leido+ 100, BLUE ); (*x)++; }

3

/* MONITO.C */

#include <utility.h> #include <userint.h> #include "monito.h" #defjne base 0x300 static int panelHandle; int i,indice; double datos[1000], datos1 [1000]; void main () { panelHandle = LoadPanel (0, "monito.uir", PANEL); DisplayPanel (paneIHandle); RunUserlnterface (); } int Adquirir (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int num=0,j,i,cont=O; double val; int n=0,ap,ap1; double y_pb[33]; int i_pb = 0, b_pb = 0; double y_pa[33]; int i_pa = 0, b_pa = 0; double y_d[5]; int i_d = 0, b_d = 0; long double cuadrado[75], punto_a_grafjcar = 99; int i_c = 0, b_c = 0; indice=0; switch (event) { case EVENT_COMMIT: ini-tarjeta (); j=1; ap1 =0; do{ ap=0; iniciaadq(j); do{ num=adquiere(); datos[ ap ]=num*2.5/1000,0-5.0; datos1 [ap1]=datos[ap]; /*pasa_bajas(y_pb, b_pb,&i_pb); pasa_altas(y_pb, y_pa, &b_pa, &b_d, &i_pa); derivador(y_pa, y_d, cuadrado, &b_d, &i_d, &i_c, &b_c, i_pa); integrador(cuadrado, &punto_a_graficar, i_c, b_c); */

4

if (indice == 13) { indice=0; b_pb=1; } indice++; ap++; ap1++; }while(ap<1000); if (b_c==1 ){ if ((punto_a_graficar/7500)>0.666) cont++; } if(ap1>=999) { ap1 =0; if (j==1 ){ PlotStripChart (paneIHandle, PANEL_GRAPH, datos1, 999, 0, 0, VAL_DOUBLE); j=2; } else{ PlotStripChart (paneIHandle, PANEL_GRAPH2, datos1, 999, 0, 0, VAL_DOUBLE); j=1; } } /* fin de if */ }while ( !KeyHit ()); break; case EVENT_RIGHT_CLICK: break; } return 0; } int Shutdown (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserlnterface (0); break; case EVENT_RIGHT_CLICK: break; } return 0; } void iniciaadq(int canal) { outp(base+10, canal); outp(base+9,0x3); outp(base+11,2); }

5

int adquiere(void) { int nolisto,Dato; int MSB,LSB; do { MSB=inp(base +5); LSB=inp(base +4); }while(MSB&0x10 ); MSB&=0x0f; LSB&=OxOff; Dato=(MSB<<8)|LSB; return(Dato); } void ini_tarjeta (void){ outp (base+3, 0x74}; /* Inicializacion de los timers */ outp (base+1 , 0x20); /* Divide /10, T1, parte baja */ outp (base+1 , 0x0); /* Parte alta, T1 */ outp (base+3, 0x74 }; /* T2 */ outp (base+2, 0x1f); /* Divide /200, T2, parte baja */ outp (base+2, 0x0); /* Parte alta de T2 */ }

6

/* FILTROS.C */ #define NN 30 extern int indice; extern double datos[1000]; int f(int, int, int); /******************************************************************************************************/ void pasa_bajas(double y[33], int b_pb, int* ind){ int n, m; (*ind)++; if( (*ind) == 33){ *ind = 0; } m = indice-1; n = *ind -1 ; switch(b_pb ){ case 0: /*no han sido mas de 12 datos */ if(n==0) y[n] = datos[n]; if(n==1 ) y[n] = 2 * y[n-1] + datos[n]; if( (n>1 ) && (n<=5) ) y[n] = 2 * y[n-1] -y[n-2] + datos[n]; if( (n>=6) && (n<=11 ) ) y[n] = 2 * y[n-1] -y[n-2] + datos[n] -2*datos[n-6]; break; case 1: /*mayor o igual a 12 datos */ if(n == -1 ) n = 32; if(m == -1) m = 12; y[n] = 2 * y[f( n , 1,32)] -y[f( n, 2,32)] + datos[m] -2*datos[f( m 16, 12)]+ datos[ f( m , 12, 12) ]; break; } } /*************************************************************************************************/ void pasa_altas(double datos[33], double y[33], int* b_pa, int* b_d, int *indice){ int n; (*indice)++; if( (*indice) == 33){ *indice = 0; *b-pa = 1;

7

} n = *indice-1; switch(*b_pa ){ case 0: /*no han sido mas de 32 datos */ if(n==O) y[n] = -datos[n]; if(n >=1 ) && (n<=15)) y[n] = -y[n-1] -datos[n]; if(n >=16 ) && (n<=31 )) y[n] = 32*datos[n-16] -( y[n-1] + datos[n] ); break; case 1 : /*mayor o igual a 32 datos, indice >= 33 */ if(n < 0) n = 32; y[n] = 32 * datos[ f(n. 16.32) ] -( y[ f(n. 1. 32) ] + datos[ n ] -datos[ f(n. 32. 32) ] ); break; } } /*******************************************************************************************/ void derivador(double datos[33], double y[5], long double cuadrado[NN], int* b_d. int* indice. int* i_c, int* b_c, int i_pa){ int n, m, p; m = i_pa -1 ; if(m < 0) m=32; (*indice)++; (*i_c)++; if( (*indice) == 5){ *indice = 0; *b_d = 1; } if( (*i_c) == NN ){ *i_c = 0; *b_c= 1; } n = *indice -1 ; p= *i c-1; if(p==17) p=p; if(p < 0) p = NN-1; switch(*b_d){ case 0: /*no han sido mas de 4 datos */ if(n==O) y[n] = datos[m]/8; if((n >=1 ) && (n<=2)) y[n] = (2*datos[f(m,1,32)]+ datos[m])/8; if( (n == 3 )) y[n] = (-2 * datos[ f(m, 3,32) ] + 2 * datos[ f(m, 1, 32) ] +datos[ m ])/8; cuadrado[p] = (long double) (y[n]*y[n]); break; case 1 : /*mayor o igual a 4 datos, indice >= 33 */ if(n < 0) n = 4;

8

y[n] = ( -datos[ f( m, 4, 32) ] -2 * datos[ f( m, 3, 32) ] + 2 * datos[ f( m, 1,32) ] + datos[ m ] )/8; cuadrado[p] = (long double) (y[n]*y[n]*1.0); break; } } /********************************************************************************************/ void integrador(long double cuadrado[NN], long double* salida, int i-c, int b-c){ int N = NN, i; int n= i_c –1; if(n < 0) n = NN-1; switch(b_c){ case 0: break; case 1 :(*salida) = 0; for(i = NN-1; i >= 0; i--) (*salida) = (*salida)+cuadrado[f(n, i, NN-1 )]; (*salida) /= N*1, 0; break; } } /*****************************************************************************************/ int f(int n,int i, int max){ int j; /*condicio n >= 0 */ for(j = 0;j < i;j++ ){ n--; if(n == -1 ) n = max' } return n; }

9

/**************************************************************************************/ /* LabWindowslCVI User Interface Resource (UIR) Include File */ /* Copyright (c) National Instruments 2000. All Rights Reserved. */ /* */ /* WARNING: Do not add to, delete from, or otherwise modify the contents */ /* of this include file. */ /* */ /* MONITO.H */ /* */ /**************************************************************************************/

I* Panels and Controls: *1 #define PANEL 1 #define PANEL-QUIT 2 /* callback function: Shutdown */ #define PANEL-AdquiereECG 3 /* callback function: Adquirir */ #define PANEL-NUMERIC 4 #define PANEL-GRAPH 5 #define PANEL-GRAPH2 6 I* Menu Bars, Menus, and Menu Items: */ I* (no menu bars in the resource file) */ I* Callback Prototypes: */ int Adquirir(int panel, int control, int event, void *callbackData, int eventData1, int eventData2); int Shutdown(int panel, int control, int event, void *callbackData, int eventData1, int eventData2); void iniciaadq(int canal); void ini_tarjeta (void); int adquiere(void); void pasa_bajas( double*, int, int*); void pasa_altas(double*, double*, int*, int*, int*); void derivador(double*, double*, long double*, int*, int*, int*, int*, int); void integrador(long double* .long double*, int , int );