Autor Tema: TACOMETRO CON PIC 16F88 (CONSULTA)  (Leído 2196 veces)

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

Desconectado Matiasitu

  • PIC10
  • *
  • Mensajes: 4
TACOMETRO CON PIC 16F88 (CONSULTA)
« en: 16 de Agosto de 2021, 19:30:13 »
Buenas noches! Alguien me podria explicar el void main de este codigo, ya que obtiene las rpm mediante variables, queria saber si alguien me podría explicármelo como lo hace, estoy aprendiendo en esto pero se me trabo la cabeza.

#include <16f88.h>
#use delay(int=4000000)
#use delay(clock=4000000) 
#include "lcd.c"     
/*****************************************************************************/
// Declaración de variables.
int time0, time1, i;                  //Se declaran variables enteras//
int16 pulses0, pulses, rpm, time;    //Se declaran variables enteras de 16 bits//
int1 rpmbit;                         //Se declara variable entera de 1 bit//

/*****************************************************************************/
//Subrutina RPM GET
/*****************************************************************************/
void rpm_get()                      //Se obtienen las RPM//
{
 rpm=60*pulses;                     //Formula para obtener RPM//
 if(pulses0!=pulses)                // Si pulsos0 no es igual a pulsos//
 {

 printf(lcd_putc,"\f    RPM:%Lu", rpm);   //Se imprime en pantalla las RPM//
 printf(lcd_putc,"\n   REV. MOTOR");   //Se imprime en pantalla las RPM//
 }
 pulses=0;                              //Se reinician los pulsos//
 time1=0;                               //Se reinicia el time1//


}
/*****************************************************************************/
void main()                            //Cuerpo del programa//
{                                       
 rpm=0;                                //variable rpm = 0
 time=0;                               //variable time = 0
 time0=0;                              //variable time0 = 0
 time1=time0;                          //variable time1 = time0
 pulses=0;                             //variable pulsos = 0
 pulses0=pulses;                       //variable pulsos0 = pulsos
 rpmbit=1;                             //variable rpmbit = 1
 lcd_init();                           //INICIAMOS EL LCD
 lcd_putc("\f    2009 \n");           
 lcd_putc("\n  TACOMETRO");
 delay_ms(200);
/*****************************************************************************/
 while(true)                                   
 {
 
  //Se mide la lectura de vueltas//
  {
   if((input(PIN_A0)==1)&&(rpmbit==1))     
   {
    pulses++;                             
    rpmbit=0;                             
   }
   if((!input(PIN_A0)==1)&&(rpmbit==0))   
   {
   rpmbit=1;                               
   }
   time0++;                               
   if(time0>250)                         
   {
    time1++;                               
    time0=0;                               
    if(time1>=4)                           
    {
     time0=0;                             
     if(pulses<1)                         
     {
      lcd_putc("\fMOTOR APAGADO");         
      delay_ms(100);                       
     }
    else
     {
      rpm_get();                         
     pulses0=pulses;                   
     }
    }
   }

  }
  delay_ms(1);                         
 }                                     
}

Les agradecería de antemano

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:TACOMETRO CON PIC 16F88 (CONSULTA)
« Respuesta #1 en: 17 de Agosto de 2021, 00:05:11 »
El bloque
Código: [Seleccionar]
    if((input(PIN_A0)==1)&&(rpmbit==1))
    {
        pulses++;
        rpmbit=0;
    }
    if((!input(PIN_A0)==1)&&(rpmbit==0))
    {
        rpmbit=1;
    }
cuenta el número de flancos ascendentes de PIN_A0

El siguiente
Código: [Seleccionar]
    time0++;
    if(time0>250)
    {
        time1++;
        time0=0;
        if(time1>=4)
        {
            time0=0;
            if(pulses<1)
            {
                lcd_putc("\fMOTOR APAGADO");
                delay_ms(100);
            }
            else
            {
                rpm_get();
                pulses0=pulses;
            }
        }
    }
    delay_ms(1);
Cuenta hasta 1000 (250*4)  y muestra la cantidad la cantidad de flancos (x60) y si no hubo ninguno indica motor parado.

Al final un delay de 1ms de manera que el tiempo de conteo sea 1"

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:TACOMETRO CON PIC 16F88 (CONSULTA)
« Respuesta #2 en: 17 de Agosto de 2021, 11:20:55 »
Teniendo buenos timers en cualquier pic no concibo hacer estas cosas contando pulsos   ;-)


Desconectado Matiasitu

  • PIC10
  • *
  • Mensajes: 4
Re:TACOMETRO CON PIC 16F88 (CONSULTA)
« Respuesta #3 en: 04 de Diciembre de 2021, 00:09:50 »
El bloque
Código: [Seleccionar]
    if((input(PIN_A0)==1)&&(rpmbit==1))
    {
        pulses++;
        rpmbit=0;
    }
    if((!input(PIN_A0)==1)&&(rpmbit==0))
    {
        rpmbit=1;
    }
cuenta el número de flancos ascendentes de PIN_A0

El siguiente
Código: [Seleccionar]
    time0++;
    if(time0>250)
    {
        time1++;
        time0=0;
        if(time1>=4)
        {
            time0=0;
            if(pulses<1)
            {
                lcd_putc("\fMOTOR APAGADO");
                delay_ms(100);
            }
            else
            {
                rpm_get();
                pulses0=pulses;
            }
        }
    }
    delay_ms(1);
Cuenta hasta 1000 (250*4)  y muestra la cantidad la cantidad de flancos (x60) y si no hubo ninguno indica motor parado.

Al final un delay de 1ms de manera que el tiempo de conteo sea 1"

Gracias Eduardo

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:TACOMETRO CON PIC 16F88 (CONSULTA)
« Respuesta #4 en: 04 de Diciembre de 2021, 07:55:00 »
La forma más rápida y muy precisa de medir las rpm es contar el tiempo entre dos pulsos y luego invertir el número.

rpm = 60*Frecuencia de reloj / (pulsos_de_reloj_contados_entre_dos_pulsos_del_tacómetro)


 

anything