www.mikrocontroller.net

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


Autor: ...alias... (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void ADW_ausfuehren(void)
{
  unsigned char i;
  unsigned char w;
  unsigned long Mittelwertsumme=0;
  unsigned int hilfe=0;
  //ADC0CN=0x80;  //rechtsbündig (High- und Lowbyte)
  AMX0SL=0x08;  //AD0.8 ausgewählt (Chipsensor, Kanal 9)
  for(w=0;w<50;w++);   //warten, bis AMX0SL eingestellt ist
  for(i=0;i<6;i++)    //AD-Wandlung wird 6-mal durchgeführt, danach der Mittelwert gebildet
  {
    AD0INT=0;  //das heißt, dass das Ermitteln 
          //der Daten nicht fertig ist [hat no gar ned angefangen]
    AD0BUSY=1;  //und das is das Startsignal (Config: "Every write of 1 to AD0BUSY") 
    while(AD0INT==0);  //Warten bis der ADW fertig is ["while(AD0BUSY!=0)"]
       //Jetzt ist AD0INT = 1
       //ADC0H ist das High Byte, ADC0L das Low Byte
    hilfe=ADC0H*0x100;  //die 4Bit im ADC0H werden mit 0x100 (256) multipliziert und addiert
            //                      ADC0H             ADC0L
            //Bit Nr.          7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0
            //Linksbündig:   | X X X X X X X X | X X X X - - - - |
            //Rechtsbündig:  | - - - - X X X X | X X X X X X X X |   
            //wobei  'X' --> die 12 Bits, die wichtig sind; '-' --> die 4 Nullen    
    hilfe+=ADC0L; //Low Byte des ADC-Eingangs in Hilfsvar. gespeichert  
    Mittelwertsumme+=hilfe;
  }
  help1.i=(unsigned int)(Mittelwertsumme/6);
  //Jetz kommt AD0.0 zum Zug --> AMX0SL=0x00 (externer Sensor [Thermoelement])
  Mittelwertsumme=0;  //Neubeginn
  hilfe=0;      //    "
  w=0;          //    "
  i=0;        //    "
  AMX0SL=0x00;  //AD0.0 ausgewählt (Kanal 1)
  for(w=0;w<50;w++);
    for(i=0;i<8;i++)
  {
    AD0INT=0;  //Ermitteln der Daten nicht fertig
    AD0BUSY=1;  //Los gehts
    while(AD0INT==0);  //warten bis AD0BUSY=0
    hilfe=ADC0H*0x100;   //High Byte des AD0.0  * 256
    hilfe+=ADC0L;       //+ Low Byte  "    "
    Mittelwertsumme+=hilfe;                              
  }
  help2.i=(unsigned int)(Mittelwertsumme/8);
}

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?

Autor: ...alias... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ...alias... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verdammt, irgendwas ist mit dem Betreff falsch gelaufen.. ^^

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...alias... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: BBC (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: BBC (Gast)
Datum:
Angehängte Dateien:

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

Autor: BBC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: LOL? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: BBC (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: BBC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: BBC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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#Demonstr...

Autor: BBC (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

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.