Forum: Mikrocontroller und Digitale Elektronik periodische Schwankungen bei der AD-Wandlung von unbekannter Herkunftandlung von unbekannter Herkunf


von ...alias... (Gast)


Angehängte Dateien:

Lesenswert?

So Hallo, ich hab wieder mal ein "kleines" Problem!

Ich habe den µC F020 von Silabs. Er hat einen 12 Bit-ADC, mit dem ich 
mehrere Spannungswerte von Temperatursensoren einlese.

Einer der Sensoren ist ein auf dem µC integrierter Sensor, er liegt auch 
an einem der 9 Kanäle des ADC.

Nun hab ich das Problem, dass ca. jeder achte eingelesene Wert um 
einiges geringer ist als er sein sollte. Dis tritt aber nur bei den 
externen ADC-Kanälen auf, nicht aber bei dem Kanal des Chipsensors.

An sich kein Problem, liegt halt wahrscheinlich irgend eine Interferenz 
vor, oder so?
Nein, das kann ich ausschließen, weil genau dasselbe auch auftritt, wenn 
ich den Abfrageintervall des ADCs entscheidend verringere oder 
vergrößere.

Beispiel: Intervall ist 1s, dann tritt dieser Fall also ca. alle 8s auf.
          Intervall ist 0,125s: Effekt tritt nach ca. 1s auf.
(Um das zu verdeutlichen, hab ich mal zwei Screenshots von meiner 
Software beigelegt, die den Temperaturverlauf darstellen soll.)

Daraus hab ich geschlossen, dass es eigentlich nur ein softwareseitiger 
Fehler sein kann.

Ich hab also im Debugmodus die einzelnen Spannungswerte des ADCs 
überprüft, und tatsächlich tritt auch hier dieser Fehler auf. Deswegen 
denke ich, dass die softwareseitige Signalverarbeitung keinen Fehler 
beinhaltet, da dieser ja schon an der Wurzel, nämlich beim ADC, 
auftritt.

Nächster Gedanke: Ich hab dem ADC-Multiplexer zu wenig Zeit gegeben, 
seinen Kanal umzuschalten. Aber warum sollte dann der Fehler bloß alle 8 
Zugriffe auftreten?


Falls der ein oder andere mal reinschauen will, ich hab hier mal den 
C-Code von der AD-Wandlung:
1
void ADW_ausfuehren(void)
2
{
3
  unsigned char i;
4
  unsigned char w;
5
  unsigned long Mittelwertsumme=0;
6
  unsigned int hilfe=0;
7
  //ADC0CN=0x80;  //rechtsbündig (High- und Lowbyte)
8
  AMX0SL=0x08;  //AD0.8 ausgewählt (Chipsensor, Kanal 9)
9
  for(w=0;w<50;w++);   //warten, bis AMX0SL eingestellt ist
10
  for(i=0;i<6;i++)    //AD-Wandlung wird 6-mal durchgeführt, danach der Mittelwert gebildet
11
  {
12
    AD0INT=0;  //das heißt, dass das Ermitteln 
13
          //der Daten nicht fertig ist [hat no gar ned angefangen]
14
    AD0BUSY=1;  //und das is das Startsignal (Config: "Every write of 1 to AD0BUSY") 
15
    while(AD0INT==0);  //Warten bis der ADW fertig is ["while(AD0BUSY!=0)"]
16
       //Jetzt ist AD0INT = 1
17
       //ADC0H ist das High Byte, ADC0L das Low Byte
18
    hilfe=ADC0H*0x100;  //die 4Bit im ADC0H werden mit 0x100 (256) multipliziert und addiert
19
            //                      ADC0H             ADC0L
20
            //Bit Nr.          7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0
21
            //Linksbündig:   | X X X X X X X X | X X X X - - - - |
22
            //Rechtsbündig:  | - - - - X X X X | X X X X X X X X |   
23
            //wobei  'X' --> die 12 Bits, die wichtig sind; '-' --> die 4 Nullen    
24
    hilfe+=ADC0L; //Low Byte des ADC-Eingangs in Hilfsvar. gespeichert  
25
    Mittelwertsumme+=hilfe;
26
  }
27
  help1.i=(unsigned int)(Mittelwertsumme/6);
28
  //Jetz kommt AD0.0 zum Zug --> AMX0SL=0x00 (externer Sensor [Thermoelement])
29
  Mittelwertsumme=0;  //Neubeginn
30
  hilfe=0;      //    "
31
  w=0;          //    "
32
  i=0;        //    "
33
  AMX0SL=0x00;  //AD0.0 ausgewählt (Kanal 1)
34
  for(w=0;w<50;w++);
35
    for(i=0;i<8;i++)
36
  {
37
    AD0INT=0;  //Ermitteln der Daten nicht fertig
38
    AD0BUSY=1;  //Los gehts
39
    while(AD0INT==0);  //warten bis AD0BUSY=0
40
    hilfe=ADC0H*0x100;   //High Byte des AD0.0  * 256
41
    hilfe+=ADC0L;       //+ Low Byte  "    "
42
    Mittelwertsumme+=hilfe;                              
43
  }
44
  help2.i=(unsigned int)(Mittelwertsumme/8);
45
}

So ich hoffe ich habs für jedermann verständlich auskommentiert ;)
(Noch was: das is mein erstes Projekt in der Richtung, und das wird man 
wohl meinem Code auch ankennen...)

Ich hab jetzt bloß mal 2 der AD-Wandlungen hier reinkopiert, es 
existieren noch 2 weitere, die aber analog zu den obigen ablaufen.

Weiß jemand Rat?

von ...alias... (Gast)


Lesenswert?

Ach ja, der orange Graph ist der Chip-Sensor, und der grüne ein externes 
Thermoelement. Da sieht man den Unterschied: Die orange Linie bleibt 
konstant, die grüne nicht.

von ...alias... (Gast)


Lesenswert?

Verdammt, irgendwas ist mit dem Betreff falsch gelaufen.. ^^

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> periodische Schwankungen bei der AD-Wandlung von
> unbekannter Herkunftandlung von unbekannter Herkunf
Krass.


> Aber warum sollte dann der Fehler bloß alle 8 Zugriffe auftreten?
Tja, evtl. ist genau dieser Gedankengang falsch, und du hast dir durch 
die Wahl der Abtastzyklen etwas vorgegaukelt.
> Intervall ist 1s, dann tritt dieser Fall also ca. alle 8s auf.
> Intervall ist 0,125s:
Geh mit der Abtastung mal weg von den 2er-Potenzen zu 1s.
Was passiert bei einem Intervall von 0,110s?
Tritt der Effekt dann immer noch nach 8 Abtastungen auf?

von ...alias... (Gast)


Lesenswert?

Ok, grad mal schnell ausprobiert, in dem genauen Fall tritts dann nach 6 
auf.

Ich denke nicht dass es damit was zu tun hat; man sieht ja auch oben bei 
den Graphiken:
Bei der 1s-Abtastung tritt der Effekt sogar erst nach 13 Abtastungen 
auf, sieht also eher nach nach einer indirekten Proportionalität zum 
Abtastintervall aus...

von BBC (Gast)


Angehängte Dateien:

Lesenswert?

So ich hab jetz mal eine längere Messreihe abgespeichert. Ist echt total 
interessant, was der µC so mit seinen ADCs macht, wenn die unbenutzt 
sind. Seht euch das da mal an (am Besten mit IrfanView, das kann so 
große Dateien ab, den Tip hab ich hier im Forum gekriegt. In Irfan View 
dann auf View - Original Size). Vor allem ab dem 2ten Drittel wirds 
lustig, ab da war der ADC komplett frei. Sieht ja fast nach nem Sinus 
aus, dessen Frequenz erst immer kleiner und dann wieder größer wird... 
Und das wird dann irgendwie auf die Messspannung draufmoduliert!

von Arc N. (arc)


Lesenswert?

BBC wrote:
> So ich hab jetz mal eine längere Messreihe abgespeichert. Ist echt total
> interessant, was der µC so mit seinen ADCs macht, wenn die unbenutzt
> sind. Seht euch das da mal an (am Besten mit IrfanView, das kann so
> große Dateien ab, den Tip hab ich hier im Forum gekriegt. In Irfan View
> dann auf View - Original Size). Vor allem ab dem 2ten Drittel wirds
> lustig, ab da war der ADC komplett frei. Sieht ja fast nach nem Sinus
> aus, dessen Frequenz erst immer kleiner und dann wieder größer wird...
> Und das wird dann irgendwie auf die Messspannung draufmoduliert!

Wie sieht denn die Eingangsschaltung für die Thermoelemente aus?
Einfacher RC-Filter? Wird das Thermoelement differentiell (mit externer 
Offset-Spannung z.B. hochohmiger Spannungsteiler) gemessen? Schonmal 
getestet was passiert wenn ein Thermoelementleiter mit z.B. 1 MOhm an 
GND gelegt wird?

von BBC (Gast)


Angehängte Dateien:

Lesenswert?

Das ist die Beschaltung, sollte eigentlich nichts fehlen. C1 müsste 
sowas abblocken.

von BBC (Gast)


Lesenswert?

Übrigens. Wenn man den wirklichen Effekt betrachten will, dann sollte 
man die Datei oben runterladen und in Irfan View betrachten, sie ist 
nämlich viel größer. Wie gesagt, ab dem 2. 3tel wirds interessant...

von LOL? (Gast)


Lesenswert?

Kannst du mal eine Reihe mit den ADC-Werten aufnehmen und die hier 
reinstellen ? Welche Eigenschaften hat der ADC ?

Bevor du noch mehr rumfrickelst, konvertiere die Roh-ADC-Werte nach 
binär (Bitdarstellung) und schau dir an welche Bits wackeln !

von BBC (Gast)


Angehängte Dateien:

Lesenswert?

Also gut, ich seh schon, das funktioniert so nicht. Ich machs mal 
anders: Hier ist der Verlauf, und zwar gezippt. So muss es 
funktionieren.

@LoL?
Ähm, ich versteh das jetz nicht ganz. Du meinst, es schaltet immer ein 
einzelnes Bit hin- und her? Wahrscheinlich dann im Lowbyte, sonst wär 
die Amplitude der Schwankung viel größer. Danke, ich werds mal 
ausprobieren!

von BBC (Gast)


Lesenswert?

Ok, das hat nix gebracht. Einige Werte:

0a7 -> 010100111
137 -> 100110111
035 -> 000110101
100 -> 100000000
140 -> 101000000
158 -> 101011000
093 ->    ...
052 ->
0d2 ->
090 ->
usw.
dies sind die Werte die sich ergeben, wenn der ADC nirgends 
angeschlossen ist. Ziemlich sinnlose Reihe.

Wenn man dagegen den ADC Eingang mit GND verbindet, gibts keine 
Probleme: durchgehend und konstant wird dann 0 angezeigt.
Ich hab auch mal ne 1,5Volt-Batterie angeschlossen; der Wert von 09ca 
wird auch sehr konstant eingehalten.
Ist vielleicht die Thermoelementschaltung zu wenig belastbar?

von crazy horse (Gast)


Lesenswert?

tja, hast du einfach mal mit dem Scope die Spannunug nach dem Verstärker 
angeschaut?
Ich schätze mal, das da die Seuche schon drauf ist. Entweder 
Störeinkopplungen oder der Verstärker schwingt.

von BBC (Gast)


Lesenswert?

Ich weiß jetz zwar nicht, was ein Scope ist, aber ich hab natürlich n 
Multimeter hingehalten. Ein Osci hab ich nicht.
Jedenfalls sind die 40mV bei Zimmertemperatur absolut konstant.

Wie würde man dann außerdem die Abhänigkeit des Effekts von dem 
Messintervall erklären? Weil wenn das Ganze ausschließlich an der 
Verstärkerschaltung liegen würde, dann wär das Ganze doch unabhängig vom 
Auslesevorgang.

von crazy horse (Gast)


Lesenswert?

Oszi==Oszilloskop==Scope :-)
Viel Mist kann man messen durch Alias-Effekte. Entsteht immer, wenn im 
Signal höhere Frequenzen vorhanden sind als die halbe Abtastfrequenz. Es 
entstehen scheinbare Frequenzen, die in Wirklichkeit gar nicht vorhanden 
sind. Wie hoch die Störfrequenz ist, kann man nicht feststellen.
http://de.wikipedia.org/wiki/Alias-Effekt#Demonstration_des_Alias-Effekts

von BBC (Gast)


Angehängte Dateien:

Lesenswert?

So :D Ich denk mal ich hab das Problem:

Es tritt nämlich nur auf, wenn ich am ADC ein Kabel befestige. Dieses 
wirkt dann scheinbar wie eine hochempfindliche Antenne. Man kann schon 
extreme Ausschläge erkennen, wenn man 1m davon entfernt vorbeigeht!

Nimmt man dagegen das Kabel sowie eines das zu GND geht in beide Hände, 
ist sofort Schluss damit: Genau auf Null ist die Spannung dann. Selbst 
so ein großer Widerstand von einem zum anderen Arm kann das also 
unterdrücken... Ich denk mal ich schalt irgendwie 50MOhm oder so auf 
GND, das sollt eigentlich das Problem lösen ^^

Falls es jmd interessiert: Ich hab wieder mal nen kleinen Verlauf 
beigelegt.
Zwischen 0s und 6s  hab ich gar nichts gemacht.
Zwischen 6,5 und ca. 9 bin ich im Abstand von 1m vorbeigegangen.
Bei 12 hab ich die Kabelisolierung angefasst.
Bei 22 den blanken Draht.
Und da wo der Verlauf 0 anzeigt, hab ich sowohl GND als auch das 
ADC-Kabel angefasst.

Naja krass find ichs schon irgendwie...

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.