Hola! Si necesitamos hacer algún tipo de control digital con estos potentes DSPs, lo primero que debemos saber es adquirir señales de nuestro entorno, cosa que generalmente haremos con el conversor analógico-digital. Este módulo ya lo expliqué en esta entrada, en la cual leíamos la señal analógica del sensor de temperatura interno del f28027. Una vez adquirida la señal del exterior, necesitamos, una vez calculado el control, filtro, ganancia…, lo que necesitamos es devolver esa señal al “mundo real”, para ello, debemos transformar la señal digital del DSP en una señal analógica, y esto generalmente se hace mediante un conversor digital – analógico, como hice en el caso del filtrado en DSPIC. Pero para transformar una señal digital en analógica no es necesario siempre disponer de un CAD, sino que simplemente nos vale con sacar una señal, cuyo valor medio corresponda con la señal analógica que deseamos, luego con un pequeño filtro paso bajo formado por un condensador y una resistencia, obtenemos la señal analógica que deseamos.
En esta entrada vamos a ver como configurar el módulo ePWM de un TMS320f28027, que, a pesar de la distancia, no difiere mucho de los módulos PWM de los DSPIC. Tanto en el DSP, como en el DSPIC, la configuración y funcionamiento de este módulo se acerca mucho muchísimo a la forma en que sacaríamos una señal PWM si solo dispusiéramos de circuitos analógicos discretos.
El funcionamiento es muy sencillo, tenemos un contador que empieza desde cero hasta un valor que almacenamos en el registro TBPRD. Este contador, como se ve en la figura, puede contar de 3 modos diferentes seleccionables con el registro CTRMODE, UP_MODE, DOWN_MODE, o UPDOWN_MODE, y con una velocidad seleccionable a partir de dos preescalers, HSPCLKDIV y CLKDIV, que a partir de nuestra frecuencia de sistema, 60MHz máximo para el f28027, obtenemos la frecuencia del contador. Junto al contador existen 2 registros de comparación, CMPA y CMPB. Estos registros se comparan continuamente con el valor del contador, y cuando el valor del comparador es igual al del contador se produce un evento, así pues, mediante los comparadores podemos llegar a tener 4 eventos, que son, cuando cruzamos con el comparador A, y la cuenta es ascendente, cuando cruzamos con el comparador A y la cuenta es descendente, y otros dos iguales para el B. Sobra decir, que el valor máximo de estos comparadores se debe encontrar en TBPRD. Además de estos eventos, el DSP nos genera eventos también cuando el contador llega a cero y cuando el contador llega al valor TBPRD. El DSP nos deja configurar el valor de la salida para cada evento, pudiendo elegir entre poner la salida a 1 o a 0.
Un ejemplo sencillo de configuración podría ser el siguiente:
void InitPWM(){ EPwm1Regs.TBPRD = 1199; // Period = 1200 TBCLK counts -> 50kHz EPwm1Regs.CMPA.half.CMPA = 600; // Compare A = 600 TBCLK counts EPwm1Regs.CMPB = 600; // Compare B = 600 TBCLK counts EPwm1Regs.TBCTL.bit.CTRMODE = 0; // UP_MODE EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLK EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.AQCTLA.bit.PRD = 1; // AQ_CLEAR; EPwm1Regs.AQCTLA.bit.CAU = 2; //AQ_SET; EPwm1Regs.AQCTLB.bit.PRD = 2; //AQ_SET; EPwm1Regs.AQCTLB.bit.CAU = 1; //AQ_CLEAR; }
En el ejemplo, los dos preescalers se han dejado a 1, y el registro TBPRD se ha puesto a 1200, por lo que 60MHz/1200 = 50kHz de frecuencia contador. Se ve también que el contador está configurado en UP_MODE, por lo que la frecuencia del contador corresponderá con la frecuencia del PWM. Y en este caso solo se ha configurado un comparador para las dos salidas, de esta forma las dos salidas están relacionadas, y si nos fijamos una va justo al contrario que la otra, por lo que la salida serán dos señales PWM complementarias, como se ve en la siguiente figura.
Como veis, en el caso de estos DSP, es bastante más sencillo asignar valores al ciclo de trabajo que por ejemplo en los PIC18, así que un ejemplo un poco más completo podría ser el de asignar el valor del ADC que obtuvimos en la entrada anterior al PWM, de forma que hagamos un sencillo control proporcional. Para ello, en el bucle principal debemos añadir las siguientes líneas:
while(1) { Duty1B = AdcResult.ADCRESULT1 >> 2; EPwm1Regs.CMPA.half.CMPA = Duty1B; }// while
Como el conversor es de 12 bits, obtenemos una salida máxima de 4096, que desplazada 2 posiciones a la derecha nos da una salida máxima de 1024. Ese valor lo asignamos directamente al comparador y podemos obtener un ciclo de trabajo máximo del 85%.
Esto es solo una parte de lo que se puede hacer con este módulo, pero por ahora será suficiente para hacer varios montajes que he pensado.
No hay comentarios:
Publicar un comentario