Autor Tema: Velocímetro con Pic16f877  (Leído 2689 veces)

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

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Velocímetro con Pic16f877
« en: 01 de Septiembre de 2008, 13:42:36 »
Un saludo a todo el foro, que pena no haber respondido antes pero tuve problemas al acceder al la página del foro. Bueno muchachos veo que algunos están motivados en el proyecto al igual que yo. En estos dias estuve manejando el compilador de C para los microcontroladores PIC y pude hacer un programita sencillo pero funciona muy bien.

La idea del programa es medir el ancho de un pulso que viene "de la lata metálica" esta induce un campo magnético, por lo tanto, por ley de inducción de Faraday induce un voltaje que es pequeño pero si lo pasamos por disparador 74LS14 "Scmitt Trigger" creo que podemos obtener 5 y 0V que es la lógica que maneja el micro.


Bueno voy a publicar el programita no lo hice el ensamblador porque tenia que hacer muchas vueltas.

Conexiones

lcd                        Pic

RS                        d0
RW                       d1
RE                        d2

D4                        d4
D5                        d5
D6                        d6
D7                        d7


vss                        0V
vdd                       5v

pic entrada

B1                        Genrador de señales (Onda cuadrada) ó tren de pulsos
C6                        Terminal de serial


#if defined(__PCM__)
#include <16f877.h>
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define use_portd_lcd TRUE          // Definir puerto de la lcd
#byte    puerto_b=06

#include <lcd.c>                    // librería de la lcd


long desbor,de;

#int_rtcc
void desborde()
         {

          desbor= desbor + 1;
          de = desbor;
          set_timer0(0);
         }



void espera_arriba()

      {
         while(input(PIN_B0));          // si está en alto espero a que este en nivel bajo
         delay_us(3);
         while(!input(PIN_B0));        // espero un alto
           
      }

void ancho_pulso()
      {
         delay_us(3);
         while(input(PIN_B0));         // Espero un 0 lógico
         delay_us(3);
         while(!input(PIN_B0));        // Espero un 1 Lógico y esta medido el pulso
      }

main()

    {

       int tiempo,medida;
       long total_t,velocidad;

       lcd_init();
       lcd_gotoxy(5,1);
       printf(lcd_putc,"0 Km");
       enable_interrupts(GLOBAL);
       enable_interrupts(INT_RTCC);
       setup_counters(rtcc_internal, rtcc_div_256);
         do
            { 
               espera_arriba();
               desbor = 0;
               de = 0;
               set_timer0(0);
               ancho_pulso();
               tiempo = get_timer0();
               total_t= (de*255) + tiempo;
               velocidad = (44179/total_t);
               lcd_init();                                   // inicializa  lcd
               lcd_gotoxy(5,1);
                  if (velocidad<3)
                        {
                           printf(lcd_putc,"0 Km");
                        }
                   else
                   {     
               printf("\r %lu Km/H", velocidad);
               printf(lcd_putc,"%lu Km/H", velocidad);       // pongo el valor el la lcd
                   }
               desbor = 0;
               set_timer0(0);
               delay_ms(100);

            } while(true);
    }

Bueno muchachos en el momento estoý trabajando en desarrollo del circuito estare publicando avances y complementando el trabajo con las sugerencias que resulten en el foro.

Un Saludo desde Pereira- Colombia
Un saludo desde Pereira - Colombia

Desconectado marco_zappia

  • PIC10
  • *
  • Mensajes: 25
Re: Velocímetro con Pic16f877
« Respuesta #1 en: 26 de Febrero de 2012, 17:11:20 »
Hola, estoy haciendo mi velocimetro desde 0, es bastante similar al tuyo, pero yo estoy trabajando con un timer1 de 16bits.
Me queda la siguiente tuda en tu cuenta:

porque pones total_t= (de*255) + tiempo;?

mas precisamente porque pones: "de*255" LO DEMAS ME QUEDA CLARISIMO. Estas sumando la cantidad de desbordes y el "pico" de tiempo.

Ahora bien, ese 255 no tendrias que convertirlo a segundos?

Yo estoy haciendo en esencia la misma cuenta pero se que con timer1 de 16bits, se da el desborde cada 0.5243s (trabajando a 4MHZ y prescaler 1/8) por lo tanto la cuenta es:
t_total=desbordes*0.5243+get_timer1().

Estoy interpretando mal? saludos