Fehlmessungen im ADC

OP #731578
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);
}
OP #731629
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.
(Firma: TravelRec.) Persönliche Seite #731637
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.
OP #731659
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.
Persönliche Seite #731755
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
Gast #734771
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
(Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #740975
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
Gast #741171
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.
OP #741712
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren