TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Matiasitu en 16 de Agosto de 2021, 19:30:13

Título: TACOMETRO CON PIC 16F88 (CONSULTA)
Publicado por: Matiasitu 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
Título: Re:TACOMETRO CON PIC 16F88 (CONSULTA)
Publicado por: Eduardo2 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"
Título: Re:TACOMETRO CON PIC 16F88 (CONSULTA)
Publicado por: remi04 en 17 de Agosto de 2021, 11:20:55
Teniendo buenos timers en cualquier pic no concibo hacer estas cosas contando pulsos   ;-)

Título: Re:TACOMETRO CON PIC 16F88 (CONSULTA)
Publicado por: Matiasitu 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
Título: Re:TACOMETRO CON PIC 16F88 (CONSULTA)
Publicado por: Picuino 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)