Hallo,
hab mich die letzten Wochen durch diese tolle Seite gearbeitet,
Traumhaft, Mein Controller spricht zu mir! :) Aber jetzt steh ich an..
bräucht Expertenrat
Es geht um den ADC, ich will eine Temperaturmessung übern KTY81/121
vornehmen. Genauer gesagt 6, die werden über RS232 abgefragt und vom PC
geloggt.
Das ganze funktioniert theoretisch supa, praktisch nicht so.. die Werte
schwanken.
Ich führe die Abfrage im Sekundentakt durch, dabei machen sich
Schwankungen von rund 1° bemerkbar (2 ADC Stufen), mit gelegentlichen
Ausreißern um die 3 Grad. Ich bild mir ein das wurde besser wenn ich die
Spannungsversorgung übern STK500 hatte, heute kann ich das aber leider
nicht mehr bestätigen.
Weit schlimmer ist dass sich die Pins gegenseitig beeinflussen. Stöpsl
ich den einen ADC Pin auf +5V sinkt der ADC Wert des Nachbarn um 10
Schritte?!
Ich habs mit Sampling Zeit Variation probiert, Mittelwertmessungen, ich
hab einen Kondensator zwischen Aref und GND, einen zwischen Vcc und GND,
2 bei meinem Quarz.
Hab Vcc übern PC, Raspberry Pi und einem Handyladegerät probiert. Alles
nutzt nichts!
Folgende Grundschaltung benutze ich:
Beitrag "KTY81-121 KTY81-122 Temperatursensor / Thermometer LED 0,5°C Auflösung Assembler ATmega8"
Ich habs abgewandelt, die Messfühler hängen über den Widerstand direkt
und dauerhaft auf VCC (ich mess Flüssigkeiten, da ists mir egal ob sich
das Ding erwärmt..)
Folgende Codeschnipsel kommen zum Einsatz, FCPU=8MHz
1
voidADC_Init(){
2
uint8_tresult;
3
ADMUX=(0<<REFS1)|(1<<REFS0|1<<ADLAR);// interne AVcc als Referenz benutzen
4
ADCSRA=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);// Frequenzvorteiler auf 64!
5
ADCSRA|=(1<<ADEN);// ADC aktivieren
6
ADCSRA|=(1<<ADSC);// eine ADC-Wandlung
7
while(ADCSRA&(1<<ADSC)){}// auf Abschluss der Konvertierung warten
Hat jemand Tipps für mich wie ich das ganze stabilisieren kann? Die
Auflösung von 0,5° würd mir eigentlich reichen, es geht eher um die
Verhältnisse als um exakte Temperaturen, außerdem hab ich Kilos von den
KTY81/121 rumliegen
Aktuell ists aber leider unbrauchbar :/
vielen dank im Vorraus und beste Grüße,
Andi
Die Code-schnipsel sehen so weit gut aus. Das Problem wird vermutlich
eher an der Hardware liegen, etwa eine nicht ausreichende Entkopplung
oder Einstreuungen von 50 Hz oder HF (z.B. Handy).
Gegen 50 Hz Störungen könnte man in Software noch was machen, indem man
mehrere Werte mittelt, und zwar so viele das es ein Zeitfenster mit
einem Vielfachen von 20 ms (also z.B. 49 ms) gibt. Das gibt einen
Digitalen Filter mit guter Unterdrückung von 50 und 100 Hz. Nebenbei
kann man durch das Oversampling auch noch etwas (vielleicht 1-2 Bit) an
Auflösung gewinnen.
Hey,
Danke für die Antworten! Anbei die Schaltung, ich hoff man erkennt was
ich mein :)
Ob der C zwischen VCC und GND wirklich 100nF war weis ich nimmer, hab
mal irgentwas reingesteckt.
Das Problem tritt auf wenn ich PC1 auf 5V hänge, dann bricht der
Messwert von PC0 ein.
Einstreuungen hab ich auch vermutet, evt kommt über die UART
Schnittstelle Müll rein. Ich häng am 3,3V UART vom Prozessor, deshalb
die Widerstände. Das sollt aber fürn Atmega kein Problem darstellen,
vorallem kommts selbe raus wenn ich den Atmega mit 3,3V VCC versorge!
Aber.. dass die Einstreuungen den Atmega so konsequent stören glaub ich
net.. Da gehts ja net um kleine Schwankungen, da gehts um 10ADC Schritte
die konstant einbrechen!
Als Lösung würd mir Einfallen die Sensoren einzeln per Pin zu versorgen,
damit immer nur einer am Saft hängt.. aber das kanns ja trotzdem net
sein!
Frohe Weihnachten an alle!
Andi
Ein 'Mitziehen' vom Nachbarpin bedeutet eigentlich immer, das der
Quellwiderstand an den ADC Eingängen zu hoch ist, um den S&H Kondensator
nach dem Umschalten schnell auf die Spannung am neuen Messpunkt zu
bringen.
Du hast 2 Möglichkeiten. Entweder machst du deine Quellen niederohmiger
oder du änderst das Programm, soweit es geht.
* Wenn du den ADC Takt verringerst, wird das Problem schon mal kleiner,
der S&H Kondensator hat mehr Zeit zum Umladen.
* Wenn du zwischendurch auf einen ADC Pin schaltest, der auf GND gelegt
ist, wird der Kondensator entladen.
Hey,
Avcc hängt nicht an vcc. Das hatte ich zwar, brachte mir einen
zerstörten atmega adc.. Gut das ich 3 hab :)
Aber so wie mein adc jetzt eingestellt ist nimmt er doch die interne vcc
oder?
Das mitm umschalten auf gnd ist eine gute idee, test ich mal! Kann ich
den quellwiderstand irgentwie künstlich verringern? Das ganze sollt am
raspberry pi hängen bleiben, zwecks der netzwerkfunktionalität.. Ich
werd mal mit nem richtigen netzteil oder battrien versuchn, vlt hilfts..
Vielen dank schonmal!
Lg andi
Der eine defekte µC hat wohl eine andere Ursache. Avcc muss immer
versorgt werden. Die Gefahr eine Defektes ist eher ohne die Verbindung
größer.
Ohne eine Versorgung für AVCC gibt es komische Effekte - Fehler bei den
AD Werten sind da noch das kleinere Problem. Fehlt die Versorgung an
AVCC kommt da Spannung über interne "Schutz-" bzw. Parasitäre Dioden an,
aber halt etwas zu wenig Spannung. Es geht dann meistens irgendwie, aber
z.B. der Brownout Detektor kann falsch reagieren und gelegentliche
Resets ausführen. Wobei Anfänger die den Fehler machen den Brown-out
Detektor, meistens nicht aktivieren.
Im Normalfall reicht eine einfache Verbindung von VCC zu AVCC und GND zu
GND(AGND). Dazu ein 2. Abblockkondensator vor AVCC. Die Analogen
Eingänge sollten den GND PIN bei AVCC nutzen. Bei Störungen auf VCC kann
man eine Induktivität vor AVCC schalten um Fehler beim ADC zu reduzieren
- für die Temperaturmessung sollte es auch ohne gehen.
p.S. Für die Messung bei Spannungsteiler wäre es noch etwas besser ARef
nicht intern auf AVCC zu schalten sondern extern über einen
Spannungsteiler (z.B. 1:1) - damit kann man die Auflösung noch etwa
verdoppeln.
Andi schrieb:> Kann ich> den quellwiderstand irgentwie künstlich verringern?
Künstlich? Durch einen echten Opamp, in deinem Fall nicht-invertierend
und Rail-To-Rail bei deinen knappen Betriebsspannungsgrenzen.
Andi schrieb:> Avcc hängt nicht an vcc.
Ich nehme mal an du meinst AREF den man nicht an AVCC hängen soll.
AVCC muss schon, gegebenenfalls über eine Induktivität 10µH, mit VCC
verbunden sein.
Nachdem die Temperaturfühler träge sind, genügt auch schon ein 10n
Kondensator parallel zum ADC-Eingang um den Quellwiderstand zu
verringern.
evtl. auch den Noise Reduction Modus benutzen falls in diesem µC
vorhanden. Ansonsten kann man auch eine hochohmige Quelle mit einem
Kerko ausstatten und nach der Kanalauswahl mit ADMUX etwas warten bis
man die Wandlung startet, dann wird die S&H Stufe niederohmig aus dem
Kerko versorgt.
Dem Plan zufolge sind die Temperatursensoren schon recht niederohmig:
1,4 K und der Sensor (vermutlich 500 Ohm oder 1 K) Parallel. Da muss man
sich also keine großen Gedanken machen. Wenn AVCC nicht angeschlossen
ist, muss man sich aber auch nicht wundern: 5 V an einem ADC pin sind
dann zu viel, und können die Spannung an AVCC ändern, weil Strom über
die Schutzdioden fließt.
DANKE!! Die fehlende AVCC wars! Spannung ist jetzt auch relativ stabil,
schwankt großteils zwischen 1 ADC Schritt, das wird per Software
ausgeglichen!
folgend schauts jetzt aus:
GND -> AGND
VCC -> AVCC
10nF -> AGND-AVCC
10nF -> GND-VCC (das bringt nixx)
was mach ich jetzt mit VREF? In der jetzigen Konfiguration (AVCC als
Ref) hängts mit 100nF gegen AGND.
Ulrich: als "Externes AREF" häng ichs an einen 1:1 Spannungsteiler
(gesamt 2,5k sind OK?) zwischen AGND und AVCC, komm damit auf eine
Auflösung von 0,25°? Das wär echt toll!
1000 Dank & lg andi
Die Spannung von den Sensoren wird so wie es aussieht nicht über die
halbe Versorgung hinauskommen - falls doch müsste man den 1,4 K
Widerstand anpassen. Da würde es sich anbieten für ARef auch etwa die
halbe Spannung zu nutzen. Das wäre z.B. ein Spannungsteiler mit 2 mal 10
K und ggf. einem Kondensator nach GND (analog) dazu. Viel weniger als
Vcc/2 geht für Aref ohnehin nicht - das Limit (z.B. 2 V) müsste man ggf.
in DB nachschauen.
Noch etwas mehr Auflösung (z.B. 1 zusätzliches Bit) kann man ggf. noch
durch Oversampling gewinnen: also etwa 192 Werte aufsummieren (sollte
bei durchlaufendem AD gerade 20 ms geben) und dann nur durch 96 teilen.
Wie gut das klappt hängt aber vom Aufbau ab - zumindest hätte man damit
eine 50 Hz Unterdrückung.
Falls es nicht genügend "Störungen" sind müsste man ggf. noch eine
kleine extra Wechselspannung dazu mischen, damit das Oversampling auch
was bringt. Da hier der genutzte Bereich des ADCs nicht bis 0 geht
(Vermutlich eher nur die obere Hälfte), könnte man ausnahmsweise die
Wechselspannung auch bei ARef. zu mischen - etwa 100 Hz (passend zur
Abtastzeit) von einem PWM Ausgang per 1 M Widerstand.
Den Kondensator an VCC/GND sollte man trotzdem dran lassen, auch wenn
man den Effekt nicht gleich sieht - der reduziert z.B. auch
Funkstörungen.
Wenn du in das Datenblatt des Mega168 schaust, dann siehst du das du
auch 1,1V für AREF einstellen kannst. Dann müsstest du allerdings den
Spannungsteiler KTY / Widerstand entsprechend anpassen. Ob die Auflösung
dadurch steigt, habe ich jetzt nicht nachgerechnet.
Hi
>Dann müsstest du allerdings den>Spannungsteiler KTY / Widerstand entsprechend anpassen.
Und dem Sensor gleich noch eine Linearisierung verpassen.
MfG Spess
Für die Messung mit dem KTY.. sollte man nicht die interne Ref. nutzen,
sondern die Spannung für die Sensoren und die Ref. Spannung aus der
selben Quelle ableiten. Hier wohl vor allem die positive Versorgung. Für
eine Linearisierung in 1.Näherung sollte der Widerstand für den KTY...
einen bestimmten wert haben - soweit ich mich erinnere etwa 2,7 mal den
Widerstandswert bei Raumtemperatur. Die relative Spannungsänderung je
Grad Temperaturänderung wäre sogar noch etwas größer wenn der Widerstand
noch größer wird. Viel kann man damit aber nicht gewinnen (maximal ca.
25%) und die Spannung wird kleiner, ggf. zu kleine um das mit einer
kleineren Ref. Spannung zu kompensieren.
Die Ref. Spannung kann man sich relativ einfach per Teiler aus der
Spannung für die Sensoren gewinnen. Irgendwo bei 1/3 bis 1/2 der
Spannung sollte es hinkommen und auch noch im erlaubten Bereich für den
AD liegen.
probier das mit den 10µH an AVCC aus, Musterbeschaltung gibts z.B. im
Datenblatt vom ATTiny26. Ich verbaue so einem Filter mit 100µH-1mH gerne
mal an VCC da juckt dann auch keine Funken eines Relais in der Nähe
Andi schrieb:> als "Externes AREF" häng ichs an einen 1:1 Spannungsteiler> (gesamt 2,5k sind OK?) zwischen AGND und AVCC, komm damit auf eine> Auflösung von 0,25°? Das wär echt toll!
Die KTY81-Sensoren haben im günstigsten Fall einen Messfehler von 1,27
Kelvin. Es macht also nicht sehr viel Sinn, auf einem solchen Sensor
eine Messung mit einer Genauigkeit von 0,25 Kelvin auszuführen.