Forum: Mikrocontroller und Digitale Elektronik [Hilfe] ADC verfälscht LM385-2.5 schuld


von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,
ich bin mit meinem Latein am Ende.
Habe einen Atmega16 mit externer 2.5V AREF.
Der Schaltplan ist erprobt, die Programmierung auch.
Doch die Ausgabe (Temperatur) am LCD ist minimal zu hoch (ca 20°C bei 
Raumtemperatur 16°C) und springt auch ungewöhnlich oft.

Im Wandel der Zeit habe ich den
http://www.mouser.de/Search/ProductDetail.aspx?R=LM385Z-2.5Gvirtualkey58410000virtualkey863-LM385Z-2.5G

gegen den
http://www.mouser.de/Search/ProductDetail.aspx?R=LM385DR-2-5virtualkey59500000virtualkey595-LM385DR-2-5

getauscht. (Vom ersteren leider keinen mehr übrig, um gegen zu testen.)

Gibt es irgendetwas, was ich in den Datenblättern übersehen habe, 
weswegen ich diese beiden nicht gegeneinander tauschen darf?

Ich hänge noch Mal das Schaltbild an.

Folgendes habe ich bereits geprüft:
Spannungsquelle: saubere 5V
AREF: saubere 2.5V
Wert von R11 korrent.
Spannungsteiler R15 am ADC auch korrekt.

Noch Jemand eine Idee. Fuses die das Verhalten beeinflussen gibt es doch 
keine oder?

Grüße Oekel

von Oldie (Gast)


Lesenswert?

Warum soll der LM385 schuld sein?

Was macht denn der Motor-Temperatursensor?
Den hast du nicht benannt.
R15 hab ich auch noch nicht gefunden...

Lass mal den Motorsensor weg und überbrücke die Klemmen
7-2 / 7-3 mit 2,2 kOhm. Das gibt über R16 etwa 1,56 V.
Wenn das eine stabile Anzeige (egal welcher Wert) gibt,
dann liegt dein Problem außerhalb.

Wenn nicht - und die Spannungen sind wirklich sauber,
dann legts wohl am Programm.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Oldie schrieb:

> Wenn das eine stabile Anzeige (egal welcher Wert) gibt,
> dann liegt dein Problem außerhalb.

bei 10k erhalte ich binnen 5sec eine stabile Anzeige von 45°

Laut Adam Riese sollten dann wohl 1/11 von 5V anliegen = 0,45454545

Bei dem LM35, welchen ich als Sensor verwende kommen 10mV/Grad raus.
Auch das scheint mir also ein richtiger Wert zu sein.

Noch weitere Ideen?

Meine "Raumtemperatur" schwankt zwischen 22 und 27 Grad :(

: Bearbeitet durch User
von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Könnte ich hier noch einen Fehler haben?

Es hängt ein externer 8MHz Resonator dran:
http://www.mouser.de/Search/ProductDetail.aspx?R=CSTLS8M00G53-A0virtualkey64800000virtualkey81-CSTLS8M00G53-A0

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Könnte es auch an einem zu überdimensionierten Elko liegen?
Hab auf dem Display 47uF statt den geplanten 10uF verbaut.

Ich rate mittlerweile nur noch, da ich keine Logik mehr sehe :(

von Oldie (Gast)


Lesenswert?

Wenn der Spannungsteiler stabil ausgewertet wird, hast du
doch ein Problem mit dem Sensor, oder der Verdrahtung.

Schau mal ins TI-Datenblatt, da sind ein paar Tipps zum
Aufbau mit längeren Leitungen in störender Umgebung.

von MaWin (Gast)


Lesenswert?

D a v i d K. schrieb:
> AREF: saubere 2.5V

Demnach liegt es nicht am LM385.

> Noch Jemand eine Idee.

Vielleicht beeinflusst Strom für andere Teile die Spannung am 
Masseanschluss ?

von Walter S. (avatar)


Lesenswert?

D a v i d K. schrieb:
> Ich rate mittlerweile nur noch, da ich keine Logik mehr sehe :(

schlechte Strategie, miss doch Mal die Spannung am ADC, und schau sie 
dir am Oszilloskop an

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Oldie schrieb:
> Wenn der Spannungsteiler stabil ausgewertet wird, hast du
> doch ein Problem mit dem Sensor, oder der Verdrahtung.

Also ich baue ja nicht Mal das reale Szenario mit 50cm langem Kabel auf, 
sondern schraube den Sensor direkt in die Klemme.Die drei Adern sind 
also genau wie beim Spannungsteiler max 1cm lang.

von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Oder hätte ich für R16 statt Dickfilmwiderstände - SMD 1K OHM 5%

lieber 1% nehmen müssen/sollen?

Wie weit darf das RC Glied (1k 100nF) vom Sensor bzw ADC entfernt 
liegen?
Wie weit darf man das R vom C trennen?

Ich bilde mir ein minimale Verbesserungen zu erhalten, wenn ich ein 
zweites Pärchen direkt an den Sensor halte.
(Dann hätte ich das RC-Glied jedoch 2x in der Schaltung im original war 
es auch nur 1x auf der Platine und nicht am Ende des Kabels in 
Sensornähe.

Ich bezweifle dass mein Layout, indem sich R&C ca 2cm verschoben haben 
eine derartige Verschlechterung bewirkt? (siehe Anhänge)

EDIT: habe ich evtl den Displayanschluss (i2c) zu nah an das ADC Signal 
geführt?

Falls ja, kann ich mit Filtern ausbessern?

Grüße Oekel

: Bearbeitet durch User
von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Siehe Walter S.:

Hast Du mal die Spannung am ADC-Eingang und der AREF mal mit Oszi oder 
Multimeter gemessen und nachgerechnet, welcher Ausgangswert zu erwarten 
ist?

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Marcus H. schrieb:
> Siehe Walter S.:
>
> Hast Du mal die Spannung am ADC-Eingang und der AREF mal mit Oszi oder
> Multimeter gemessen und nachgerechnet, welcher Ausgangswert zu erwarten
> ist?

Rechnung siehe oben, oder was genau meist du mit Messen?
Vermutest du ein Rauschen oder komplett falsche Werde?

Grüße Oekel

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Ich hoffe, nichts übersehen zu haben.
Was ich vermisse, ist eine Rechnung im Stil von:

AREF = 2,5V -> 256 Digits bei 2,5V
ADIN = 2,0V -> erwarteter Messwert 205 Digits


David schrieb: "falsche Werde?" -> Grüße aus Oberfrangn...

: Bearbeitet durch User
von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Marcus H. schrieb:

> AREF = 2,5V
korrekt.

> -> 256 Digits
Bislang "closed Source" Ich schiebe es bereits 8 Monate vor mir her die 
Funktionalität in C als Blackbox nachzubauen, denn der gegebene 
Bascom-Code ist für mich einfach nur hässlich und unverständlich:

Hoffe ich vergesse nun nichts:
Config Porta = Input                                        'Eingänge
Porta = &B00011111
'Set Sfior.pud                                               'pullup 
widerstände deaktivieren für Temperaturmessung (ADC) 
'
'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , 
Polarity = Low , Phase = 0 , Clockrate = 64 , Noss = 1       '
'Spiinit
Config Adc = Single , Prescaler = Auto , Reference = Aref 
'internal_2.56
'Now give power to the chip
'Start Adc


...
Ich vermute fast, mir wurde nicht Mal der aktuellste Code überliefert, 
denn "Reference = Aref   'internal_2.56" scheint mir nicht wie eine eine 
externe Versorgung mit 2.5V

Wenn ich denn Pin aber anhebe geht er gleich auf nen Fehler.
Kann ich im SourceCode für euch noch nach etwas interessantem suchen, 
oder hilft uns das eh nicht weiter (vermute ich fast, dass ich wie 
gesagt immer das gleiche hex flashe, welches bei dem alten Layout 
weniger Schwankungen aufweißt)



Grüße Oekel

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> Habe einen Atmega16 mit externer 2.5V AREF.

Du hast die Spannung nachgemessen (am ARef-Pin) und dein 
Spannungsmessgerät zeigt dir 2.50V an oder 2.56V oder einen ganz anderen 
Wert?

Ich hatte schon Referenzspannungen von 2.701V oder auch 2,45V bei meinen 
AVRs gemessen!

Die Referenzspannung ist sehr stabil, aber eben nicht sehr genau.
Kalibrieren muss man sie auf alle Fälle damit das Messergebnis stimmt.
Ich habe dafür extra eine sehr genaue Referenzspannungsquelle (LT1021) 
gekauft.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Naja, wenn die Blackbox-Firmware auf interner Referenz steht, dann will 
die am AREF-Pin nur einen 100nF Kappa sehen.
Aktuell gewinnt halt scheinbar die externe Referenz gegen die 
eingebaute. Sicher nicht ideal.

Ansonsten, was Atmega schrieb: Wenn auf die absolute Genauigkeit kein 
Verlass ist, dann hilft ggf. eine Messung der Verhältnisse.
Versuch mal die Registersettings mit dem Datenblatt zu vergleichen.

Praxisbeispiel: Zwei ADC-Kanäle. Der eine misst die 
Sensorversorgungsspannung über einen Referenzspannungsteiler, der andere 
die tatsächliche Messspannung. Über das Verhältnis der beiden Messwerte 
hast Du einen Messwert der unabhängig vom Absolutwert der Referenz ist.
Auf die Art holst Du unkalibriert mehr als 10bit Genauigkeit aus einem 
eingebauten MCU-ADC. Der größte limitierende Faktor sind dann 
Messwiderstände.

von Walter S. (avatar)


Lesenswert?

D a v i d K. schrieb:
> Rechnung siehe oben, oder was genau meist du mit Messen?
> Vermutest du ein Rauschen oder komplett falsche Werde?

Messen heißt messen, mit Vermutungen kommt man bei der Fehlersuche nicht 
weiter

von Michael K. (Gast)


Lesenswert?

Walter S. schrieb:
> mit Vermutungen kommt man bei der Fehlersuche nicht
> weiter

Klar, man vermutet und dann misst man nach. :-)
Dann vermutet man das nächste ...

Debugger ran, in die Register schauen und auch mal den rohen AD Wert 
anschauen.
Es gibt 1000 Möglichkeiten das im Programm zu versauen.
Wird ADC ready ausgewertet oder 'blind' gelesen etc. pp.

D a v i d K. schrieb:
> Doch die Ausgabe (Temperatur) am LCD ist minimal zu hoch (ca 20°C bei
> Raumtemperatur 16°C) und springt auch ungewöhnlich oft.

Out of the box geht der ADC auch nicht sehr genau.
Nullpunkt und Steigung sollten abgelichen werden.

Das Springen ....
Um wie viele digits springt der denn ?
Was ist denn gewöhnlich oft springen ?

D a v i d K. schrieb:
> Folgendes habe ich bereits geprüft:
> Spannungsquelle: saubere 5V
> AREF: saubere 2.5V
> Wert von R11 korrent.
> Spannungsteiler R15 am ADC auch korrekt.

Sauber und korrekt.
Mit dem feuchten Finger gemessen, oder dem Multimeter (minimal genauer) 
oder einem Oszi das den Namen verdient ?
Ripple hast Du immer drauf. Wie hoch ist der bei Dir ?

Wirklich, Du läßt uns jedes Detail raten.
Geb uns doch mal Informationen mit den Du was anfangen könntest wenn Du 
nicht mit dem Projekt vertraut bist.

Natürlich ist eine Layoutveränderung ein ganz hervorragender Grund sich 
diese Art Probleme einzufangen.
Gleitende Mittelwertbildung ist übrigens auch kein Hexenwerk.

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Michael K. schrieb:

> Gleitende Mittelwertbildung ist übrigens auch kein Hexenwerk.

Es geht nicht drum, dass ich es nicht (neu) programmieren könnte und 
dann auch debuggen.

Doch das braucht 1-2 Tage und bisher ist der "Kunde" nur am abfordern 
der HW. Daher habe ich die Software bisher nicht angefasst 
(Zeitknappheit) und "nur" die Hardware (Bauteile unverändert) in SMD 
etwas zusammengeschoben.

"Nur" zum Ersten, weil das alte Layout in der Produktion schlichtweg zu 
teuer war, um überhaupt noch etwas dran zu verdienen und...

"nur" zum Zweiten hab ich da nicht weit genug nachgedacht, wie wir hier 
gerade sehen ;)

Ich werde heute Abend das Fluke anhängen, Fernwartung von der Arbeit 
wird nur noch in weiteren Mutmaßungen enden.

Grüße Oekel

von Ulrich P. (uprinz)


Lesenswert?

Also bitte miss mal nach und rechne das auf dem Papier aus. Dann 
vergleichen:
Du kennst (oder kannst nachmessen) den Widerstand des Fühlers und kannst 
dann die Spannung am ADC Eingang errechnen.
Du kennst auch deine AREF und damit kannst Du den erwarteten digitalen 
Wert errechnen.

Nun musst Du in der Software nachsehen, welcher Temperatur dieser 
digitale Wert entspricht.

Da Dein Fühler aber einen falschen Wert anzeigt, kannst Du den digitalen 
Wert ja auch noch mal zurück rechnen, ausgehend von der anderen AREF von 
2.56V. Kommst Du dann auf das eigentlich falsche, aber angezeigte 
Ergebnis, hat, wie zuvor schon mal erwähnt, die interne AREF gewonnen.

Sollte das der Fall sein, erklärt sich auch das seltsame und 
empfindliche verhalten der Schaltung, da zwei Referenzen gegeneinander 
arbeiten, Deine extern und die interne. Das kann rauschen und schwingen.

Nebenbei habe ich immer einen 1µF tantal und einen 100nF oder 10nF Cap 
an meine externe oder interne AREF geklemmt.

Gruß
Ulrich

von Paul B. (paul_baumann)


Lesenswert?

Config Porta = Input   'Eingänge Porta = &B00011111
'Set Sfior.pud   'pullup widerstände deaktivieren für 
TemperaturmessungADC)
'
'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes ,
Polarity = Low , Phase = 0 , Clockrate = 64 , Noss = 1       '
'Spiinit
Config Adc = Single , Prescaler = Auto , Reference = Aref
'internal_2.56
'Now give power to the chip
'Start Adc

Hier stimmt eine ganze Menge nicht:
Config PortÁ = Input schaltet den GANZEN Port auf Eingang, nicht wie im 
Kommentar angegeben.

Config Adc = Single , Prescaler = Auto , Reference = Aref
'internal_2.56

Das ist auch nicht richtig, weil Du draußen dran eine 
Referenzspannungsquelle hast. Da muß Reference = Off stehen, damit die 
interne Referenzquelle abgeschaltet wird und die draußen dranhängende
benutzt wird.

Start Adc
braucht man hier auch nicht, weil schon "Config ADC" weiter oben den ADC 
startet.

MfG Paul

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Hi,
ich wollte noch Mal Rückmeldung geben:
Habe den Kondensator C8 komplett entfernt und alles läuft wie es soll.
Kann Irgendwer in seiner Glaskugel erkennen, wieso das zur Lösung 
geführt hat? ;)

Grüße Oekel

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Nach den Schaltplanfragmenten liegen die 5V dauerhaft am Sensor, 
richtig? Dann sollte C8 keine Auswirkung haben. Oder ändert sich die 
Motortemperatur im Millisekundenbereich?
Vielleicht war das nur noch dem Namen nach ein C, aber eigentlich mehr 
ein R. -> Messen!

von Atmega8 A. (atmega8) Benutzerseite


Lesenswert?

D a v i d K. schrieb:
> Kann Irgendwer in seiner Glaskugel erkennen, wieso das zur Lösung
> geführt hat? ;)

Wenn du den (KL7-2) Pin zwischen Eingang und Ausgang umschaltest oder du 
den PullUp hinzu schaltest, dann könnte es sein dass die Spannung am 
Kondensator eine andere ist.

Ich gehe davon aus dass sich dort ein NTC-Spannungsteiler an der KL7 
Buchse befindet.

Schau doch mal nach ob irgend ein Programmteil den entsprechenden 
Port/Pin der als ADC dient beeinflusst.
Also auf alle "PORTA = 0x??" oder "DDRA = ??".

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.