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:
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.
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!
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.
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
voidmessprep(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!
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.
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?
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.
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.
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?
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
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.
>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
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.
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 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
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.
>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
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.
>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
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?
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.
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?
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.
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.
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.