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
Was meinst du mit direktem Multiplexing? Laut Handbuch muss doch nur ADC0CON entsprechend gesetzt werden? Kanal raussuchen, Messung starten, warten bis Ergebnis da ist.
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
>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.
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
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.
Ja ich will kontinuierlich messen. :-) Und eben beim Umschalten bekomm ich nur falsche Werte.
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
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..
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.
Ach ja, ohne Oszi wird das ganze immer ein Ratespiel bleiben, weil du nicht weißt, wo die Fehler entstehen.
Ne abschalten tu ich ihn nicht.. Du meinst den ganzen ADC disablen,dann Kanal wechseln und dann wieder enablen?
> 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?
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
@ 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.
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 :(
@ 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
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 | }
|
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.
Ja haben eine JTAG_Debugger. nur hab iuch keine Ahnung wie ich damit Werte am PC anzeigen lassen kann.. :-(
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.
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
@ Arc Net So wie ich das sehe an deinem geposteten Programm, benötige ich also keine Interrupts? MFG Mexx
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.
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
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 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?
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
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.
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
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.
Welche ich da genau verwenden muss weiß ich noch nicht, wird mir erst gesagt.. :-)
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
@ 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
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.
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
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.
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.
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?
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?
Wo ist der Schirm aufgelegt? Einfach einen Schirm um eine Leitung legen kan sogar mehr stören als bringen.
:) 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.
Hm hab das geschirmte Kabel mit dem GND Potential vom Eval Board verbunden.. passt das nicht?? das müsste doch reichen oder?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.