Objetivos:
Medir la velocidad rpm de un motor DC y mostrarla en una LCD
Material:
- Encoder
- Motor DC 12 V
- 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 } } }