Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/09/2012 #1


Problema en ciclo de trabajo del PWM
Como estan, pues resulta que estoy usando el módulo PWM del PIC 18F4550, estoy usando el PLL para trabajar a 48Mhz usando un cristal de 20MHz, la frecuencia del PWM es de 10KHz y haciendo todos los cálculos necesarios para configurar el pic:

Periodo del PWM=1/(frecuencia del PWM)
Periodo PWM= 1/10KHz = 100us ó 0.1ms

Tosc=1/(cristal del pic)
Tosc= 1/ 48MHz =20.83ns

ahora como PR2 tiene que estar entre 0 y 255 vemos que Preescaler nos sirve, en esto solo puede tomar tres valores de Preescaler los cuales son 1, 4 ó 16.
-Escogí un preescaler de 16:
PR2=[(Periodo del PWM)/(4*Tosc*TMR2 Preescaler)]-1
PR2= (100us/(4*20.83ns*16))-1 = 74

Resolución máx=[log(cristal del pic/frecuencia PWM)] / log2
=[log(48MHz/10KHz)] / log2 =12.22 > 10 bit entonces la resolucion es de 10

Ahora el ciclo de trabajo máximo o 100% es (Segun la formula):
Value=[4(PR2+1)] (% Duty Cycle)
=[4(74+1)] (100%) = 300

Por lo tanto con este valor supuestamente obtienes el máximo ciclo de trabajo, pero realmente al simularlo en proteus no llega ni al 50% del ancho de pulso.

Mi codigo es el siguiente:
Código:
#include <18F4550.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HSPLL                    //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLPT1OSC                //Timer1 configured for higher power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL5                     //Divide By 5(20MHz oscillator input)
#FUSES CPUDIV1                  //No System Clock Postscaler
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES ICPRT                    //ICPRT enabled

#use delay(clock=48000000)

#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
#USE STANDARD_IO(C)
#USE STANDARD_IO(E)

signed int16  value=0;

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,249,1); // PWM 10KHz
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

   // TODO: USER CODE!!

while(1){

if(input(pin_b3)==1){

   if(input(pin_b1)==1){//Si se activa B1 
     value=value+10;                                             
     if(value>300)                                            
     value=300;                                                   
     set_pwm1_duty(value);}                                       
      
   if(input(pin_b2)==1){//Si se activa B2
     value=value-10;                                             
     if(value<0)                                               
     value=0;                                                    
     set_pwm1_duty(value);}
    }                                       
     
   }
Explicación:
Si mantenemos presionado el boton B3 y pulsamos o presionamos(varias veces) B1 el pwm aumentará, pero si seguimos manteniendo presionado B3 y pulsamos(varias veces) el B2, disminuirá el pwm. Y como ya les decia antes en la simulación con un osciloscopio, se ve que el ciclo de trabajo no llega ni al 50%.

Creen que la formula del máximo ciclo de trabajo esté mal (viene en el datasheet del PIC)?
Ayuda y gracias
30/09/2012 #2


Que tal, sólo para añadir lo siguiente resulta que simulado en proteus y viendo el pwm en el osciloscopio del mismo, resulta que la señal tiene un periodo PWM de 330.00us a lo que es igual a una frecuencia de PWM de 3030.3030Hz.
Lo habré configurado mal?? ya que yo hice los cálculos para que la frecuencia fuera de 10000Hz.
Espero y me puedan ayudar gracias.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.