0 Usuarios y 1 Visitante están viendo este tema.
/* Programa de PWM y comunicacion RS-232Rodriguez Altamirano Jesus Abel*/#include <18F4550.h>#device adc=10#FUSES NOWDT //No Watch Dog Timer#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale#FUSES INTHS //Internal Oscillator, HS used by USB#FUSES NOPROTECT //Code not protected from reading#FUSES BROWNOUT //Reset when brownout detected#FUSES BORV43 //Brownout reset at 4.3V#FUSES PUT //Power Up Timer#FUSES NOCPD //No EE protection#FUSES STVREN //Stack full/underflow will cause reset#FUSES NODEBUG //No Debug mode for ICD#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES NOWRT //Program memory not write protected#FUSES NOWRTD //Data EEPROM not write protected#FUSES IESO //Internal External Switch Over mode enabled#FUSES FCMEN //Fail-safe clock monitor enabled#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET#FUSES NOWRTC //configuration not registers write protected#FUSES NOWRTB //Boot block not write protected#FUSES NOEBTR //Memory not protected from table reads#FUSES NOEBTRB //Boot block not protected from table reads#FUSES NOCPB //No Boot Block code protection#FUSES MCLR //Master Clear pin enabled#FUSES LPT1OSC //Timer1 configured for low-power operation#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)#FUSES PLL1 //No PLL PreScaler#use delay(internal=8000000)#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)int x=0, y=0,z=0,a1=0,a2=0,ciclo2=0;float read1=0,temp=0,ciclo=0,porc=0,dc2=0;long dc=0,pulso=0,pulso2=0;int1 a=0,b=0,c=0,n=0,cambio=0;#int_TIMER0void TIMER0_isr() //timer en cada segundo{ set_adc_channel(0); //lectura del convertidor analogo digital read1=read_adc(); pulso2=pulso*60; //esto es para sacar las revoluciones por minuto,cada segundo pulso=0; //se reinicia para tener una lectura correcta a=1; //esta variable es para que en el while infinito mande los datos por //tx cada segundo solamente if(y==1&&b==0) //este if sirve para el encendido, b es para limitarlo a 15seg y { //si es 1 es encendido x+=1; //cada segundo se incrementa en 1 if(x<15) //al llegar a los 15 segundos el ciclo de trabajo es igual al 50% { dc+=34.1; //dc y dc2 son del mismo valor siempre pero son de diferente tipo de dc2+=34.1; //variable, una long y otra float //este incremento es para que en el encendido de 15seg se valla incrementando //la velocidad en forma de rampa } else { dc=511.5; //en caso de que pasen los 15seg el ciclo de trabajo es igual al 50% dc2=511.5; b=1; //b es la variable que nos permite salir del ciclo de encendido } } if(c==1) //esta parte es para el apagado { if(n==0) { porc=dc/15; //esto es para saber que porcentaje se decrementa cada segundo durante el n=1; //apagado del motor } z+=1; //z es para contar los 15seg de apagado dc-=porc; //es el decremento que hace dc2-=porc; if(z>=15) //ya que pasaron los 15seg del apagado se reinician todas las variables { //para asi poder volverla a prender en forma de rampa y=0; b=0; z=0; dc=0; dc2=0; ciclo=0; c=0; x=0; porc=0; n=0; } }}#int_TIMER1void TIMER1_isr() {}#int_EXT //interrupcion externa para encendido y apagadovoid EXT_isr() { y=1; if(b==1) y+=1; if(b==1&&y==2) { c=1; } }#int_EXT1 //incrementovoid EXT1_isr() { ciclo2=ciclo; if(b==1&&y==1) //solo si ya alcanzo el 50% del ciclo de trabajo { if(ciclo<90) { dc+=51.15; //aumenta en 5% dc2+=51.15; } if(ciclo2>=90&&b==1&&y==1) //limite maximo del ciclo de trabajo ciclo=90; } }#int_EXT2 //decrementovoid EXT2_isr() { ciclo2=ciclo; if(b==1&&y==1) //solo si ya alcanzo el 50% { if(ciclo>30) //decrementa en 5% { dc-=51.15; dc2-=51.15; } if(ciclo2<=30&&b==1&&y==1) //limite menor del 30% { ciclo=30; dc=306.9; dc2=306.9; } }}#define LCD_TYPE 2#include <lcd.c>void main(){ lcd_init(); setup_adc_ports(AN0_TO_AN1|VSS_VDD); setup_adc(ADC_CLOCK_DIV_8); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); setup_timer_2(T2_DIV_BY_16,255,1); // Perido de la señal PWM setup_timer_3(T3_DISABLED|T3_DIV_BY_1); //setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L); setup_ccp1(ccp_pwm); setup_ccp2(ccp_pwm); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER0); enable_interrupts(INT_TIMER1); enable_interrupts(INT_EXT); enable_interrupts(INT_EXT1); enable_interrupts(INT_EXT2); enable_interrupts(GLOBAL); setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); // TODO: USER CODE!! set_tris_b(0xf7);#use fixed_io(a_outputs=PIN_A2, PIN_A3) /*para utilizar solo unos pines del puerto a como salidas*/while(TRUE){if(input(pin_b7)&&cambio==0) //contador de cambios de estados para contar las rpm{ pulso+=1; cambio=1;}if(!input(pin_b7)&&cambio==1)//con la variable cambio se detecta el cambio de estado //y asi sacamos las rpm{ cambio=0;}ciclo=dc2/10.23; //para saber a cuanto equivale cada 1%a1=temp;a2=ciclo;if(a==1) //se hace 1 en el timer interno{ printf("Temp %i Rpm %lu Ciclo %i \n\r",a1,pulso2,a2); //manda datos por tx a=0; //la iguala a cero para esperar a que pase un segundo mas}//TEMPERATURAlcd_gotoxy(1,1);lcd_putc("T:");temp=((read1*0.0048875855327468))*100; //lectura del adc de la temperaturalcd_gotoxy(3,1);printf(lcd_putc,"%i \xdfC %lu rpm \n %i%% ",a1,pulso2,a2);/*impresion \xdf es igual al ºde temperatura, rpm y ciclo de trabajo*///PWMset_pwm1_duty(dc); //porciento del ciclo de trabajoset_pwm2_duty(dc);}}