Velocimetro con pi18f2550 + lcd

Gente q tal,,,

Estoy realizando un velocimetro,,,,,, "antes qUE me digan ,,, si he mirado el de solaris y el de otros compañeros,,, tambien he leido algo, sobre ello pues bueno tengo este codigo: con el cual tengo una formula en la qUE basicamente recibo los pulsos de las interrupcion externa los multiplico por 2PI * diametro de la rueda * 0.036 ( el cual vi qUE sirve para la conversion de km/h), el problema esta en que no se me actualiza "no regresa a cero),,, del carro he tomado los datos fisicos como el diametro de la rueda que es 0.75mt, con un oscilospio tome los datos de un sensor comercial que tiene el carro y con la ayuda del gps vi que por 10km/h obtenia una frecuencia de 9hz aproximadamente. si me hechan una manito gracias-- tambien he leido qUE leyendo el periodo del pulso con el timer y qUE teniendo ese periodo y con la formula de f=1/T puedo llegar a las revoluciones y de ahi a la velocidad,,, bueno eso mas o menos lo entiendo pero no se como escribirlo en codigo...

Código:
#include <18f2550.h>
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT 
#use delay (clock=4000000)

#use standard_io(b) 
#use fast_io(a)
#use standard_io(C) 

#BYTE porta = 0x05
#BYTE portb = 0x06
#BYTE portc = 0x07

#define use_portb_lcd TRUE
#include "lcd flex.c"

////////////////////////////////////////////////////////////////////

 int32 contador2=0;
//long int contador1=0;
float pulsos=0;


#INT_EXT
void ext_isr()
{  
  contador2++; 
   pulsos= contador2 * 235.62*0.036;  // formula para la velocidad
     lcd_gotoxy(1,2);   //tercera linea
   printf(lcd_putc, "%03.2f", pulsos);
   delay_ms(10);
        
    }
     //////////////////////////////  ciclo principal /////////////////////////
void main()
{
    lcd_init();//llama a lcd
    delay_ms(500);
    lcd_gotoxy(1,1);
    printf(lcd_putc," VELOCIMETRO B & N");
    disable_interrupts(global);
//configura puertos
  set_tris_a(0b11111111);
  set_tris_b(0b00000001);
  set_tris_c(0b10000001);
//fin configura puertos
  ext_int_edge (L_TO_H);
  setup_timer_1 (T1_EXTERNAL);
  enable_interrupts(int_ext);
  enable_interrupts(global);
  delay_ms(200);

}
 
Última edición por un moderador:
Podrías usar un PIC más chico y por lo tanto más económico ya que no precisás de tantas entradas/salidas.
¿Qué lenguaje es ese? ¿C# o CCS?
 
Gracias por responder.
Bueno, es que en realidad tengo 2 de esos que me regalaron.
Si, efectivamente es CCS.
 
Última edición por un moderador:
aniki...
yo de pic casi nada por no decir nulo, pero si puedo ayudarte mecanica, electronica o de alguna otra forma eche el grito amigo!!
 
Hola..
De cuál sensor obtuviste 9hz para 10km/h?. Pero bueno con ese dato deberías hacer una lectura de pulsos por segundo utilizando uno de los contadores y un temporizador de 1 seg. para determinar el inicio y fin de la lectura. O puedes emplear la interrupción y un timer. Saludos. :)
 
como hago para que el timer me guarde cierta cantidad de pulsos por un segundo,, inicialmente hice en mi programa que por int_ext me contara pulsos:
#INT_EXT
void ext_isr()
{
pulsos++;
}
ahora lo del timer, que rutina hago para que almacene esos pulsos duurante un segundo para luego multiplicarlo por 60 ( para obtener minutos) y de ahi sacar las revoluciones, pense en esto y lo implemente pero no se como añadir lo que necesito (cuantos pulsos por segundo entran al timer)
#int_TIMER0
void TIMER0_isr()
{
velocidad= pulsos * 235.62*0.036; // 235.62 sale de 2*pi*diametro rueda y 0.0036 para conv km/h
lcd_gotoxy(1,2); //tercera linea
printf(lcd_putc, "%03.2f", velocidad);
pulsos=0;
velocidad=0;
set_timer0(0);
}
 
Necesitas configurar el TIMER0, no programo en CCS pero revisando el manual podrias hacer lo siguiente:
//para configurar el intervalo de tiempo para la interrupcion
SETUP_TIMER0(T0_INTERNAL | T0_DIV_64); // 1uS x 64 x 15625 = 1000000uS
SET_TIMER0(65535-15625);

//Cada vez que ocurra la interrupcion del TIMER0 debes volver a iniciar el registro contador con:
SET_TIMER0(65535-15625);

Haciendo esto deberia funcionarte el programa para contar los pulsos por segundo.
 
Yo tampoco uso pics hace un tiempo, ni tampoco uso ccs.
Pero creo que para tus necesidades, deberías configurar un timer como contador para que cuente los pulsos que envía el sensor, y un timer como temporizador para que cada cierto intervalo de tiempo lea la cuenta de pulsos, resetee la cuenta (esto dentro de la rutina de interrupción del timer), y luego en el main calcular la velocidad y presentarla en el LCD.

Es decir, algo como:
Código:
volatile unsigned char huboInterrupcion;
volatile unsigned char cuenta;

float velocidad;

void main(void)
{
  //1. Inicializar puertos LCD, etc.

  //2. Iniciar timer1 o timer3 como contador usando como entrada T13CKI,
  // o timer0 con entrada T0CKI

  //3. Usar otro timer como temporizador y configurar interrupción 
  //cada 1 segundo

  //4. Habilitar interrupciones
  
  while(1)
  {
    //loop principal
    while(huboInterrupcion >0); //esperar a que haya una interrupción
    
    huboInterrupcion = 0; //limpiar el flag de interrupción
    velocidad = blablabla; //la cuenta para calcular velocidad
   
    //Mostrar el resultado en LCD, etc, etc
  }

} //fin main

//Supongamos que cuento los pulsos con timer1 y
//uso como temporizador timer0
//no se como declarar rutina de interrupción con CCS
//pero ví que usaste #int_TIMER0 así que lo pongo igual:

#int_ TIMER0
void temporizador_isr(void)
{
  cuenta = TIMER1L;
  huboInterrupcion = 1; //cualquier valor distinto de 0 funcionará
  TIMER1L = 0; //limpiar cuenta del contador de pulsos para la próxima lectura
}
Otra cosa, en la cuenta vi que usas 2 * pi * diámetro. Pero el perímetro de la rueda es 2 * pi * radio o pi * diametro, pero no 2 * pi * diametro (te va a dar el doble!!!).
Uso solo timer1L porque el sensor da solo 9 pulsos cada 10 Km/h, no hay riesgo de desborde (timer1L >255) porque eso implicaría que el auto debería andar a más de 283.3... Km/h, así que no debería ser problema.

Lamento no poder ser más específico, pero no uso el CCS y estoy oxidado con los pics, ojalá sirva de guía.
 
hola gente
Retomando el tema, averigüe gracias a un colega que la formula que tenia no me iba a funcionar puesto que el sensor que tenía no estaba ubicado en la rueda, por el contrario el sensor que utilizaba estaba ubicado ya en caja del carro, osea que tenia que conocer la relación de la caja con la cantidad de vueltas de ese sensor cosa tediosa, por el contrario hice una aproximación por formula 1hz por km/h.
Ahora tengo otro inconveniente, tengo 350 pulsos por 100 metros osea 1 metro - 3,5 pulsos esto para visualizar los metros recorridos el problema esta en como hago ver los 3,5 pulsos en principio y matemáticamente hice esto el problema esta en que no es exacto ya que por 350 pulsos me arroja en el lcd 87 metros.
¿Alguna idea para este algoritmo?
Gracias.
Código:
#INT_EXT HIGH
   void ext_isr()
   {
     pulsoskms++;
     ecuacion=pulsoskms*0.5; // realice esto para q cada pulso fuera 0.5
   }

while(true)
   {
   
   for (ecuacion=0;ecuacion<1.75;) /// despues realice esto ya 3.5 * 0.5 =1.75
   {    
   }
///
   metros++;
   lcd_gotoxy(1,1)   
   printf(lcd_putc,"metros= %4lu ",metros);
   Lcd_putc( "\b");
   ecuacion=0;
   pulsoskms=0; 
   }
   }
 
Última edición por un moderador:
Atrás
Arriba