• Domingo 22 de Diciembre de 2024, 22:06

Autor Tema:  Pwm, dudas sobre el tema  (Leído 2828 veces)

GPANGEL

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Pwm, dudas sobre el tema
« en: Viernes 10 de Agosto de 2007, 23:10 »
0
BUEN DIA

Hace poco realice una aplicaion de pwm con uno de estos microcontroladores sin embargo me quedaron varias dudas como son el calculo del pwm es decir su frecuencia y ciclo util para programarlos en el micro si alguien tiene infromacion al respecto se lo agredeceria de antemano.

fa61an

  • Miembro MUY activo
  • ***
  • Mensajes: 100
    • Ver Perfil
Re: Pwm, dudas sobre el tema
« Respuesta #1 en: Viernes 10 de Agosto de 2007, 23:49 »
0
La frecuencia depende de dos cosas..

1) El cristal que estés usando
2) La config del Timer

Ejemplo GP32 con un cristal de 10 MHz

10'000.000 / 4 = 2'500.000     // Cada instruccion se ejecuta a 4 ciclos del reloj por               eso el 4

2'500.000 MHz   --->   0,4 uS    

Entonces casa 0,4 uS ejecuta una instrucción

Ahora si se tiene un Preescaler de  % 4   en el timer, el conteo del mismo se ejecuta cada  

0.4 x 4 = 1.6 uS

Y lo ultimo que haría falta saber es el modulo del conteo para el Timer... para entener aun mas ver ejemplo

Código: Text
  1.  
  2. #include <hidef.h>
  3. #include <MC68HC908GP32.h>
  4.  
  5. interrupt 4 void rsi_t1ch0 (void);
  6. interrupt 6 void rsi_ov1 (void);
  7.  
  8. void main(void)
  9.  
  10.   CONFIG1|=0x01;
  11.   DDRD=0x10;    
  12.   T1SC  =0b01110010;         // Prescaler: Div entre 4 y se habilito
  13.   T1SC0 =0b01010110;        // Config del PWM
  14.  
  15. // ****MODULOS DE CONTEO   ********\\  
  16.   T1MOD=0x186A;             // 186A(6250)decimal x 1,6 us = 10 ms "periodo del PWM"
  17.   T1CH0 =0x09C4;            // 09C4(2500)decimal x 1,6 us = 4  ms   "Ancho del pulso"
  18.                  
  19.   T1SC&=~(0x20);        
  20.   EnableInterrupts;
  21.   for(;;) {    }  
  22. }
  23.  
  24. // VECTORES DE INTERRUPCION
  25.  
  26. interrupt 4 void rsi_t1ch0 (void) {  T1SC0&=(~0x80); }
  27. interrupt 6 void rsi_ov1   (void) {   T1SC&=(~0x80);  }
  28.  
  29.  
  30.  

Ese codigo funciona para el Codewarrior version 3.0 que es la que uso...