Sensor de velocidad rpm de un motor dc con microcontrolador pic16f887

Sensor de velocidad rpm de un motor dc con microcontrolador pic16f887

Escrito Por: admin Publicado En: Proyectos de microcontroladores PIC Fecha de Creación: 2016-08-23 visitas: 2605

Sensor de velocidad rpm de un motor dc con microcontrolador pic16f887

Objetivos:

Medir la velocidad rpm de un motor DC y mostrarla en una LCD

 

Material:

Encoder

Motor DC

pic16f887

 

 

Diagrama de Proteus

 

Código en PIC C


​#include <16F887.h>
//#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V

#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#include <LCD.C>


int1  bandera;  // la voy usar para prender un led cada 20 ms 

int32 contadort =0;  //  contar las interrupciones temporales cada 20 ms

int32 pulsos = 0;  // contar los pulsos que vienen del encoder cada interrupcion externa

int32 resolucion=24.0;  // resolucion del encoder  ( pulsos por revolucion 

int32 rpm;  // la velocidad 



#int_RTCC
void  RTCC_isr(void) 
{

contadort=contadort+1;


set_TIMER0(100); //inicializa el timer0 es para temporizacion 20 ms

}

#int_EXT
void  EXT_isr(void) 
{

pulsos=pulsos+1; // cada interrupcion externa pulsos se incrementa en uno


}



void main()
{
   lcd_init();  // inicializa lcd



   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   
   setup_spi(SPI_SS_DISABLED);
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   
   
   enable_interrupts(INT_RTCC);
   
   enable_interrupts(INT_EXT);
   
   set_TIMER0(100); //inicializa el timer0 es para temporizacion 20 ms
   
   ext_int_edge( L_TO_H );   // la interrupcion se genera cuando el pin rbo cambia de un valor alta a un valor bajo
   
   
   
   
   enable_interrupts(GLOBAL);
   
   setup_oscillator(OSC_8MHZ);

   // TODO: USER CODE!!
   
   
   while(true){
   
   
   
   if(contadort==50){
   
   
   rpm= (pulsos*60.0)/24.0;  // formula para calcular rpm
   
   
   
   lcd_gotoxy(1,2);   // point LCD cursor to col1 row1
   
   printf(lcd_putc,"RPM:");
   
   
   lcd_gotoxy(5,2);   // point LCD cursor to col1 row1
   

 
   printf(lcd_putc,"%Ld",rpm); // escribo rpm en el lcd
   
   
   pulsos=0;  // reinicio pulsos a cero
   
   contadort=0;  // reinicio el contador de interrupciones del timer
   
   
   }
   
   
   
   }

}