universidad autonoma metropolitana …148.206.53.84/tesiuami/uam1603.pdf · universidad autonoma...
TRANSCRIPT
UNIVERSIDAD AUTONOMA METROPOLITANA
UNIDAD IZTAPALAPA
CIENCIAS BASICAS E INGENIERIA
LICENCIATURA EN INGENIERIA EN ELECTRONICA EN COMPUTACION
TRABAJO RECEPCIONAL PARA OBTENER EL TITULO DE LICENCIATURA
TURCIOS ERNESTO PATRACA MALDONADO
8922651
INDICE GENERAL
INTRODUCCION
CAPITULO I
1.1 RI, A\;\ZPI,IFICAIDOR OPER \CION;IL
DEFINICION.
;II’I,IC.-\CIONES
CAPITULO I1
2.1 AILIPLIFICL\DOR DIFERENCLIL
2.1.1 FACTOR DE RECHAZO COAIUN
2.1.2 EL ;\NPLIFICLIDOR DE 1NSTRUMENT;ICION
2.2 FILTROS
0 PAS;\ ALT;\S.
0 RECI-I;IZ;I BAWDL\.
0 PASri SAJ_lS.
2.3 S I S T E ~ PAR\ L ~ \ O B T E N C I ~ N DE SEÑ~ILES BIOELECTRICAS
1
3
7
8
10
11
CAPITULO I11
3.1 2QUÉ ES UK.\ FUENTE L\ISI,ADA\?
3.2 FUENTE ;\ISLAIDA
ANEXOS
APENDICE A
16
APENDICE B
CONCLUCIONES
BIOGRAFÍA
73
74
75
El mundo médico ha avanzado en los últimos 20 anos de una manera vertigniosa, ya que se ha valido de los
grandes avances en la técnica para crear una medicina moderna 1- no traumitica.
Ciertamente la electronic2 y la instrumentación han jugado un papel clave para crear equipos que hagail que
el ser humano tcnga una calidad de vida superior.
Por medio de este reporte queremos mostrar como se puede disenar un equipo médico para el diagnótico, por
medio de una instrumentación sencilla pero eficaz.
CAPITULO 1
EL AMPLIFICADOR OPERACIONAL.
1.1 EL AMPLIFICADOR OPERACIONAL (OAP)
EL ;iOP es un amplificador de CC multietapa con entrada diferencial, cuya caracteristicas se aproximan a las de
un amplificador ideal.
XPJJCXCIONES DE LOS XOI'
De modo general, podemos decir que sus aplicaciones están presentes en los sistemas electónicos de control
industrial, en la instrumentación nuclear, en la instrumentación médica (electromedicina o 13oeIectronica), en los
ordenadores analogcos y en los equipos de audio y telecomunicaciones.
1.2 MODOS DE CONFIGURACI~N.
Rasicamentc el ;\OP trabaja de tres formas:
;i) SIN R E TR OALIMENTA CIÓN
Denominada tambien configuración a lazo abierto, la ganancia del ;iOP viene determinada por el fabricante,. Se
utiliza en los circuitos comparadores como se muestra en la figura 1.2.1
B) CON REALIMENTACION POSITIVA.
Este tipo de configuración se denomina en lazo cerrado y tiene el inconveniente de desestabilizar el circuito. La
aphcaclón de estos circuitos se dan en los osciladores, como se mucstra en la figura 1.2.2
C ) CONRETROALIMENTACION NEGATIVA(RN)
\‘ease que la salida estb aplicada a la entrada inversora del _iOP a través de Rf, las aplicaciones que podemos hacer
con esta configuración so11 las siguientes:
m Aimplificador no inversor.
m ;implificador inversor.
Sumador.
,-\mplificador diferencial.
Diferenciador.
Integrador.
Filtros activos.
De las configuraciones antes mencionadas vamos a tomar con atención particular en los filtros activos,
amplificador diferencial J’ amplificador inversor J’ no inversor.
UNIVERSIDAD AUTONOMA METROPOLITANA
UNIDAD IZTAPALAPA
PROYECTO DE INGENIERIA ELECTRONICA I1
'SISTEMA PARA LA O B T E N C I ~ N DE SEÑALES BIOELÉCTRICAS"
ASESOR:
VICTOR HUGO TELLEZ ARRIETA.
! I
I .
FABIAN CUBILLA MENDEZ. ,p I .{
/y FRANCISCOJA WER CR UZ ANGEL.
. / í PATRACAMALDONADO TURCIOSERNESTO
Con estas aplicaciones vamos a hacer un sistema para l a obtención de señales bioelectricas por lo cual vamos a
profutldizar en dichas configuraciones.
CAPITULO I1
CONFIGURACIONES UTILIZADAS PARA LA OBTENCION DE SENALES
BIOELECTRICAS.
2.1 AMPLIFICADOR DIFERENCIAL.
Este circuito permite obtener en la salida una tension igual a la diferencia de las señales de entrada. E s un
amplificador con numerosas aplicaciones en el irea de instrumentación. Veamos en la figura 2.1.
2.1.1 FACTOR DE RECHAZO ENMODO COMUN(CMRR)
La figura 2.2. muestra el principio que acabamos de mencionar:
2.1.2 EL AMPLIFICADOR DE INSTR UMENTA CIÓN
El amplificador de instrumentación debe presentar las siguientes caracteristicas:
a) Resistencia de entrada muy alta.
b) Resistencia de salida baja.
c) CMRR superior a los 100 dB.
d) Ganancia de lazo abierto alta.
e) Baja tensión de OFFSET de entrada
El amplificador de instrumentación Que utilizamos en nuestro proyecto es el siguiente:
r'amoa a mostrar las técnicas que utihzamos para eliminar cl ruido (60 Hz) y la tensión de OFFSET.
a) T E N S I ~ N D E OFFSET
La tensión de OFFSET es un voltaje que se suma a la seiial de salida del amplificador operacional, utilizando una
configuración como la que se muestra en la figura 2.3. podemos evitar la tensión de offset.
b) RUIDO
Llamamos ruido a las señales eléctricas indeseables que pueden aparecer en las terminales de cualquier dispositivo
electronico. Motores electricos, h e a s de transmisión, descargas atmosfericas, radiaciones electromagneticas, etc.
Un metodo práctico para atenuar los efectos de los ruidos en los circuitos electrónicos, conciste en enviar a tierra
dichos circuitos, así como los equipos involucrados. También podemos dar una buena protección utilizando
capacitores entre tierra y l a terminal de alimentación. La figura 2.4.
2.2.FILTROS.
Para saber los rangos que vamos a uulizar y l a señal que deseamos obtener, para la experimentación tomamos la
señal de electrocardiografia.
a) Rango de frecuencia 0.05 Hz a los 100 Hz
11) Rango de selial 10 microvolts a 5 mv.
Para este fin se utilizó una serie de filtros puestos en cascada para solo filtrar la s e h l deseada J- eliminar
componentes de alta frecuencia y ruido que pudiera filtrarse.
a) FIL TR O PASA AL TAS.
b) FILTRO RECHAZA BANDA
C) FIL TR O PASA BAJAS.
2.3 SISTEMA PARA LA OBTENCI~N DE SEÑALES BIOELECTRICAS.
Ya que tenemos todo lo anterior podemos integrarlo todo junto con lo cual obtendremos un sistema para obtener
seiiales de electrocardiografia.
Su diagrama a bloques es el siguiente:
t 1 I 1 PACIENTE 1 I
I i """."_ll. lll.l......
7- 7
I ~ lll_...".."-.. ! AMPLIFICADOR i I
1""-
! FILTROS I 1111"" 1" ..:
i
Con estas herramientas ya casi tenemos el sistema para la obtención de señales, falta solo donde se va a desplegar
dichas seiiales para lo cual utilizamos un equipo P.C. por medio de la tarjeta de evaluación del 68HCll hacemos
una conversion analogca - distal, enviando por la norma RS-232 enviamos al puerto serial de l a miquina, para
que por medio de un programa en lenguaje C, podamos dar un facil manejo y manipulación a la seiial que estamos
obteniendo, almacenaldola en disco duro para su posterior estudio y/o anilisis.
CAPITULO I11
LA FUENTE AISLADA
3.1 ¿QUÉ ES U N A FUENTE AISLADA?.
Una fuente es lo que le da energa a un sistema, para hacerlo funcionar. En el caso de los equipos biornedicos las
fuentes deben tener unos requerimientos especiales para mantener al paciente seguro y a salvo de cualquier
accidente. En los proxirnos puntos se descrilirin el dernrrollo de nuestr:l fuente aislada asi como los criterios de
diseno que utilizamos.
3.2 FUENTE PRINCIPAL.
La fuente principal presentó un reto ya que necesitabamos una fuente que fuera de un arnperaje alto para
alimentar a la parte de aislamiento y a su vez que estuviera regulada para esto utlizamos un dispositivo electrónico:
LM317. Con el cual logramos los requerimientos de la siguiente etapa.
Utilizamos una configuración de alta corriente dicha aplicación la podemos ver en el apendice R.
3.3 FUENTE AISLADA.
Para la parte de aislamiento utilizamos al LA1555 como generador principal de nuestra fuente; la cual oscilaba a
una frecuencia de 50 Khz, esto con el fin de dar una seguridad al paciente, tambien en esta etapa hay un
transformador que es la parte principal de nuestro diseiio ya que esta proporciona la seguridad total al paciente,
debido a los campos magneticos que generan las corrientes inductivas que dan energm a la siguiente etapa.
ANEXOS
APENDICE A.
Este programa realiza la comunicación serial con un equipo P.C. Para este fin utilizamos lenguaje de
programación C, algunas rutinas se uuliz:m para establecer la comunicación y almacenar los datos.
/" archivos de encabezamiento */
#include <stdio.h>
#include <stdlib.h>
#include <bios.h>
#include (conio.h>
#include <dos.h>
#include <graphics.h>
#include <tnarh.h>
#include < time.h>
#include <stddef.h>
#include <timeb.h>
/* variables globales '/
char PUERTO;
char TRINS;
typedef struct Nodo
{
int sis; /* presición sistelica */
int dias; /* presición diastelica I/
int med; /* presición media */
int frec; /" pulsaciones por minuto y /
int dur; /* tiempo entre pulso y pulso "/
struct Nodo 'ant; /* apuntador al nodo anterior */
struct Nodo *sig; apuntador al nodo siguiente ::-/
} nodo;
typedef nodo Ypnodo /*define el tipo nodo como p o d o '/
typedef struct Escala
float nl;
float 112;
float 113;
float 111;
float n5;
} csc;
/* guarda el valor de la escala de l a Ira. gráfica , G /
/* guarda el valor de la escala de la 2da. gráfica y /
/ ' guarda el valor de la escala de la 3ra. grifica /
/ y guarda el val01 de la escala dc la I t a . gráfica ' /
/* guarda el valor de la escala de la .5ta, grifica x /
typedef esc +escala; define el tipo esc como escala * /
typedef struct Lim
i
int sl; int s2;
int dl; int d2;
int ml; int m2;
int El; int f2;
int tl; int t2;
} lim;
typedef lim *lunite;
union REGS ent,sal;
int status;
int auxhar;
/* prototipo */
pnodo CreaNodo(void);
void Inserta@nodo 'Nodlet);
void BorraNodo@nodo *Nobict);
void inicia_graficos(void);
void presentacion(void);
void menu(void);
void Protocolo(void);
vod Tnipuerto(void);
void finapres(void);
void checksum(void);
void modo-trans(void);
void format-dato(void);
void mandar-datos(void);
void inicia(void);
void fin(void);
void escribe(char);
char recibe(void);
char recibe1 (int *);
char edo-puerto(void);
void comunicar(void);
void Error(int,int);
int Error2(vold);
int Inter(int*,int*,int,int);
void Intervalos(limite *Lt,escala "Ese);
double iniy(int);
void Eje(int);
void PinEjesPmite *);
void Pitlta(int,int,int,int,float,int);
void DespGraf(int *,pnodo,escala);
void DespNum(pnod0,int *, int cont);
void Desplicga(int *, int *, pnodo *, int, escala x , char);
void RecA\rch(char *);
void Nomlrch(F1LE I, char *);
void Salva(pnodo ,*IniLista, pnodo ‘:-NodAct);
int AdqDat@nodo T o d - i c t , pnodo FInLista, escala *Ex, limite
k t RecDat(pnodo “SodAct, pnodo *InLista, escala ‘Esc, limite ”1.t);
void DespIlat @nodo “Nodlct, pnodo ’InLista, escala ’Esc, Lmlte ‘Lt);
/ pide memoria al sistema del tamaño del nodo, e inicializas elementos a nulos * /
pnodo CreaNodo(void)
I
pnodo temp;
tempO@nodo) malloc (sizeof(struct Nodo));
if (temp == NULL) /* No tiene memoria el sistema J’ sale del programa */
{
puts(“No hap memoria disponible...”) ;
esit(1);
I
temp ->dias=O; /*Existe memoria, entonces inicializa variables */
temp ->sis=O;
temp ->med=O;
temp ->frec=O;
temp ->dur=O;
temp ->sig=NULL;
temp ->ant=NULL;
return(temp);
1
/*recibe un nodo nuevo y lo inserta a la lista ligada,colocando el nuevo nodo al inicio de la l ista“/
void Inserta@nodo “Nod-ict);
{
if (‘Nodlct==NULL)
TNodAct = New;
else
/’Elimina el nodo de la lista */
void BorraNodo( p o d o *Nod;\ct)
I
p o d o temp=*Nod-ict;
if (’Nodlct!=NULL)
I
if ((*No&lct)->ant!=NULL)
{
(*NocLlct)=(*Nod;ict->ant;
(“Nod-ict)->sig->ant=NULL;
(”Nod-\ct)->sig=NULL;
/* La l i s t a no tiene elementos */
/‘:- New es el primer nodo de l a lista */
/* La lista tiene al me1los u11 elemento y /
/‘ La l i s ta tiene al menos un elemento * /
/* La lista tiene mas de un elemento * /
free(temp);
1
1
/ * Inicia graficos
void micia_graficos(void)
int controlador,modo;
controlador=DETECI ;
initgraph(&controlador,&modo,”C:/tc/BGI”);
1
void Tap(void)
t
clearview porto;
setfillstyle(SOL1D-FILL,WHlTE);
bar(O,O,getrnaxso,getmaxl\.o);
setfillstyle(SOLID-FILL,LIGHTCYL~N);
bar(getma~x~/lO,getmax~~/lO,getmaxs~-getmaxs~/lO, getmaxy@getmaxyo/lO);
setcolor(LIG1-ITBLUE);
setlinestyle(SOL1D-LINE,l ,THICK-\VIDTH);
rectangle(getmaxso/lO,getmaxy0/10,getmaxxo-getma~xo/lO, getmaxl\.o-getmasl\.o/lO);
setcolorQ3LUE);
setlinestyle(SOL1D-LINE,l ,THICK-\‘C?DTH);
rectangle(getmasx~/lO,getmaxy~/lO,getmasx~-getmass~/lO,getmaxy~-getmax~~/~~~);
setcolor(LIGHll3LUE);
settextstyle(S;INS-SERIF-FONT,HORIZ-DIR,2);
void presentacion(void);
I setfillstyle(l,LIGTI-IGR\\’)?;
bar(0,0,650,650);
setcolor(l3LUE);
setteststyle(l,HORIZ-DIR,2);
outtestx!-(2,2,”1_!NIT’ERSID;\D .WlONO;\L-\ METKOPOLIT.\N;\”);
sleep(1);
outtexts~-(l00,~O,”PRO~‘ECTO DE Ih-GENIERI;\ ELECTRONICA\ 11”);
sleep(1);
setcolor(BL;\CK);
outtestx~(100,1jO,”SISTE~L-\ P;\R;I L;i OBTENCION DE SE%\LES BIOEL,ECTRICA-Is”);
sleep(1);
outtestsy(l00,300,”INTEGR-\NTES”);
setcolor(l3LUE);
setteststyle(l,HORI%-DIR,2);
outtestxy(350,300,”CUBILL\ AIENDEZ F;IBIAN”);
outtestxy(3j0,400,”CRUZ &INGEL FRUXCISCO J;I\’IER’);
outtes~y(350,400,”P;ITK_-\C;i AL-\LDON;IDO TURCIOS ER_\ESTO”);
1
void menu(void)
I setfillstyle(SOL1D-FILL,BLUE);
bar(0,0,650,50);
setcolor(l5);
setteststl\.le(l,HORIZ-DIR,2);
outtestxy(l75,O,”~IE~U PRINCIP_\L”);
setfillstl\-le(SOLID_FILL,15);
bar(O,50,650,650);
setfillstyle(SOL1D-FILL,GKEEN);
bar(25,50,600,90);
setcolor(BLUE);
settextstyle (1,HORIZ_DIR,2);
outtextsy(70,50,”1 .-ADQUIRIR.”);
t~ar(2~,140,600,180);
outtestxy(70,140,”2.-RECL‘PER~R DEL DISCO.”);
bar(25,230,600,270);
outtexts!7(70,230,”3.-S~~L~’;\R.”);
bar(25,320,600,360);
outtestxy(70,320,”4.-D~SPLEG~~R.”);
bar(25,410,600,450);
outtextxy(70,410,”j.-S;II,IR”);
outtextsy(370,41O,”Su selección-”);
1
/* Pregunta el tipo de inicialización Que le vamos a dar al puerto de la miquina y /
/ y asigna los valores a las variables trans J’ puerto ’/
void Protocolo(void);
char opcion;
cleardeviceo;
Tapo;
o~ttext?cy(200,getma~y~/2-15O,”TIPO D E INICI;1LI%_1CION”);
outtests~(20O,getmas~O/2-100,”1 .-Alanual”);
outtextxp(2O0,getmax~O/2-~O,”2.-;\utomatic~”);
do í
outtestsy(20O,getmasyO/2+150,“Su selección-”);
opcion =getchO;
I f (opcion i=l && opcion !=2)
Error(lfiO,petmax!.0-2j);
} while (opcion ;=I && opcion i=2);
if (opcion==l)
{
PUERTO=puertoO-48;
TR;\NS=;LlanualO;
1
else {
PL?ERTO=O;
TR;INS=Os8;I;
1
void Inipuerto(void)
í
ent.h.ah=O;
ent.s.ds=PUERTO;
ent.h.al=TR;INS;
int86(0~14,&ent,&sal);
1
void finapres(void)
c
char dato;
dato=OslR;
escribe(dat0);
dato=”!”;
escribe(dat0);
dato=OsOD;
escribc(dat0);
}
void checksurn(void)
{
char dato;
dato=”D”;
escribe(dato);
void modo-trans(void)
{
char dato;
iniciao;
dato=”X”;
escribe(dat0);
void format-dato(void)
char dato;
iniciao;
&to=“Q”;
escribe(dat0);
fino;
I
void mandar-datos(void);
I
char dato;
inicia();
dato=”\”’;
escribe(dato);
fino;
1
void inicia (void)
I
char dato;
dato=OslB;
dato=”C”;
escribe(dat0);
dato=”N”;
escribe(dat0);
1
void fin(void)
1
char dato;
dato=”c”;
escribe(dat0);
dato=OsOD;
escribe(dat0);
1
char edo-puerto(void)
{
ent.h.ah=3;
ent.x &=PUERTO;
int86(0~14,&ent,&sal);
return(sal.h.ah);
1
void escribe(char dato)
i
ent.h.ah=l;
ent.h.al=dato;
ent.x.dx=PUERTO;
mt86(0xl4,&ent,&sal);
1
char leer(void)
{
ent.h.ah=2;
ent.s.dx=PUERTO;
int86(0~14,&ellt,&sal);
/* T’erifica si hay dato listo en el puerto f /
/* Dato listo en el puerto para enviarlo */
/* Dato listo en el puerto para leerlo */
return(sa1.h.d)
1
char recibe1 (int *ban2)
c unsigned i=0;
char dato1 =”;
i=O;
do {
i++;
if (i> 10000)
{
setfillstyle(SOLID~FILL,l~);
setcolor(GREEN);
outtex~~(getmassO-8~,getmax~O-45,”EN EST“\DO”);
outtextx~(getmaxsO-85,getmaxyO-35,”DE ESPERI”);
?ban2=1;
1
ent.h.ah=3;
ent.x.dx=PUERTO;
int86(0~14,&ent,&sal);
status=sal.h.ah Pr 0x01;
i€ (status)
{
ent.h.ah=2;
ent.x.dx=PUERTO;
int86(0~14,&ent,&sal);
datol=sal.h.al;
1
}while (dato==”);
return(dato1);
1
char recibe(void)
{
char datal=";
do {
ent.h.a11=3;
ent.r.ds=PLiERT@;
int86(0x14,Frent,&sal);
dato1 =sal.h.al;
}while (datal==");
return(dato1);
1
/* Inicializa el puerto y envia los comandos para inicializar ai finapres ’/
void comunicar(void)
{
int val;
Inipuertoo;
val=edo_puertoO;
if (val Fr 0x20)
{
finapreso;
recibeo;
checksumo;
reclbeo;
modo-trans();
recibe();
format-dato();
reclbeo;
mandar-datoso;
}
void Error(int S , int y)
i
outtests!.(x,v,”Error la opcion 110 es valida, Reintente”);
delay(500);
setfills~le(SOLID_FII,L,~~~HITE);
bar(O,getmax~0-30,getma~~O-jO,getmaxy0);
}
int Error2(void);
{
kt banzl ;
Tapo;
outtextxy(l50,getmasy0/3,”No fue posible abrir uno o mas archivos”);
outtexts!-(ljO,getmaxy0/2,”Pulse una tecla para continuar”);
getcho;
return @an);
char l’ipDesp(void);
i
char option=";
Tap o ; outtests!-(200,getmas~0/2-100,”TIPO DE DESPLIEGUE”);
outtextx~(200,getmaxy0/2-j0,”1.- Despliegue Grifico”);
outtexts!.(200,getmas!-0/2,”Despliegue Xuménco”);
do {
outtextsy(2O0,getmass~/2+~O,”Su selección:-”);
opcion=getchO;
if (opcion !=1 && opcion !=2)
Error(200,getmasyO-Zj);
while (opcion !=1 && opcion !=2);
clearviewporto;
return(opcion);
}
char DurDesp(void)
i
char option=";
Tapo;
outtextxy(200,getmasyO/2-lOO,”DESPLIEGUE”);
outtext?iy(200,getmaxyO/2-~0,”1. Por 5 minutos”);
outtext?iy(20O,getn~as~O/2,”2. Continuo”);
do {
outtestxy(200, getrnasy0/2+5O, ”Su selección:”);
opcion=getch();
if (opcion!=‘l’&& opcion!=’2’)
Error(ljO,getmaxr()-25);
}while(opcion!=‘l’) && opcion!=’2’);
clearviewport();
return opcion;
1
double iniy(int numgraf)
{
double Iy;
double s,in;
s=getmasyO~(1.18-numgrafy(0.19666));
in=modf(x,&ly);
return Iy;
I
int Inter(int *pin¡, int 4pfin, int S , int y)
{char cadi[80], cadf[80];
regster int ban=O;
1nt ¡,I1 =O,12=0;
char aus;
int j=-1;
do {
outtestxp(s,p,”inicial:”);
aux=getchO;
j++;
if(am!=’r’)
cadiu]=aus;
cadiU+l]=‘sO’;
outtestsy(s+lOO,y,cadi);
}~.llile(aus!=‘r‘);
sus= ’ ’;
jZ-1.
outtestg).(gy+2O,”~nal”);
do i
aux=getchO;
j++;
if(aus!= ’r’)
cadf[j+I]=/’xO’;
outtestxy(x+lOO,y+20,cad~ ;
}wlde(aux!=’r’);
ll=atoi(cadi) ; 12=atoi(cada;
if01 >=O && 11 4 2 && 12<=4OO)
{ *yini=lI; ,ryfin=12;
11 =12-11;
ban=¡;
1
else {
Error(20O,getmaxy0-2j);
setfillstyle(SOLID-f;ILL,LIGTHCY~~N);
bar(x+lOO,y-5,x+200,y+42);
I
int Inter2(int *+ni, int yfin, int y, int S)
{ char cadil801, cadfl801;
regster int ban=O;
int i,ll=O,l2=0;
char aux;
int iZ-1;
do {
outtes~y(s,y,”inicial:”);
do{
aux=getchO;
j++;
if(aus!= ’r’)
cadib]=aus;
cadi[]+l]=’sO’;
outtestsy(s+lOO,y,cadi);
}while (aux!=”/r”);
jx.1.
aux=””;
out tes~y(x,y+2O,”f~al”) ;
do{
aus=getchO;
j++;
if(aux!=”/r”)
cadf[j]=aus;
cadf[j+l]=”/xO”;
outtestsy(x+lOO,y+ZO,cadf);
)wllilw(aux!=”/r”);
11 =atoi(cadi);lZ=atoi(cadf);
if(l1 >=o && 11 4 2 && 12<=2000)
{ *yini=lI; ‘yfin=12;
11 = m 1 ;
ban=l;
}else j~rror(2OO,getmaxxyO~2j;
setfillstyle(SOLID-FILL,LIGHTCY;\K);
bar(x+lOO,y-5,x+200,y+42);
j=-l;}
)while@an==O );
return 11:
1
void Intervalos(hite ”Lt, escala *Ex)
{char option="";
f loat h,div;
int yini, yfin;
h=iniy(l)-iniy(2);
clearviewport();
Tapo;
Outtestxy(200,getmaxx0/2-1~O,”ESC;IL~IS”);
Outextsy(2OO,getrnaxxO/2-100,”1. O-IjO”);
Outextx-y(200,getmaxxO/2-50,”2. 0-300”);
Outte?(ts~(2OO,petmassO/2,”3. ;\Ianual”);
Do{outtestxy(petma~sO/Z+SO,”Su selección:”);
Opcion=getchO;
If (opc1on!=”1” && opcion!=”2” && opcio11!=”3 ‘9
Error(lSO,getrnasss0-25);
)wh~le(opcion!=”l” && opcion!=”2” &&opcion!=”3” );
if (opcion==”l”)
{ (’Esc)->nl=h/l50;
(“I .t)->sl =o;
(Lt)->s2=150;
(~Esc)->n2=h/150; (‘I,t)->ml=O; yLt)->m2-150;
(vEsc)->n3=h/150; (”Lt)->dl=O; (‘Lt)->d2=150;
(’Esc)->n4=h/120; (“‘Lt)->fl=O; (‘Lt)->f2=1%;
(“Esc)->115=h/1000; (*Lt)->tl=O; (VLt)->t2=1000;
1 if (opcion==”2”)
{
(IEsc)->nI=h/300; (*Lt)->sl=O; yLt)->~2=300;
(”Esc)->n2=h/300; (+Lt)->ml=O; (*Lt)->rn2=300;
(rEsc)->n3=11/300; (“Lt)->dl=O; (.‘Lt)->d2=300;
(*Esc)->n4=h/170; (*Lt)->fl=40; (’Lt)->f2=210;
(pEsc)->n5=h/2000; (*Lt)->tl=O; (’I,t)->t2=2000;
1 if(opcion==”3”)
{Tapo;
outextx~(l00,getmaxp0/2-180,”Para establecer intervalos...”);
outtestx~(lOO,getmasO/2-15O,”Presio~l Sistolica”);
div=h/Inter(&~~ini,&yfin,3OO,getmaxJ-0/2-150);
outtextxy(l00,gctmas0/2+50,”Tiernpo entre pulsos”);
dirr=h/Inter2(&pini, &!-fin, 300, getmaxy0/2+50);
(*Esc)->nS=div;
(*Lt)-tl=yini; (*Lt)->t2=yfm;
I
I
void (Ejc(int num)
{ char cad[l0];
setfillstyle(SOL1D-FILL; BLUE);
bar(l50, iniy(num)-getmaxJo*0.9/5,500,iniy(num));
I
void PinEjes(limite “Lt)
{ int i,p,h,d;
int nus;
char cad [l O];
l l = ( ~ o ~ ~ ~ l e ) ( i ~ ~ i ~ ( l ) - ~ i ~ ( 2 ) ;
d=(float)gl/O.s/j’getrnasyG));
setfillstyle(SOLID-FILL,l5);
lx~r(O,O,getmaxxO, getmaxyo);
for(i=O;i<5;i++)
{ Eje(l+l); I
setcolor(GREE);
settextstyle(O,HORIZ-DIR,O);
y=iniy(5);
itoa((*Lt)->tl, cad,lO); outtestxy(505,y-5”d, cad);
itoa((“Lt)-t2, cad, 10); outtextxy(505,y-h+10yd,cad);
outtextxy(54O,~~h+lO~d,”(mseg)”);
y=iniy(4);
itoa((*Lt)->fl, cad,l0); outtextxy(505,y-5’Kd, cad);
itoa((*Lt)-f2, cad, 10); outtests~(50~,y-h+lO~d,cad);
outtextxy(535,y-h+lO*d,”(Lat/rnin)”);
y=iniy(3);
¡toa((*Lt)->ml, cad,l0); outtextsy(505,y-5’d, cad);
itoa((*Lt)-m2, cad, 10); outtextx!.(50~,y-h+lO*d,cad);
outtests~-(530,y-h+lO*d,”(1nmHg)”);
y = ¡ni! (2) ;
¡toa(( vLt)->dl, cad,l0); outtestxy(505,yj’d, cad);
1toa((~I,t)-d2, cad, 10); outtestsy(S05,y~h+lO‘d,cad);
outtestsy(S30,~.-1~+1 Ovd,”(mrnHg)”);
y=iniy(l);
itoa((*Lt)->sl, cad,10); outtextsy(S05,y-5~d, cad);
itoa((*Lt)-s2, cad, 10); outtextsy(505,J~-h+lO*d,cad);
o~ttestsy(530,y-h+10~~d,”(rnmHg)”);
settextstyle(0,T7ERT-DIR,0);
y=¡niy(G);
outtestxy(l30,y+30,”T. Entre”); outtextxy(l.10,y+30,”pulsos”);
y=iniy (S);
outtestxy(130,y+30,”Frec.”); outtestsy(l40,J-+30,”Card”);
y=iniy(4);
outtextsy(l30,y+30,”Presion.”); outtextsy(l40,y+30,”~Iedia”);
y=iniy(2);
outtests!.(l30,y+20,”Presion.”); outtests~(l4O,y+2O,”Sist.”);
setcolor(GKEEn);
settextstyle(O,HORIZ-DIR,O);
outtestsy(20,20,”Nurn de muestra”);
setcolor(WH1TE);
setteststl\-le(O,E-IORIZ_DIII,O);
i.
void Pinta (int d l , int d2, int a, int b, float escala, m t i )
I
char muestra [lo];
bouble punto;
double x, in;
int y, h;
int dat = O;
dat = dl;
x (float)(dl*escala);
in = modf(s,&punto);
d l = (doub1e)punto;
x = (float)(d2*escala);
in=modf(x,&punto);
d2=(double) punto;
y=(double)iniy ( i );
s=getmaxy()'0.9/5;
in = modf(s,&punto);
h=(double)punto;
se~~ie~vport(l50,~-1~,500,~,1);
line(a-150,h-dl, hd2);
se~~iewport(O,@,getmassO,getmas!.O,0);
setfillstyle(SOL1D-F1LL;GKEEN);
bar(5.50, y-20, 600, y);
itoad(dat, muestra, 10);
settextstyle(@, HORIZ-DIR,O);
setcolor(GREEX);
1
T'oid DespGraf(int"rn,pnodo Noc;\ct, escala Esc)
{
int a, b, i;
int y;
int T1, T2;
a=*m;
b=*m
1;
i= 1;
setcolor (GREEN);
Pinta(ruodlct.>ant>sis,Nod~lct>sis, a, b, Esc->nl, i);
i++;
Pinta(ruod~ct->ant->dias, No&-ict->dias,a, b, Esc->n2,i);
i++;
Pinta(T\Todict->ant->med, NodAct->med, a,b, Esc->nS,i);
1++;
Pinta~od-\ct->ant->frec, Nod\ct->frec, a, b , Esc->n?-,i);
i++;
Pinta(n’od-\ct->ailt->dur, Nodict->dur, a, 11, Esc->n5,i);
If((‘m)==jOO)
{
+ m = 150;
i-
(m‘)=(+’mn)+l;
void DespNum@nodo K o d - k t , int *j, int cont)
I
int a, b, c, d;
char aux[4];
if((“j)> = getmasyo-50)
{
(*j )=loo;
Tap O; setteststyle (0, HORIZ-DIR,O);
outtextxy(70,70, “Lluestra PSistélica P. Diastélica P
AIedia Pulso”);
Outtestxy(-iO,getrnaxyO-25,”Para sal ir presione tecla”);
setcolor ( LIGHTBLUE);
a=cont;
itoa(a, aux, 10);
outtestxy(l15, ‘j,aux);
itoa(Nod-\ct->sis, aux, 10);
outtestsy(19.5, ’j, aus);
itoa(Xodict->dias, aux, 10);
outtests!-!.?l(I,’j,Rus);
itoa(KocLk->med, aux, 10);
outtestx~(43O,*j,aus);
itoa(bjod-\ct->frec, aus,10);
outtextsy(510;’j,aus);
j=j+lO;
1
void Despliega (int*j, int *m, p o d o ”Nodact, int cont, escala *Esc. char tip)
c int y;
settestxstyle (0,WORIZ-DIR,O);
if(tip==’l’)
r DespGraf( m, *NodAct, *Esc);
(j+) getmaxyo-50;
1 if(tip==’2’)
c DespNum(*Nodict, J, cont);
int Adqllat k m d o TniLista, pmdo 'Nod.\ct, escala 'Esc, limite It)
í
char datl = ' ', dat2=' ', tpo= ' ', min = ";
int inter, j, m=, cont = ;
unsqped int i = O;
int yfin, yini, in, cond;
char tip ' ', car = ' ';
float escala;
long int Tar = O;
regster int ban= O;
regster int banl=O;
k t ban2 = O;
char alml[3], alm2[3], alm3[3], alm4[3], au[5];
int taj O;
j =getmasyo-;
if((vInLista)!=NULL)
{
do
I
Tapo;
DorraNodo (XodAct);
{ wvhile((’Nod;ict)~<sig! = NCLL);
BorraSodo(Kodact);
NodAct = NULL;IniT,ista=Kjull;
1 if(opci0n ==’S’) 11a11=1;
if((opci0n!=’s’)&&(opci011!=’n’))
Error( ,400);
}while(( opcion! = ‘s’)8c&_(opcion!=’tl’));
if(“IniLista==NULL)
I
clearviewport();
cleardeviceo;
setcolor( WHITE);
clearvieqorto;
tip=TipdespO;
tpo=DurDespo;
if(tip==’l’)
t Intervalos(Lt,Esc);
PinEjes(Lt);
else ’rapo;
setcolor(GKEEr\;);
InicRelO;
Opcion_Prog_TarjetaO;II/ 1
Cambia T‘ec O;
\Y.hile@anl =O)
i
do
1
datl=reclbel(&ban2);
}wldc(datl!=’N?);
Tar=Tiernpo(cont, ban2, taj);
Setfillstyle(SOLID-FILL,15);
Bar(getmaxx0-YO, getmasyo-50, getmaxxO,getmaxy0);
do
I
else
(“Nod-\ct)->dur=Tar;
if(cont>l)
Despliega(&j, &m, Nodic t , cont, ese, tip);
If(m==50O)
clearviewport();
PinEjes(Lt);
1 if((tpo==’l’&&min==’\s5’) I I (tpo==ili&&kbl-Lito ))
ban lz l ;
if(tpo==’2’ sisi kbhito)
ban lz l ;
min=EscRalO;
setfillstyle(S0LID-FILL,BLUE);
bar(30, 30, 60, 50);
itoa(cont, aux, 10);
setcolor(GREEN);
ottextxy( 35, 40, aux);
cont++;
I
if(dat2==’2’)
I
setcolor(GREEh-);
outtestsy( 5, 300, “_\UT0 ;IIUSTE”);
ban2=1;
I
if(dat2==’3’)
I
setcolor(GREEh-);
outtextxy(l0, 320, “FIK“\PKESS”);
outtextxy(l0, 330, “DESH;1RILIT;\Do”);
ban2= 1 ;
I
I
Res-\‘ec-IntO;
Getcho;
I
return ban;
1
void Nom arch(F1LE *ok, char, “nombre)
t
do
i
banI=l;
outtestsy(200, getmasyO+lOO, “salvar como: ‘3;
do
{
aus=getch0;
i++;
if(aux!=’\r’)
nom\,re[ij=aus;
nombre[i+l]=’\xO’;
outtextxy(lO0,200, nombre);
}while(mx!=’\r’);
opcion=nombre[O;
if((isdigt(opcion)) 1 I
{
Error(50,400); ban1
}
}while@anl==0);
(strlen(nombre)>S))
=O:
if((ok=fopen(nolnbre,”rt”))!= NULL)
{
do
ban3=l;
outtestsy(l00,200,”E1 archivo ya esiste.”Sobreescribir?S/N”);
opcion=getchO;
opcion=tolower(opcion);
if(opcion==’s’)
{
fclose(ok);
l1an2=0;
1
i€(opcion==’n’)
{
ban2=1;
}
else
1
else ban2=1;
}while@an2==0);
void Salva@nodo *InLista, pnodo *Sod;ict)
3
FILE okl,ok2,*ok3,*ok4,*ok5;
char nombre 11401, nombre2[40], nombre3[40], nombre4[40], nombre5[40], option=' ‘;
char cad [SO], fto[50], b;
int yini, yfin;
if((“IniLista)!=NULL,)
t
TapO;outtextxp(l50,getmaxy0/2-15O,”Nombre para los archvos”);
tomirch(ok1, nombrel);
strcpy(nombre2,nombrel);
strcpy(nombre5, nombrel);
strcat(nombrel,”.sis”); strcat(nornbre2,”.dis”);
strcat(nombre3, “.med”); strcat(nombre4, “.frc”);
strcat(notnbre5, “pul”);
‘Nod”lct= *JniLlsta;
if((okl=fopen(nombrel, “wt”))!=KULL
i
if((ok2=fopen(nombre2,”wt”))!= NJLL)
i
i€((ok3=fope11(nombre3,”wt”))!=MJLL~
1f((ok4=fopen(nombre4,”wt”))!=NULL)
{
if((oki=fopen(nombre5,”wt”))!=NULI,)
{
do
{
itoa((WocL”lct)->sis, cad, 10);
spritltf(fto,”%s/n”, cad);
fputs(fto, okl);
itoa((.‘Nodlct)->dias, cad, 10);
sprintf(fto,”% s/n”,cad);
fputs(fto,ok2);
itoa((*NocLkt)->med, cad, 10);
sprintf(fto,”%s/n”, cad);
fputs(ft0, ok3);
itoa((‘Nodiict)->frec, cad, 10);
sprintf(fto,”%s/n”, cad);
fputs(fto, ok4);
itoa((*Nod-~ct)->dur,cad, 10);
sprintf(ft0, “%s/n”, cad);
fputs(fto, ok5);
BorraNodo(ru’odict);
:while((‘nddr~ct)->sig!=NULL);
BorraNodo(Kod\ct);
IniLista=~\;ULL;~odict=NULL;
Fclose(ok5);
>
else Error20;
fclose(ok4);
ele Error20;
fclose(ok3);
1 else Error20;
fclose(ok2);
1 else Errodo;
fclose(ok1);
1 else Error20;
i
else
{Tapo;
outtextxy(200, getmaxy0/3,”ru‘o hay información disponible”);
outtextxy(200, getmasy0/2,”Pulse una tecla para continuar...”);
bgetcho;}}
void DespDat(pnodo*IniT,ista, p o d o *Nodlct, escala * E x , limite *Lt)
{
chat tip=”,b;
int inter,j, m=150, cont=l;
int yini, yfin;
char aux[5];
j=getmaxy0-50;
Nod;ict = InLista;
IfyNod;ict!=NULL)
setcolor(WH1TE);
tip=TipDespO;
i€(tip==’l’)
{
Intervalos(Lt, Esc);
PinEjes(Lt);
}
Pu’od,lct=(No~lct)->sig;
do i
if(m==500) PinEjes(Lt);
Despliega(&j, &m, Nodlc t , cont, Esc, tip);
bar(30, 30, 60,50);
itoa(cont, aux, 10);
setcolor(BLUE);
outtexty(35, 40, aux);
cont++;
if(cont==5000) contE0;
NodL\ct=(KodAct)->sig;
}while((*Nodict)->sig!= NULL);
Wod\ct= NULL;
settextstl.le(0, HORIZ-DIR,O);
b=getcho;
f
else}
-rapo;
outtestxy(l50, getmaxy0/2-100, ‘‘KO hay datos disponibles”);
outtestxy(l50, getmaxJo/2, “Cargue desde disco o adquiera”);
outtextsy(l50, getmasy0/2+100, “Pulse una tecla para continuar...”);
b=getcho;
void Rec;\rch(char* nombre)
{ char aus;
int i=-l;
do {
aus getcho;
i++;
if(aus!=’\r’)
nombre[i]=a~~x;
nombre[i+l]’\x0’;
outtextxp(100,200, nombre);
}while(aux!=’\r’);
1
int RedDatbnodo *InLista, pnodo ’Nod.\ct, escala “Esc, Limite “Lt)
1
FILE *okl, *0k2, ”0k3, *ok4, rok5;
char nombre1 [40], nombre2[40], nombre3[4@], notnbre4[40], nombre5[40];
char cad[jO];
1nt vac;
char cond=’ ’, aux[S], option=' ‘, tip=’ ‘;
int yini, yfin, inter, j, m=liO, cont = 1;
int banl=O, ban2=0;
int p;
char b;
j=getmaxyO-SO;
if((*IniLista)!=NJLL)
{
do {
Tapo;
outtestxy(150, getmaxy0/2,”Desea salvar la adquisición actual? S/N”);
opcion=getchO;
opcion=tolower(opcion);
if(opcion==’n’)
{
::‘Nod;ict= “InLista;
do {
BorraNodo(Nod1ct);
}while((*Xod\ct)->sig!=NULL);
BorraNodo(Nod1ct);
*InLista=NULI,; “Nod-\ct=NULL;
1
if(opcion==’s’) t,anl=l;
if((opcion!=’s’)&&(opcion!=’n’))
Error(50,400);
}while ((opcion!=’s’)&&(opcion!=’n’));
1
if((%Lista)==NULL)
1
’rapo;
outtestsy(100, getmaxy0/2-150, “Kornbre de los archivos a cargar:”);
Rec-\rch(nombrel);
strcpy(nombre2, nombrel); strcpp(nornbre3, nombrel);
strcpy(nornbre4, nombrel); strcpy( nombre5, nombrel);
strcat(nomnbre1, “.sis”); strcat(nombre2, “.dis”);
strcat(nombre3,”.med”); strcat(nombre4, “.frc”);
strcat(nombre5, “.pul”);
if((ok1 =fopen (nombrel. “rt”))! = XULL) {
if((ok2~fopen (nombre2. “rt”))! = XULL) {
if((ok3zfopen (nombre3. “rt”))! = NULL) {
if((ok4=fopen (nombre4. “rt”))! = NULL) {
if((okS=fopen (nombre5. “It”))! = NULL) {
do {
Inserta(Nod1ct);
if(((Wodict)->sig==lWLL)&&((NocLlct)->ant==NULL))
?InLista = ‘:.Nodlct
fgets(cad, 10, okl);
vac=atoi(cad);
(Wodict)->sis=vac;
fgets(cad, 10, ok2);
vac=atoi(cad);
(*Nobkt)->dias=vac;
fgets(cad, 10, ok3);
vac=atoi(cad);
(*Nodlct)->med=vac;
fgets(cad, 10, ok4);
vac=atoi(cad);
(*Nob-ict)->frcc=vac;
fgets(cad, 10, okj);
rac=atoi(cad);
(~Non~ct)->dur=vac;
} ~ ~ h i l e ( f e 0 f ( o k l ) & & ! f e o f ( o k 2 ) & & ! f e o f ( o k 3 ) & & ! f ~ 0 ~ ( 0 k ~ ) ~ ~ ~ ~ ~ ~ ~ ( ~ ~ ~ ) ) ;
*Xobict=NULL;
fclose(ok5);
1 else ban2=Lh~or20;
fclose(ok4);
}
else ban2=Error20;
fclose(ok3);
I
else ban2=Error20;
fclose(ok2);
1 else ban=Error20;
fclose(ok1);
1 else ban2=Error20;
if@an2==0)
(setcolor(WH1TE);
tip=TipDespO;
if(tip==’l’)
{
Intervalos(Lt, Esc);
PinEjes(Lt);
}
Nod\ct=*I11lLista;
~od~~c t=( : ’Nod~~c t )>s ig ;
do{ if(m==500)1-’inIjes~t);
Dcsp!icSl(&j,&m,Nod~ct, cont, Esc, tip);
::‘~od-ict=(*~oodlct)->sig:
bar(30,30,60,50);
itoa(cont, itus, 10);
setco!or(BLUFi);
outtexts!.(3S,lO,aus;
cont++;
delay(l00);
}while(~Nodict)->sig!=NLJLL);
Wod;ict=NUI,L;
b g e t c h o ;
1
return banl;
1
void Libera@nodo %¡Lista, pnodo *Nod\ct)
if(*InLista!=NULL)
c ::‘Nodlct=*InLista;
doc
BorraNodo(Nod-\ct);
}while((*~odict)->sig!=i\jULL);
BorraNodo(Nodict);
*IniI,ista= NULL; *Nod-\ct= SULL;
1 void main (void)
c
pnodo Nodict=NULI,, InLista=NULL;
escala Esc=NULI,; limite Lt= NULL,
int drive, mode;
int ban=0;
char option=' ‘;
Inicia-gráficoso;
Presentaciono;
Esc= rnalloc( sizeof(esc));
Lt = malloc(sizeof(esc));
Protocolo();
outtestxy(370,410, “Su selecci&-”);
opcion=getchO;
if(opcion!=’l’&&opcion!=’2’&&opciot~!=’3’8c8ropcion!=’~’&&opcio~~!=’.~’)
Error(50, getmaxyo-25);
}wh~le(opcion!=’l’&&opcion!~”2’&&~’3’&&opcion!~’1‘8cBopcion!~’~’&&opcion!=’ ’);
switch(opcion)
{
case ‘ l ’ : b a n = i \ d q D a t ( & I n L i s t a , & ~ o ~ ~ c t l c t , & E s ;
break;
case ‘2’:ban=RecDat(&Iniist~,&~o~~ct,&Esc,&Lt);
break;
case ‘3’:Salva(&InLista,&Nod-ict);
break;
case ‘4‘:DespDat(&InLista,&Kodict,&Esc,&Lt);
break;
case ‘5’:Libera(&IniT,ista,~No~-~ct);
opcion=’q’;
break;
1 if(ban==l)
I
Salva(&InlLista,&r\iod;\ct);
Ban=O;
1
}a;hile(opcioll!=’q’);
if( Esc!=NULL) {
freejEsc);
Esc=XULL;
1 if(Lt!=NULT>)
{
freept);
I,t=NULL;
1 closegrapho;}
APENDICE B.
HIGH-CURRENT ADJUSTABLE REGULATOR
CONCLUSIONES
El reporte anterior fue hecho con la intensión de dar una guía para el diseno de sistemas de registro de
senales bioeléctricas, si Ben en cierto que ya existen sistemas que realizan este tipo de funciones, lo que
intentamos dar es una solución barata y una herramienta de uso sencillo, teniendo a la vez los rninimos
requerimientos para la persona que lleva acabo la investigación. Es por este motivo que el sistema es de
hecho de manera modular, cumpliendo con algunas de las exigencias de los sistemas de hoy en d a .
L41 probar dxho sistema podemos decir que tiene una gran viabilidad para futuros proyectos por
ejemplo, uno de los que podemos apuntar, y que la opción se nos hizo muy viable, es el monitoreo
simultaneo de varios pacientes. Lo cual seria de excelente beneficio para una sala de observación de un
hospital pequeno, ya que con un solo monitor (PC), la enfermera podría estar atenta a todos los
pacientes a la vez.
BIBLIOGRAFIA
Junior Pertercce Antonio, Amplificadores Operacionales y Filtros Activos, Mc Graw Hill 1991.
Págs. 3 -10,15 - 20,39 - 69.
Tompkins J. Willis, Desing of Microcomputerbased in medical Instrumentation, Pretice Hall 1990,
Págs 1 - 13.
Donna Mosich, Namir Shammas, Bryan Flamig, Advanced Turbo C Programmer’s Guide, Wiley.
Págs 259 - 294.