Lesespannung mit dem MSP430 FF22x4 von TI

Ich versuche, die Spannung eines Leistungsgeräts mit dem MSP430 von TI zu messen. Die Spannungsquelle ist mit A1 (dh P4) und Masse (dh P1) auf der Zielplatine verbunden.

Hier der entsprechende Code:

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

Ich habe folgende Probleme:

  1. Ich drucke den ADC10MEM-Inhalt auf dem AP und sehe, dass die führenden 6 Bits von ADC10MEM alle 1 statt 0 sind. Ich kann den Grund dafür nicht verstehen.

  2. Wenn ich nur die letzten 10 Bits von ADC10MEM betrachte, kann ich sehen, dass der Wert mit steigender und fallender Spannung zunimmt und abnimmt, aber wenn ich Vin mit der Formel erhalte:

N = 1023 * ((Vin - VR- ) / (VR+ - VR-)), bekomme ich nicht den richtigen Wert. (VR+ = 1,5 V, VR- = 0 V, da Batterien die Zielplatine mit Strom versorgen) N: der Wert in ADC10MEM, in Dezimalzahl

Ich kann nicht finden, wo ich falsch liege. Muss ich den Pin für den analogen Eingang (ADC10AE0 |= 0x02) aktivieren und auch die Richtung (P4DIR &= 0x00) einstellen?

Danke!

BEARBEITEN 1: Vin-Werte: Dies sind die ADC10MEM-Werte, die ich unter Berücksichtigung der letzten 10 Bits bekomme. Die folgenden Berechnungen verwenden Vr+ = 1,5, Vr- = 0. Für eine Eingangsspannung von 0,38 V ist N = 1100000010, dh 770, und Vin = 1,12. Für eine Eingangsspannung von 0,5 V ist N = 1101010110, dh 854, und Vin = 1,25. Für eine Eingangsspannung von 1 V ist N = 1110101001, dh 937, und Vin = 1,37. Für eine Eingangsspannung von 1,45 V ist N = 1111011000, dh 984, und Vin = 1,44. Wie gesagt, der Wert steigt/sinkt mit Zunahme/Abnahme der Eingabe, aber es ist nicht korrekt.

EDIT 2: Interrupts: Ich ändere den Code des Probentemperatursensors. Ich verstehe

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

am Anfang der While(1)-Schleife in linkTo()/main_ED.c, und da ist

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

nach 'Bemusterung und Konvertierung starten' und vor 'Ergebnisse lesen'

BEARBEITEN 3: Code basierend auf msp430x22x4_adc_10_02.c aus den Codebeispielen von 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

Ich bekomme ähnliche Werte auch mit diesem Code.

Welchen Wert von $V_{IN}$ möchten Sie messen?
Was ist FF22x4?
Meinst du 430f22x4? Sie sollten sich nicht auf Pin-Nummern auf einem Teil mit mehreren Pinbelegungen beziehen.
Sind Sie sicher, dass keine anderen Interrupts aktiviert sind?
Dies sind die ADC10MEM-Werte, die ich unter Berücksichtigung der letzten 10 Bits bekomme. Die folgenden Berechnungen verwenden Vr+ = 1,5, Vr- = 0. Für eine Eingangsspannung von 0,38 V ist N = 1100000010, dh 770, und Vin = 1,12. Für eine Eingangsspannung von 0,5 V ist N = 1101010110, dh 854, und Vin = 1,25. Für eine Eingangsspannung von 1 V ist N = 1110101001, dh 937, und Vin = 1,37. Für eine Eingangsspannung von 1,45 V ist N = 1111011000, dh 984, und Vin = 1,44. Wie gesagt, der Wert steigt/sinkt mit Zunahme/Abnahme der Eingabe, aber es ist nicht korrekt.
Ich meine EZ430-RF2500. FF22x4 ist der Mikroprozessor. Dies ist das Benutzerhandbuch, dem ich folge.
@MikeJ-UK, @markrages: Danke für deine Hilfe. Ich habe die Frage bearbeitet. Bitte suchen Sie nach EDIT1 und EDIT2.
Der Prozessor ist "msp430f22x4". Nur ein "F".
Sie zeigen nicht, wo Sie die analoge Eingabe in Ihrem Code aktiviert haben. Hast du das gemacht? Die Richtung sollte standardmäßig auf Eingabe eingestellt sein.
Danke für die Antwort. Meinst du ADC10AE0 |= 0x02; und P4DIR |= 0x00; ?
OK, ich habe keine Zeit, alle ez430-Codebeispiele zu untersuchen, um zu sehen, was sie tun könnten. Ich schlage vor, Sie lesen das über den ADC und das Interrupt-System.
"P4DIR |= 0x00;" ist ein no-op, verstehst du warum?
Ich verstehe das. Ich werde P4DIR &= 0x00 versuchen
P4DIR ist standardmäßig auf Null gesetzt.

Antworten (1)

Dies ist der Code, der funktioniert hat:

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

Danke für die Hilfe!