www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehlmessungen im ADC


Autor: Elmar Haneke (elmar69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab bei der ADC-Messung am ATTINY45 das Problem, dass die Messreihe 
gelegentlich absurde Ausreißer hat, die sogar oberhalb des 12Bit 
Maximalwertes liegen.

Die CPU läuft mit internem Takt, ohne /8 Teilung, also 8 MhZ.

Als Messport word tatsächlich der Reset-Pin verwendet, die entsprechende 
Fuse ist geändert (sonst bekäme der Prozessor ein Dauer-Reset).

Woran könnte das liegen?

Gibt es einen eleganteren Weg, auf das erreichen eines Schwellwertes zu 
reagieren?

Hier die relevanten Code-Fragmente (gcc):

a) Initialisierung beim Systemstart:

DDRB &= ~(_BV(5));
ADCSRA = _BV(ADPS2) | _BV(ADPS1) // Eingangstakt 125 kHz (FCPU/64)
         | _BV(ADIE); // Interrupts erzeugen
ADMUX=_BV(REFS1); // Interne 1.1V Referenzspannung

b) Starten der Messreihe

ADCSRA |= _BV(ADEN) // ADC Einschalten
       | _BV(ADSC); // Erste Messung starten

c) Auswertung

static volatile uint16_t LastADC=0;

ISR(ADC_vect) {
  // Wert auslesen
  LastADC=ADC;
  // Wert bearbeiten
  ...
  // nächste Messung starten
  ADCSRA |= _BV(ADSC);
}

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den 
Tiny in den Noise Reduction Sleep Mode schicken.

Oder: Analog Komperator (weiß nicht ob der Tiny45 das hat)

Autor: Elmar Haneke (elmar69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läubi Mail@laeubi.de wrote:
> Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den
> Tiny in den Noise Reduction Sleep Mode schicken.

Den "noise reduction" sleep kann ich leider nicht gebrauchen, da der 
Timer weiterlaufen muss.

> Oder: Analog Komperator (weiß nicht ob der Tiny45 das hat)

Kann man da die Vergleichsspannung softwaremäßig einstellen? Die 
Beschreibung im Datenblatt sieht mir ehr danach aus, dass zwei externe 
Spannungen verglichen werden.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den
>Tiny in den Noise Reduction Sleep Mode schicken.

Das ist Paranoia. Nur bei Controllern mit aktivierter, hoher 
Eingangsverstärkung und sehr schnellen Meßintervallen macht das wirklich 
Sinn. Bei unsauberem / fliegendem Layout oder zu hohen Impedanzen der 
Meßquellen hift auch der Noise-Reduction-Mode nicht.

Autor: Elmar Haneke (elmar69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bei unsauberem / fliegendem Layout oder zu hohen Impedanzen der
> Meßquellen hift auch der Noise-Reduction-Mode nicht.

Wie hoch darf denn der Widerstand sein? Zum Schutz vor Spannungsspitzen 
leite ich das Signal über einen 2k2 Widerstand und leite mit einer Z5.1 
Diode ab.

Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und leite mit einer Z5.1

Wird der ADC nicht schon zerstört wenn die Spannung über der 
Referenzspannung liegt ?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Travel Rec. wrote:
>>Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den
>>Tiny in den Noise Reduction Sleep Mode schicken.
>
> Das ist Paranoia. Nur bei Controllern mit aktivierter, hoher
> Eingangsverstärkung und sehr schnellen Meßintervallen macht das wirklich
> Sinn. Bei unsauberem / fliegendem Layout oder zu hohen Impedanzen der
> Meßquellen hift auch der Noise-Reduction-Mode nicht.

Wieso Paranoia??? Es steht explizit im Datenblatt das Schalten während 
der ADC Wandlung das Ergebnis verfälscht! Und der Tiny hat nunmal nur 
einen Port!
-----
19.7.2 Analog Noise Canceling Techniques
[...]
c. If any port pins are used as digital outputs, it is essential that 
these do not switch
while a conversion is in progress.
-----
Eventuell hilft aber auch die 2.56V Referenz mit einem Kopelkondesator 
schon weiter:
-----
The Internal voltage reference of 2.56V can optionally be externally 
decoupled at the AREF (PB0) pin by a capacitor, for better noise 
performance.
----

Ansosnten isses mir halt auch egal, war ja nur ein Hinweis... Ich hab 
zumindest bei meinem Tiny auf die weise keine Probleme :P

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Ulrich wrote:
>>und leite mit einer Z5.1
>
> Wird der ADC nicht schon zerstört wenn die Spannung über der
> Referenzspannung liegt ?

Nein. --> Siehe Datenblatt. Alles > Aref resultiert in einem Maixmalen 
ADC Wert...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Läubi Mail@laeubi.de (laeubi)

>Wieso Paranoia??? Es steht explizit im Datenblatt das Schalten während
>der ADC Wandlung das Ergebnis verfälscht!

Die Frage ist immer. Um WIEVIEL wird die Messung verfäslcht.

MfG
Falk

Autor: Elmar Haneke (elmar69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läubi Mail@laeubi.de wrote:

> c. If any port pins are used as digital outputs, it is essential that
> these do not switch while a conversion is in progress.

Die Messfehler treten auch dann auf, wenn kein Portbit umgeschaltet 
wird.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach doch mal einen Schaltplan :-)

Autor: Elmar Haneke (elmar69)
Datum:
Angehängte Dateien:
  • preview image for s.png
    s.png
    5,89 KB, 193 Downloads

Bewertung
0 lesenswert
nicht lesenswert
> Mach doch mal einen Schaltplan :-)

Kommt als Anhang. Es sollten alle relevanten Teile drauf sein.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>..absurde Ausreißer hat, die sogar oberhalb des 12Bit
>Maximalwertes liegen.

Der ATTiny45 hat nur einen 10-Bit-ADC. Beim Überschreiten der 
Referenzspannung kommen auch nur $3FF. Wenn du wirklich Werte >$FFF 
hast, stimmt noch etwas anderes nicht.

MfG Spess

Autor: Elmar Haneke (elmar69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab die Taktfrequenz auf 1MHz gesenkt, danach scheint das Problem 
nichtmehr aufzutreten. Zusätzlich hab ich alledings jetzt nurnoch eine 
8-Bit-Messung drin und den Free-Running-Modus eingeschaltet.

Autor: Alex Bürgel (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich hab die Taktfrequenz auf 1MHz gesenkt, danach scheint das Problem
>nichtmehr aufzutreten. Zusätzlich hab ich alledings jetzt nurnoch eine
>8-Bit-Messung drin und den Free-Running-Modus eingeschaltet.

Vielleicht solltest du, wenn du dem Problem wirklich auf die Spur kommen 
möchtest, immer nur eine Variable gleichzeitig verändern...
Ansonsten stehst du beim nächsten Mal wieder vor dem gleichen Problem.

Schöne Grüße,
Alex

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann das mal sein, daß Du dem ADC gar keinen Vorteiler mitgegeben hast? 
Der ADC darf, egal wie schnell der Controller läuft, nur maximal 250kHz 
schnell laufen, damit noch eine 10-Bit Genauigkeit erreicht werden kann. 
Bei 8-Bit kann der ADC bis 500kHz getaktet werden.

Autor: Christian R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde noch gerne die Codestelle sehen, wo Du die Daten von LastADC 
im Hauptprogramm ausliest. Bedenke, dass es sich hierbei um eine 
16-Bitzahl handelt, die vom AVR nicht mit einer atomaren Operation 
(quasi nicht in einem Rutsch) kopiert werden kann. Daher könnte LastADC 
im ungünstigen Moment aus zwei verschiedenen Messwerten bestehen (Obere 
und untere 8 Bit). Wenn hier ein Übertrag bei 8 Bit stattfindet, gibt's 
in der Tat schöne Ausreisser. Es kann aber nicht erklären, warum die 
Messwerte größer als 0x3FF sind.

In jedem Fall muss sich das Hauptprogramm irgendwie mit dem Interrupt 
synchronisieren, z.B. mit einem pfiffigen Flag.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Elmar Haneke (elmar69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Travel Rec. wrote:
> Kann das mal sein, daß Du dem ADC gar keinen Vorteiler mitgegeben hast?
> Der ADC darf, egal wie schnell der Controller läuft, nur maximal 250kHz
> schnell laufen, damit noch eine 10-Bit Genauigkeit erreicht werden kann.
> Bei 8-Bit kann der ADC bis 500kHz getaktet werden.

Mit

ADCSRA = _BV(ADPS2) | _BV(ADPS1) // Eingangstakt 125 kHz (FCPU/64)

sollte eigentlich ein Vorteiler gesetzt werden.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, bin in GCC nicht zuhause.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier's mal mit
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) // Eingangstakt 125 kHz (FCPU/64)
        ^
Hatte mit dem neuesten WinAVR und dem _BV schon Probleme.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.