viernes, 6 de junio de 2014

MSP430: Timer TA0 PWM Piano

En este capítulo vamos a trabajar con el módulo interno TimerA, en realidad, ya hay varios ejemplos de como trabajar con dicho periférico y es más, lo hemos estado usando como temporizador (una de sus funciones). Pero la causa de dedicarle un capítulo en exclusiva no es por la configuración que puede adoptar de temporizador, más bien es por otro tipo de configuración la cual, suele ser interesante a la hora de generar señales con una frecuencia determinada o dicho de otra manera más formal, generar una señal de salida modulada, en sus siglas anglosajonas: PWM.

Por lo tanto, este capítulo se basa en generar señales de salida con una anchura de pulso determinada usando para ello, el TimerA.

Y para ello, tenemos a nuestra disposición dos registros fundamentales:


  • TAxCCR0: Determina la anchura de la señal de salida.
  • TAxCCR1: Determina la modulación de dicha señal: 0%, 50%, ...., 100%


Con el par de registros arriba mencionados, podremos obtener bastantes tipos de señal de salida dependiendo de como configuremos los bits: OUTMODx.

Para ampliar y ver los tipos de señales de salida dependiendo de dichos bits y de la configuración del TimerA, aconsejo que se vea el apartado: 12.2.5 Output Unit del documento: slau144j.

El ejemplo que va tener el propósito de ilustrar como configurar el TimerA en modo PWM y generar las señales de salidas deseadas, consiste en simular las notas musicales de un piano. Se sabe que cada nota musical tiene asociada una frecuencia determinada tal y como se muestra en la siguiente tabla:

Frecuencias de Notas Musicales
Nomenclatura Latina
Nomenclatura Alfabética
Frecuencia, Hz
· Do · C
261.63
· Reb (Do#) · C#
277.18
· Re · D
293.66
· Mib (Re#) · D#
311.13
· Mi · E
329.63
· Fa · F
349.23
· Solb (Fa#) · F#
369.99
· Sol · G
392.00
· Lab (Sol#) · G#
415.30
· La · A
440.00
· Sib (La#) · A#
466.16
· Si · B
493.88

Pues bien, nuestro ejemplo consistirá en un software PC que simule las teclas de un piano, y al ser pulsada una de ellas, se enviará la información de que tecla (nota musical) se ha pulsado para ser reproducida por nuestro microcontrolador. Para tal fin, configuraremos el TimerA en modo PWM y generaremos una señal de salida a la frecuencia de dicha nota pulsada.

Y para darle un poco más de realismo, es decir, intentar que nuestra placa de desarrollo se parezca un poco más a un piano, se va a emplear el TimerA TA1 como controlador o mejor dicho, como la duración máxima que será reproducida una nota musical (siempre y cuando no se pulse ninguna otra tecla más).

La idea es transformar nuestra placa de desarrollo MSP430 LaunchPad en un piano (simplemente con las notas principales).

Para conectar el PC a nuestra placa usaremos el conversor USB <---> RS-232, es uno externo, concretamente el CP2102 (enlace del fabricante). Y hay que tener en cuenta algo muy importante, y es que al ser la familia MS430G, microcontroladores de bajo consumo, la señal que se genera también lo serán y esto a la hora de generar sonidos es un problema, ya que no tendrá la suficiente potencia para que el sonido sea audible (el volumen sea lo suficientemente alto para ser escuchado).

Es por ello que necesitaremos una etapa amplificadora externa para adaptar nuestra señal PWM del microcontrolador a las necesidades de un altavoz (speaker). En mi caso, he conectado directamente la señal de salida PWM ofrecida por el microcontrolador a una radio convencional (radio cassette) por su entrada de micrófono. Dicha radio realizará o se usará como etapa amplificadora.

El material que vamos a necesitar y su función, es la que se muestra a continuación:

· MSP430 Launchpad: Evidentemente, nuestra placa de desarrollo con el microcontrolador MSP430G2553.

· Módulo B75937: Conversor USB <---> RS-232 externo basado en el dispositivo CP2102.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con sistema operativo Windows con al menos, la versión.NET Framework 4.0. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware.

· Radio Convencional (Radio Cassette): Será tanto la etapa amplificadora como el altavoz (speaker).


El código del programa principal es el siguiente:


/*----------------------------------------------------------------------
   AqueronteBlog@gmail.com            
                                                      
Este archivo es propiedad intelectual del blog Aqueronte,  
cuya dirección web, es la siguiente:                       
                                                       
  http://unbarquero.blogspot.com/           
                                                       
Se permite cualquier modificación del archivo siempre y cuando
se mantenga la autoría del autor.                          
                                                      
----------------------------------------------------------------------
                                                       
Filename:      main.c                              
Date:          3-June-14                                
File Version:  vs0.0                                     
Compiler:      IAR 5.60.2 

Author:        Manuel Caballero                           
Company:       Hades                          
                       
----------------------------------------------------------------------
                                                      
Notes:  Este programa tiene el propósito de emplear el Timer TA0 como
        modulación de anchura de pulso (PWM).

        Para tal propósito, se ha diseñado un programa que emula las
        notas principales de un piano.

        Mediante un software de PC que emula a un piano, se le enviará
        al MSP430 LaunchPad que configure el PWM de tal manera que 
        genere una onda que coincida en frecuencia a la nota musical
        enviada por el software del PC.

        Dicha onda generada por el PWM tendrá una duración máxima de 
        1s, a no ser que se vuelva o se pulse otra tecla del software
        del PC.

        El microcontrolador estará en modo bajo consumo LPM1 hasta
        que reciba una orden desde el ordenador.

        Es importante destacar que al ser la familia MSP430 de bajo 
        consumo, su salida va acorde a dicha filosofía por lo que 
        generar sonidos directamente sin una etapa amplificadora tendrá
        como consecuencia que dicho sonido generado, su volumen será muy
        flojito.

        Para este ejemplo, se ha conectado directamente la salida del
        PWM del microcontrolador a una radio convencional por la entrada
        del micrófono. Consiguiéndose, amplificar la señal PWM y que ésta
        sea audible.
*/

#include "io430.h"
#include "variables.h"
#include "funciones.c"
#include "interrupciones.c"


void main( void )
{ 
  unsigned char error = 0;      // Variable que indica lo siguiente:
                                //      · error = 1: Se ha producido un error. Apaga todo.
                                //      · error = 0: Todo correcto.
  
  conf_WDT    ();                // Configura WDT del sistema
  conf_CLK    ();                // Configura CLK del sistema  
  conf_TimerA ();                // Configura TimerA  
  conf_IO     ();                // Configura Entradas/Salidas
  conf_UART   ();                // Configura UART 
  
  __enable_interrupt();          // Interrupciones ON.
  
  
  while(1)
  {     
    LPM1;
    
    error      = 0;                     // Reset variable: error
    
    TA0CTL     = MC_0 + TACLR;          // Timer TA0 OFF: No hay sonido
    
    
    switch (datoUART)
    {
      case Si:
      // Nota musical: Si  ~ 493.88 kHz
        TA0CCR0        = 24297;  
        TA0CCR1        = 12149;
        break;

      case Sib:
      // Nota musical: Sib ~ 466.16 kHz
        TA0CCR0        = 25742;  
        TA0CCR1        = 12871;
        break;

      case La:
      // Nota musical: La  ~ 440.00 kHz
        TA0CCR0        = 27273;  
        TA0CCR1        = 13637;
        break;

      case Lab:
      // Nota musical: Lab ~ 415.30 kHz
        TA0CCR0        = 28895;  
        TA0CCR1        = 14448;
        break;

      case Sol:
      // Nota musical: Sol ~ 392.00 kHz
        TA0CCR0        = 30612;  
        TA0CCR1        = 15306;
        break;

      case Solb:
      // Nota musical: Solb ~ 369.99 kHz
        TA0CCR0        = 32433;  
        TA0CCR1        = 16217;
        break;

      case Fa:
      // Nota musical: Fa   ~ 349.23 kHz
        TA0CCR0        = 34361;  
        TA0CCR1        = 17181;
        break;

      case Mi:
      // Nota musical: Mi   ~ 329.63 kHz
        TA0CCR0        = 36404;  
        TA0CCR1        = 18202;
        break;

      case Mib:
      // Nota musical: Mib  ~ 311.13 kHz
        TA0CCR0        = 38569;  
        TA0CCR1        = 19285;
        break;

      case Re:
      // Nota musical: Re   ~ 293.66 kHz
        TA0CCR0        = 40864;  
        TA0CCR1        = 20432;
        break;

      case Reb:
      // Nota musical: Reb  ~ 277.18 kHz
        TA0CCR0        = 43293;  
        TA0CCR1        = 21647;
        break;

      case Do:
      // Nota musical: Do   ~ 261.63 kHz
        TA0CCR0        = 45866;  
        TA0CCR1        = 22933;
        break;

      default:
      // Ha habido un error
        error = 1;
        break;        
    }
    
    if (error == 0)
    {
    // Ningún Error: Activa TA0 y TA1
      TA0CTL     = TASSEL_2 + MC_1 + TACLR;      // SMCLK, TA0 Up Mode
      TA1CTL     = TASSEL_1 + MC_1 + TACLR + TAIE;      // ACLK, TA1 Up Mode y TA1 Produce interrupción
    }
  }
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación, donde se interpretará la canción de Feliz Cumpleaños (Happy Birthday):



Os pongo a vuestra disposición el programa en lenguaje C (IAR y MSPGCC) para que lo podáis descargar y probar:

MSP430: DS1624 + UART
Compilador IARCompilador MSPGCC
CC
MSP430: Timer TA0 PWM Piano
MSP430: Timer TA0 PWM Piano
MSP430: Timer TA0 PWM Piano
MSP430: Timer TA0 PWM Piano

· NOTA 1: En caso de que en el Software empleado para simular un piano no reconozca ningún puerto COM, es síntoma de que no se tiene los drivers necesarios del dispositivo CP2102, por lo que se deberán instalar para un uso correcto, ya que el ordenador no lo reconoce.

· NOTA 2: El PWM se suele usar mucho para controlar la velocidad de motores, entre otras cosas.

· NOTA 3: En este ejemplo se ha usado como etapa amplificadora una radio convencional (radio cassette) para adaptar la señal de salida generada PWM a un sonido audible. En caso de conectar dicha salida PWM al altavoz, el sonido será muy débil.

· NOTA 4: Tengo que reconocer que la canción: Feliz Cumpleaños (Happy Birthday) que se escucha en el vídeo, la he interpretado de manera muy modesta (mi nivel de piano es nulo, aunque espero mejorar).

1 comentarios:

Unknown dijo...

Hola me gustaria ver tu diagrama de coenxiones si fuera posible, Saludos!!