TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado 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.
-
interesante proyecto.... y bienvenido al foro!!!!
lo voy a ver y luego te comento.... como es el sensor que colocas en el dedo??.
Saludos
-
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.
-
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.
-
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.
-
Algun esquema?
-
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/)
-
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!
-
que creativo el sensor!!.... pudes colocar al meno suna foto de él??
saludos
-
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. :-/