Cálculo Del PWM
Cálculo Del PWM
Cálculo Del PWM
En la siguiente imagen (se usa una frecuencia de reloj de 20MHz) hay un ejemplo en el
que T vale 45s (es decir, una frecuencia de 22,22kHz para el PWM). Habiendo
utilizado las 2 ecuaciones:
Tpwm = (PR2 + 1) * 4 * Tosc * PRESCALERtimer ===> 45 = (PR2 + 1) * 4 * 1/20M
===> PR2=224
TiempoTimer = [(256-carga) * PS + 2] * Tinst ===> 20 = [(256-carga)*1+2]*4/20M
===> carga=158
El cdigo para configurar el PWM es sencillo, pues slo hay que configurar el Timer
asociado a los PWM e indicar mediante setup_ccpX que se va a utilizar el PWM.
1 setup_timer_2(T2_DIV_BY_1,158,1);
//CCP1 y CCP2 sern utilizados y
2 setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM); //sus puertos son salidas PWM
3
Desde este momento tan slo hay que utilizar la
funcin set_pwmX_duty(ValorDelPWM); y opcionalmente en el robot de los talleres
2012 la funcin Motores(); los dos siguientes bloques de programacin son
equivalentes y hacen lo mismo.
Forma genrica:
1 set_pwm1_duty(pwm);
M1In1=1; //Para que avance
2
M1In2=0;
//son estos valores
3
Forma particular del robot de los talleres 2012:
1
2
int16 pwm;
Motores(pwm,1,'A');
En ambos casos la variable pwm se habr declarado como un entero de 16 bits mediante
la siguiente instruccin:
1
int16 pwm;
PR2 debemos recordar que es de 8 bits, por lo que el valor mximo no debe
exceder 255 (muy importante).
Recordar que
Pulse Width =(CCPRxL:CCPxCON<5:4>) TOSC (TMR2 Prescale Value)
y que
Duty Cycle Ratio= (CCPRxL:CCPxCON<5:4>)
-------------------------------4(PR2 + 1)
El ciclo de trabajo ya se conoce (es el deseado), por lo que interesa es el
valor de CCPRxL:CCPxCON<5:4>. En C o en BASIC es relativamente sencillo
colocar ese valor, en ensamblador no tanto. Lo anterior debido a que los bits
5 y 4 de CCPxCON son los de menor peso y se debe realizar un corrimiento
con todo CCPRxL.
Aqu es donde se torna algo confuso (para la mayora):
suponiendo un ciclo de trabajo de 50%, significa que el valor donde se
repite el periodo (PR2+1) es 250, el valor medio sera 125, por lo que
CCPRxL deber tomar ese valor.
CCPRxL toma el valor ya que es el registro de mayor peso para el ciclo de
trabajo, los otros dos bits no afectan.
Lo anterior es si deseas utilizar el PWM en "modo de 8 bits" (no existe tal
modo, pero trabaja asi). Si deseas utilizar los 10 bits de resolucin, debers
utilizar esos dos bits de menor peso.
Esos dos bits de menor peso siempre producirn 4 combinaciones
adicionales (00,01,10,11) a las 256 del CCPRxL y, como sabemos
10bits=1024. El mximo valor que tendrs ser 1023.
Si PR2 es 249, y PR2+1 =250, entonces el valor para el ciclo de trabajo
crece de 250 a 1000, dando 4 veces el original (debido a esos dos bits).
Aqui est la situacin:
para utilizar los 10 bits de resolucin el CCS debe saber que el parmetro de
set_pwm_duty() es un entero de 16 bits (INT16 o LONG), de otra manera lo
tomar como 8 bits (solo tomar el CCPRxL).
Coloca esto:
setup_ccp1(ccp_PWM);
setup_timer_2(t2_div_By_4,249,1);
set_pwm_duty(125);
Coloca esto:
setup_ccp1(ccp_PWM);
setup_timer_2(t2_div_By_4,249,1);
set_pwm_duty(500L);
Notad que el mdulo PWM usa el timer TMR2, por lo que ste no podr
usarse como temporizador de propsito general mientras se est usando
PWM. Si que es posible usarlo (y ahorrarnos gastar otro timer) si queremos
hacer saltar una interrupcin cada cierto tiempo. El postscaler del TMR2 no
tiene efecto sobre la frecuencia PWM, pero si influye sobre cuando salta (si
est habilitada) la correspondiente interrupcin (TMR2_flag). Si por ejemplo
el post-scaler es 1:16 entonces la interrupcin del TMR2 saltar cada 16
periodos del PWM.
Lo primero que tenemos que hacer para usar el mdulo PWM es habilitarlo
indicando que va a usarse como generador de una onda PWM, ya que dicho
mdulo es compartido con otras funciones (Capture/Compare). La forma de
hacerlo es poner a 11XX los 4 bits menos significativos del registro
CCP1CON. Los PIC18 suelen tener 2 mdulos PWM por lo que existe un
segundo registro CCP2CON.
T_on
= [ DC x PRE] x Tosc
Registro
PR2
F_pwm
Para Fosc = 20
MHz
255
Fosc /
1024
19.75 KHz
255
Fosc /
4096
4.88 KHz
255
16
Fosc /
16384
1,22 KHz
Frecuencias por encima de Fosc/1024 son posibles pero a costa de bajar PR2
y por lo tanto disponer de menor resolucin para el ciclo de trabajo. Por
La razn por la que para frecuencias muy altas no podemos especificar con
tanta precisin el ciclo es que el periodo empieza a hacerse muy pequeo.
En el caso anterior (Fpwm = Fosc/256) es obvio que en un ciclo del PWM
slo entran 256 ciclos del oscilador. Como es imposible que el micro haga
algo entre ciclos de reloj, est claro que slo puede bajar la lnea del PWM
en 256 puntos como mucho (esto es, con una resolucin de 8 bits).
lo que puedo conseguir con PRE=2 y PR2 = 249. Pero entonces el valor del
ciclo de trabajo (DC) tiene que moverse en el rango 0 a 4(PR2+1) = 1000.
Con DC=1000 ya alcanzamos un 100% del ciclo de trabajo y valores
superiores no tendrn ningn efecto extra.