Forum: Mikrocontroller und Digitale Elektronik ADuC7060 Kanalwechsel


von Markus U. (mexx0085)


Lesenswert?

Hallo Leute!

Und zwar arbeite ich mit deinem ADuC7060 und will nun am ADC0 (Primary 
ADC) zwei Spannungen messen (jeweils von einem Temperatursensor).
also so:

Pin AIN0/AIN1 ... Sensor1
Pin AIN2/AIN3.... Sensor2

Die Messungen erfolgen differentiell.

Jetzt hab ich folgende Frage:
Direktes multiplexen zwischen den Kanälen ist nicht möglich. Wie kann 
ich nun zwischen diesen Pins hin und herschalten?

Habe mir gedacht mit einem Timer.. Interrupt auslösen, dann Sensor 1 
messen, erstes Messergebnis verwerfen, nochmal messen und Ergebnis 
abspeichern. Dann auf zweiten kanal wechseln und das selbe..

Könnt ihr mir vielleicht helfen??

MFG Mexx

von Markus U. (mexx0085)


Lesenswert?

hmm keiner eine Idee???

von Gast (Gast)


Lesenswert?

Was meinst du mit direktem Multiplexing?

Laut Handbuch muss doch nur ADC0CON entsprechend gesetzt werden?
Kanal raussuchen, Messung starten, warten bis Ergebnis da ist.

von Markus U. (mexx0085)


Lesenswert?

Ja genau.

Naja bei gewissen Modellen gibt es ein eigenes Register fürs 
Multiplexen.
Aber egal das betrifft mich e nicht.

Ja also über ADC0CON Kanal setzen, messen, jedoch das erste Ergebnis 
verwerfen oder? und erst das zweite nehmen.
Und anschließend nächsten Kanal wählen?

Man benötigt doch sicher eine gewisse Pause zwischen den Wechseln.. im 
manual is da leider nichts drin.

mfg

von Skua (Gast)


Lesenswert?

>Ja also über ADC0CON Kanal setzen, messen, jedoch das erste Ergebnis
>verwerfen oder? und erst das zweite nehmen.
>Und anschließend nächsten Kanal wählen?

Wenns noch schnell genug ist auf jeden fall die sichere Methode.
Sonst einfach mal die beiden Messungen vergleichen und schauen ob die 
erste schon Sinn macht.

von Markus U. (mexx0085)


Lesenswert?

Naja das Problem ist, ich hab es schon versucht, auf beide Arten.. und 
die Werte schwanken viel zu viel.. im mV-Bereich... Verwende ich nur 
einen Kanal, also ohne Umschalten, habe ich meine geforderte 
Genauiggkeit in uV-Bereich.

mfg

von Gast (Gast)


Lesenswert?

Kommt halt auch drauf an, wie du misst.
Wenn du nur eine einzelne Messung machst, braucht da nichts weggeworfen 
werden. Wenn du kontinuierlich misst vermutlich schon eher.

von Markus U. (mexx0085)


Lesenswert?

Ja ich will kontinuierlich messen. :-)

Und eben beim Umschalten bekomm ich nur falsche Werte.

von Gast (Gast)


Lesenswert?

Ich denke im uV Bereich wird das nichts. Was für eine Referenz 
verwendest du?
Hast du ein RC Gleid vor dem Wandler? Zumindest bei den anderen ADUC 
muss der ran. Sonst wird die Spannung durch den "switched Capacitor" 
heruntergezogen und die Ergebnisse stimmt nicht mehr. Schon mal ein Oszi 
an die Eingangspins angeschlossen?

Wenn es nicht einmal mit einem Kanal funktioniert, vermute ich, du hast 
eine nicht optimale Ansteuerung des ADC

von Markus U. (mexx0085)


Lesenswert?

Ja RC-Glied is dran..

naja wenn ich mit einem kanal messe, dann funktioniert schon alles..

Nur sobald ich den Kanalwechsel programmiere, bekomme ich zwar annähernd 
die Werte hin, die ich haben will, jedoch schwanken die eben im mV 
Bereich.

Ne ein Oszi steht mir leider nicht zur Verfügung..

von Gast (Gast)


Lesenswert?

Poste mal ein wenig Code, wie du umschaltest.
Schaltest du den ADC vorher ab?
Du weißt schon, dass bei einem SImga-Delta-Wandler vorherige Messungen 
in das aktuelle Ergebnis mit einfliessen?
Einfach kontinuierlich messen, den Kanal im Register umstellen und 
weitermessen wird nicht funktionieren.

von Gast (Gast)


Lesenswert?

Ach ja, ohne Oszi wird das ganze immer ein Ratespiel bleiben, weil du 
nicht weißt, wo die Fehler entstehen.

von Markus U. (mexx0085)


Angehängte Dateien:

Lesenswert?

ADC-Config File

von Markus U. (mexx0085)


Angehängte Dateien:

Lesenswert?

Messungs-File

von Markus U. (mexx0085)


Lesenswert?

Ne abschalten tu ich ihn nicht.. Du meinst den ganzen ADC disablen,dann 
Kanal wechseln und dann wieder enablen?

von Arc N. (arc)


Lesenswert?

> Ich denke im uV Bereich wird das nichts. Was für eine Referenz
> verwendest du?

Solange da keine Fehler in der Vorserie vorhanden sind, sollten die 
Fehler, je nach Wandlungsrate und vorheriger interner 
Offset/Gain-Kalibrierung, < 1 uV (relativ zur Referenz) sein.
(die ADCs sind denen der AD779x/AD7190 ziemlich ähnlich)

Gast wrote:
> Ach ja, ohne Oszi wird das ganze immer ein Ratespiel bleiben, weil du
> nicht weißt, wo die Fehler entstehen.

Im Datenblatt lässt sich eigentlich alles finden...
Seite 35
single shot Messung: 2 oder 3 ADC-Zyklen je nach dem ob der Chopper 
eingeschaltet ist, der Interrupt wird nach den 2/3 Zyklen ausgelöst.
continuous mode: ein ADC-Zyklus

Seite 39, Tabelle 38 settling time, je nach Einstellungen ein bis vier 
ADC Zyklen, hier sind die ersten Werte nicht genau

p.s. habt ihr die Teile direkt von Analog oder sind die mittlerweile bei 
den Distributoren aufgetaucht?

von Markus U. (mexx0085)


Lesenswert?

Betreff Refernz:

Ich verwende eine AD780 Band Gap Referenz mit 2.5V
Wie gesagt, sobald ich nur mit einem Kanal messe, bekomme ich genau die 
Werte raus, die ich haben will. (Wert +/- 50uV)

Nur eben sobald ich das Umschalten verwende (wahrscheinlich ist die 
Programmierung noch falsch) bekomme ich Abweichungen im mV-Bereich und 
steigend heraus.

mfg

von Markus U. (mexx0085)


Lesenswert?

@ Arc-Net:

Ich mach grad ein Praktikum und habe das Eval-Board zur Verfügung 
gestellt bekommen. Woher die das genau haben weiß ich leider nicht.

von Gast (Gast)


Lesenswert?

Als erstes zu deinem Code:

floats will man nicht auf einem uC verwenden. Nimm lieber 
Pseudokommazahlen und rechne mit Integer.
Auf Printf wenn möglich verzichten, dadurch wird der Code riesig. 
Erfolgt die Ausgabe per Uart ohne Interrupts, steht das Programm erst 
einmal eine Weile.
Versuche keine Spannung die berechent wurde auszugeben. Nimm statt 
dessen den ADC-Wert. Eventuell stimmt einer deiner Berechnungen nicht?
Schreib Kommentare so, dass sie auch etwas bringen. Bei deinen 
Berechnungen steht kein einziger Kommentar. Dafür bei Registern, deren 
Werte man im Handbuch nachschauen kann.

In deinem Code verwendest du eine externe Referenz. Was ist das? Einfach 
nur Vdd? Vdd ist nicht stabil. Dadurch kommt es zu Abweichungen im 
Ergebnis.

Ich kenne nur die anderen ADC die mit einem "Switched Capacitor" 
arbeiten. Am anfang würde ich den ADC jedesmal neu initialisierung ein 
einzelne Messungen machen und dann Schritt für Schritt den Code 
einfacher machen.

Die Handbücher von Analog sind leider nicht sehr detailliert :(

von Markus U. (mexx0085)


Lesenswert?

@ Gast

Die Printf's verwende ich nur, da die Software (IAR) ein Terminal I/O 
besitzt und mir daher die Werte anzeigen lasse. Kommt später sowieso 
weg.

Der angesprochenen UART...Da ich erst neu im Kapitel 
Mikrokontrollerprogrammierung bin, kenne ich mich noch nicht so gut aus.
Hab zwar die UART Schnittstelle initialisiert und habe auch, ADC-Werte, 
die ich in einen Buffer geschrieben habe, per UART gesendet. Dies hat 
funktioniert. Jedoch weiß ich nicht, wie ich über den UART Werte am 
Bildschirm visualisieren kann? Hab schon viel im Forum herumgesucht, 
aber nichts gefunden.

Die Berechnungen an sich stimmen. Wie vorher gesagt habe ich die 
Eingangsspannung vorgegeben, mit einem Präzisionsmessgerät mitgemessen 
und komme auf +/- 50uV genau hin.

Welche Referenz ich verwende habe ich auch oben geschrieben (AD780 auf 
2.5V eingestellt)

MFG

von Arc N. (arc)


Lesenswert?

Gast wrote:
> Ich kenne nur die anderen ADC die mit einem "Switched Capacitor"
> arbeiten. Am anfang würde ich den ADC jedesmal neu initialisierung ein
> einzelne Messungen machen und dann Schritt für Schritt den Code
> einfacher machen.

Ist hier definitiv nicht notwendig, ausser das Vorserienteil hat einige 
Macken.

> Die Handbücher von Analog sind leider nicht sehr detailliert :(

Was schon vorgeschlagen wurde, Programm soweit vereinfachen wie möglich.
Z.B.
1
int results01[100];
2
int results23[100];
3
4
int main() {
5
    // no timers, no interrupts
6
7
    ADC0_Configuration();
8
9
    while (true) {
10
        ADC0_Start(); 
11
        ADC0_SwitchChannels(0);
12
13
        for (int i = 0; i < 100; i++) {
14
            while (!ADC0_ConversionReady()) { }
15
            results01[i] = ADC0DAT;   
16
        }
17
18
        ADC0_SwitchChannels(1); 
19
20
        for (int i = 0; i < 100; i++) {
21
            while (!ADC0_ConversionReady()) { }
22
            results23[i] = ADC0DAT;   
23
        }
24
         
25
        ADC0_Idle();
26
27
        SendResults();
28
    }
29
30
    return 0;
31
}

von Gast (Gast)


Lesenswert?

Uart ist im PC RS232. Da gibt es kein "festes" Programm.
Ich vermute dein Terminal I/O läuft auch über Uart.
Am einfachsten ist für den Anfänger Ausgabe per Hyperterm. Wenn man sich 
ein bischen einliesst und herausfindet, dass es ANSI Steuercodes gibt, 
kan man damit ganz nette Oberfächen basteln.
Man kann auch mit C ein einfaches Programm schreiben, welches die 
Messdaten anzeigt. Ich habe so etwas mal mit Labview realisiert, um eine 
Pulswelle in Echtzeit anzuzeigen.

Ansonten gilt das, was ark vorgeschlagen hat. Im Gegensatz zu mir 
scheint er schon einmal mit dem ADC deines MOdells gearbeitet zu haben.

Hast du einen JTAG Debugger? Damit ist das Arbeiten wesentlich einfacher 
als per Uart oder LED zu debuggen. Da muss aber jeder selbst 
herausfinden, welche Werkzeuge einem gefallen.

von Markus U. (mexx0085)


Lesenswert?

Ja haben eine JTAG_Debugger. nur hab iuch keine Ahnung wie ich damit 
Werte am PC anzeigen lassen kann.. :-(

von Gast (Gast)


Lesenswert?

Wenn ich deinen Code richtig Verstanden habe, pufferst du Messwerte in 
einem Array zwischen.

Mit IAR habe ich bisher noch nicht gearbeitet. Ich debugge mit Eclipse. 
So bald das Programm angehalten wird, kann man in Eclsipe den 
Variableninhalt anzeigen lassen.

von Markus U. (mexx0085)


Lesenswert?

hm naja bei IAR gibt es ein Terminal I/O.. das erlaubt einen printf.. 
dann zeigt es die Werte mit 1-2Hz an.
Ist eigentlich komplett unbrauchbar, dauert ewig..

Auf was anderes bin ich noch ned gekommen

von Markus U. (mexx0085)


Lesenswert?

@ Arc Net

So wie ich das sehe an deinem geposteten Programm, benötige ich also 
keine Interrupts?

MFG Mexx

von Gast (Gast)


Lesenswert?

Wenn mn damit leben kann, die Zeitsteuerung mit while-Warteschleifen zu 
machen geht es auch ohne.

So bald mehr Aufgaben dazu kommen, tut man sich damit keinen Gefallen.

von Markus U. (mexx0085)


Lesenswert?

Hab das Programm jetzt soweit umprogrammiert..

Jetzt habe ich da Problem, dass am Anfang falsche Werte rauskommen und 
nach einer gewissen Zeit durchgehend die richtigen.

z.B.: verwendet als U-Quelle eine 1.5V batterie.

Wert: 1.569801V

Und wenn ich nun meine Messung starte, bekomme ich die erste 200-300 
Werte (Anzahl der Werte ändert sich jedes mal) 1.569226V statt 1.569801V 
raus..

Was kann da sein?

MFg mexx

von Markus U. (mexx0085)


Angehängte Dateien:

Lesenswert?

Hier hab ich ein Diagramm im Excel gemacht.. Da ist der Verlauf recht 
gut zu sehen, dass anfangs der Wert viel niedriger ist.

Ab dem Wertwechsel sinkt er nicht mehr.. dann geht der Verlauf immer so 
weiter.

mfg

von Gast (Gast)


Lesenswert?

Von wo kommen die 3 Nadeln in deinem Signal? Mit was für einer 
Abtastrate arbeitest du? Für mich sieht das Signal so aus, als ob da 
eine Störspannung, z.B. Netzbrummen, mit drauf liegt.

Bei dem Rest kann ich nur Raten. Eventuell bricht die Batteriespannung 
am Anfang ein? Im Sigma-Delta ist ein Samplekondensator eingebaut, der 
bei den ersten Messungen geladen wird. Da die Spannung nur um 600uV 
einbricht, köntne dies denkbar sein. Aber wie bereits geschrieben, das 
ist nur geraten. Bricht die Spannung immer noch ein, wenn du an die 
Batterie einen Lastwiderstand parallel zum ADC anschließt?

von Markus U. (mexx0085)


Lesenswert?

Also die 3 Nadeln sind die Umschaltvorgänge nehme ich an.. Alle 200 
Werte erfolgt ein Kanalwechsel. Dargestellt ist nur ein kanal. Und da 
die Nadeln alle 200 Werte auftreten, schätze ich dass diese vom 
Umschalten hervorgehen.

Abtastrate ist 1kHz.

Netzbrummen ist drauf ja, jedoch liegt das im Toleranzbereich. Hast du 
eine Ahnung wie ich das weiter einschränken könnte?

Hm das mit dem Kondensator könnte stimmen, jedoch ist hierfür ja die 
SettleTime ausschlaggeben oder? und diese ist im Datenblatt bei meiner 
Verwendung mit 2/fadc angegeben also 2ms. Bei einer Frequenz von 1kHz 
würde das bedeuten dass nur die ersten beiden Werte falsch sind oder?

Nein einen Lastwiderstand habe ich noch nicht angeschlossen

von Gast (Gast)


Lesenswert?

Was für einen Temperatursensor willst du auslesen? Wie schnell ist der? 
Ich vermute 1kHz ist ein wenig übertrieben. Mit dem Eingangstiefpass 
kannst du eventuell schon versuchen 50Hz herauszufiltern. Ich vermute 
der Effekt wird leider nur minimal sein. Am einfachsten lassen sich 50Hz 
mit einem 20ms Mittelwertsfilter herausrechnen.

von Markus U. (mexx0085)


Lesenswert?

Also es ist so geplant, dass an den ADC0 2 Thermocouples & an den ADC1 3 
Thermocouple kommen und 1 PT1000 an den ADC1. Damit kann ich dann 5 
Thermocouples betreiben. Daher benötige ich einer höhere Frequenz.

Hm Tiefpass habe ich schon draufgemacht, bringt eben leider ned viel.

Mfg

von Gast (Gast)


Lesenswert?

Thermopiles die ich kenne können max. 20Hz. Bei der Verwendung eines 
richtig dimensionierten Analog Frontends mit eingebautem Tiefpass würde 
sogar ein 10Bit Wandler ausreichen.

Deine Netzstörungen können in deine Messschaltung über kapazitive 
Einkopplung etc. gelangen.

von Markus U. (mexx0085)


Lesenswert?

Welche ich da genau verwenden muss weiß ich noch nicht, wird mir erst 
gesagt.. :-)

von Arc N. (arc)


Lesenswert?

Markus Unbekannt wrote:
> @ Arc Net
>
> So wie ich das sehe an deinem geposteten Programm, benötige ich also
> keine Interrupts?
>
> MFG Mexx

War im Post vllt nicht deutlich genug: Dieser möglichst weit 
vereinfachte Programmausschnitt sollte dazu dienen, erstmal andere 
Fehler im Programm (z.B. Kanalwechsel während eine Messung läuft etc.) 
auszuschließen.
Beim fertigen Programm kann/sollte das dann wieder auf Interrupts 
umgestellt werden.

> Also es ist so geplant, dass an den ADC0 2 Thermocouples & an den ADC1 3
> Thermocouple kommen und 1 PT1000 an den ADC1. Damit kann ich dann 5
> Thermocouples betreiben. Daher benötige ich einer höhere Frequenz.

Je nach dem wie genau das werden soll, reicht u.U. ein PT1000 zur 
Messung der Kaltstellentemperatur nicht mehr aus.
Nächstes Problem, die Eingänge sind auf 0.1 V bis VDD - 0.7 V beschränkt 
d.h. man braucht (beim primären ADC immer) einen Offset (eine 
Möglichkeit das zu lösen steht im Datenblatt auf S. 16 Fig. 13).
Beim Aux-ADC kann man das auf AGND erweitern, indem man den Buffer 
abschaltet (und sich die von Gast genannten Fehler einhandelt).
Der Aux-ADC hat wesentlich höhere Eingangsströme als der Primäre (uA vs. 
nA)

> Hm Tiefpass habe ich schon draufgemacht, bringt eben leider ned viel.

Bei den 50 Hz Störungen kann man folgendes versuchen:
Entweder die Wandlungsrate so weit anpassen, dass der Sinc3 50/60 Hz 
passend filtert, oder das ganze nochmal nachfiltern (Stichwort Kerb- 
bzw. Notchfilter)

> Bei der Verwendung eines
> richtig dimensionierten Analog Frontends mit eingebautem Tiefpass würde
> sogar ein 10Bit Wandler ausreichen.

Hängt vom Temperaturbereich und der geforderten Auflösung ab.
Beispiel Typ K geht von -270 °C - 1372 °C (also 1642 °C insgesamt -> 
Auflösung bei 10 Bit 1.6 °C).
Beispiel Typ T: -50 °C - 150 °C, Auflösung 0.1 °C -> geht nicht

von Markus U. (mexx0085)


Lesenswert?

@ Arc Net

Ich habe den Messbereich mit einem Widerstands-Array am Eingang auf im 
Moment +/- 6V vergrößert.

Später soll es auf +/-12V erweitert werden.

Weiters habe ich mit dem DAC das Potential um 2.5V angehoben. Daher 
müsste es möglich sein, einen PT1000 zu verwenden.



Hab die Software jetzt soweit funktionstüchtig.. die Werte passen auch.
Jetzt ist die Frage: Ist es eigentlich sinnvoll, einen Timer zu 
verwenden, um die Kanäle zu wechseln?

Im Moment löse ich es so, dass ich eine gewisse Anzahl an Werten 
aufnehme, in einen Buffer speichere und dann den kanal wechsle..

MFg Mexx

von Gast (Gast)


Lesenswert?

Es kommt wohl darauf an, was später mit den Daten passieren soll. 
Meistens will man zwischen den einzelnen Messwerten immer den gleichen 
Zeitabstand. Alles andere wird später sehr eklig, wenn man digitale 
Signalverarbeitung machen will.
Daher hätte ich auch nach nur einem gültigen Messwert den Kanal 
gewechselt.

Wenn du kontinuierlich messen willst, gibt der ADC den Takt vor, dann 
braucht man keinen Timer.

von Markus U. (mexx0085)


Lesenswert?

Ja im moment will ich kontinuierlich messen.. dann is das e ok.

Andere Frage: Ich simuliere ja jetzt den Sensor mit einer Batterie.. 
Wenn ich jetzt jedoch die Batterie mit einem Fluke-Simulator (kann 
Spannungen simulieren, PT100 simulieren..) ersetze und diese dann messe, 
bekomm ich nen totalen Brumm drauf..

Ich mein gut, viel. den oben genannten Notchfilter verwenden, gibts aber 
keine andere Möglichkeit?

MFg Mexx

von Gast (Gast)


Lesenswert?

Ein Mittelwertfilter ist kein Notchfilter, der sinc-Filter auch nicht.
Fluke Simulator sagt mir nichts.

Wie ist die Verkabelung? Hängt die Schaltung am Lichtleiternetz?
Ein geschlossener Stromkreis aus Leitungen ist eine Schleife, in die 
natürlich Strom von aussen induziert wird. Die aufgespannte Fläche muss 
daher so klein wie möglich gehalten werden.

von Gast (Gast)


Lesenswert?

Nachtrag: Warum ich auf dem Notch zu rumhacke:ein analoges Notchfilter 
sauber zu designen ist nicht trivial, wenn man eine entsprechende 
Schärfe haben will. Ein digitales Filter Filter ist die bessere Wahl, 
wobei man bei kurzen Wellenstücken an den Rändern eine Art Leckeffekt 
hat.

von Markus U. (mexx0085)


Lesenswert?

Ich hab ein Eval-Board vom ADuC7060 und an die Eingangspins des ADC hab 
ich eben zum Vermessen den Simulator angehängt. da kommt ein Brumm raus 
der viel größer ist als mein Messsignal..

Wie meinst du Lichtleiternetz?

von Gast (Gast)


Lesenswert?

Lichtleiternetz = 230V~, slo nicht per Batterie betrieben.
Wie hast du den Simulator verbunden, einfache ungeschirmte 
Krokodilklemmen, Bananenstecker etc? Wenn die Kabel jeweils 0,5m lang 
sind und 2cm ausseinander liegen spannst du damit eine ziemliche Fläche 
auf, mit der Brummen eingefangen wird. Schon mal eine verdrillte Leitung 
versucht?

von Markus U. (mexx0085)


Lesenswert?

habe geschirmte leitungen mit bananestecker

von Gast (Gast)


Lesenswert?

Wo ist der Schirm aufgelegt?
Einfach einen Schirm um eine Leitung legen kan sogar mehr stören als 
bringen.

von Markus U. (mexx0085)


Lesenswert?

sind fertig gekaufte geschirmte leitungen

von Gast (Gast)


Lesenswert?

:)

Ein Schirm funktioniert nur, wenn man ihn mit Nullpotential verbindet. 
Bei EKGs wird sogar das Gleichtaktsignal aktiv auf den Schirm gelegt. 
Ansonsten ist der Schirm nur eine Äquipotentialfläche, mit der man sich 
noch mehr Störungen einfängt. Nimm mal ungeschirmte Kabel, die verdrillt 
sind. Eventuell dann um das Paar einen Schirm legen und diesen auf einer 
Seite mit Nullpotential verbinden. Ich hätte dafür aus dem Bauch raus 
AGND verwendet, ich denke andere haben da bessere Vorschläge.

Eventuell solttest du dir ein wenig Literatur über Messtechnik besorgen. 
An dem Satz "Wer misst misst Mist" ist schon etwas dran. Kleine Fehler 
sind da schnell drinnen.

von Markus U. (mexx0085)


Lesenswert?

Hm hab das geschirmte Kabel mit dem GND Potential vom Eval Board 
verbunden.. passt das nicht?? das müsste doch reichen oder?

von Markus U. (mexx0085)


Lesenswert?

hmmm oder lieg ich da falsch???

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.