Forum: Mikrocontroller und Digitale Elektronik Fehlmessungen im ADC


von Elmar H. (elmar69)


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);
}

von Läubi .. (laeubi) Benutzerseite


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)

von Elmar H. (elmar69)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Elmar H. (elmar69)


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.

von Christian U. (z0m3ie)


Lesenswert?

>und leite mit einer Z5.1

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

von Läubi .. (laeubi) Benutzerseite


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

von Läubi .. (laeubi) Benutzerseite


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...

von Falk B. (falk)


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

von Elmar H. (elmar69)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Mach doch mal einen Schaltplan :-)

von Elmar H. (elmar69)


Angehängte Dateien:

Lesenswert?

> Mach doch mal einen Schaltplan :-)

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

von spess53 (Gast)


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

von Elmar H. (elmar69)


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.

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Christian R. (Gast)


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.

von Falk B. (falk)


Lesenswert?


von Elmar H. (elmar69)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Gut, bin in GCC nicht zuhause.

von Thilo M. (Gast)


Lesenswert?

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

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.