Forum: Mikrocontroller und Digitale Elektronik Atmega168 ADC - Schwankungen/Beeinflussungen vom Nachbarpin


von Andi (Gast)


Lesenswert?

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
void ADC_Init() {
2
  uint8_t result;
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
8
  result = ADCH;            //read 1 time
9
}
10
11
uint16_t ADC_Read_10bit(uint8_t channel )
12
{
13
14
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
15
  ADCSRA |= (1<<ADSC);            
16
  while (ADCSRA & (1<<ADSC) ) {}  
17
  return ADCH << 2 | ADCL >> 6;                    
18
}
19
20
uint16_t ADC_Read_Avg_10bit( uint8_t channel, uint8_t average)
21
{
22
  uint16_t result = 0;
23
  for (uint8_t i = 0; i < average; ++i )
24
    result += ADC_Read_10bit( channel ); 
25
  return (uint16_t)( result / average );
26
}

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

von L. P. (lpg)


Lesenswert?

Hi,
Bitte poste deine Schaltung. Sonst wird das nix...

Lg.

von Ulrich (Gast)


Lesenswert?

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.

von Andi (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Anbei die Schaltung, ich hoff man erkennt was
>ich mein :)

Nicht wirklich.

MfG Spess

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

und hier mit Anhang..

von Hubert G. (hubertg)


Lesenswert?

AVCC ist aber auch angeschlossen und mit 100n auf GND?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Andi (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Hubert G. (hubertg)


Lesenswert?

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.

: Bearbeitet durch User
von Thomas (kosmos)


Lesenswert?

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.

von Ulrich (Gast)


Lesenswert?

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.

von Andi (Gast)


Lesenswert?

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

von Ulrich (Gast)


Lesenswert?

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.

von uwegw (Gast)


Lesenswert?

Andi schrieb:
> was mach ich jetzt mit VREF? In der jetzigen Konfiguration (AVCC als
> Ref) hängts mit 100nF gegen AGND.

Das ist gut so.

von Mikki M. (mmerten)


Lesenswert?

Gib dem ADC nach dem Umschalten des ADMUX etwas Zeit bevor du die 
nächste Wandlung startest. Wirkt oft Wunder

von Hubert G. (hubertg)


Lesenswert?

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.

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>Dann müsstest du allerdings den
>Spannungsteiler KTY / Widerstand entsprechend anpassen.

Und dem Sensor gleich noch eine Linearisierung verpassen.

MfG Spess

von Flo Draus (Gast)


Lesenswert?

1. Messung -> Ergebnis wegwerfen, Multiplexer schaltet und alles pendelt 
ein.
2. Jetzt sollte Ruhe eingekehrt sein, sofort nochmal messen -> Ergebnis 
verwenden.

Gruß Flo

von Ulrich (Gast)


Lesenswert?

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.

von Thomas (kosmos)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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.

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.