jueves, 24 de enero de 2013

Control de Velocidad de un motor CD mediante MSP430+Bluetooth

Introducción
En este proyecto muestro como desarrollar un control de velocidad para un motor pequeño de CD hacia un solo sentido mediante un PWM. Dicho PWM es generado por el TIMERA0 del microcontrolador MSP430G2553 que viene por defecto con nuestro LaunchPad de TexasInstruments. La asignación de la velocidad deseada se lleva acabo mediante ordenes vía Bluetooth desde una aplicación que sea compatible con comunicación serial  a 9600 baudios, en este caso lo haremos con una app que simula una terminal que se enlaza con un módulo Bluetooth HC-05 el cual se comunica con nuestro microcontrolador mediante el protocolo UART. La fase de potencia a la salida del microcontrolador es llevada acabo mediante un circuito integrado L293D el cual es un circuito de Puentes H.

Wiki (Opcional):

Requerimientos
Para poder llevar acabo este proyecto necesitamos:

Procedimiento
El circuito
El circuito eléctrico está compuesto por:
  1. Fuentes de alimentación eléctrica. En mi caso uso una fuente de poder de una PC vieja que resultaperfecta para éste proyecto y la mayoría dado que unas de las posibles salidas de dicha fuente de alimentación son +-3.3V, +-5V, etc. y si recordamos nuestros microncontroladores de la familia MSP430 son ultra-low power por lo que pueden ser alimentados desde 1.8V hasta 3.4V aproximadamente, mientras el Bluetooth que yo uso está montado en una base con pines para ser alimentado entre 3.6V y 6V, el circuito L293D puede ser alimentado a 5V para el funcionamiento del mismo mientras como fuente de alimentación para los motores puede variar hasta 36V. En este caso solo usaremos la misma fuente de alimentación de 5V dado que el motor usado es de ese voltaje.
  2. El módulo Bluetooth. Éste componente estará enlazado inalámbricamente con el celular o computadora con la que se desee controlar el motor DC. De manera alámbrica está conectado con el microcontrolador mediante sus canales TXD y RXD (véase que es el protocolo UART y cómo funciona). El pin del módulo Bluetooth denominado como RXD debe conectarse con el pin 4 (UCA0TXD) del microcontrolador, mientras el pin TXD del Bluetooth debe conectarse al pin 3 (UCA0RXD) del microcontrolador.
  3. Microcontrolador MSP430G2553. Dicho microcontrolador es el que trae a la fecha el antiguo LauchPad (A la fecha, hace unos días salio una versión mjorada con otro microcontrolador de la misma familia, ya hablaremos de éste en cuanto reciba mi LaunchPad). Éste microcontrolador es alimentado en un rango de voltaje bajo, para éste caso 3.3V el cual debe ser suministrado en el pin 1. La tierra o GND (también conocida para algunos como el menos de la alimentación) es conectada en el pin 20 de dicho microcontrolador. Una nota muy importante que hay que considerar es que el pin 16 o RESET, debe estar puesto en alto (conectado al voltaje positivo de la alimentación) dado que si está a tierra o está flotado, el microcontrolador no trabajará, esto se debe que como todos los microcontroladores, éste es el pin RESET, o sea que con éste pin podemos reiniciar el programa cuando queramos poniendolo en bajo (conectándolo a tierra) y vlviendo a ponerlo en alto.
  4. El integrado L293D. Éste circuito contiene dentro 4 drivers puente H qu pueden ser usados en tres modos diferentes como lomuestra su datasheet o la imágen de abajo. Éste circuito se alimenta para su funcionamiento en el pin 16 a 5V, mientras que para el suministro de voltaje para el motor se realiza en el pin 8 y soporta hasta 36V y 600mA nominales. Para éste caso usamos la configuración de controlar un solo motor, por lo que solo debe conectarse la parte encerrada en un cuadro verde y por supuesto la alimentación de 5V alos pines 8 y 9. El pin 9 sirve para activar/desactivar dos de los drivers como se muestra en la imágen. Se debe conectar el pin 15 de éste circuito con el pin de salida del microcontrolador 14, pues en éste se pone la salida el PWM en nuestro programa. 
 

 
La programación
La programación de nuestro Launchpad y microcontrolador se realiza en el software gratuito CodeComposerStudio distribuido por el mismo TexasInstruments (del cual dejé un enlace arriba). Abriendo nuestro entorno de desarrollo hacemos click en File->New->CCS Project como se muestra a continuación.


Después de realizar esto aparecerá una ventana donde debemos ingresar los parámetros para nuestro nuevo proyecto, en el cual debemos especificar:
  • Nombre: El que gusten (El que le puse se muestra en la imagen).
  • Output type: Executable
  • Family: MSP430
  • Variant: MSP430G2553
  • Connection: TI MSP430 USB1 (Nuestro LaunchPad)
  • Y seleccionamos "Empty Grace (MSP430) Project"


Al final solo presionamos "Finish" y una vez creado nuestro proyecto, aparecerá la siguiente ventana de bienvenida, donde nos interesa el archivo "main.cfg" y dentro de éste, la subpestaña "Device Overview", hacemos click en ésta.


Después de realizar lo anterior, nos aparece un diagrama de bloques sobre los módulos que componen a nuestro microcontrolador. Aquellos bloques en azul son los que podemos modificar mientras los que están de blanco son aquellos que no.
Los módulos que modificaremos serán el voltajes de alimentación, El Timer0_A3, el USCI A0 y como opción el bloque de reloj, aunque no es necesario dado que nuestro timer trabaja con un reloj secundario. Para modificar algún módulo solo es necesario hacer click en él y nos abrira una pestaña inferior en la que debemos ingresar los parámetros. En este punto hay que aclarar que el suministro de voltaje que le daré al microcontrolador fuera del LaunchPad será de 3.3V que es uno de los voltajes de una fuente de poder de computadora la cual yo uso y otro punto importante es que el Pin RST/NMI (Reset) debe ser alimentado con el voltaje de alimentación dado que si se pone a tierra o se deja flotando, el microcontrolador NO funcionará.


Si hacemos click en el módulo del reloj, aparece la siguiente ventana en la que podemos modificar la frecuencia del reloj principal, en mi caso lo deje en 1MHz. Guardamos y vamos a la ventana principal del Overview (la imagen de arriba).


Entramos a la configuración del Time0 y nos aparece una ventana que luce como la imagen de abajo. En las opciones superiores de dicha ventana solo nos aparece la opción "Overview" dado que dicho módulo por default está inactivo. Para activarlo solo hay que hacer check en el checkbox superior a la izquierda y esperamos a que cargue las demás opciones.


Podemos notar ahora que ya aparecen más opciones arriba y la que nos interesa es "Basic User", hacemos click en ésta y procedemos a configurar nuestro microcontrolador como sigue:


En la primer sección seleccionamos "PWM Mode" y "TA0.0 Output OFF". Dadoque trabajaremos a una frecuencia en el PWM de 100Hz, configuramos el Periodo del timer en 10milisegundos.
En la segunda sección seleccionamos "PWM Duty Cycle" y "P1.6/TA0.1", esto significa que el PWM será ajustado determinando el Duty del mismo y que deseamos la salida en el pin P1.6, donde recordemos el LaunchPad tiene un LED de salida en este pin. La elección de éste pin puede servir para el debugger.
En el Duty Cycle se debe ingresar el porcentaje del ciclo de trabajo en el que comenzará el programa, en este caso lo puse a 2%, pero dado que no es exacto, Code Composer lo aproximó a 1.7%, explicaré más adelante el por qué.
A continuación guardamos, regresamos al Overview General y ahora entramos el módulo USCI_A0.


Nos vamos a Basic User y como primer opcíón debemos elegir el protocolo de comunicanión que será usado, en ese caso es UART. Después de elegir dicha opción, proseguimos a configurarlo de la siguiente manera.


Debemos activar los pines de entrada/salida del módulo UART que por default están desactivados. En éste caso solo necesitamos el pin de entrada, dado que no enviaremos algún dato de regreso, sin embargo estableceremos los dos. Configuramos la opción "Baud" a 9600 bps que es la frecuancia o velocidad de comunicación que trae por defecto nuestro módulo Bluetooth en su puerto UART. y por último activamos la interrupción de entrada haciendo check en el checkbox correspondiente.

Despés de terminar de configurar los módulos de nuestro microcontrolador mediante Grace, proseguimos a guardar todo y construir nuestro proyecto haciendo click en el icono de "Build" con forma de martillo arriba del explorador de proyectos, esperamos a que termine y si no nos equivocamos no marcará ningún error.


Una vez terminada la compilación, dos son los archivos que nos interesan, por una parte el archivo Timer0_A3_init.c el cual contiene los parámetros para la configuración y modificación del funcionamiento del PWM y el archivo InterruptVectors_init.c que es el código fuente de las interrupciones y que es ahí donde programaremos el comportamiento de nuestro microcontrolador a las entradas que le enviemos.


Primero abrimos Timer0_A3_init.c y observamos los dos registros que nos interesan, por un lado encontramos el registro TA0CCR0 el cual tiene asignado un valor de 119. Éste registro contiene el número total de unidades que componen a nuestro ciclo completo mientras que el registro TA0CCR1 contiene la cantidad de unidades del ciclo completo en el cual la salida está en alto. De este modo 119 unidades son el 100% del periodo, así que si queremos un Duty del 50% necesitamos asignar a TA0CCR1 el valor de 59.5(aproximarlo a un entero dado que no podemos ingresar fracciones). Si recuerdan cuando configuramos el Duty en el módulo comente que explicaría la razón por la que después de haber puesto un Duty inicial del 2% nos lo había cambiado al 1.7% y esto se debe a que como 119 unidades son el 100%, el 1% serían 1.19 unidades, como deseamos el 2% multiplicamos 2*1.19=2.38 unidades y como anteriormente había dicho solo pueden ser ingresadas unidades enteras por lo que se redondea a 2 unidades. Si dividimos 1.19/2 obtenemos así el porcentaje de 1.68% aproximado a 1.7%.
Resumiendo esta parte, las dos cosas que debemos rescatar son que:

  1. En TA0CCR0 están guardadas las unidades que representan el 100% del ciclo total y que
  2. En TA0CCR1 están guardadas las unidades que representan al Duty (estado en alto en la salida)

Por lo anterior se concluye que para modificar el Duty de nuestro PWM y por consiguiente la velocidad del motor, necesitamos modificar el registro TA0CCR1 lomitándonos por el valor del registro TA0CCR0.


A continuación abrimos el archivo de  la interrupciones e introducimos en la función de interrupción de entrada, el código que se muestra a continuación.


En este código estamos declarando una variable tipo caracter llamada "car", a la cual le asignamos el valor en el bufer de entrada para después crear una función switch para determinar que dato está entrando y que debe realizar el microcontrolador en base a esta entrada.
En orden ascendente y de izquierda a derecha en un teclado qwerty, las teclas de la "q" a la "p" tienen asignados valores que auentan de 10% en 10% para aumentar o reducir la velcidad del motor, de este modo la letra "q" significa que el motor trabajará a un Duty del 10%, la letra "w" a un Duty del 20% o la letra "p" al 100%. Habiamos comentado que las unidades totales del ciclo son 119, por lo que el 10% es un aproximado de 12 unidades. Dichos valores son asignados al registro TA0CCR1 que como habíamos mencionado antes, controla el Duty.

Después de esto solo necesitamos crear un bucle infinito en el código principal que es main.c.


Por último sólo necesitamos construir nuevamente nuestro proyecto haciendo click en el icono del martillo como anteriormente o podemos hacer click derecho en nuestro proyecto en el Explorador de Proyectos y seleccionar "Build Project", en general recomiendo esta forma dado que si tienes más proyectos abiertos y en los cuales estás trabajando, Code Composer puese compilar otro proyecto en lugar del que deseas.


Al final como ya sabemos, con nuestro LaunchPad conectado hacemos click en Debugg que es el ícono al lado del martillo que tiene forma de  escarabajo y esperamos a que cargue el programa a nuestro LaunchPad, de ahí podremos o debuggearlo o simplemente detener el debugger, desconectar el LaunchPad, sacar el microcontrolador del LaunchPad y comenzar a probar en nuestro protoboard.


Si deseas ver el resultado, al final está el video.


En el video se muestra desde como programar el microcontrolador y como debuggearlo hasta la implementación en un protoboard. 


Recursos Adicionales
Video
En éste video se muestra el proceso de programación y el resultado ya implementado en un protoboard.



Se agradece cualquier comentario o duda.