Forum: Mikrocontroller und Digitale Elektronik LM75 u. PIC: merkwürdiger Verhalten


von Sebastian O. (osa)


Lesenswert?

Hallo an allen uC Freunden!

Erstmal schuldigung für die Fehlerhafte Ausdrücken und Schreiben auf 
Deutsch.

Es geht um folgendes:
an einen PIC uC habe ich ein LM35 Sensor angeschlossen, an ADC0. Ausgang 
Pin von LM35 an ADC0 PIC Eingangspin, eins zu eins.
Der Temperatur wird auf einen 7Segment Anzeige angezeigt.
Vref ist der Versorgungspannung (5V) der durch einen 6800uF/16V 
Kondesator gefiltert ist. Als Netzteil benütze ich einen 10Eur Wert 
Ding, auf dem den Ausgangspannung von 3V bis 12V(?) einstellbar ist. Hat 
kein Trafo.

Systemmodi:
Es geben zwei modis: normalbetrieb, hier, den ADC ist an, Sensor immer 
abgetastet, Anzeige(n) an und jede Sekunde neugeschrieben.
Schlafmodus: nach 5minuten normalbetrieb, schalte ich die Anzeigen aus 
(MOS Transistoren (driver) aus) halte den ADC an, dann schicke den PIC 
in low power mode mit dem SLEEP befehl.
Während schlafmodus, wäckt der uC jede minute auf (triggert von einen 
externen 32kHz Quartz an Timer1 angeschlossen), der ADC wird 
angeschaltett, 3ms gewartett, dann folgt den Sensor abtasten.

Algoritmus:
Der Sensor wird jede 39ms abgetastet, und aus 8 konsekutiven Werten ein 
Durchsnitt ausgerechnett.
In normalbetrieb, wird diese Wert angezeigt, in schlafmodus, wird den 
Wert nur gespeichert und das System zurück in schlafmodus geschickt.

Es funktioniert alles super, bis das System aus schlafmodus ins 
normalbetrieb geschaltett ist, durch einen Tasten druck, der an EXT Int 
gekoppelt ist. Nach dem aufwecken, wird ein Temperatur Wert genau 4Grad 
weniger angezeigt als es sein soll, dann, nach eine Sekunde (Display 
Updaterate) wird der richtige Temperaturwert angezeigt.

Wenn ich mein Multimeter zwischen LM35 ausgang (und ADC0 eingang) und 
masse habe, und ist an, während den schlafmodus, dann, nach aufwachen 
durch Tasten druck, wird der korrekte Temperaturwert angezeigt.

Ich bin ratlos, wenn jemandem eine gute Idee dazu hatt, ich würde es 
fröhlich annehmen.

Danke euch!
Sebastian.

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

In dem Datenblatt zu dem Sensor mal auf Seite 8 schauen, findet man u.A. 
auch hier:

http://www.mikrocontroller.net/part/LM35

Dort sieht man einen Widerstand in reihe zu einem Kondensator, welche 
zwischen Ausgang und GND geschaltet sind. Könnte mir vorstellen das der 
Sensor ein minimale Last am Ausgang braucht, die der ADC Eingang vom PIC 
alleine nicht bereitstellen kann. Da Du sagtest das es funktioniert wenn 
noch zusätzlich ein Multimeter angeschlossen ist könnte das hinkommen. 
Genau weiss ich es aber nicht.

Versuche doch mal diese R/C Kombination, oder für den Anfang ganz 
einfach mal einen Widerstand von einigen kilo-Ohm zwischen Ausgang und 
GND.

Grüße,

Chris

von osa (Gast)


Lesenswert?

Hallo Chris,
danke für deinen schnellen Antwort.

Ich habe mit eine 100Ohm Widerstand seriell mit einem 1uF Kondensator 
ausprobiert, und es ist deutlich besser geworden.
Der maximale differenz liegt jetzt bei 2Grad.

Eine 20kOhm Widerstand parallel zum Ausgang hat absolut nichts gebracht.

Danke!

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Hmm, komisch. Wie läuft das denn in deiner Firmware ab? Also der PIC 
geht in den Sleep-Modus, wacht auf, und dann machst Du die Messung. Kann 
es vielleicht sein das Du eine zu kurze TAD eingestellt hast für den 
ADC? So wie ich das verstehe benutzt Du ja nur einen ADC Eingang. Da 
kann es natürlich sein das bei zu kurzer TAD dann mist bei rauskommt. 
Wenn man nur einen Kanal benutzt ist dann die "erste" Messung mist, 
folgende Messungen werden dann "besser". Wenn man mehrere Kanäle nutzt 
ist es dann auf allen Mist.

Grüße,

Chris

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Nachtrag:

Um das mal etwas näher zu erklären. In dem PIC ist ja nur ein einziger 
ADC der auf mehrere Pins multiplext wird. Um eine Messung zu machen wird 
vder gewählte Pin auf eine einfache Sample&Hold Schaltung gelegt, in 
diesem Fall ein Kondensator. Danach wird der Pin getrennt und der ADC 
liest dann den Spannungspegel, auf den der Kondensator geladen wurde, 
aus. Natürlich hat man auch noch parasitäre Widerstände im Chip.

Wenn jetzt die Ladezeit dieses internen C's zu kurz ist kann der 
natürlich nicht bis auf die "echte" Spannung umgeladen werden. Wird nun 
kontinuirlich immer nur der gleiche Kanal gewandelt ist ja nach einigen 
Wandlunger der C entsprechend geladen, daher sieht man das dann nicht. 
Geht der PIC aber in den Sleep entlädt sich währenddessen der C. Nach 
dem Aufwachen muss dieser aber erst wieder voll geladen werden um ein 
brauchbares Ergebnis zu bekommen, d.h. die TAD (Acquisition Time) muss 
lang genug sein.

Dazu kommt noch das bei höheren Takfrequenzen keine ausreichende TAD 
mehr eingestellt werden kann, mann muss dann auf den internen Oszillator 
ausweichen um den ADC zu takten. Dies ist dann aber getrennt vom 
eigentlichen PIC Takt, d.h. der PIC selber läuft mit vollem Takt weiter, 
lediglich der ADC nutzt einen intern erzeugten, niedrigeren Takt.

Also, Kanal wählen, ausreichende Zeit warten, dann mit genügend hoher 
TAD samplen. Der Simulator im MPLab gibt einem übrigens Warnungen aus 
wenn die Zeit zwischen Kanalauswahl und Sample-Start zu gering ist.

Grüße,

Chris

von Sebastian O. (osa)


Lesenswert?

Hallo Chris,
am ende werde ich 3 Temperatur Sensoren benützen. Der Code dafür ist 
schon geschrieben, damit meine ich dass ich schalte zwischen die 3 
Eingänge, aber, nur auf ADC0 habe ich ein Sensor die anderen zwei sind 
auf Masse gelägt.

Nachdem ich ein Kanal abgetastett habe, schlate ich zu den nächsten 
Kanal, und nur danach werden berechnungen für die aktullste Wert 
gemachen. So stelle ich sicher dass der Kondi für den nächsten Kanal 
korrekt auflädt.

Jetzt, in sleepmodus, nachdem das System aufgewacht ist (jede minute), 
warte ich erstmall 39ms, und nur danach taste ich mein Kanal0, der vor 
dem schlafmodus schon eingestellt war, ab. Dann, nach anderen 39ms, 
taste ich ADC1 ab, dann ADC2, dann wider ADC0. Alle Kanäle 8 mall.

Könnte es sein dass 39ms, nach aufwachen, noch viel zu wenig sind?
Nachdem ich den RC gruppe parallel an LM35 eingebunden habe, 
funktioniert es schon richtig. Heute morgen habe ich es nocheinmall mir 
angeguckt, und der angezeigte Wert nach Tasten aufwachen war der 
korrekte Wert. Ich habe einen Raumtermometer neben stehend für 
vergleich.

Meine ADC Einstellungen:
ADCON0=0x40 -> conversion clock=Fosc/8
ADCON2=0x38 -> 20TAD

Der quartz ist 16MHZ.

Grüsse,
Sebastian.

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Sebastian O. schrieb:
> Hallo Chris,
> am ende werde ich 3 Temperatur Sensoren benützen. Der Code dafür ist
> schon geschrieben, damit meine ich dass ich schalte zwischen die 3
> Eingänge, aber, nur auf ADC0 habe ich ein Sensor die anderen zwei sind
> auf Masse gelägt.
>
> [... snip ...]
>
> Meine ADC Einstellungen:
> ADCON0=0x40 -> conversion clock=Fosc/8
> ADCON2=0x38 -> 20TAD
>
> Der quartz ist 16MHZ.
>
> Grüsse,
> Sebastian.

OK, die unbenutzen sind auf GND, und der ausgelesene Wert (ohne die 
extra RC Beschaltung, also so wie im Ursprungszustand) ist zu niedrig. 
Ich würde mal vermuten das wenn Du die unbenutzen ADC Pins auf VCC 
legst, der ausgelesene Wert des einen Kanals dann zu hoch ist.

Es sind ja, von der Spannung her betrachtet, nur ein paar mV.

Welchen PIC benutzt Du denn? Bei einem 18F Typen, beispielsweise der 
18F2620, steh im Datenblatt das eine AD Clock Source von 8 Tosc nur bis 
zu einem Oszillatortakt von 11,43 MHz gut ist. Da wären die 16MHz dann 
schon drüber, was zu Fehlern in der Wandlung führen kann. "Schlimmer" 
wird es dann beim LF Typen. Beim 18LF2620 ist bei 8 Tosc nur noch ein 
Takt von maximal 5,72 MHz zulässig.

Bei 16MHz Takt müsste man also 16 Tosc beim F Typen und 32 Tosc beim LF 
Typen wählen, wenn man einen 18..2620 PIC benutzt.

Grüße,

Chris

von Sebastian O. (osa)


Lesenswert?

Hallo Chris,
der uC ist eine 16F777.
Ich habe gerade den Datenblatt noch gründlicher durchgelesen, und habe 
gefunden dass 8Tosc für eine maximale 5MHz Oszilatortakt zu verwenden 
ist.

Tosc bei meinem 16MHz Oszillator ist 62,5ns. Um einen, mindestens, 1,6us 
TAD zu ermöglichen, brauche ich einen Faktor von 25,6. Um sicher zu 
stellen das meine ADC richtig funktioniert, muss ich dann 32Tosc 
auswählen?

Ich melde mich noch Heute Nachmittags.

Danke und Grüsse,
Sebastian.

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Sebastian O. schrieb:
> Tosc bei meinem 16MHz Oszillator ist 62,5ns. Um einen, mindestens, 1,6us
> TAD zu ermöglichen, brauche ich einen Faktor von 25,6. Um sicher zu
> stellen das meine ADC richtig funktioniert, muss ich dann 32Tosc
> auswählen?

Ja, 32 Tosc sollte dann passen. Aber bedenke das Du zwischen Auswahl des 
Kanals und start der Wandlung selber dafür sorgen musst das genug Zeit 
vergeht, das macht der PIC normalerweise nicht automatisch. Sollte aber 
auch kein großes Problem sein, da Du die gelesenen Werte ja eh noch 
weiterverarbeiten musst.

1: Ausgelesenen ADC Wert sichern
2: Kanal wählen
3: Gesicherten ADC Wert verarbeiten
4: ADC Wandlung starten
5: Schlafen
6: Alles wieder von vorne

Somit muss man keine extra Warteschleife einbauen. Wenn man es ganz 
genau will, also das auch die allererste Messung nach dem Einschalten 
richtig ist (in obigem Schema wurde ja noch keine Wandlung gestartet in 
de Falle) kann man beim Init des PIC ja einamlig den Kanal wählen, 
warten, Wandlung starten, nochmals warten bis Wandlung fertig ist.

Grüße,

Chris

von Sebastian O. (osa)


Lesenswert?

Hallo Chris,
jetzt habe ich bemerkt dass ein Fehler im Betreff war. Es geht um den 
LM35 und nicht um den LM75. Mein Fehler!

Nachdem ich den R-C Damper an LM35 angeschlossen habe, und der PIC ADC 
feinjustiert habe, bekomme ich jetzt vernünftigen Werte angezeigt, 
speziell nachdem das System per Knopfdruck aufgewacht ist, und generell 
während normal Betrieb.
Bezüglich PIC ADC, der 777 ist mit dem sogenannten "Automatic Aquisition 
Time" ausgestatett. Ich glaube du weisst schon worüber es geht.


Somit, möchte ich mich bei dir Chris speziell, und bei den ganzen 
mikrocontroller.com team zu bedanken!

Grüsse,
Sebastian.

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.