Autor Tema: VELOCIMETRO UTILIZANDO MODULO CCP  (Leído 3511 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diego ospina

  • PIC10
  • *
  • Mensajes: 1
VELOCIMETRO UTILIZANDO MODULO CCP
« en: 04 de Junio de 2014, 19:02:14 »
Buenas tardes compañeros!

actualmente estoy diseñando un velocimetro usando el modulo ccp del pic 18f2550 para un rin de 14", entonces al contar el ancho de pulso (ccpx y timer1) hallo una relacion para calcular la frecuencia y asi expresarla en km/h. El programa funciona correctamente para frecuencias de entrada desde 8Hz hasta 20hz osea desde 32km/h hasta 80km/h, sin embargo cuando la frecuencia es menor a 8hz,el programa ya no funciona, creo que debido al desborde del timer1 que no he podido sensar para luego hacer el calculo correcto y corregir el codigo,  me tiene loco! necesito sensar la velocidad desde 0km/h hasta 80km/h con una resolucion de +/- 1km/h

en pocas palabras tengo problemas con las bajas frecuencias, especialmente desde 0hz a 8hz, o en otras palabras para que el velocimetro funcione bien desde 0km/h a 32km/h, porque desde 32km/h en adelante funciona perfectamente,


este es el codigo completo!

/*
EXISTEN DOS FORMAS DE SENSAR LA VELOCIDAD:
1. CONTANDO UN NUMERO DE PULSOS (OSEA LA FRECUENCIA) Y MULTIPLICANDOLOS POR LA DISTANCIA RECORRIDA DEL GIRO DE LA RUEDA
   ESTE METODO PRESENTA PROBLEMAS PARA FRECUENCIAS BAJAS, LA TOLERANCIA DE ERROR ES +-20%
   ESTE METODO SE BASA EN EL FRECUENCIMETRO, UTILIZANDO TIMER1 COMO CONTADOR DE EVENTOS EXTERNOS Y TIMER0 BASE DE TIEMPO
   
2. CONTANDO EL TIEMPO QUE DURA EN DAR 1 VUELTA (OSEA EL PERIODO). Y SACAR LA FRECUENCIA HACIENDO F=1/T. Y MULTIPLICANDO
   EL VALOR POR LA DISTANCIA RECORRIDA DEL GIRO DE LA RUEDA (OSEA LA LONGITUD 2PIxR), DE ESTA FORMA ES MAS EXACTO, +.5%
   ESTE METODO SE BASA EN LOS MODULOS CCP PARA MEDIR EL PULSO DE LA SEÑAL
   
   
Basicamente es un frecuencimetro,  donde se esta empleando el temporizador 0, timer0, como base de tiempo
y el timer1 como contador de eventos externos
En este caso se emplea un divisor de reloj de 256, tal que 256x195=49920 ms y contando el numero de interrupciones alcanzamos
aproximadamente el segundo (49920 ms x 20); me he pasado bastante, es cosa de afinar el calculo solo pretende servir de ejemplo.

para el pic 16f877a se usa el pin16 para el conteo de pulsos
para el pic 16f628  se usa el pin13 para el conteo de pulsos
ESTE ES UN VELOCIMETRO DIGITAL teniendo como base un rin de 14" donde:

la longitud recorrida del rin en metros al dar 1 giro o vuelta es 2*pi*radio, es decir: 2*3,1416*2,54*(14/2)= 1,11715296 metros
multiplicando esa longitud recorrida por un numero de pulsos, obtengo la distancia total recorrida por el rin de 14"
y puesto que Velocidad = Espacio sobre Tiempo (base de tiempo de 1 seg), simplemente hago la conversion en km/h, asi:

de metros a km, divido en 1000
y de segundos a hora divido en (60/3600)

Si el auto usa guaya debe utilizarse el sensor  REED SWITCH en el eje y sobre la guaya se pega el iman para contar los pulsos.
Si el auto es electronico, no se usa sensor, la señal proviene de la computadora y simplemente se cuentan los pulsos.

*/

// MEDIDOR DE ANCHO DE PULSO EN MODO CAPTURA
//OBTIENE EL VALOR DEL TIMER1 (REGISTRO DE 16 BITS) EN UN TIEMPO DADO, FIJADO POR LA ACCION DEL TERMINAL 16 y 17 DEL PIC ( CCP1 Y CCP2 )

//PORTB GESTIONA LOS PINES DE LA LCD


#include<18f2550.h>
#use delay(clock=4000000)
#include<flex_lcd.c>      //ESTA ES LA LIBRERIA PARA MANEJAR LA LCD

float    frec,pulso,velocidad=0;  //DEFINO LAS VARIABLES COMO FLOAT
float    valor=0;
float    pulso1=0;
float    conta=0;
float    duty=0;
float    espacio=0; //distancia en kilometros recorrida por el rin de 14" al dar 1 vuelta
float    rin=14;

//*************************************DESBORDE DE TIMER1******************************************************************************
#int_TIMER1
void  TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1
{
conta=conta+1;    //se guarda las veces q se desborda el timer1,
//es decir, conta cuenta en microseg el tiempo que dura la señal activa, o en otras palabras, lo que dura en alto la señal
}


//*************************************ATIENDO INT DE MODULOS CCP1 Y CCP2 EN MODO CAPTURA***********************************************

//CAPTURA AL SUBIR LA LINEA
#int_CCP1
void CCP1_isr() {
 
 //Deshabilita capturas en CCP1
   //y habilita capturas en CCP2
   
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_CAPTURE_FE);
 
                                     // le digo que no cuente mas el tiempo que dura la señal en ALTO, es decir, que
                                       //cuando ocurre un evento en el pin de captura (flanco ascendente),
                                       // se copia el contenido del temporizador a un registro específico (CCPR1).
}

//CAPTURA AL BAJAR LA LINEA
#int_CCP2
void CCP2_isr(){

 //Deshabilita capturas en CCP2
   setup_ccp2(CCP_OFF);

 //disable_interrupts(INT_CCP2);         // le digo que no cuente mas el tiempo que dura la señal en BAJO, es decir, que
                                       //cuando ocurre un evento en el pin de captura (flanco descendente),
                                       // se copia el contenido del temporizador a un registro específico (CCPR2).

 valor=(CCP_2-CCP_1);   // en los registros CCP_x se guarda el tiempo que dura la señal activa
 

 
// dado que el timer1 es de 16 bits (2°16 = 65536), la maxima cuenta sin que se desborde seria para un ancho de pulso de 65ms (65536 us)
//si el pulso tiene un ancho superior a 65ms, debo multiplicar las veces que se desborda dicho timer1 (osea conta) y sumarle
// el tiempo que dura la señal activa ccp_x, asi obtengo el ancho de pulso para una señal mayor de 65ms

//el minimo de frec que mide es 8hz, osea periodo <=65ms y hasta 9khz sin problema,osea q el periodo sea >=65us como minimo
//esto sin q se desborde el timer1, frecuenias por fuera de este rango hacen q se desborde el timer1




frec=((1/valor)/2)*1000000;  //para hallar la frec con base en la medicion del ancho de pulso
velocidad=frec*espacio*3.6; //esto es para la velocidad de una llanta de 14 pulg (1.117 metros recorre por vuelta)


}

//******************************************************programa principal****************************************************


void main() {
set_tris_B(0x00);                           //portb como salida PARA MANEJAR LA LCD
set_tris_C(0xFF);                           //PORTC COMO ENTRADA PARA CCP1 Y CCP2
lcd_init ();


printf(LCD_PUTC,"   MEDIDOR DE   ");
lcd_gotoxy (1,2);
printf(LCD_PUTC," VELOCIDAD Km/h  ");




setup_timer_1(T1_INTERNAL); // Start timer 1, ESTE TIMER VA A ESTAR CONTANDO EN microsegundos TODO EL TIEMPO QUE DURA EL PULSO A MEDIR             
enable_interrupts(GLOBAL);


espacio=(((2*3.1416)*(rin/2)*(0.0254)));  //en metros se expresa la distancia recorrida del rin,

do{

enable_interrupts(INT_CCP1); //HABILITO INTERRUPCIONES
enable_interrupts(INT_CCP2);
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise OSEA EL FLANCO DE SUBIDA


lcd_send_byte(0,0b00000001);                     //borra display
printf(LCD_PUTC,"vel =%0f km/h",velocidad);             
lcd_gotoxy (1,2);
printf(LCD_PUTC,"frec =%0f Hz",frec);
delay_ms(1000);             



} while (TRUE);  //loop esperando q se desborde TMR1 o que se capture un evento en CCPx



}


Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: VELOCIMETRO UTILIZANDO MODULO CCP
« Respuesta #1 en: 04 de Junio de 2014, 19:35:56 »
puedes poner prescaler al timer o bien poner un cristal de menor frecuencia. El problema que tienes es que 8hz produce desborde (>65535).

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: VELOCIMETRO UTILIZANDO MODULO CCP
« Respuesta #2 en: 04 de Junio de 2014, 19:58:13 »
bajando la velocidad del CPU "en caliente" podrias aumentar la precisión en la medida

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: VELOCIMETRO UTILIZANDO MODULO CCP
« Respuesta #3 en: 04 de Junio de 2014, 20:17:45 »
Lo que te sucede es paracido a medir un voltaje de 0.5V estando el multimetro en la escala de 1000V  :D
Por lo que tendras como indican arriba aumetar el valor del pre escaler para que no se te desborde an rapido el timer y luego acondicionar la formula para el calculo de ese nuevo pre escaler   :mrgreen:

Ahora no entiendo bien porque el primer metodo que describes te da tanto error (+- 20%)   :?


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: VELOCIMETRO UTILIZANDO MODULO CCP
« Respuesta #4 en: 01 de Julio de 2014, 09:30:48 »
Hola.

Pues, podrias contar los desbordes del timer para hacer el cálculo de esas frecuencias tan bajas.

Saludos
El papel lo aguanta todo