lectura de voltaje usando MSP430 FF22x4 de TI

Estoy tratando de medir el voltaje de un dispositivo de potencia usando el MSP430 de TI. La fuente de voltaje está conectada a A1 (es decir, P4) y 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 los siguientes problemas:

  1. Estoy imprimiendo el contenido de ADC10MEM en el AP y veo que los 6 bits principales de ADC10MEM son todos 1, en lugar de 0. No puedo entender el motivo.

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

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

No puedo encontrar dónde me estoy equivocando. ¿Tengo que habilitar el pin para la entrada analógica (ADC10AE0 |= 0x02) y configurar la dirección (P4DIR &= 0x00) también?

¡Gracias!

EDICIÓN 1: Valores Vin: estos son los valores ADC10MEM que obtengo, considerando los últimos 10 bits. Los siguientes cálculos utilizan Vr+ = 1,5, Vr- = 0. Para una tensión de entrada de 0,38 V, N=1100000010, es decir, 770, y Vin=1,12. Para tensión de entrada de 0,5 V, N=1101010110, es decir, 854 y Vin=1,25. Para voltaje de entrada 1V, N=1110101001 es decir 937 y Vin = 1.37. Para un voltaje de entrada de 1,45 V, N = 1111011000, es decir, 984 y Vin = 1,44. Como dije, el valor aumenta/disminuye con el aumento/disminución de la entrada, pero no es correcto.

EDICIÓN 2: Interrupciones: estoy modificando el código del sensor de temperatura de la muestra. Veo

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

al comienzo del ciclo while(1) 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.

¿Cuál es el valor de $V_{IN}$ que estás tratando de medir?
¿Qué es FF22x4?
te refieres a 430f22x4? no debe hacer referencia a los números de pin en una parte con múltiples pinouts.
¿estás seguro de que no hay otras interrupciones habilitadas?
Estos son los valores ADC10MEM que obtengo, considerando los últimos 10 bits. Los siguientes cálculos utilizan Vr+ = 1,5, Vr- = 0. Para una tensión de entrada de 0,38 V, N=1100000010, es decir, 770, y Vin=1,12. Para tensión de entrada de 0,5 V, N=1101010110, es decir, 854 y Vin=1,25. Para voltaje de entrada 1V, N=1110101001 es decir 937 y Vin = 1.37. Para un voltaje de entrada de 1,45 V, N = 1111011000, es decir, 984 y Vin = 1,44. Como dije, el valor aumenta/disminuye con el aumento/disminución de la entrada, pero no es correcto.
Me refiero a EZ430-RF2500. FF22x4 es el microprocesador. Esta es la Guía del usuario que estoy siguiendo.
@MikeJ-UK, @markrages: Gracias por su ayuda. He editado la pregunta. Busque EDIT1 y EDIT2.
El procesador es "msp430f22x4". Solo una "F".
No muestra dónde habilitó la entrada analógica en su código. ¿Tú hiciste esto? La dirección debe configurarse como entrada de forma predeterminada.
Gracias por la respuesta. ¿Quieres decir ADC10AE0 |= 0x02; y P4DIR |= 0x00; ?
OK, no tengo tiempo para investigar todos los ejemplos de código ez430 para ver qué podrían estar haciendo. Le sugiero que lea sobre el ADC y el sistema de interrupción.
"P4DIR |= 0x00;" es un no-op, ¿entiendes por qué?
Entiendo que. Probaré P4DIR &= 0x00
P4DIR por defecto es cero.

Respuestas (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!