TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Abeltronica en 12 de Junio de 2009, 14:04:40

Título: Medidor de pulsos (Señales Cardiacas)
Publicado por: Abeltronica en 12 de Junio de 2009, 14:04:40
Saludos a todos, estoy en este interesante proyecto pero tengo un problema, primero les explico un poco el desarrollo.

La parte de adquisicion de la señal, ya la tengo resuelta, (el sensor que va en el dedo), mi problema es en el algoritmo, estoy usando el pic 16f877A, lenguaje C, con CCS compiler, y simulandolo en Proteus.

Pues bien estoy usando el modulo CCP en modo captura. Practicamente es un frecuencimetro, que trabaja para bajas frecuencias digamos desde los 0.3Hz hasta los 3Hz exagerando.

Equivale decir a 18PPM - 180PPM (Pulsaciones Por Minuto). Mi problema comienza en la simulacion en proteus para bajas frecuencias, ya que para altas creo que el error es aceptable.

He hecho pruebas con diferentes cristales y varia bastante. Bueno aqui esta mi algoritmo :

*************************************************************************

#include <16f877A.h>               
#fuses XT,NOWDT,NOPROTECT,NOLVP   
#use delay(clock=4000000)           
#include "LCD.c"                   
#byte PIR1= 0x0c                   
                                   
                       
   int change=0;
   int16 capture = 0;
   float ap = 0.0;             
         
void MCU_init(){

      lcd_init();
      set_tris_c(0xff);
     
      setup_timer_1(T1_INTERNAL);
      setup_ccp1(CCP_CAPTURE_RE);
     
}
     
void ENA_init(){
   
    enable_interrupts(INT_CCP1);
    enable_interrupts(GLOBAL);

}

#int_CCP1

   void CAPTURE_init(){
     
      capture=CCP_1;
      set_timer1(0);
      change=1;
}     


void main()
{
   MCU_init();         
   ENA_init();       
   printf(lcd_putc," PLETHYSMOGRAPH");       
     
   do{                           
   
      if(change==1){               
             
         ap = capture;           
         printf(lcd_putc,"\n%6.1f us      ",ap);     
   }
     
     
      change = 0;   
   
}

while(TRUE);

}

*******************************************************************************

y aqui mi tabla de pruebas con diferentes Cristales:

Freq/Xtales   20Mhz      10Mhz      4Mhz      


1hz              260.10hz      260.66hz      59.10hz      
100hz              100.08hz      100.16hz      100.41hz      
1khz              1.008khz      1.0166khz                   1.0427khz   

Bueno sospecho que mi problema esta en el TMR1 con un cristal indicado para esta solucion.

Adjunto mi codigo, .hex y proteus.

Gracias de antemano.

Bytes.

Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: NANO1985 en 12 de Junio de 2009, 14:49:20
interesante proyecto.... y bienvenido al foro!!!!
lo voy a ver  y luego te comento.... como es el sensor que colocas en el dedo??.
Saludos
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: Suky en 12 de Junio de 2009, 15:14:17
No estas teniendo en cuenta la resolución del módulo CCP. Con esto me refiero a que tu necesitas medir periodos entre 0.33 y 3.3 seg. Y si configuras el Timer 1:1 como máximo podrás medir periodos entre 65.5ms. Para solucionar ese problema deberías usar una variable adicional que cuente los overflow del Timer1 para realizar el correcto cálculo del periodo.
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: MLO__ en 12 de Junio de 2009, 15:18:55
Muy interesante.

Seria mejor trabajarlo con interrupciones en el Timer1 para que tu mismo lleves la cuenta, de esa manera ajustas tu base de tiempo a tu gusto.

Saludos.
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: Abeltronica en 12 de Junio de 2009, 15:33:07
Hola, gracias por responder tan rapido :D

Ya veo, voy a probar sus respuestas  :)

En si el proyecto en realidad abarca:

Muestra la señal cardiaca por rs232, hacia el pc por conversion ad del pic.
Muestra en LCD de las pulsaciones por minuto.
Alarma para pulsaciones muy elevadas.
Pequeño "bip" tipo oximetros de pulso.

El sensor que pongo en el dedo, son un phototransitor y un led IR, luego viene una etapa de filtraje y amplificacion con un LM358.
Basicamente cuando la sangre fluye en el dedo, lo hace proporcionalmente al corazon. Bien ese fluido hara que el phototransistor reciva en forma periodica mas emison o no del led IR.

Bueno ese es mi sensor, algo simple pero efectivo, se logra ver bien en el osciloscopio una señal tipica del corazon.

Lo del rs232 ya me simula ok, solo me falta hacer el modulo y probar mi hardware.

Bien termine de hacer todas las etapas las juntare y posteare para que vean los resultados, en verdad es muy entretenido
este proyectito.

Bytes.
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: MLO__ en 12 de Junio de 2009, 15:45:54
Algun esquema?
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: Abeltronica en 12 de Junio de 2009, 15:51:03
Bueno lo vi en esta pagina, que venden todo el hardware como modulo y pense hacerlo yo mismo con el pic 877a
e incluir lo que les explique anteriormente.

Sensor (http://www.picotech.com/experiments/calculating_heart_rate/)
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: Abeltronica en 12 de Junio de 2009, 19:06:20
Saludos, quiero agradecer a todos los que me ayudaron hoy, en especial a Suky, por que funciono perfectamente   :-/

bueno sin más aqui va el codigo modificado:

*******************************************************************
#include <16f877A.h>               
#fuses HS,NOWDT,NOPROTECT,NOLVP   
#use delay(clock=4000000)           
#include "LCD.c"                   
#byte PIR1= 0x0c                   
                                   
                       
   int change=0;
   int16 capture = 0;
   int8  overflow = 0;
   float ap = 0.0;             
         
void MCU_init(){

      lcd_init();
      set_tris_c(0xff);
     
      setup_timer_1(T1_INTERNAL);
      setup_ccp1(CCP_CAPTURE_RE);
     
}
     
void ENA_init(){
   
    enable_interrupts(INT_CCP1);
    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);
 
     
}

#int_TIMER1

void CONTA_init(){
overflow++;

}

#int_CCP1

   void CAPTURE_init(){
     
     
      capture=CCP_1;
      set_timer1(0);
      change=1;
}     


void main()
{
   MCU_init();         
   ENA_init();       
   printf(lcd_putc," PLETHYSMOGRAPH");       
     
   do{                           
   
      if(change==1){   
         
       
         ap = capture + overflow*65536;           
         printf(lcd_putc,"\n%6.1f us      ",ap);     
   
     
     
      change = 0;
      overflow = 0;
      }
}

while(TRUE);

}

*************************************************************

estoy emocionado xq hoy mismo pruebo todo el hardware, ya les comentare como voy... estamos en contacto.

Salu2 Bytes!
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: NANO1985 en 13 de Junio de 2009, 14:25:53
que creativo el sensor!!.... pudes colocar al meno suna foto de él??
saludos
Título: Re: Medidor de pulsos (Señales Cardiacas)
Publicado por: egvh en 09 de Diciembre de 2013, 21:34:46
Saludos, quiero agradecer a todos los que me ayudaron hoy, en especial a Suky, por que funciono perfectamente   :-/

bueno sin más aqui va el codigo modificado:

*******************************************************************
#include <16f877A.h>               
#fuses HS,NOWDT,NOPROTECT,NOLVP   
#use delay(clock=4000000)           
#include "LCD.c"                   
#byte PIR1= 0x0c                   
                                   
                       
   int change=0;
   int16 capture = 0;
   int8  overflow = 0;
   float ap = 0.0;             
         
void MCU_init(){

      lcd_init();
      set_tris_c(0xff);
     
      setup_timer_1(T1_INTERNAL);
      setup_ccp1(CCP_CAPTURE_RE);
     
}
     
void ENA_init(){
   
    enable_interrupts(INT_CCP1);
    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);
 
     
}

#int_TIMER1

void CONTA_init(){
overflow++;

}

#int_CCP1

   void CAPTURE_init(){
     
     
      capture=CCP_1;
      set_timer1(0);
      change=1;
}     


void main()
{
   MCU_init();         
   ENA_init();       
   printf(lcd_putc," PLETHYSMOGRAPH");       
     
   do{                           
   
      if(change==1){   
         
       
         ap = capture + overflow*65536;           
         printf(lcd_putc,"\n%6.1f us      ",ap);     
   
     
     
      change = 0;
      overflow = 0;
      }
}

while(TRUE);

}

*************************************************************

estoy emocionado xq hoy mismo pruebo todo el hardware, ya les comentare como voy... estamos en contacto.

Salu2 Bytes!

Abeltronica amigo muchísimas gracias  ((:-)) me ha sido de gran ayuda tu código para un proyecto parecido, ya lleva tiempo y no podía hacerlo pero gracias a tu código ya he logrado un gran avance también gracias a Suky.    :-/