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
voidADW_ausfuehren(void)
2
{
3
unsignedchari;
4
unsignedcharw;
5
unsignedlongMittelwertsumme=0;
6
unsignedinthilfe=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=(unsignedint)(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=(unsignedint)(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?
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.
> 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?
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...
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!
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?
Ü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...
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 !
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!
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?
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.
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.
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
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...