Hallo,
ich erfasse mit dem MSP430F169 eine Spannung zwischen 0,6 und 2,2V
(Externe Referenz liegt an eREF+ und VeREF-)
Die Messspannung ist an P6.5 / A5 angelegt
Den gemessenen Wert zwischen 0 und 4095 gebe ich auf einem Display aus,
bzw betrachte ihn im Debugger.
Bei einer langsamen Änderung der Eingangsspannung kann ich nicht alle
Werte erfassen, es gibt Sprünge im Messwert.
Hier ein Auszug, welche Messwerte möglich sind.
Diese Werte werden durch langsames erhöhen der Eingangsspannung
angezeigt.
1571 011000100011
1603 011001000011
1619 011001010011
2051 100000000011
2083 100000100011
2115 100001000011
2131 100001010011
2155 100001101011
2259 100011010011
2339 100100100011
Auch beim Debuggen und beobachten des ADC12MEM0 bekomme ich genau diese
Werte angezeigt.
Es fällt auf, dass immer die letzten 3 Binärstellen "011" sind.
Ich schaffe es also nicht, irgendeinen Zwischenwert bei den obigen
Messwerten einzustellen. Dieses Problem zieht sich über den gesamten
Messbereich hin.
Hier mein Code:
Erst mal die Initialisierung...
1 | ADinternInit() //Grundeinstellung AD-Wandler
|
2 | {
|
3 | ADC12CTL0 = ADC12ON + SHT0_0 + REFON; // ADC12ON:ADC in Bereitschaft
|
4 | // REFON zwar eingeschaltet, aber nicht verwendet, da externe Spannung ADC12 anschalten,
|
5 | ADC12CTL1 = SHP; // Sampling Timer benutzen (SHP = Sample-and-hold-pulse) Einstellungen werden automatisch vorgenommen
|
6 | // -----------------------------
|
7 | // ADC12MCTL0 steuert ADC12MEM0. Das Conversion-Ergebnis steht im 16Bit-Register ADC12MEM0.
|
8 | // Die führenden 4 Bit sind "0"
|
9 | ADC12MCTL0 = SREF_6 + INCH_5; // SREF_6: Referenzspannung einstellen: Verwendet wird: Extern: VeREF+ und Extern: VeREF-
|
10 | // INCH=Input Channel A0 bis A11. Gewählt: P6.5 = A5
|
11 | ADC12CTL0 |= ENC; // jetzt anfangen ... Enable Conversion muß HIGH sein um zu starten
|
12 |
|
13 | }
|
Hier der Aufruf im Programm:
1 | int temperaturmessung()
|
2 | {
|
3 | extern int ADCkty; // Die externe Variable ADCkty verwenden
|
4 | ADC12CTL0 |= ADC12SC; // Konvertierung durchfuehren
|
5 | while ((ADC12IFG & BIT0)==0) // Wenn das Bit 0 auf 1 geht, dann ist ein Wert in ADC12MEM0 geschrieben worden.
|
6 | {}; //warten....
|
7 | ADCkty=ADC12MEM0; // ADCkty den Wert zuweisen(Bereich von 0 bis 4095)
|
8 | }
|
Da die Messung zeilich nicht kritisch ist, verwende ich keine
Interrupts, sondern warte auf den Abschluß der Wandlung.
Was muss ich ändern, damit ich auch ALLE Zwischenwerte angezeigt
bekomme?
Martin