Para aquellas personas que inician su trayecto por el tema de modulación de ancho de pulso, podemos decir que es una técnica muy utilizada cuya función principal es modificar el ciclo de trabajo de una onda senoidal o cuadrada; controlando así, cuanta energía se le suministra a una carga (leds, motores, bombas, etc.)
Ciclo de trabajo (Duty Cicle)
Podemos definir este concepto como el porcentaje al cual nuestra carga recibe energía ó estará encendida, el ciclo de trabajo está estrechamente relacionada con el período de la onda, expresando matemáticamente, tenemos: C = (ta / T)x100;
Donde
C = Ciclo de trabajo
ta = Tiempo durante el cual la onda está en nivel alto
T = Período de la onda
A manera de ejemplo podemos decir que si queremos que una carga este encendida 012 ms y queremos trabajar a una frecuencia de 60 Hz tenemos que T= 1/f = 1/60 T = 16.67 ms. El siguiente paso es obtener el ciclo de trabajo por la ecuación antes mencionada C = ta/T = 72%, este resultado nos representa que el 72% del período, la carga está encendida y el 28% estará apagada.
Teniendo claro estos conceptos, el siguiente paso es crear un programa que nos ayude a modificar nuestro ciclo de trabajo, para ello utilizare el entorno mikroC PRO para PIC32 debido a que utilizo la tarjeta LV 32MX –V6 de mikroelektronika; cabe destacar que esta tarjeta es capaz de manejar 5 ciclos de trabajos diferentes, lo que viene siendo igual a 5 módulos por anchos de pulsos diferentes y están ubicados en el puerto D de RDO hasta RD4.
Foto de la Tarjeta LV 32MX –V6 de mikroelektronika.
{rokbox title=|Foto de la Tarjeta LV 32MX –V6 de mikroelektronika| thumb=|http://clase911.com/CV/images/problems/pwmfa.jpg|}http://clase911.com/CV/images/problems/pwmfa.jpg{/rokbox}
En esta ocasión presento el código fuente del programa, el cual está hecho para 2 leds y gracias a las librerías que posee este entorno puedo editar dependiendo de las necesidades que se me presentan, la frecuencia, el ciclo de trabajo, la magnitud del módulo por ancho de pulso (0 hasta 255), el canal que voy a enviar el pulso (1 hasta 5) y el timer por defecto que es timer2 o timer3.
1 |
unsigned int current_duty, pwm_period1, pwm_period2;<br /> void InitMain() {<br /> CHECON = 0×32;<br /> AD1PCFG = 0xFFFF; // Configure AN pins as digital I/O<br /> PORTD = 0; // set PORTD to 0<br /> TRISD = 0; // designate PORTD pins as output<br /> }<br /> <br /> void main() {<br /> InitMain();<br /> current_duty = 70; // initial value for current_duty<br /> pwm_period1 = PWM_Init(4000,1,60,2);<br /> pwm_period2 = PWM_Init(4000,5,255,2);<br /> PWM_Start(1);<br /> PWM_Start(5);<br /> PWM_Set_Duty(current_duty,1); // Set current duty for PWM1<br /> WM_Set_Duty(current_duty,5); // Set current duty for PWM5<br /> while (1) {<br /> PWM_Set_Duty(current_duty,1);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(current_duty,5);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(pwm_period2,5);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(pwm_period2/2,5);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(current_duty/2,5);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(current_duty/2,1);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(pwm_period1,1);<br /> Delay_ms(3000) ;<br /> PWM_Set_Duty(pwm_period1/2,1);<br /> Delay_ms(3000) ;}<br /> } |
El código fuente lo que hace es lo siguiente: primero declaramos las variables sinsigno y entero _duty, pwm_period1, pwm_period2; debido que es una exigencia de la librería de PWM, luego de esto declaramos el puerto que vamos a utilizar en este caso el puerto D, con la instrucción TRIS declaramos si estos puertos serán configurados a manera de salidas o entradas (input, output) , posterior a esto current_duty = 70; vendría siendo mi ciclo de trabajo, la línea de código pwm_period1 = PWM_Init(4000 , 1, 60, 2); es una declaración de la librería PWM y 4000 es la magnitud de nuestra frecuencia , 1 es el canal en el cual queremos enviar nuestro modulo por ancho de pulso , el 60 representa la magnitud de nuestro pulso y que puede variar de 0 hasta 255 y final mente 2 significa que utilizare el timer2 que está diseñado por defecto en la librería, la declaración PWM_Start(1); representa que se iniciara el PWM del canal número 1, en la siguiente línea de código tenemos que PWM_Set_Duty(current_duty, 1); nos representa que el canal 1 tomara el valor de current_duty, al entrar a la instrucción while (1) nos va a indicar que lo que este dentro de ella se ejecutara indefinida mente y es por ello que la línea de código PWM_Set_Duty(current_duty, 1); Delay_ms(3000); nos va a representar que el PWM está adquiriendo el valor de current_duty del canal número 1 y luego tiene un retardo de 3000 ms para saltar a la siguientes línea de código, posterior a esto coloque diferentes anchos de pulsos para que el efecto se pudiese apreciar mejor.