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:
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.
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.
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!
MikeJ-UK
Markierungen
Markierungen
Markierungen
Chaitanya
Chaitanya
Chaitanya
Markierungen
Markierungen
Chaitanya
Markierungen
Markierungen
Chaitanya
Markierungen