Você está na página 1de 4

MSP430G2 - ADC / 2 - muestreo de una seal de audio

Antes de comenzar: El MSP430G2 no ha sido diseado con el muestreo de audio como


una de sus facilidades, por lo cual es posible decir que debe buscarse una alternativa ms
viable para realizar un muestreo de calidad, pero debido a los costes, este servir de
manera general. Una cuestin es la cantidad limitada de memoria RAM, lo que impedira
nosotros para amortiguar y procesar los datos de audio interno. Lo primero que se
prepar fue un cable estreo para obtener la seal de audio de mi conexin de
computadoras auriculares.
Luego

comprob

que

poda

obtener

seales

de

ambos

canales.

Como nos vamos a alimentar esta seal a nuestro conversor ADC, tenemos que asegurar
que sus valores estn dentro de los lmites definidos por Vref- y Vref +, es decir, las dos
tensiones de referencia utilizados por el convertidor de definir los valores mnimo y
mximo a muestrear. La mayora de los ADCs, incluyendo el MSP430G2 ADC10, pueden
muestrear slo seales positivas (Vref-> 0) con un valor mximo normalmente igual a su
Vcc (3.3V para la plataforma de lanzamiento. El voltaje de desplazamiento es la tensin
se obtiene cuando se tiene la toma conectada y se tiene sin sonido. Esto significa que por
lo general la mitad de su seal de audio tiene valores negativos, que no trabajaran con el
ADC. Tenemos que aadir un desplazamiento de una manera positiva que la seal
entrante nunca es negativo. Por ejemplo: Vi que la mayor parte del audio que sale de un
vdeo de YouTube tena una amplitud de alrededor de 800mV, pero cambiando volumen y
reproduciendo msica fuerte mostr una amplitud mayor, alcanzando aproximadamente
2V. La ADC10 puede utilizar diferentes valores Vref, para facilitar las cosas vamos a
utilizar Vref- = 0V (GND) y tenemos que elegir entre 1.5V, 2.5V, Vcc (3,3 . V) para Vref
+ La amplitud de la seal que podemos tomar, asumiendo que puede compensar
exactamente en el medio de nuestra gama es igual a Vref + -. Vref-, as que tener Vref- =
0 V, la amplitud es igual a Vref +. Si la seal de entrada tiene una amplitud que est
cubriendo slo una pequea porcin de su banda de muestreo, entonces usted est
perdiendo resolucin de muestreo. La seal de audio son ms o menos simtrica con
respecto a su desplazamiento, por lo que es, en general, una buena idea para mover el

desplazamiento en el medio del rango de muestreo, en nuestro caso a 2,5 / 2 = 1,25 V.


Lo comprob con el ajuste de los cursores a mis valores Vref alcance ( 0 y 2.5V), esto es
lo que obtuve:

Esto se ve sin duda una seal de que podra ser manejado por el ADC10. El msp4302553
tiene 8 entradas externas analgicas asignadas en el puerto P1 (P1.0 a P1.7), tenemos
que seleccionar dos canales adecuados de una manera que no se superpongan con otras
funciones que podramos necesitar. El 2553 ficha tcnica tiene todo: nuestros A3 / A4
canales (P1.3, P1.4) parecen buenos candidatos. Tambin en la hoja de datos nos
encontramos con que no hay una necesidad real de establecer los valores multiplex
(P1SEL, P1SEL2) o el registro P1DIR al utilizar pasadores como canales de ADC, porque
el
ADC10
establecer
por
nosotros
.

Se puede probar de forma automtica una secuencia de canales. Una secuencia de


canales se muestrea y convierte una vez La secuencia comienza con el canal
seleccionado por INCHx y decrementos para canalizar A0 cada uno.
Bsicamente he optado por utilizar el oscilador ADC interno en su frecuencia mxima.
Para Vref us VRef + = referencia interna y Vref- = GND
La referencia interna se configura a 2.5V (por defecto es de 1,5 V) y la muestra y
mantenga el tiempo es la posible (4 ciclo de ADC10CLK) ms corto.

Hay cuatro modos de funcionamiento seleccionados con las constantes Conseq:

#define CONSEQ_0 (0 * 2u) / * solo canal de conversin nico * /


#define CONSEQ_1 (1 * 2u) / * Secuencia de canales * /
#define CONSEQ_2 (2 * 2u) / * Repita solo canal * /
#define CONSEQ_3 (3 * 2u) / * Repita la secuencia de canales * /

Decid probar una sola secuencia de canales, el DTC bajar los datos en mi nmero
entero de dos de 16 bits bfer.
Eso es todo por hoy, depurando el programa y -surprise sorpresa- mi bfer es en realidad
llena con valores que varan en cada ciclo, lo que indica que el DTC est enviando
muestras.
Tambin me doy cuenta de que sin audio entrante mis canales que estn en valores en
torno a 510, que coincide muy de cerca offset (1024/2 = 512) mi ideal.
CODIGO MUESTREO

#include <msp430g2553.h>
unsigned int sampling;
unsigned int buffer[2];
void clockConfig()
{
// configure the CPU clock (MCLK)
// to run from DCO @ 16MHz and SMCLK = DCO / 4
BCSCTL1 = CALBC1_16MHZ; // Set DCO
DCOCTL = CALDCO_16MHZ;
BCSCTL2= DIVS_2 + DIVM_0; // divisor=4 for SMCLK y 1 para MCLK
}
void adcConfig()
{
// ADC10SSEL_0 : ADC10OSC
// ADC10DIV_0 : ADC10
reloj divisor 0. Roughly 5MHz
// INCH_4 :canal mas Fuerte se muestrea
// CONSEQ_1 : secuencia de canales
ADC10CTL1 = ADC10SSEL_0 + ADC10DIV_0 + INCH_4 + CONSEQ_1; //

// SREF_1 : VR+ = VREF+ and VR- = AVSS


// ADC10SHT_0 : Sample & Hold = 4 x ADC10CLKs
// REF2_5V : ADC10 Ref 0:1.5V / 1:2.5V;
ADC10CTL0 = SREF_1 + REF2_5V + REFON + ADC10SHT_0 + MSC + ADC10ON +
ADC10IE;
ADC10AE0 |= BIT3 + BIT4; // adc en los canals 3 y 4
ADC10DTC1 = 0x02; // numero de canals muestreados
__delay_cycles(1000); // Wait for ADC Ref to settle
}
//linea de interrupcion para verificar que ADC esta completo
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
sampling = 0;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
clockConfig();
adcConfig();
__bis_SR_register(GIE); // habilitar interruptores
while (1)
{
ADC10CTL0 &= ~ENC;
while (ADC10CTL1 & BUSY);
// esperar si nueclo de ADC10 esta activo
sampling = 1;
ADC10SA = (unsigned int)&buffer;
// iniciando el buffer de memoria
ADC10CTL0 |= ENC + ADC10SC;
// maestro y conversion empieza
while(sampling>0); // esperar hasta que muestreo este completo
}
}

Você também pode gostar