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
}
}
}
