Manejo de pwm

buen dia

compañeros quisiera saber como puedo manejar el modulo pwm en el pic 16f877a

ya que estoy un poquito enredado, en lo que es su manejo y solo tengo la información que hay en el datasheet


gracias por su ayuda

att

Carlos
 
Esta es una rutina para inicializar el pwm revisala

;---------------------------- CONFIGURACION PWM ---------------------------------
;--------------------------------------------------------------------------------

BSF STATUS,RP0 ;BANCO 1
MOVLW .255 ;PERIODO PWM
MOVWF PR2
BCF STATUS,RP0 ;BANCO 0
MOVLW .0
MOVWF CCPR1L
MOVLW B'00001100' ;PWM ON
MOVWF CCP1CON
MOVLW B'00000100' ;PREDIVISOR tMR2
MOVWF T2CON



configura antes el pin rc2 como salida. Luego solo basta con variar el valor de CCPR1L y tendras tu PWM con resoluion de 10 bits, pero con el ccpr1l solo varias 8, los otros quedan fijos a 00. Con un XT de 20 Mhz, tendras un periodo de 51.20 micro hz
 
Buenas noches amigos.. Necesito que me den una manito con este problema.. se que para algunos es sencillo pero yo no lo veo tan claro, ademas que apenas ando empezando a programar. Aquí va lo que ando haciendo:
vengo trabajando en la generación de un PWM, ando con una frecuencia de 38Khz de pwm y quiero variar el ciclo de trabajo de 0% a 100% con un potenciómetro. He generado mi PWM, ya he leído mi entrada Analógica conectada al AN0. pero lo que no he logrado como sacar la relación de tal forma que el ciclo de trabajo me varié proporcional al cambio del potenciómetro. Me explico, cuando el potenciómetro se encuentre en la mitad el ciclo de trabajo sea del 50% cuando sea el potenciómetro se encuentre en el punto máximo, sea el 100% del ciclo de trabajo y así sucesivamente. Anexo el código

Código:
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#device adc=10
#use delay (clock=4000000)

//*****************PWM**************************

void main()
{


output_low(PIN_C2);
setup_ccp1(CCP_PWM);
setup_adc_ports(AN0); //Seleccionamos el pin RAN0 como entrada del potenciometro
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_2(T2_DIV_BY_1,25,1); //Configuramos el Timer para una frecuencia PWM=38KHZ (1/38KHZ)=(PR2+1)*4*(1/4Mhz)*1 => PR2=25
set_pwm1_duty(0);

long duty;

set_adc_channel(0);

while(1){

duty=read_adc();
delay_us(20);
set_pwm1_duty(duty);



}
}
 
Última edición por un moderador:
Atrás
Arriba