Como Generar Un Pwm
Enviado por taragushi • 25 de Noviembre de 2012 • 383 Palabras (2 Páginas) • 424 Visitas
como generar un PWM con el pic:
primero tenemos que saber a que frecuencia queremos nuestro PWM, donde a este se le calcula el periodo de la frecuencia:
periodo del PWM=1/(frecuencia del PWM)
luego tenemos que saber que cristal vamos a utilizar para sacarle de igual forma el periodo:
Tosc=1/(cristal del pic)
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.
PR2=((Periodo del PWM)/(4*Tosc*TMR2 Preescaler))-1
y por ultimo tenemos que saber cuál va a ser nuestro rango de trabajo del PWM. esto quiere decir que si vamos a hacer un Dady cicle por ejemplo del 50% ó 100%.
CCPR1L:CCP1CON=(Ciclo de trabajo del PWM)/(Tosc*TMR2 Preescaler)
y por último la configuración del programa tiene que ser:
setup_ccp1(CCP_PWM); //ccp1 modo PWM ó
setup_ccp2(CCP_PWM); //ccp2 modo PWM ó
setup_ccp3(CCP_PWM); //ccp3 modo PWM
como también pueden ser las tres juntas
luego de esto se tiene que poner:
setup_timer_2(modo, period, postcaler);
Esta función inicializa el timer2; mode especifica el divisor del reloj del oscilador. period
es un número comprendido entre 0-255, y determina el momento en el que el valor del
reloj se resetea a 0. postscale es un número de 0 a 15, que determina cuántos reset del
timer se han producido antes de una interrupción. 0 significa 1 reset, 1 significa 2 reset,
y así sucesivamente. El valor del timer puede leerse y puede escribirse utilizando
GET_TIMER2() y SET_TIMER2().
Los valores de mode son:
o T2_DISABLED
o T2_DIV_BY_1
o T2_DIV_BY_4
o T2_DIV_BY_16
(los tres ultimos casos equivalen al preescaler utilisado)
ejemplo:
setup_timer_2(T2_DIV_BY_1,PR2, 1);
y por ultimo
SET_PWM1_DUTY(value)
SET_PWM2_DUTY(value)
Estas funciones escriben los 10 bits de value al dispositivo PWM para establecer el
ciclo de trabajo. Se puede usar un valor de 8 bits si no son necesarios los bits menos
significativos.
ejemplo:
SET_PWM1_DUTY(CCPR1L:CCP1CON);
esto equivale al ciclo de trabajo del PWM
ejemplo completo:
cristal del pic 4MHz, Preescaler 1:1, ciclo de trabajo del PWM 50% y frecuancia del PWM igual a 20KHz
Periodo PWM= 1/20KHz = 50us
Tosc= 1/ 4MHz =250ns
PR2= (50us/(4*250ns*1))-1 = 49
CTPWM 50%= Periodo PWM / 2 = 25us
CCPR1L:CCP1CON = 25us/(250ns*1) = 100
por lo tanto la configuracion de esto es:
setup_ccp1(ccp_PWM);
setup_timer_2(t2_div_By_1,49,1);
...