Mostrando entradas con la etiqueta TMS320. Mostrar todas las entradas
Mostrando entradas con la etiqueta TMS320. Mostrar todas las entradas

domingo, 25 de mayo de 2014

Puente en H. Control (III)

Una vez hemos visto y entendido el hardware que forma el puente en H o puente completo llega la hora de preparar un programa para poder controlar todo lo bien que podamos la respuesta del puente completo.
Lo primero es elegir el microcontrolador que vamos a utilizar, y en esta ocasion he elegido uno de Texas Instruments, el TMS320f28027. El uso de este microcontrolador va a tener muchas ventajas, la primera de ellas es su potencia, ya que funciona a 60MIPS. La segunda de las ventajas es que, utilizando el Launchpad  C2000 tenemos este microcontrolador integrado en una placa de desarrollo, junto con un depurador por un precio de 14 euros.

Otra de las opciones que tuve en mente es utilizar un PIC de 8 bits. En concreto podría haber utilizado alguno de los que tienen módulos ECCP como el 18f2550 o el 18f14k50. El problema de estos es que no hay posibilidad de realizar una modulación como necesito, ya que estos módulos conmutan solo uno de los transistores de la rama, mientras que lo ideal es conmutar los dos de forma inversa. Esta posibilidad si que la tienen los DSPIC o los PIC24, pero no tengo ninguna placa de desarrollo que me facilite su montaje.
El programa que he escrito es algo más complicado de lo que acostumbro a poner en el blog habitualmente, pero aún así no creo que tengáis problema en entenderlo. Una novedad importante que hay en el código es que he utilizado el formato numérico en coma fija que proporciona Texas Instruments a través de la librería IQmath. Utilizando este formato numérico es mucho más sencillo agregar filtros o reguladores, ya que estos funcionan todos con la librería IQmath, de forma que no habría que hacer cambios de formato numérico a la hora de agregar estos al proyecto, directamente la salida del regulador la podríamos llevar a la variable que ajusta el ciclo de trabajo del puente. La función que establece el ciclo de trabajo está preparada para aceptar ciclos de trabajo entre -1 y 1, con una resolución de 1/2^24.
A continuación tenéis los archivos modpwm.c y modpwm.h para utilizar con estos microcontroladores y para controlar cualquier puente completo.

Espero que os sirva aunque sea de referencia para poder exportarlo a cualquier otro microcontrolador.

domingo, 4 de mayo de 2014

Puente en H. (I)

Cuando hablamos de control de motores, a cualquier aficionado o profesional a la electrónica, lo primero que le viene a la cabeza es la topología en puente completo o puente en H. Con esta topología a partir de una tensión simple, es decir entre 0 y VDC, podemos aplicar a nuestra carga tensiones que van desde -VDC hasta VDC, lo cual es muy importante a la hora de poder controlar un motor, ya que su sentido de giro depende del sentido de la corriente que lo atraviesa. En este blog ya he hablado del puente en H para controlar motores, en concreto hablé de el aquí, pero en ese momento el motor que quería controlar era muy pequeño, y por eso opté por una configuración OnChip. Esto funciona perfectamente para motores de hasta 1 amperios, ya que con controladores como el L298 no tenemos que diseñar el hardware, ya que va todo implementado en el interior, tanto drivers como la etapa de pequeña potencia, pero... ¿que sucede cuando queremos más potencia?, o un problema más grande, ¿que pasa si necesitamos realizar un control con el que necesitamos controlar cada transistor por separado?, en el caso de L298 eso es imposible, ya que se controla cada semi-rama del puente con un único pin. Estos dos inconvenientes que tiene este integrado se han ido subsanando a medias con el paso del tiempo, ya que las nuevas tecnologías utilizadas en los procesos de fabricación de los transistores permiten que una etapa integrada en un IC pueda dar corrientes de hasta 12 amperios (tecnología NexFET), como el el caso del DRV8432 de Texas Instruments. Este integrado si que nos permite controlar cada semiconductor por separado, lo cual nos abre la posibilidad de utilizar todos los tipos de control que existen, pero aun así seguimos teniendo una limitación en la potencia que podemos obtener, además de la desventaja de tener todo integrado en un mismo IC, de forma que si este deja de funcionar por cualquier motivo, hay que cambiar el integrado completo. La solución a estos problemas, pasa por diseñar nuestro sistema con componentes discretos, de forma que, en primer lugar, podamos dimensionar los componentes de la forma que mejor nos convenga, y, en segundo lugar, podamos verificar el correcto funcionamiento de cada una de las partes de nuestro sistema, y en el caso de que algo falle, podamos sustituir simplemente el componente dañado, de forma que abaratamos las reparaciones. Esta opción es sin duda la mejor si queremos diseñar un prototipo.


Y eso mismo es lo que he hecho. Al mismo tiempo que diseñaba la fuente SEPIC para el MPPT, diseñé un puente completo para 4 transistores MOSFET de canal N. Como realimentaciones de la placa tenemos la tensión del bus de continua, tensión en cada uno de los terminales de salida, y corriente por cada una de las ramas del puente. Con estas medidas tenemos el sistema completamente monitorizado. Como se ve en la imagen, en la placa hay 4 condensadores que aseguraran, en la medida de lo posible, que la tensión del bus de continua sea estable. Para monitorizar las corrientes por las ramas, existen 2 resistencias de 0.1 ohmios y 1W que, a través de un amplificador operacional, nos devuelve la corriente en cada una de las ramas. Las medidas de las tensiones se obtienen a partir de divisores de tensión.


El disparo de los transistores MOSFET se hace con los drivers UCC27201 de Texas Instruments. Este driver servirá para disparar tanto la parte alta como la parte baja de una rama formada por dos transistores de canal N. El disparo de la parte baja no presenta problema, ya que el surtidor del MOSFET está llevado a masa, por lo que la tensión puerta-surtidor tiene una referencia de 0V. En el caso de la parte alta, el surtidor no está llevado a masa, sino al punto intermedio de la rama, por lo que la tensión que hay que aplicar a la puerta, la tensión puerta-surtidor debe ser la del punto medio mas la tensión de disparo, y esto se puede conseguir de varias formas, aunque la más sencilla es mediante la elevación de la tensión de puerta por medio de un circuito de bootstrap, y esto es lo que encontramos en el driver UCC27210, al cual solo hay que añadir un condensador para que funcione correctamente.
En un principio he hablado de utilizar este circuito para el control de motores, y es cierto que esta es una de las aplicaciones más comunes, pero ni de lejos la única, y es que esta topología está presente en muchos equipos de electrónica de potencia, ya sean inversores, fuentes conmutadas o rectificadores controlados, por lo que lo voy a poder utilizar bastante. Aquí tenéis una imagen en la que le he añadido un filtro LCL y mediante un DSP genero una señal senoidal de 50Hz para la implementación de un inversor.


El controlador que he utilizado para esta prueba ha sido el Launchpad C2000 de Texas Instruments, aunque se puede utilizar cualquier microcontrolador que nos permita obtener 4 señales PWM, como por ejemplo los DSPIC o los ARM Cortex. 

domingo, 2 de febrero de 2014

BOOSTXL-DRV8301 y los transistores NEXFET.

Hola a todos!! En esta entrada os quiero hablar de otro de mis regalos de reyes (esta vez no auto-regalo, sino que ha sido cosa de mi novia), y es uno de los últimos Boosterpacks oficiales de Texas Instruments para el Launchpad de la familia C2000, el BOOSTXL-DRV8301.


La placa recibe el nombre del driver que lleva montado, el DRV8301. Mediante este driver podemos atacar a las puertas de 6 transistores MOSFET de forma que podemos controlar 3 semiramas, compuestas por dos transistores cada una,  para alimentar motores BLDC. Aunque este es el propósito principal de la placa, la realidad es que tenemos 3 semipuentes que podemos controlar como nosotros queramos, ya sea para controlar motores de corriente continua, o diseñar un inversor de baja potencia para alimentar una carga en alterna. 
Además de la parte de potencia, la placa también cuenta con una instrumentación muy completa que incluye la medida de la corriente por cada una de las ramas, la tensión del bus de continua y las tensiones en cada una de las fases. 
En cuanto a la potencia que podemos obtener es de hasta 60 vatios, ya que la tensión del bus de continua se regula mediante un conversor tipo BUCK para mantenerla estable a 6 voltios, y la corriente que con capaces de conducir los transistores es de 10 amperios, aunque puede soportar hasta 14 amperios de pico, y esto es mucha corriente si tenemos en cuenta que cada transistor no ocupa mas de 5mm x 6mm.
Para hacer posible, Texas ha utilizado transistores que han sido diseñados con la tecnología NEXFET. Estos transistores viene heredados de los transistores utilizados para radio frecuencia, los cuales reducen al mínimo sus capacidades internas, por lo que las frecuencias de conmutación a las que pueden trabajar son muy elevadas (las recomendadas son de 200kHz hasta 1MHz). Además, al tener también las características de los transistores MOSFET anteriores (flujo vertical de la corriente), estas dos características unidas hacen que estos pequeños puedan soportar corrientes de mas de 100 amperios.

Pero lo que para la corriente es una ventaja, no lo es tanto para la tensión, de ahi que estos MOSFET no puedan soportar grandes tensiones drenador-surtidor.
Podéis encontrar más información sobre la tecnología NexFET aquí y aquí. 
En las próximas entradas iré alternando entre la Intel Galileo, y esta nueva placa.

sábado, 2 de febrero de 2013

Módulo PWM en TMS320.

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.

lunes, 10 de diciembre de 2012

Lectura analógica en TMS320f28027

Como ya comenté en entradas anteriores, compré hace un par de meses una placa de desarrollo de Texas Instruments la cual lleva un DSP (Procesador digital de señal), de la familia c2000, en concreto lleva un f28027. No es uno DSP de los más potentes pero no está nada mal, ya que lleva en su interior un procesador de 32 bits funcionando a 60 MIPS. El punto más fuerte de este tipo de procesadores es la parte del conversor analógico-digital, ya que este DSP, sin ser de gama alta ni mucho menos lleva un CAD de 12 bits que nos permite conversiones en 6 ciclos de reloj, lo que nos da una velocidad de 10Msps, recordemos que los PIC más potentes nos dan 1,3Msps para conversiones de 10 bits, mientras que si queremos conversiones a 12 bits la velocidad baja hasta los 500ksps.
El módulo ADC de los DSP, a parte de la alta velocidad y la gran resolución nos permiten hacer hasta 2 muestras diferentes, aunque solo cuente con un CAD. Esto es posible ya que cuenta con dos circuitos de muestreo y retención, o sample and hold. Esto es muy útil por ejemplo para calcular potencias instantáneas, ya que podemos, en un momento dado medir la corriente y la tensión sin que haya diferencia de tiempo entre ambas.
Otra de las características del CAD de los DSP de texas, es que pueden hacer lecturas de forma secuencial. Esto es, existe una pila en la que nosotros ponemos por orden los canales que vamos a leer, por ejemplo, en primer lugar leeremos el canal 5, después el canal 7, después el canal 4…, cada uno de estos puede tener una señal de disparo diferente, o todos la misma, si por ejemplo los canales 5 y 4 tienen la misma señal de disparo, o trigger, el conversor leerá el canal 5 y después el 4, saltándose el 7. Esto ocurre cuando no hemos seleccionado la lectura simultánea, si está seleccionada esta, las conversiones van siempre en parejas simultáneas, es decir, el que hemos puesto en la posición 1 de la pila, con el que hemos puesto en la 2, el de la 3 con la 4 y así sucesivamente. Para poder realizar lecturas simultáneas, hay que tener en cuenta que los canales que hayamos elegido deben pertenecer a circuitos sample and hold diferentes, esto es por ejemplo que en la posición 1 de la pila esté el canal A1, y en la posición 2, el canal B4, donde A y B son cada uno de los circuitos de sample and hold de nuestro DSP.
He hablado antes de las señales de trigger, en estos DSP, como sucede en los DSPic y PIC32, la señal que inicia la conversión del conversor puede ser bien el módulo PWM, una señal de cualquier temporizador, el seteo manual de un registro, etc, y cuando esta señal se active, el conversor iniciará la conversión para aquellos canales cuyo trigger se haya activado.
El último punto que queda por configurar en el CAD de los DSP, es la ventana de muestreo que queremos para nuestra aplicación. Como he dicho, el conversor de 12 bits necesita al menos 6 ciclos de reloj para realizar la conversión, pero no siempre será suficiente con 6 ciclos, ya que habrá sensores, que por su alta impedáncia de salida, hagan que nuestro conversor con tan solo 6 ciclos no haya podido muestrear correctamente la tensión, por lo que este tiempo es configurable desde 6 ciclos hasta 64 ciclos. Dicho todo este, solo queda empezar con el código.
Para centrarnos solo en la parte que nos interesa, la parte de la inicialización del DSP la he realizado mediante las librerias que ofrece texas, por eso podeis ver en el código una instrucción que es DeviceInit(), la cual inicializa oscilador y PLL para trabajar a una frecuencia de 60MHz, así como los 4 leds y el pulsador de la placa. En cuanto a la  inicialización del módulo CAD es la siguiente:
void InitADC(){

 EALLOW;
 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC
 AdcRegs.ADCCTL1.bit.TEMPCONV = 1;
 EDIS;
 ADC_SOC_CNF(ChSel, TrigSel, ACQPS, 1, 0);

}
Lo primero que hacemos es llevar el reloj al modulo DAC mediante el registro ADCENCLK, después, y solo para probar que todo funciona bien, hemos conectado por software el sensor de temperatura interno del DSP con el canal A5, seteando el registro TEMPCONV. Una vez hecho esto nos queda configurar la adquisición del conversor, para ello he utilizado una instrucción que nos da texas, en la que le tenemos que meter, en primer lugarel parámetro ChSel, el cual le dice el orden de canales que queremos leer, el segundo es TrigSel, mediante el cual, para cada canal seleccionamos la señal de trigger que queremos, siendo 0 para seteo por software, 1 para el temporizador 0, 2 para el temporizador 1… como está descrito en el datasheet, el siguiente parametro es la ventana de muestreo, tambien para cada canal por separado, el siguiente parametro es el nivel de interrupción, es decir, cuantos canales queremos leer antes de que salte la interrupción, y por ultimo, el modo, en el cual podemos elegir entre lectura continua (mode = 0), lectura start – stop (mode = 1) en la cual leemos cuando se dispara el trigger. Los vectores quedarían de la siguiente manera.
// ADC configuration variables
int16 ChSel[16]={5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int16 TrigSel[16]={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int16 ACQPS[16]={10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10};
Donde vemos que se va a convertir el canal A5, que tendrá un trigger mediante T0, los demás, tendrán un trigger manual, por lo que si no lo activamos, nunca se leerán. La configuración del temporizador 0 es la que sigue.
void InitT0(){

 asm(" eallow"); //permiso escritura en memoria

 SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // llevamos el reloj al timer0

 CpuTimer0Regs.PRD.all = periodo; //Cargamos el valor del periodo para 100us
 CpuTimer0Regs.TCR.bit.TRB = 1; //cuando el timer llega a 0, se precarga el valor de TPR
 CpuTimer0Regs.TCR.bit.TIF = 1; //borramos el flag del timer.

 asm(" edis");

}
La variable periodo está en principio en 6000, y los preescalers están ambos en 1, nos da un periodo de 100us.
Una vez inicializados los dos módulos solo queda escribir el main, el cual es muy sencillo.
//main
void main()
{

// CONFIGURACIÓN INICIAL.
 DeviceInit();
 InitT0();
 InitADC();
  //loop
 while(1) {

  if(CpuTimer0Regs.TCR.bit.TIF == 1) { //si el temporizador ha llegado a 0...
   sampleTemp = AdcResult.ADCRESULT0;
   CpuTimer0Regs.TCR.bit.TIF = 1;
   CpuTimer0Regs.PRD.all = periodo;
  } //if
  GpioDataRegs.GPADAT.bit.GPIO1 = led;
 }// while
}//main
Con este tendremos nuestro DSP muestrando la señal analógica proveniente del sensor de temperatura interno cada 100us, la cual leemos desde el registro AdcResult.ADCRESULT0, y almacenamos en sampleTemp.

martes, 9 de octubre de 2012

Hola Mundo. TMS320F28023

Como comenté en una entrada anterior, por diversos motivos he de empezar a programar microcontroladores de la serie TMS320 de Texas Instruments. Después de varios días de lecturas e intentos tengo preparado y funcionando un pequeño programa que controla entradas y salidas digitales.
Algo que me ha llamado la atención es la controlabilidad que tiene el micro, es decir, casi todo puedes elegirlo, desde a que periféricos llega la señal de reloj, modos de bajo consumo, establecer áreas de reloj… pero todo esto no es gratis, sino que incrementa la dificultad de la programación, ya que el número de registros es enorme. En este ejemplo, a pesar de solo utilizar entradas y salidas digitales (GPIOs General Pourpose Input Output), debemos seleccionar de una forma correcta el WDOG, el oscilador utilizado, el PLL, incluso la multiplexación de los puertos, ya que, en estos micros debemos seleccionar donde está conectado cada pin entre un máximo de 3 periféricos, es decir, si utilizamos un pin para la salida de PWM debemos decírselo, al contrario que pasaba con PIC que es el micro el que lo conecta. En concreto, cada puerto de 32 bits tiene los siguientes registros:
  • GPxMUX1 y GPxMUX2: Controlan la multiplexación del pin.
  • GPxDIR: En caso de elegir GPIO, selecciona si el puerto es de entrada o salida, como el registro TRIS de los PIC.
  • GPxPUD: Seleccionamos si queremos resistencias de pull-up o no.
  • GPxDAT: Registro de estado del puerto, podemos tanto escribir como leer, aunque no es recomendable escribir desde este registro, ya os explicaré porque.
  • GPxSET, GPxCLEAR, GPxTOGGLE: Registros para poner un pin a 1 (SET), ponerlo a 0 (CLEAR) o voltearlo (TOGGLE).
Con estos registros podemos controlar el puerto por completo. Cada registro de los que he nombrado, al igual que pasaba con los PIC, está formado por estructuras, por lo que podemos controlar cada pin por separado.
Cada registro, forma parte de un gran grupo de registros como son GpioCtrlRegs, donde están los registros de control, y el GpioDataRegs, donde se encuentran los registros de datos.
El programa que he hecho, espera a que se pulse un pulsador situado en el GPIO12, y cuando este se pulsa y se suelta, se voltea el bit GPIO0.
/******************************************************
 * HOLAMUNDO EN C2K LAUNCHPAD
 *     P.TRUJILLO
 * OCTUBRE 2012

 *******************************************************/

//includes

#include "F2802x_Device.h"

//main
void main()
{

// CONFIGURACIÓN INICIAL.

      asm(" eallow");

      SysCtrlRegs.WDCR = 0x68;    //WDOG deshabilitado

      SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;    //activamos el oscilador interno 1
      SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 0;
 
      SysCtrlRegs.PLLSTS.bit.OSCOFF = 0; //activamos el PLL
      SysCtrlRegs.PLLSTS.bit.PLLOFF = 0;
      SysCtrlRegs.PLLCR.bit.DIV = 10;
      SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;    //FOSC = 10 * 10/2 = 50MHz.

      //LED

      GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
      GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
      GpioDataRegs.GPASET.bit.GPIO0 = 1;

      //PULSADOR

      GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
      GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
      GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;

      asm(" edis");

  //loop
    while(1) {
        if(GpioDataRegs.GPADAT.bit.GPIO12 == 1) {
            while(GpioDataRegs.GPADAT.bit.GPIO12 == 1);
            GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
        } //if
 
      }//while
 
    }//main

En las demás entradas os intentaré ir explicando cada parte del código, pero con esto espero que se os despierte la curiosidad sobre estos potentes micros de 32 bits.

miércoles, 19 de septiembre de 2012

Empezando con Texas Instruments.

Hasta ahora, en este blog, tan solo he hablado y programado de microcontroladores de microchip, desde líneas básicas como los PIC18 hasta las más avanzadas como los PIC32, pero por diversos motivos, entre otros que en la industria se encuentran muchísimo, tengo que aprender a utilizar micros de otro gigante de la electrónica como es Texas Instruments.
Hace ya un año os conté que había adquirido un módulo muy barato con un microcontrolador de TI, el MSP430, el cual llevaba el programador y el depurador integrado, esa entrada la podéis leer aquí. La verdad es que desde que lo recibí, y lo trastee un poco durante una semana no le he vuelto a hacer caso, y lo tenia ahí un poco apartado, pero hace ya 2 semanas que lo desempolvé y comencé a aprender a programar este tipo de microcontroladores, que, aunque su programación se basa, al igual que en microchip, en dar valores a los distintos registros, la arquitectura de estos (osciladores, timers, interrupciones…), es bastante diferente, y eso que se trata de un micro de gama baja con pocos periféricos, si nos vamos a micros grandes, como la familia TSM320 la cosa supongo que cambiará un poco más, y es justo esta familia la que “debo” aprender a programar, ya que es la que me piden para realizar un proyecto, y como para aprender a programar se necesita en primer lugar un dispositivo que programar, me enteré de que TI había sacado placas nuevas de bajo precio de la familia LaunchPad (misma familia de placas que la del MSP430), en concreto una que monta un micro TMS320C28027 por un precio mas que razonable, 14 euros. Este micro es de 32 bits y funciona a 60MIPS y no tiene mucho que envidiar a los famosos DSP de texas, ya que la mayor diferencia es que este no lleva FPU, pero un micro de 32 bits funcionando en coma fija sigue siendo un muy buen micro. Como en el caso del MSP430, esta placa viene con depurador y programador USB integrada.
La placa, como la anterior viene muy bien presentada, y se programa con la suite de TI Code Composer Studio en su versión 5 y existen varios Booster Packs como complemento de la placa.
Una vez estaba en a página de TI vi que había otra placa también de la serie LaunchPad en promoción por solo 4,99 dolares que al cambio son unos 3,5 euros por lo que la añadí también a mi pedido. Esta placa viene con un micro de la familia Stellaris con una arquitectura ARM Cortex M4F, como las anteriores con programador y depurador integrado, y me parece una oportunidad muy buena y barata de obtener un sistema basado en ARM, el problema es que ese precio tan solo estaba la semana pasada, y actualmente tiene un precio de 13 dolares, que aun así es muy barato para ser lo que es.
Y por ahora me despido y espero enseñaros pronto mis primeros programar con los micros de TI.