Autor Tema: Modulo PWM del PIC16F886  (Leído 1545 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Modulo PWM del PIC16F886
« en: 20 de Enero de 2011, 21:02:45 »
Hola a todos, estoy trabajando con un PIC16f886 y me han surgido un par de dudillas acerca del modulo PWM,he visto infinidad de post por inet acerca de este modulo, como calcularlo y tal, yo utilizo CCS C, y en el PICWIZARD aparece que utiliza el CPP1 y CPP2, ademas te indica como calcular el valor del registro PR2-->=[Fosc/(4*Fpwm*Presc)]-1.
Utilizo F.osc.int=2Mhz ya que se ajusta mas al rango que busco[100..2000]Hz.
Hasta ahi sin problemas.

Mi problema es que calculo para una señal de 200 Hz con un dutty de 50% y me sale un PR2 de 207 por ejemplo, y la señal la veo en el osciloscopio y sale bien, pero cuando hago el calculo para una frecuencia de 300Hz y me sale un PR2<<200 es cuando me vienen los porblemas ya que me aparece en el osciloscopio una señal continua de nivel alto, y claro ajustando el prescaler puedo sacar varias frecuencias de una en una pero no me permite sacar muchas frecuencias ya que si el PR2 es de 8 bits (255) y solo me funciona bien desde el 200 hasta el 255 aprox, poco puedo hacer.
Me extraña que el modulo pwm sea asi, por eso pienso que estoy metiendo la pata y no se en donde, si ha alguien se le ocurre algo os lo agradeceria, aquie esta mi codigo :
Recibo los comandos por Rs232.


printf("\r\n ¿dutty? :"); //Introduzco valor del Dutty
      fgets(s3);  
      dutty=atol(s3); //lo paso a entero
      x = atol(s1); //paso a int16 la variable del Valor de la Frecuencia
      dos_dec=((presc*4)*(x)); //Calculos previos para calcular PR2
      
valor_pr2_dec=((2000000/dos_dec)-1);  //Valor del PR2 con decimales
      valor_pr2=valor_pr2_dec; //Valor del PR2 sin decimales
      
      resto_dec=(valor_pr2_dec-valor_pr2); //saco el valor del decimal
      
 if(resto_dec>0.5) //si el decimal es mayor a 0.5 redondeo para arriba
      valor_pr2++;
      if(resto_dec<0.5) //si es menor redondeo para abajo
      valor_pr2--;
      delay_ms(1);
---------------------------------- //AKI ES DONDE GENERO PWM    
setup_timer_2(T2_DIV_BY_16,valor_pr2,1);  //prescaler 16;post a 1
      setup_ccp1(CCP_PWM);
      set_pwm1_duty(dutty);
      setup_oscillator(OSC_2MHZ);
-----------------------------------

Aunque lo veais un poco bastante chapuza, he comprobado mediante printf que los valores se calculan y llegan correctamente al valor de PR2.

No se si mi problema es con el duty porke no entiendo porque en vez de aparecerme la señal con la frecuencia deseada me aparece una señal de nivel alto continuo.

Se me olvidaba la formula que uso para el calculo del dutty es :

Duty(%)=(Valor que pongo/PR2 +1)*100%

Gracias.
« Última modificación: 20 de Enero de 2011, 21:19:31 por ferorts »