Forum: Mikrocontroller und Digitale Elektronik ADC starke Schwankungen der Werte


von Andy002 (Gast)


Lesenswert?

Hallo,
Ich verwende einen ATmega1248p mit 20 MHz Takt.
Der Controller sitzt auf eine Platine OHNE MasseFläche.  Die 
Potentiometer sind 7 x 10k schiebePotis die mit einem bandkabel an den 
Controller gesteckt werden.

Ich lese hier schon nur 8 Bit des adc's aus und die haben leider schon 
starke Schwankungen... Sprich die letzte stelle schwankt um 3-4 werte...

Hab schon einige Beiträge im Forum gelesen und würde mir gerne ein paar 
Punkte zusammen stellen mit denen ich die werte genauer hin bekomm...
Falls ein Schaltplan oder Programm benötigt wird kann ich das gerne 
hochladeb bin allerdings gerade nur mit dem Handy unterwegs.

Wär wirklich super wenn einige ein paar Punkte aufzählen könnten um dir 
werte genau zu kriegen, da der Wert ja um insgesamt 3 Bits schwankt was 
ja nicht gerade wenig ist...

Danke im voraus!

von DieDrei (Gast)


Lesenswert?

Hallo, mach es wie in meiner Schaltung, dann funktioniert es. Kann sie 
aber gerade leider nicht hochladen da ich mit dem Handy unterwegs bin. 
Ein Foto geht auch nicht da die Schaltung nicht dort ist wo gerade das 
Handy ist.

So weit schon mal die ersten Tipps entsprechend dem Informationsgehalt 
deiner Frage.

von Dirk K. (dekoepi)


Lesenswert?

1nF zwischen ADC-Input-Pin und Mess-Opfer?

Oder hier mal lesen, spuckt die Suche nach "ADC Schwankungen" gleich als 
erstes aus: Beitrag "Atmega168 ADC - Schwankungen/Beeinflussungen vom Nachbarpin"

von Purzel H. (hacky)


Lesenswert?

Mach zu Beginn eine Masseflaeche drunter...

von Karl H. (kbuchegg)


Lesenswert?

KÖnnte auch ein Softwareproblem sein.
Zu kleiner / zu grosser ADC Prescaler

von Udo S. (urschmitt)


Lesenswert?

Karl Heinz schrieb:
> KÖnnte auch ein Softwareproblem sein.

Könnte alles sein, Der TO sollte sich an die Netiquette bzgl 
Problembeschreibung halten und an Bildformate

von Andy002 (Gast)


Lesenswert?

voerst Danke!

1nF zwischen adc eingang und Messleitung? nicht gegen GND?

Prescaler habe ich 128 gewählt lieg also ca bei 156kHz

von Ein (Gast)


Lesenswert?

Andy002 schrieb:
> Falls ein Schaltplan oder Programm benötigt wird ...

Sehr gut, damit würde man weiter kommen.

von daf (Gast)


Lesenswert?

Andy002 schrieb:
> 1nF zwischen adc eingang und Messleitung? nicht gegen GND?


Bitte die aktuelle Schaltung als Schaltplan darstellen, sonst drehen wir
uns hier noch mehr im Kreis.

von Werner (Gast)


Lesenswert?

Andy002 schrieb:
> Ich lese hier schon nur 8 Bit des adc's aus und die haben leider schon
> starke Schwankungen... Sprich die letzte stelle schwankt um 3-4 werte...

Was meinst du mit "letzte Stelle" bei 8Bit. In einer Binärdarstellung 
kann die nur "0" oder "1" sein.

Vielleicht zeigst du einfach mal die Verteilungsfunktion der Werte ...

von Gerald G. (gerald_g)


Lesenswert?

Ich denke er meint wenn er den Wert zwischen 0 und 255 darstellen lässt, 
schwangt der hintere Wert, sprich, die letzten 2 Bits

von Amateur (Gast)


Lesenswert?

Ich würde sagen 42.

Eine Analogmessung besteht aus einem Sack voll Code:
Geht ja keinen war an!

Eine Analogmessung benötigt analoge Wege (Layout/Verdrahtung):
Geht ja keinen was an!

Eine konstante Spannung zu messen ist Beutelschneiderei:
Vielleicht schwankt die Spannung ja würglüch?

von Interessierter Beobachter (Gast)


Lesenswert?

Amateur schrieb:
> Vielleicht schwankt die Spannung ja würglüch?

Oder die Referenz eiert wegen massiver Störungen, fehlender Abblockung 
oder mangels Stützkondensator durch die Gegend. Oder die Settling-Time 
am Mux ist zu kurz, oder, oder, oder ...

von asd (Gast)


Lesenswert?

Jaja...

Beim Erfassen von analogen Signalen wird das Rad immer wieder neu 
erfunden.

von Andy002 (Gast)


Lesenswert?

Ich meine bei der 8 Bit Auflösung schwankt die letzte stelle...

Schaltplan und Code werde ich hochladen sobald ich Zugang zu den 
Unterlagen heute habe... Deswegen hab ich es ja angeboten muss man nicht 
gleich so aufbrausend kommen^^

Naja ganz im Gegenteil eigentlich...  Hab schon oft den adc eingesetzt 
und drauf geachtet dass alles passt... Die Schwankungen war nie 
vorhanden und wenn dann minimal und nicht auffallend... Auch der 
Controller mit adc wurde schon eingesetzt allerdings mit 16 MHz und 10 
Bit Auflösung

Hab allerdings jetzt ein jahr pause gemacht was die Mikrocontroller 
betrifft da übersieht man dann schon eine Kleinigkeit die das ganze zu 
schaukeln bringen kann...  Auch das PlatinenLayout wurde nicht gerade 
optimal erstellt aber seht später selbst

von Purzel H. (hacky)


Lesenswert?

Die letzte (binaer-) Stelle schwankt immer.

von Dirk K. (dekoepi)


Lesenswert?

Ich habe gestern für meine Stabilisierung aus jeweils 100nF für Vcc/AVcc 
und einem gemeinsamen 10µF-Kerko letzteren durch einen "großzügig 
dimensionierten" 10µF Tantal ersetzt. Das reicht schon, um gemütlich um 
2 LSB zu pendeln; zuvor waren Sprünge um absolut +/-3 bis 5 drin, jetzt 
eben sehr viel ruhiger maximal +/-2 absolut.

Warte noch auf Ferritperlen und auf 1µF Kerkos. Mit den beiden sollte 1 
LSB Auflösung schaffbar sein.

von Fabian F. (fabian_f55)


Lesenswert?

Oszilloskop vorhanden?
Wenn ja mal
VCC
Analog GND
AVRef
und das Signal selbst messen.

Wenn da einer Schwingt wirkt sich das eher kontraproduktiv auf die 
Messung aus...

von Andy002 (Gast)


Angehängte Dateien:

Lesenswert?

Siebzehn Zu Fuenfzehn schrieb:
> Die letzte (binaer-) Stelle schwankt immer.

Naja in meinem Fall kommen die 2 nicht ausgelesen bits ja noch dazu (bit 
adc) also wär die schwankung noch größer

Fabian F. schrieb:
> Oszilloskop vorhanden?
> Wenn ja mal
> VCC
> Analog GND
> AVRef
> und das Signal selbst messen.
>
> Wenn da einer Schwingt wirkt sich das eher kontraproduktiv auf die
> Messung aus...

Oszi hab ich leider keins da sonst hätt ich den Fehler schon längst 
eliminieren können ;)

Also ich hab schon mal den Fehler gemacht den VCC für die Slider nicht 
an der Signalbahn, die beim AVCC vorbei läuft ab zu greifen.
An der Buchsenleiste wird ein Bandkabel eingesteckt, dass direkt an die 
10 Slider geht. GND und VCC sind an den Slidern mit Drähten 
durchgebrückt.

von Uwe (de0508)


Lesenswert?

Andy002,

warum ist der ADC des AVR nicht so wie von Atmel vorgegeben verdrahtet ?

Zwei Elkos ist verkehrt verschaltet.

von Andy002 (Gast)


Lesenswert?

Uwe S. schrieb:
> Andy002,
>
> warum ist der ADC des AVR nicht so wie von Atmel vorgegeben verdrahtet ?
>
> Zwei Elkos ist verkehrt verschaltet.

sind zwei Kerkos. einer auf ARef Pin und einer zwischen AVCC und GND 
dachte das passt soweit?!

von M. P. (Gast)


Lesenswert?

Andy002 schrieb:
> sind zwei Kerkos.

C2 und C11?

von Mike A. (Gast)


Lesenswert?

Uwe S. schrieb:
> Zwei Elkos ist verkehrt verschaltet.

Ich komme auf drei ...

von Mike A. (Gast)


Lesenswert?

Mike A. schrieb:
> Ich komme auf drei ...

p.s. auf Schaltplanfragment nicht dargestellt ;-)

von Andy002 (Gast)


Lesenswert?

M. P. schrieb:
> Andy002 schrieb:
>> sind zwei Kerkos.
>
> C2 und C11?

dachte die Glättungskondensatoren müssen an den 7805 ??

ein Kerko vor VCC und GND
ein Kerko vor AVCC und GND und
ein Kerko auf AREF und GND

jeweils vor und nach den 7805 und 7803 einen Kerko mit 100nF
C11 ein Pufferkondensator
C2 ein Glättkondensator

ist das falsch??

von Andy002 (Gast)


Lesenswert?

C10 ist für die Reset schaltung beim einschalten
C13 C14 am Quarz

von :-) (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Karl Heinz schrieb:
>> KÖnnte auch ein Softwareproblem sein.
>
> Könnte alles sein, Der TO sollte sich an die Netiquette bzgl
> Problembeschreibung halten und an Bildformate

> Bildformate
> Bildformate
> Bildformate
> Bildformate
> Bildformate

Ohne Bild?

von Andy002 (Gast)


Lesenswert?

:-) schrieb:
> Udo Schmitt schrieb:
>> Karl Heinz schrieb:
>>> KÖnnte auch ein Softwareproblem sein.
>>
>> Könnte alles sein, Der TO sollte sich an die Netiquette bzgl
>> Problembeschreibung halten und an Bildformate
>
>> Bildformate
>> Bildformate
>> Bildformate
>> Bildformate
>> Bildformate
>
> Ohne Bild?

habs auch mit dem Orginale Code aus dem Tutorial probiert...
1
#define F_CPU 20000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <stdio.h>
6
#include <avr/interrupt.h>
7
#include "lcd-routines-SPI_20MHz.h"
8
9
// Diese Beispiel zeigt die Anwendung des ADC eines ATmega169
10
// unter Verwendung der internen Referenzspannung von nominell 1,1V.
11
// Zur Anpassung an andere AVR und/oder andere Referenzspannungen
12
// siehe Erläuterungen in diesem Tutorial und im Datenblatt
13
 
14
/* ADC initialisieren */
15
void ADC_Init(void);
16
 
17
/* ADC Einzelmessung */
18
uint16_t ADC_Read( uint8_t channel );
19
 
20
/* ADC Mehrfachmessung mit Mittelwertbbildung */
21
/* beachte: Wertebereich der Summenvariablen */
22
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t nsamples );
23
 
24
/* Beispielaufrufe: */
25
 
26
int main( void )
27
{
28
  DDRB = 0xFC;
29
  PORTB |= (1<<PORTB2);
30
  
31
  uint16_t adcval;
32
  char Buffer[20];
33
  ADC_Init();
34
  
35
  
36
  
37
  spi_LCD_init();
38
  lcd_init();
39
 
40
  while( 1 ) {
41
    adcval = ADC_Read(0);  // Kanal 0
42
    // mach was mit adcval
43
 
44
    //adcval = ADC_Read_Avg(0, 8);  // Kanal 2, Mittelwert aus 4 Messungen
45
    // mach was mit adcval
46
  
47
  lcd_setcursor(0,1);
48
  sprintf(Buffer, "%d ", adcval);
49
  lcd_string(Buffer);
50
  }
51
}
52
53
/* ADC initialisieren */
54
void ADC_Init(void) {
55
 
56
  // die Versorgungsspannung AVcc als Refernz wählen:
57
  ADMUX = (1<<REFS0);    
58
  // oder interne Referenzspannung als Referenz für den ADC wählen:
59
  // ADMUX = (1<<REFS1) | (1<<REFS0);
60
 
61
  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
62
  // schon auf 0, also single conversion
63
  ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
64
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
65
 
66
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
67
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
68
 
69
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
70
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der Konvertierung warten
71
  }
72
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
73
     Wandlung nicht übernommen. */
74
  (void) ADCW;
75
}
76
 
77
/* ADC Einzelmessung */
78
uint16_t ADC_Read( uint8_t channel )
79
{
80
  // Kanal waehlen, ohne andere Bits zu beeinflußen
81
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
82
  _delay_ms(1);
83
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
84
  while (ADCSRA & (1<<ADSC) ) {   // auf Abschluss der Konvertierung warten
85
  }
86
  return ADCW;                    // ADC auslesen und zurückgeben
87
}
88
 
89
/* ADC Mehrfachmessung mit Mittelwertbbildung */
90
/* beachte: Wertebereich der Summenvariablen */
91
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t nsamples )
92
{
93
  uint32_t sum = 0;
94
 
95
  for (uint8_t i = 0; i < nsamples; ++i ) {
96
    sum += ADC_Read( channel );
97
  }
98
 
99
  return (uint16_t)( sum / nsamples );
100
}

von Uwe (de0508)


Lesenswert?

Hi  Andy002,

also kennst Du nicht die vielen Application Notes von Atmel.
Wenn man sich daran hält hätte man weniger Probleme.

Die sind ALLE auf der Atmel Webseite zu deinem AVR µC gelistet.

Speziell fehlt mir hier eine C-L-C Filter vor dem AVcc Eingang.

von der alte Hanns (Gast)


Lesenswert?

Aufgrund der Diskrepanz zwischen Text (20) und Schaltplan (16) könnte 
ein Böswilliger auf die Idee kommen, dass der uC in Wirklichkeit noch 
mit der Standardeinstellung (1 MHz) läuft.

von Andy002 (Gast)


Lesenswert?

Uwe S. schrieb:
> Hi  Andy002,
>
> also kennst Du nicht die vielen Application Notes von Atmel.
> Wenn man sich daran hält hätte man weniger Probleme.
>
> Die sind ALLE auf der Atmel Webseite zu deinem AVR µC gelistet.
>
> Speziell fehlt mir hier eine C-L-C Filter vor dem AVcc Eingang.

Nein das ist mir jetzt neue! Hast du vielleicht einen link an der Hand? 
Ansonsten Werd ich nach der Arbeit daheim gerne auch selber suchen. Aver 
danke! Hoffe ich komm da auf einen Fehler...

der alte Hanns schrieb:
> Aufgrund der Diskrepanz zwischen Text (20) und Schaltplan (16)
> könnte ein Böswilliger auf die Idee kommen, dass der uC in Wirklichkeit
> noch mit der Standardeinstellung (1 MHz) läuft.

Nein zuerst war 16mhz vorgesehen deswegen 16 MHz im Schaltplan verbaut 
wurden aber 20 MHz und das ist ja der entscheidende Punkt... Die fuse 
sind auch richtig gesetzt hab's bereits getestet und quch schon die 
usart und timer benutzt die hätten  ja dann nicht richtig 
funktioniert...

von Uwe (de0508)


Lesenswert?

Ups Andy002,

ich hätte nicht gedacht, dass Dir die Hersteller URL fehlen würde.

Hier ist der Link: http://www.atmel.com/

Klickt man einmalig gelangt man hier hin:

# http://www.atmel.com/products/microcontrollers/avr/default.aspx

von Andy002 (Gast)


Lesenswert?

Uwe S. schrieb:
> Ups Andy002,
>
> ich hätte nicht gedacht, dass Dir die Hersteller URL fehlen würde.
>
> Hier ist der Link: http://www.atmel.com/
>
> Klickt man einmalig gelangt man hier hin:
>
> # http://www.atmel.com/products/microcontrollers/avr...
Herstellen ist mir schon bekannt allerdings kenn ich mich auf der Seite 
nicht aus also wäre es hilfreich gewesen (falls zu ihn zur Hand gehabt 
hättest was ich ja sagte)  wenn du mir einen direkt-link geschickt 
hättest

DANKE

von spess53 (Gast)


Lesenswert?


von Andy002 (Gast)


Lesenswert?

Weis einfach nicht weiter... :(

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.