lectura de voltaje usando MSP430 FF22x4 de TI

3

Estoy tratando de medir el voltaje de un dispositivo de energía usando el MSP430 de TI. La fuente de voltaje está conectada a A1 (es decir, P4) y a tierra (es decir, P1) en la placa de destino.

Aquí está el código relevante:

ADC10CTL1 = INCH_1 + CONSEQ_0; //A1, single measurement
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE + ADC10SR; //same as sample temperature sensor code
ADC10CTL1 &= ~ADC10DF; //setting binary format for ADC10MEM
ADC10CTL0 |= ENC + ADC10SC; //Sampling and conversion start
 __bis_SR_register(CPUOFF + GIE);        // LPM0 with interrupts enabled
//read result in a uint8_t[2]
incomingVoltage[0] = ((uint8_t *)&ADC10MEM)[0]; //this is Least-significant-byte
incomingVoltage[1] = ((uint8_t *)&ADC10MEM)[1]; //this is most-significant-byte

Tengo problemas siguientes:

  1. Estoy imprimiendo los contenidos de ADC10MEM en el AP, y veo que los 6 bits iniciales de ADC10MEM son todos 1, en lugar de 0. No puedo obtener el motivo por el mismo.

  2. Si considero solo los últimos 10 bits de ADC10MEM, puedo ver que el valor aumenta y disminuye con el aumento y la caída del voltaje, pero si obtengo Vin con la fórmula:

N = 1023 * ((Vin - VR-) / (VR + - VR-)), no obtengo el valor correcto. (VR + = 1.5V, VR- = 0V, ya que las baterías alimentan la placa de destino) N: el valor en ADC10MEM, en decimal

No puedo encontrar dónde me equivoco. ¿Debo habilitar el pin para la entrada analógica (ADC10AE0 | = 0x02), y establecer la dirección (P4DIR & = 0x00) también?

¡Gracias!

EDIT 1: Valores de vin: Estos son los valores ADC10MEM que estoy obteniendo, considerando los últimos 10 bits. Los siguientes cálculos utilizan Vr + = 1.5, Vr- = 0. Para voltaje de entrada 0.38V, N = 1100000010 es decir, 770 y Vin = 1.12. Para voltaje de entrada 0.5V, N = 1101010110, es decir, 854 y Vin = 1.25. Para el voltaje de entrada 1V, N = 1110101001 es decir, 937 y Vin = 1.37. Para voltaje de entrada 1.45V, N = 1111011000 es decir, 984 y Vin = 1.44. Como dije, el valor aumenta / disminuye con el aumento / disminución en la entrada, pero no es correcto.

EDIT 2: Interrupciones: Estoy modificando el código del sensor de temperatura de muestra. Veo

__bis_SR_register(LPM3_bits+GIE);  // LPM3 with interrupts enabled 

al comienzo de while (1) bucle en linkTo () / main_ED.c, y hay

 __bis_SR_register(CPUOFF + GIE);        // LPM0 with interrupts enabled

después de 'inicio de muestreo y conversión' y antes de 'leer resultados'

EDIT 3: Código basado en msp430x22x4_adc_10_02.c de ejemplos de código de TI

ADC10CTL1 = INCH_1 + CONSEQ_0;
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
ADC10AE0 |= 0x02;
P4DIR |= 0x00;
ADC10CTL0 |= ENC + ADC10SC; //Sampling and conversion start

Estoy obteniendo valores similares incluso con este código.

    
pregunta Chaitanya

1 respuesta

1

Este es el código que funcionó:

ADC10CTL1 = INCH_1 + CONSEQ_0;
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
for (countDown = 240; countDown > 0; countDown--); //delay to allow references to settle
ADC10AE0 |= 0x02;
ADC10CTL0 |= ENC + ADC10SC; //Sampling and conversion start
__bis_SR_register(CPUOFF + GIE);        // LPM0 with interrupts enabled
result = ADC10MEM; //result is a int
incomingVoltage[0] = result&0xFF; //incoming voltage is an array of uint8_t, send it to AP
incomingVoltage[1] = (result>>8)&0xFF; //this and previous line is similar to temperature sensing code sample

¡Gracias por la ayuda!

    
respondido por el Chaitanya

Lea otras preguntas en las etiquetas