pues la frecuencia que quieres la calculas desde el timer 2 , en el data esta, por suerte y sino mal me acuerdo, la frecuencia que deseas si alcanza a llegar para el mudulo de pwm, esto lo digo, sacando el pwm por hardware, aqui esta el ejemplo
setup_timer_2(T2_DIV_BY_8,0x4F,1);
en donde le dices que tu preescaler es divisible entre 8, y el conteo empezara de 0x00 hasta 0x4F, y solo un desbordamiento necesitara para hacer una interrupcion, aqui puedes hacer los calculos, aunque te recomiendo un programita que hice el maestro Redpic que te evita hacer todo esos calculos, visita su pagina y descargalo, ahora para hacer variar el ancho de pulso se hace con la funcion pwm duty, aqui pongo un ejemplito para hacerlo variar por el valor analogico, aunque puedes usar las formulas arriba mencionadas
long duty;
int grados_temperatura;
void toma_adc(void){
set_adc_channel(0);
delay_ms(1);
duty= read_adc();
delay_ms(1);
grados_temperatura = (int) ((duty * 391) / 1000);
printf("L = %u T = %u \n",duty,grados_temperatura);
}
void main()
{
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
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_8,0x4F,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(TRUE);
setup_ccp1(CCP_PWM);
set_tris_a(0xFF);
// TODO: USER CODE!!
do{
toma_adc();
output_b(duty);
set_pwm1_duty(duty);
}while(true);
}
puedes usar long o int, depende, como ya explico previamente el el amigo pocher. saludos