Pwm como parametrizar la fecuencia

#1
hola buenas tarde tengo este programa que quiero que me entregue una frecuencia de 33.khz a 370khz cuando meta en la entrada A0 de 0 a 5 volts y como hacer que me lea la instruccion que le de en A1 enseguida les dejo cogido si alguien me puede ayudar se lo agradeceria bastante saludo.
Código:
#include <16f877a.h>
#fuses NOWDT,HS,NOPUT, NOPROTECT,NODEBUG,NOBROWNOUT, BROWNOUT, NOLVP ,NOCPD,NOWRT
#use delay(clock=12000000)
 
void main()

{
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1, 64, 1); 
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
  
   int duty;
   int  j;
   set_adc_channel(0); // elegimos el canal que vamos a leer.
   set_adc_channel(1);
   output_low(PIN_C2);
 
   
  
   while(1)
   {
      for(duty=0; duty<64;  duty++)
      {
        setup_timer_2(T2_DIV_BY_1, duty, 1);
        duty=read_adc(); // leemos la tension en el canal que  elegimos.
        delay_us(20);
        set_pwm1_duty(duty/2); 
      }
       for(j=0; j < 64; j++)
      {
        
         j=read_adc();
         delay_us(20); 
         set_pwm1_duty(j);
         
      }        
   }
}
 
Última edición por un moderador:
#2
la verdad no entiendo lo que quieres hacer pero veo algo raro en tu codigo.

Código:
for(j=0; j < 64; j++)
{

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

}
ahi utilizas la variable j para leer el ADC y como contador, me parece que tienes un conflicto de valores.
ademas de que lo que varias no es la frecuencia sino el duty(periodo).
 
Última edición:
#3
Código:
#include <16f877a.h>
#fuses NOWDT,HS,NOPUT, NOPROTECT,NODEBUG,NOBROWNOUT, BROWNOUT, NOLVP ,NOCPD,NOWRT
#use delay(clock=12000000)
 
void main()

{
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1, 64, 1); 
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
  
   int duty;

   set_adc_channel(0); // elegimos el canal que vamos a leer.
 
   output_low(PIN_C2);
 
   
  
   while(1)
   {
      for(duty=0; duty<64;  duty++)
      {
        setup_timer_2(T2_DIV_BY_1, duty, 1);
        duty=read_adc(); // leemos la tension en el canal que  elegimos.
        delay_us(20);
        set_pwm1_duty(duty/2); 
      }}}
pues en si este es el programa de hecho lo que quiero es variar el duty y la frecuencia lo que me hace bien es la frecuencia que sera este codigo que pongo ahorita y lo que me falta es determinar bien la frecuancia que valla de de 33.khz a 370khz si pudieras ayudarme te lo agradeceria mucho lo estoy haciendo en css
 
Última edición por un moderador:
#4
No entiendo para que quieres cambiar las dos cosas, lo normal es cambiar solo la proporción.
Si varías la frecuencia ¿como calculas los filtros?
 
Arriba