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.
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
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!
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
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
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.