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:
-
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.
-
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.