El microcontrolador ARM TM4C123GH6PM tiene interfaces para encoders, salidas PWM bus CAN, USB, I2C, etc. Estas capacidades hacen que el microcontrolador pueda ser usado en aplicaciones como: maquinas herramientas, control numérico computarizado, maquinas de corte, robots, procesos industriales, equipos para casa, medicina, energía, transportes, etc. En este articulo veremos su arquitectura, herramientas de desarrollo y su facilidad de programación.
Alfonso Pérez
(*) Para saber más sobre los microcontroladores ARM sugerimos la lectura del artículo MIC011S - EMPEZANDO A PROGRAMAR LOS MICROCONTROLADORES ARM (32 Bits) del mismo autor.
Microcontroladores ARM son construidos para ser usados en toda clase de aplicaciones y proyectos. Existen Microcontroladores ARM para ser usados en control de procesos y automatización industrial. Tal es el caso del microcontrolador TM4C123GH6PM de laSerie Tiva C, de Texas Instruments. Ver Figura 1. Vamos a describir sus características.
EL MICROCONTROLADOR ARM TM4C123GH6PM.
El microcontrolador TM4C123GH6PM cuenta con las siguientes características (Ver Figura 2):
CPU ARM Coter-M4F.
Frecuencia 80 MHz
Memoria de Programa de hasta 256 KBytes
Memoria RAM de 32 KBytets.
EEPROM de 2 KBytes.
Memoria ROM cargada con TivaWare.
RTC (Real Time Clock)
Timers.
Wachdog Timer.
4 Interfaces Serial Síncronas (SSI)
8 UART
SPI
I2C.
USB.
2 Controladores CAN.
Conversor Analógico para Digital de 12 bits (ADC).
2 Comparadores Analógicos
GPIOs con capacidad de interrupción.
Módulo de hibernación.
Módulos para depuración y seguimiento (Trace).
Bajo consumo, ideal para equipos a batería.
Entre las muchas aplicaciones, donde se puede usar este microcontrolador, se encuentran:
Control de movimiento.
Máquinas de corte.
Maquinas herramienta.
Automatización industrial.
Procesos industriales.
Robots.
Paneles de Acceso.
Interfaces Humanas.
Equipos de teste y medidas.
Módulos de comunicación.
Control de luz inteligente.
Transportes y vehículos.
Equipos médicos.
Sistema de energía.
Dispositivos de mano inteligentes.
La Figura 3 muestra el diagrama en bloques del microcontrolador TM4C123GH6PM. Podemos notar la CPU ARM Cotex-M4F, las memorias Flash, RAM, ROM, los GPIO, ADC, Comparadores Analógicos, Timers, UARTs, SPI, I2C, etc. Los microcontroladores ARM para tener mejor desempeño, usan varios buses para interconectar sus memorias y periféricos, pero en el diagrama de la Figura 4, se han omitido para facilitar el entendimiento. Gracias a las funciones y librerías que la Texas Instruments ha desarrollado y que entrega al programador en una librería de software (funciones o rutinas) llamadoTivaWare, estos buses son transparentes a la hora de programar.
ENCODER
El microcontrolador TM4C123GH6PM tiene 2 encoder incrementales de 2 canales, los cuales convierte desplazamientos lineales en pulsos. Monitoreando el número de pulsos y la fase relativa de las 2 señale, es posible seguir la posición, dirección de rotación y velocidad de un desplazamiento.
PWM.
PWM o Modulación del Ancho del Pulso (Pulse Width Modulation), son módulos generadores de onda cuadrada, donde una parte de la onda es controlada (duty cycle) para codificar una señal análoga. Normalmente se usan en fuentes de potencia (switching power) y control de motores.
CAN.
CAN (Controller Area Network) o es un bus serial para conectar a otros dispositivos, que normalmente leen sensores y controlan salidas (ECU o Elenctronic Control Unit). Este bus fue especialmente diseñado para ambientes donde hay ruido electromagnético.
NVIC
NVIC o Controlador de Interrupciones, es un dispositivo que habilita interrupciones en los pines de entrada del microcontrolador y en los periféricos, para que tan pronto como ocurra un evento, la CPU del microcontrolador sea notificada y la respectiva rutina sea llamada.
USB
USB o Bus Serial Universal (Universal Serial Bus), es un bus usado para comunicación con computadores o dispositivos portátiles que soporten este bus. Muy útil para configurar parámetros en el equipo o enviar datos a computadores.
TARJETA DE DESARROLLO.
La Texas Instruments ha creado un kit de desarrollo, de fácil uso, llamado EK-TM4C123GXL LaunchPad, con el cual podemos comenzar a programar el microcontrolador TM4C123GH6PM y testar sus múltiples periféricos y capacidades. La Figura 4 muestra una imagen de este kit. Podemos observar las varias entradas analógicas, GPIOs, UART, SPI, I2C, PWM, Timers, Entradas con Captura, etc. Los pines de la tarjeta, son un estándar, compatible con una serie de módulos diseñados para esta tipo de placas. Es importante estar atento y verificar si el modulo es cien por ciento compatible o si hay que hacer alguna modificación. La Figura 5 muestra los pines del microcontrolador TM4C123GH6PM, en donde podemos observar su rico set de periféricos.
En la Figura 6, podemos observar una aplicación práctica, para controlar un motor de paso bipolar (stepper motor). Es usado el driver de motor DVR8833, un circuito integrado con 2 puentes H, ideal para manejar motores. La dirección, velocidad, arranque y parada del motor, pueden ser controlados por los botones que hay en la tarjeta EK-TM4C123GXL.
HERRAMIENTAS DE PROGRAMACION.
Muchas herramientas de desarrollo o IDE (Editores y Compiladores) están disponibles para programar el kit, como: el IDE Code Composer Studio, el IDE IAR Embedded Workbench, el IDE Keil uVision. La Texas Instruments desarrollo librerías de funciones para facilitar el uso y programación del microcontrolador. A todas estas funciones o rutinas, la Texas Instruments le dio el nombre de TivaWare. Con la práctica veremos su fácil uso y utilidad, pues el programador no se tiene que preocupar con crear rutinas para controlar los periféricos. Así, el programador se puede concentrar en el aplicativo y ganar tiempo para terminar el diseño.
PROGRAMA EXEMPLO PARA PRENDER/APAGAR (BLINKING) UN LED.
Uno de los programas ejemplo más utilizados para microcontroladores, es encender y apagar (blinking) un LED. En las librerías ejemplo del microcontrolador TM4C123GH6PM, también encontramos este ejemplo para encender y apagar un LED.
int main(void)
{
volatile uint32_t ui32Loop;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
{
}
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);
while(1)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x1);
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x0);
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
}
}
Explicando el programa, podemos decir que la primera función que el programa llama, es main(). La siguiente línea de código, declara una variable de tipo entera llamada ui32Loop:
volatile uint32_t ui32Loop;
La siguiente línea de código, habilita el puerto F, para poder trabajar con él. Recordemos que en los microcontroladores ARM, todos los periféricos y puertos están deshabilitados por defecto:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
La siguiente línea de código, verifica si el puerto F está listo para poder trabajar con él; es decir, si ya estabilizo su voltaje y reloj (clock):
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
{
}
La siguiente línea de código, configura el pin 3, del puerto F como salida:
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);
La siguiente línea de código, es usada para que el programa siempre se repita, es decir entre en un loop infinito:
while(1)
La siguiente línea de código, es usado para colocar el estado del pin 3, del puerto F, para nivel alto (1 lógico):
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x1);
La siguiente línea de código es usada para retardar (delay) el programa por un tiempo y poder observar el parpadeo (blink) del LED:
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
La siguiente línea de código, es usado para colocar el estado del pin 3, del puerto F, para nivel bajo (0 lógico):
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0x0);
La siguiente línea de código es usada para retardar (delay) el programa por un tiempo y poder observar el parpadeo (blink) del LED:
for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
{
}
Las líneas de código que se encuentra dentro del while(1), se repite infinitamente y así el LED va a prender y apagar (blinking). Para compilar y editar el ejemplo anterior fue usado el IDE Keil. La Figura 7 muestra este entorno de desarrollo.
Otra ventaja de usar los microcontroladores TM4C123GH6PM, es su compatibilidad con el modelo de programación Arduino. La Texas Instrumental ofrece una IDE de desarrollo llamada Energía, la cual es muy parecida al IDE de Arduino. La Figura 8 muestra el IDE Energía, entorno de desarrollo para la tarjeta EK-TM4C123GXL. Es necesario instalar la tarjeta en el IDE; para hacer esto, vaya al menú: Herramientas->Placa->Gestor De Targetas. El siguiente es un ejemplo para encender y apagar un LED, usando el IDE Energia:
#define LED RED_LED
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}
Podemos observar que el programa es muy simple. Primero, en la función void setup(), se configura el pin del puerto para ser salida:
pinMode(LED, OUTPUT);
Luego, en la función del loop infinito, la salida del LED, se coloca a nivel alto (HIGH), con la siguiente línea de código:
digitalWrite(LED, HIGH);
Luego, retardamos por 1000 milisegundos (1 segundo), con la siguiente línea de código:
delay(1000);
Luego, se coloca a nivel bajo (LOW) la salida del LED, con la siguiente línea de código:
digitalWrite(LED, LOW);
Y luego, se vuelve a retardar por 1000 milisegundos (1 segundo), con la siguiente línea de código:
delay(1000);
Este código, el que se encuentra dentro de la función void loop(), se repite infinitamente y así el LED va a prender y apagar (blinking).
PROGRAMA EJEMPLO PARA ENVIAR DATOS POR EL PUERTO SERIAL (UART).
El siguiente es un programa ejemplo para enviar datos por el puerto serial. Este programa lo que hace es enviar la frase Hello, world! por la UART. Así, el programa comienza por configurar el clock de microcontrolador, configurar el puerto que usa la UART, configurar los pines usados por la UART, configurar el clock usado por la UART y configurar la velocidad de transmisión:
int main(void)
{
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
UARTprintf("Hello, world!\n");
while(1)
{
}
}
Vamos a explicar, lo que se hace dentro de la función main():
La siguiente línea de código, coloca el clock para correr directamente desde el cristal.
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
La siguiente línea de código, habilita el puerto que usa la UART:
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
La siguiente línea de código habilita la UART0:
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
Las siguientes líneas de código, habilitan los pinos de los puertos para ser usados por la UART0:
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
La siguiente línea de código, usa el oscilador interno de 16 MHz, como el clock fuente para la UART:
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
La siguiente línea de código, inicializa la UART:
UARTStdioConfig(0, 115200, 16000000);
La siguiente línea de código, envía la frase: Hello, world! por la UART:
UARTprintf("Hello, world!\n");
En la siguiente línea de código, el programa entra en un loop infinito que no hace nada:
while(1)
{
}
Como podemos observar, comenzar a programar un microcontrolador ARM TM4C123GH6PM es muy sencillo; esto también es válido para cualquier microcontrolador ARM de la familia Cortex-M.
EL MICROCONTROLADOR ARM TM4C129x.
Este microcontrolador es un TIVA C con mucho mas desempeño que el MSP432P401. El microcontolador TM4C129x es un ARM Cortex-M4F con Ethernet integrado, más velocidad de procesamiento 120 MHz, controlador para LCD, etc. La Figura 9 muestra un diagrama en bloques de microcontrolador TM4C129x. Para este microcontrolador la Texas Instruments diseño una placa (kit) de desarrollo llamada DK- TM4C129x y la Figura 10 muestra una fotografía de este kit.