Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC sehr merkwürdige Werte


von Mrcl W. (Gast)


Lesenswert?

Hallo,

ich habe ein rießiges Problem mit meinem MSP430F5529 (Benutze das 
Experimenter Board von TI & programmiere mit Code Composer Studio).

Ich benutze die ext. ref. Spannung von 2,5V. Es handelt sich um einen 12 
Bit ADC.

Die Werte eines Sensors stimmen einfach nicht. Es handelt sich um einen 
0-10bar Sensor bei 5 und 6bar erhalte ich die selben Werte (1023). Ich 
lasse mir nur den Bit-Wert ausgeben und keine Spannung.

Wenn ich zu Versuchszwecken eine 1,5V Batterie versuche zu messen 
bekomme ich einen Wert von 4095 (Was zum Geier 2,5V sollten 4096 sein 
oder?)

Ich habe aber definitiv im Code die 2,5V anstatt die 1,5V Ref. Spannung 
angegeben.

Hat jemand Erfahrungen mit dem ADC des MSP430?

Hier mein Code:
1
#define ADC_PORT_SEL  P7SEL
2
#define ADC_INPUT_A12  BIT0
3
4
char display[10];
5
6
uint32_t messung;
7
8
/***************************************************************************//**
9
 * Messen
10
 ******************************************************************************/
11
12
13
void mess(void)
14
{
15
  buttonsPressed = 0;  
16
    Dogs102x6_clearScreen();
17
    ADC12CTL0 |= ADC12SC; // start conversion
18
    
19
    while (1)
20
  {
21
    if(!(ADC12SC & 0x00)) //Messung beendet?
22
    {
23
      messung = (ADC12MEM0);
24
      my_itoa(messung,display);
25
      return;
26
    }
27
  }
28
}
29
/***************************************************************************//**
30
 * Messvorbereitung
31
 ******************************************************************************/ 
32
33
void messprep(void)
34
{
35
  ADC12CTL0 = ADC12ON+ADC12SHT0_15+ADC12MSC+ADC12REFON+ADC12REF2_5V;  // ADC12 anschalten, mehrere konvertierungen, referenz auf 2,5V setzen
36
  ADC12CTL1 = ADC12SHP;
37
  ADC12MCTL0 = ADC12SREF_1+ADC12INCH_12;  
38
  ADC12CTL0 |= ADC12ENC;       // jetzt anfangen ...
39
  return;
40
}
41
/***************************************************************************//**
42
 * ADC Abschaltung
43
 ******************************************************************************/  
44
void messend(void)
45
{
46
   ADC12CTL0 &= ~ADC12ENC;                            // Disable conversions
47
   ADC12CTL0 &= ~ADC12ON;                             // ADC12 off
48
   return;
49
}
50
/***************************************************************************//**
51
 * itoa von mikrocontroller.net
52
 ******************************************************************************/ 
53
54
void my_itoa(int32_t zahl, char* string) //mikrocontroller.net
55
{
56
  uint8_t i;
57
 
58
    string[11]='\0';                  // String Terminator
59
    if( zahl < 0 )             // ist die Zahl negativ?
60
    {                  
61
      string[0] = '-';              
62
      zahl = -zahl;
63
   }
64
    else string[0] = ' ';             // Zahl ist positiv
65
 
66
    for(i=10; i>=1; i--) 
67
    {
68
      string[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
69
      zahl /= 10;
70
    }
71
}

von Karl H. (kbuchegg)


Lesenswert?

Das ...
1
void mess(void)
2
{
3
  buttonsPressed = 0;  
4
    Dogs102x6_clearScreen();
5
    ADC12CTL0 |= ADC12SC; // start conversion
6
    
7
    while (1)
8
  {
9
    if(!(ADC12SC & 0x00)) //Messung beendet?
10
    {
11
      messung = (ADC12MEM0);
12
      my_itoa(messung,display);
13
      return;
14
    }
15
  }
16
}

... sieht seltsam aus

Speziell der Teil hier

    if(!(ADC12SC & 0x00)) //Messung beendet?

von Dennis (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Speziell der Teil hier
>
>     if(!(ADC12SC & 0x00)) //Messung beendet?

Das sehe ich genauso! Das ist ja nur ein Bit zum Starten der Wandlung, 
ob es dann solange stehen bleibt...? Es gibt doch ein Busy-Bit beim 
ADC12, zumindest bei den 20ern. Oder mach es Interrupt-gesteuert - ist 
eh besser, sparste dir das Pollen.

von Mrcl W. (Gast)


Lesenswert?

Erstmal danke für die raschen Antworten. Habe das jetzt auch soweit 
geändert. Aber das Problem das 1,5V 4096 ergibt besteht immernoch. Hat 
jemand noch eine andere Idee?

Bin für jeden Hinweis und Kritik dankbar!

von Karl H. (kbuchegg)


Lesenswert?

Mrcl W. schrieb:
> Erstmal danke für die raschen Antworten. Habe das jetzt auch soweit
> geändert.

Wie hast du das geändert?

> Aber das Problem das 1,5V 4096 ergibt besteht immernoch.

> Bin für jeden Hinweis und Kritik dankbar!

4096 (eigentlich 4095) ist die größte Zahl, die mit 12 Bit machbar ist. 
Dein ADC hat 12 Bit -> meldet daher ständig Vollausschlag. Ich würde das 
mal als einen Hinweis werten, dass irgendwas mit der Referenzspannung 
nicht stimmt.

von Mrcl W. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> 4096 (eigentlich 4095) ist die größte Zahl, die mit 12 Bit machbar ist.
> Dein ADC hat 12 Bit -> meldet daher ständig Vollausschlag. Ich würde das
> mal als einen Hinweis werten, dass irgendwas mit der Referenzspannung
> nicht stimmt.

Ich habs!
1
void messprep(void)
2
{
3
  ADC12CTL0 = ADC12ON+ADC12SHT0_15+ADC12MSC+ADC12REFON+ADC12REF2_5V;  // ADC12 anschalten, mehrere konvertierungen, referenz auf 2,5V setzen
4
  ADC12CTL1 = ADC12SHP;
5
  ADC12MCTL0 = ADC12SREF_0+ADC12INCH_12;  
6
  ADC12CTL0 |= ADC12ENC;       // jetzt anfangen ...
7
  return;
8
}

Ich habe anstatt ADC12SREF_0, ADC12SREF_1 benutzt. Ist natürlich Falsch 
weil ich als zu benutzenden ADC-Kanal 0 angegeben habe. Daher hat er die 
1,5V benutzt.

Danke für alles!

von Karl H. (kbuchegg)


Lesenswert?

Mrcl W. schrieb:

>
1
>   ADC12CTL0 = ADC12ON+ADC12SHT0_15+ADC12MSC+ADC12REFON+ADC12REF2_5V;  //
2
> ADC12 anschalten, mehrere konvertierungen, referenz auf 2,5V setzen
3
>   ADC12CTL1 = ADC12SHP;
4
>   ADC12MCTL0 = ADC12SREF_0+ADC12INCH_12;
5
>   ADC12CTL0 |= ADC12ENC;       // jetzt anfangen ...
6
>

Mein persönlicher Geschmack
1
  ADC12CTL0 = ADC12ON + ADC12SHT0_15 + ADC12MSC + ADC12REFON + ADC12REF2_5V;  // ADC12 anschalten, mehrere konvertierungen, referenz auf 2,5V setzen
2
  ADC12CTL1 = ADC12SHP;
3
  ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_12;
4
  ADC12CTL0 |= ADC12ENC;       // jetzt anfangen ...

Ich bilde mir ein, dass ich das leichter lesen kann und auch leichter 
Fehler finde. Ich denke das deshalb, weil ich, seit ich 6 Jahre alt bin, 
darauf trainiert wurde, dass zwischen 2 Wörtern ein Leerraum steht. Mein 
Lesezentrum muss daher nicht erst 2 Sekunden den Buchstabendschungel 
studieren um die 'Worttrenner' "+" zu finden und dort den 
Buchstabensalat in Einzelwörter aufteilen und kann sich statt dessen 
ganz auf den Sinn der Wörter konzentrieren.

Ist aber nur meine persönliche Überzeugung, die ich nicht beweisen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ist aber nur meine persönliche Überzeugung, die ich nicht beweisen kann.

Geht da nicht nur Dir so. Aber wer (außer man selbst) schreibt schon 
lesbaren C-Sourcecode?

von Franz (Gast)


Lesenswert?

Auch wenn TI das so in seinen Beispielen macht...diese Schreibweise mit 
dem "+" würde ich mir garnicht angewöhnen.

von Mrcl W. (Gast)


Lesenswert?

Programmiere erst seit ein paar Monaten und bin daher auch für diesen 
Tip sehr dankbar! Macht natürlich alles viel Übersichtlicher!

Habe jetzt aber noch ein anderes Problem.

Wenn ich mit meinem Board meinen Sensor messen möchte zeigt er mir viel 
zu kleine Werte an welche sich auch kaum über die Spannung ändern. Wenn 
ich aber wieder meine Batterie raushole und messe stimmen die Werte 
einigermaßen.

Bin daher ein wenig verwirrt an was das liegen könnte. Wenn ich meinen 
Sensor mit einem Multimeter messe erhalte ich die richtigen Werte. Nur 
mit dem ADC funktioniert es nicht. Kann das am Strom liegen, hat dieser 
Auswirkungen auf die Messung im ADC? Habe schon versucht die Widerstände 
meines Spannungsteiler zu variieren aber ohne Erfolg.

Aufbau:

Sensor -------+8V

       -------GND---------------------------------|
                                                  |
                                                  |
       -------OUT (0,5-4,5V)---1 KOhm----1,2 KOhm-|
                                       |          |
                                       |          |
                                       |          |
Board                                  ----ADC-----

Hoffe man kann alles erkennen.

von Karl H. (kbuchegg)


Lesenswert?

Mrcl W. schrieb:

> mit dem ADC funktioniert es nicht. Kann das am Strom liegen,

Ja

> hat dieser
> Auswirkungen auf die Messung im ADC? Habe schon versucht die Widerstände
> meines Spannungsteiler zu variieren aber ohne Erfolg.

1 k zu 1.2k  ist ein relativ kleiner Spannungsteiler. Da fliesst schon 
ein nennenswerter Strom durch den Spannungsteiler. Und wenn der Sensor 
diesen Strom nicht liefern kann, dann bricht er ein.

Mach mal die Widerstände größer. Zb 10k zu 12k
Das Verhältnis bleibt gleich, d.h. der Teilerfaktor verändert sich 
nicht. Aber der Strom, der durch den Spannungsteiler fliesst wird um den 
Faktor 10 kleiner.

von Tom (Gast)


Lesenswert?

Ja das dachte ich mir auch! Habe dies auch getan jedoch verschlechterte 
sich die Anzeige noch mehr. Ich sollte bei Sensorausgang 0,5 V eine 
Anzeige von ca. 450 erhalten (bei ca 270 mV nach Spannungsteiler). 
Jedoch werden mir hier 22 Angezeigt. Wenn ich größere Widerstände für 
den Spannungsteiler benutze (10 KOhm & 12 KOhm oder 100 KOhm & 120 KOhm) 
erhalte ich Werte sehr nahe 0. Bei 82 Ohm und 100 Ohm erhalte ich mit 
ca. 175 die größte Anzeige.

Wenn ich nun mal mit einem Labornetzteil mit 0,5 V direkt in mein Board 
gehe erhalte ich eine 800 Bit Anzeige. Was auch so richtig ist 
(4096/2,5*0,5= ca. 800).

Wenn ich mit mit meinem Spannungsteiler (1 KOhm & 1,2 KOhm) und dem 
Labornetzteil (eingestellt auf 0,5 V) messe erhalte ich erneut eine 
Anzeige 22 Bit (bei ca.270 mV = ca 450 Bit).

Also:

ADC ist in Ordnung und funktioniert.
Spannungsteiler funktioniert zwar mit Multimeter aber mit ADC nicht auch 
bei unterschiedlichen Widerstandskonfigurationen.

Hat jemand noch ne Idee was ich Testen oder Ausprobieren kann? Meint Ihr 
es kann irgendwie mit den Widerständen zusammenhängen?

von Mrcl W. (Gast)


Lesenswert?

Sorry oberer Post ist von mir irgendwas ging mit dem Formular schief...

von Helmut L. (helmi1)


Lesenswert?

Du must in ADC12CTL2 den ADC auch auf 12Bit umschalten.
Dein ADC steht mit 1023 als maximalen Wert wahrscheinlich auf 10Bit.
Das geschieht mit den Bits 4 + 5.

Bit 5 = 1, Bit 4 = 0 ergibt 12 Bit Aufloesung

von Mrcl W. (Gast)


Lesenswert?

Nein mein Maximalwert beträgt 4095 Bit, habe ich auch so mit 3 V auch 
getestet (Ref. Spg. ist 2,5 V aber ADC verträgt 3,6 V). Also kann man 
davon ausgehen das der ADC mit 12 Bit arbeitet.

von Wolfgang-G (Gast)


Lesenswert?

>Also kann man davon ausgehen das der ADC mit 12 Bit arbeitet.

Um das zu prüfen: an den Wandlereingang eine Batterie anschließen. Dann 
sollte die Spannung von einem Voltmeter und dem Wandler übereinstimmen.
MfG

von Stefan (Gast)


Lesenswert?

Aus den gezeigten Programmteilen ist nicht zu erkennen ob nach dem 
Einschalten der Referenzspannung ausreichend lange gewartet wird bis 
diese sich stabilisiert bevor die Wandlung gestartet wird.

von vfr (Gast)


Lesenswert?

Sieht nach einem 50 Ohm Eingangswiderstand des ADC aus.

von Mrcl W. (Gast)


Lesenswert?

Hallo,

habs jetzt hinbekommen! Bin mal ohne Spannungsteiler mit Labornetzteil 
und Mulitmeter von 0 - 2,5 V durchgefahren und habe festgestellt das ich 
bei 2,5 V ca. 3500 Bit habe. Bin dann weiter und erst bei 3,0 V habe ich 
4095 erreicht. Danach habe ich mit Vorwiderständen experimentiert und 
verwende jetzt einen  56 Ohm Widerstand. Dadurch habe ich bei 4,6 V 
meine 4095 Bit. Also ist der Messbereich für meinen Sensor ausreichend. 
Auch die Auflösung scheint in Ordnung zu sein!

Was das stabilisisieren der Ref. Spg. angeht danach werde ich jetzt mal 
schauen. Danke für die ganze Hilfe und Tips!

Schöner Tag noch!

von Wolfgang-G (Gast)


Lesenswert?

>von 0 - 2,5 V durchgefahren und habe festgestellt das ich
>bei 2,5 V ca. 3500 Bit habe.
Da stimmt immer noch etwas nicht. Bei Uref 2,5V muss bei
2,5V Eingangsspannung ein Wert von 4095 herauskommen.
Mit welchen C-Werten wurde Uref abgeblockt
MfG

von Mrcl W. (Gast)


Angehängte Dateien:

Lesenswert?

Wolfgang-G schrieb:
> Mit welchen C-Werten wurde Uref abgeblockt

Es handelt sich um das USB Experimenter’s Board von TI. Im Anhang findet 
sich der entsprechende Ausschnitt des Schaltplans und die PDF als 
Ganzes. Es ist leider nicht ersichtlich welcher Wert der Kondensator 
hat. In der Bill of Materials ist nur vermerkt:

Part: C14
Value: DNP
Package Type: 0603

Aber ich gehe doch davon aus das mein ADC Pin (7.0) richtig zu benutzen 
ist. Er ist ja auch extra zum Abgreifen nach draußen geführt.

Das mit den Werten oberhalb 2,5 V verstehe ich natürlich selbst nicht 
und ist mir nach wie vor ein Rätsel. Zumal ich nun feststellen musste, 
dass dies nur mit dem Labornetzteil möglich ist. Mit dem Sensor geht es 
nicht. Ich denke er liefert mit zu wenig Strom...

Meint ihr es gibt eine Möglichkeit herauszufinden welche Kapazität der 
Kondensator hat?

Vielleicht hängt es ja doch damit zusammen das sich die Ref. Spg. noch 
nicht stabilisiert hat. Denn im Buch MSP430 Microcontroller Basics wird 
dies in den Beispielen auch so gemacht. Werde das auf jedenfall auch 
nochmal probieren, hoffe ich finde dafür am Wochenende ein bisschen 
Zeit.

von Helmut L. (helmi1)


Lesenswert?

Mrcl W. schrieb:
> Meint ihr es gibt eine Möglichkeit herauszufinden welche Kapazität der
> Kondensator hat?

http://www.ti.com/lit/ds/symlink/msp430f5529.pdf


Datenblatt Seite 71, Fussnote 2

10uF + 100nF

von Wolfgang-G (Gast)


Lesenswert?

>Value: DNP
>Package Type: 0603
gibt es 10µF im 0603-gehäuse?

Helmut Lenzen schrieb:
>Datenblatt Seite 71, Fussnote 2
>10uF + 100nF

diese Werte sollten nicht unterschritten werden
Ich habe auch mal tagelang nach einem Fehler gesucht, weil ich nur 6,8µF 
eingesetzt hatte.
MfG

von Stefan (Gast)


Lesenswert?

Mrcl W. schrieb:
> In der Bill of Materials ist nur vermerkt:
>
> Part: C14
> Value: DNP
> Package Type: 0603
DNP steht für Do Not Place, der Kondensator ist also nicht auf der 
Platine.
So wie ich es sehe wird er nur benötigt wenn mit einer externen 
Referenzspannung gearbeitet wird, was du nicht machst.

Die Beschreibung im Buch Microcontroller Basics gilt wahrscheinlich für 
den ADC12 einer anderen/älteren MSP430 Familie und nicht den ADC12_A des 
MSP430F5529. Benutz lieber das Datenblatt des MSP430F5529 und den 
MSP430x5xx/MSP430x6xx Family User's Guide (Kapitel REF und ADC12_A).

Die Referenzspannungsquelle im MSP430F5529 hat zwei Buffer, einen für 
die interne Nuztung und einen der die Referenzspannung nach aussen führt 
(wenn er über ADC12REFOUT eingeschaltet ist). Deshalb, und weil kein 
externer Kondensator aufgeladen werden muss, ist sie viel schneller als 
die des ADC12.

von Wolfgang-G (Gast)


Lesenswert?

>gilt wahrscheinlich für den ADC12 einer anderen/älteren MSP430 Familie
ich hatte damals den MSP430F1611 verwendet, also aus heutiger Sicht ein 
älterer Typ
MfG

von Mrcl W. (Gast)


Lesenswert?

Sorry das ich jetzt erst wieder Antworte war Fr. bis Mo. auf einer 
Fortbildung.

Das Problem besteht immernoch. Wegen den Kondensatoren:

Stefan schrieb:
> DNP steht für Do Not Place, der Kondensator ist also nicht auf der
> Platine.
> So wie ich es sehe wird er nur benötigt wenn mit einer externen
> Referenzspannung gearbeitet wird, was du nicht machst.

Wolfgang-G schrieb:
>> Datenblatt Seite 71, Fussnote 2
>> 10uF + 100nF

> diese Werte sollten nicht unterschritten werden
> Ich habe auch mal tagelang nach einem Fehler gesucht, weil ich nur 6,8µF
> eingesetzt hatte.

Jetzt bin ich verwirrt.

Im Datenblatt in der entsprechenden Fußnote steht das:

"Impedance of the external reference voltage R < 100 Ω, and two 
decoupling capacitors,
10 μF and 100 nF, should be connected to VREF+/VREF- to decouple the 
dynamic current."

Das bezieht sich doch nur auf die ext. Ref. Spg. oder? Im Family User 
Guide finde ich auch nur Angaben zur Ext. Ref. Spg..

Was anderes kann es sein das der ADC 20 mA aufnimmt (Ampermeter in Reihe 
zum ADC)? Erscheint mir doch sehr hoch. Das wäre eine Erklärung warum es 
mit dem Sensor einfach nicht hinhaut. Kann ich da irgendwas tun?

von vfr (Gast)


Lesenswert?

Der Eingangswiderstand des ADC ist auf deinem Board sehr niederohmig.
Größenordnung etwa 50 Ohm - sollte mit dem Ohmmeter messbar sein.
Wahrscheinlich ist parallel zu dem ADC ein Widerstand angeschlossen.
Daher wurde auch bei deinen ersten Versuchen die Spannung immer kleiner,
je größer du die Widerstandswerte gemacht hast. Auch die Reihenschaltung 
mit 56 Ohm, die bewirkte, das der ADC die halbe Sensorspannung bekam, 
spricht für
einen Eingangswiderstand in dieser Größenordnung. Dieser niedrige 
Eingangswiderstand ist auch für die hohe Stromaufnahme verantwortlich 
und belastet den Sensor zu stark.
Mess den Einganswiderstand vom ADC im ausgeschaltetem Zustand und
kontrollier, ob du einen externen Widerstand parallel zum ADC-Eingang 
findest.

von Mrcl W. (Gast)


Lesenswert?

Danke für die Antwort!

Ich habe jetzt mal zwischen P7.0 und GND gemessen (meine beiden 
ADC-Anschlüsse). Erhalte hier sehr hohe Werte (ca. 2 MOhm) die sich 
immer weiter erhöhen (liegt denke ich an den Kondensatoren). Wenn ich 
zwischen dem entsprechendem Pin von meinem uC und den Abgreifpunkten 
messe erhalte ich sehr sehr kleine Werte (0,5 Ohm). Daher hier sind 
keine Widerstände verbaut. Dies gilt alles im ausgeschalteten Zustand

Wenn ich im angeschalteten Zustand messe erhalte ich einen Wert von 37 
Ohm.

Was sagen wir nun diese Werte?

von Johnny B. (johnnyb)


Lesenswert?

Franz schrieb:
> Auch wenn TI das so in seinen Beispielen macht...diese Schreibweise mit
> dem "+" würde ich mir garnicht angewöhnen.

Diese Schreibweise von TI hat mich auch immer gestört. Man muss auch 
tierisch aufpassen, dass nicht zweimal dasselbe Bit vorkommt, sonst 
kommt es dann wegen der Addition zu einem ganz merkwürdigen Verhalten...
Ich verwende daher anstelle der Addition immer Oder-Verknüpfungen "|", 
damit hat man eine Fehlerquelle ausgeschlossen.

von Stefan (Gast)


Lesenswert?

Mrcl W. schrieb:
> Hier mein Code:
> #define ADC_PORT_SEL  P7SEL
> #define ADC_INPUT_A12  BIT0

Ist P7.0 als analoger Eingang konfiguriert? In den geposteten 
Codeschnipseln sind Port und Bit definiert aber die entsprechende 
Anweisung fehlt dort.

von Mrcl W. (Gast)


Lesenswert?

Stefan schrieb:
> Ist P7.0 als analoger Eingang konfiguriert? In den geposteten
> Codeschnipseln sind Port und Bit definiert aber die entsprechende
> Anweisung fehlt dort.

Stimmt! In meinen Programmierbeispielen von TI findet sich dies 
teilweiße auch nicht. Habe es jetzt auch nochmal eingefügt:
1
P7SEL |= 0x01;

Müsste so (Pin 7.0) stimmen oder (ADC Pin 7.0)?

Aber es ändert sich nichts dadurch weder zum positiven noch zum 
negativen.

Mein Hauptproblem ist einfach das etwas mit der Ref. Spg. nicht zu 
stimmen scheint.

Wenn ich mir jedoch den Schalplan anschaue sind alle nötigen 
Kondensatoren verbaut. Ich versteh die Welt langsam nicht mehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.