Sensor de velocidad rpm de un motor dc con microcontrolador pic16f887

Sensor de velocidad rpm de un motor dc con microcontrolador pic16f887

Objetivos

 medir velocidad rpm de un motor dc con microcontrolador pic16f887

Material:

  • Encoder
  • Motor DC
  • pic16f887

Diagrama 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

}

}

}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *