You are on page 1of 3

PWM con PIC16F877A

http://www.forosdeelectronica.com/f24/pwm-pic16f877a-9999/
#include <16F877A.h> #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES HS //Crystal osc 20MHz #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #FUSES NOWRT //Program memory not write protected #use delay(clock=20000000)

#define salida PIN_B0; int16 contador=0; int16 frec=0; frecuencia del PWM int16 anchura=0;

// Pin de Salida del PWM // Variable que indica la // Anchura del PWM

// 1Hz = 1 segundo = 1000mS // 100 Hz = 0.01 segundos = 10mS // La interrupcin se genera cada 1mS #int_TIMER2 TIMER2_isr() { contador++; if (contador<=anchura) output_high(salida); else output_low(salida); if (contador==frec) } contador==0; // Reseteamos el contador

void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,19,16); // Interrupcion cada 1 mS setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER2); // Habilitamos la Interrupcion enable_interrupts(GLOBAL);

while(1) { //Generamos un PWM de 10mS (100Hz) con una anchura del 50% frec=10; anchura=5;

//Generamos un PWM de 1 segundo (1 Hz) con una anchura del 30% frec=1000; anchura=300; // } } // Fin del While(1)

Revisar contador=0;

http://www.tutoelectro.com/tutoriales/microcontroladores/guia-pic/pwm-modulacion-deancho-de-pulso/

http://saeedsolutions.blogspot.com/2012/10/pic16f84a-pwm-code-proteus-simulation.html

http://stackoverflow.com/questions/17671658/pwm-resolution-in-pic-16f877

http://picmicrocontroller877.blogspot.com/2007/10/pwm-de-ancho-variable.html