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:
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.
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.
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!
MikeJ-ES
marcajes
marcajes
marcajes
Chaitanya
Chaitanya
Chaitanya
marcajes
marcajes
Chaitanya
marcajes
marcajes
Chaitanya
marcajes