Hallo zusammen, Folgendes: mit einem AVR ATmega88 (20MHz) möchte ich zwei analoge Spannungen messen. Der ADC läuft mit ca. 150kHz im continuous conversion mode, conversion complete interrupt ist eingeschaltet. AVR-Studio, WinAVR. Die beiden Messkanäle werden als "normale" ADC-Eingangskanäle verwendet, also keine differentielle gain o.Ä. Die Hardware-Beschaltung der Kanäle ist auch in Ordnung und funktioniert Messe ich nur einen Kanal, funktioniert alles wunderbar, auf beiden Kanälen. Schalte ich hingegen im Programm auf den anderen zu messenden Kanal um, tritt ein merkwürdiger Fehler auf, zu dem ich auch im Datenblatt nichts finde. Es stimmen nämlich die Messwerte, welche gleich nach dem Umschalten genommen werden, hinten und vorne nicht. Ich kann auch 10(!) Dummy-Reads gleich nach dem Umschalten einbauen, und die Werte stimmen immer noch nicht. Erst wenn ich einen _delay_ms(10) nach dem Umschalten des Kanals einbaue, liefert die Mühle die korrekten Werte... Es braucht also offensichtlich eine Pause zwischen dem Kanalumschalten und der ersten Messung...Wie kann ich eleganter (ohne delay...) sicherstellen, dass die erste Messung nach dem Umschalten korrekt ist? (Zeit spielt eine Rolle..) Ist das ein bekanntes Problem? Im DB find ich irgendwie nix dazu...? Herzlichen Gruss und Danke Mario
Hi Um den Sample&Hold-Kondensator des ADCs von 0 auf 5V umzuladen, braucht es (bei angenommenen 150k Widerstand und 14pF in der S&H-Stufe) ca.65µs. Das gilt aber nur für eine sehr niederohmige Quelle. Also stellt sich die Frage nach der Impedanz deiner Quelle. MfG Spess
1) Dummyreads gehören in die Kategorie "Legenden". Halte dich ans Datenblatt, dann stimmt die erste Messung. 2) du hast zwar keinen Code gepostet, da kann keiner nachvollziehen was du treibst und wo es klemmt. - Wann wechselst du den Kanal? Steht da der ADC oder macht der grad ne Wandlung? - 150 kHz? ADC-Takt oder Samplerate? - Was steht in der ADC-ISR?
Lies das Datenblatt mal genau. Der MUX braucht zum Kanalwechsel irgendwie auch noch Zeit, weil er den Kanal ja erst wechseln kann, wenn der ADC fertig gewandelt hat. Dann könnte es nämlich sein, dass dein "falscher" Messwert in Tat und Wahrheit ziemlich gut zum vorhergehenden Kanal "passt".
Hi >Lies das Datenblatt mal genau. Richtig . >Der MUX braucht zum Kanalwechsel irgendwie auch noch Zeit, weil er den >Kanal ja erst wechseln kann, wenn der ADC fertig gewandelt hat. Dann sieh dir mal die Diagramme in den Datenblättern. Da steht genau, was wann umgeschaltet und abgetastet wird. MfG Spess
Hi, Andreas R. schrieb: > 1) Dummyreads gehören in die Kategorie "Legenden". Halte dich ans > Datenblatt, dann stimmt die erste Messung. hast du dafür eine Quelle? Das Datenblatt empfiehlt bei gewissen Szenarien (Umschaltung der Referenzspannung, Umschalten von differentiellen Kanälen) nämlich eben jene Dummyreads. (Hier Konkret: ATTiny861 Rev. 2588C, Abs. 15.6.2 S. 149 sowie Abs. 15.13.1 S. 156) mfG Markus
Hallo zusammen, die 150kHz sind ADC-Takt. In der ISR wird nur eine Variable geändert. Habe den Interrupt aber auch schon abgeschaltet, hatte keinen Effekt. Den Kanal schalte ich zu einer beliebigen Zeit um, der ADC kann also mitten in einer Messung stecken. Habe ihn aber auch schon vor dem Kanalwechsen über das ADSC-Bit abgeschaltet, dann den Kanal gewechselt, wieder per ADSC = 1 angeschaltet, ein Dummy-Read und kommt immernoch Quark raus. Im DB steht: If both ADATE and ADEN is written to one, an interrupt event can occur at any time. If the ADMUX Register is changed in this period, the user cannot tell if the next conversion is based on the old or the new settings. ADMUX can be safely updated in the following ways: 1. When ADATE or ADEN is cleared. 2. During conversion, minimum one ADC clock cycle after the trigger event. 3. After a conversion, before the Interrupt Flag used as trigger source is cleared. When updating ADMUX in one of these conditions, the new settings will affect the next ADC conversion. Also wäre es für mich am Optimalsten, wenn man den ganzen ADC per ADEN ausschaltet, dann den Kanal wechselt und dann wieder loslegt. Werde das morgen mal probieren... Gruss und gute N8
Update: habs jetzt mit dem ADEN-Bit probiert - klappt! Also ADC mit ADEN ausschalten, Kanal wechseln, wieder einschalten. Kein Dummy-Read nötig. Gruss Mario
Mario M. schrieb: > Es stimmen nämlich die Messwerte, welche gleich nach dem Umschalten > genommen werden, hinten und vorne nicht. Ich kann auch 10(!) Dummy-Reads > gleich nach dem Umschalten einbauen, und die Werte stimmen immer noch > nicht. [Glaskugelmodus an] Du wartest nicht das Ende einer Wandlung ab, d.h. Du liest 10-mal den gleichen Mumpitz ein. Der continuous conversion mode ist nicht fürs Umschalten geeignet. Starte einfach im ADC-Interrupt die nächste Messung, dann klappts auch mit dem Umschalten. Also: - alten Wert auslesen - MUX umschalten - neue Messung starten nächster Interrupt: - neuen Wert auslesen > Erst wenn ich einen _delay_ms(10) nach dem Umschalten des Kanals > einbaue, liefert die Mühle die korrekten Werte... Wenn man nicht auf das Ende der Messung testet, muß man eben warten. 10ms sind aber extrem lang. Peter
hallo, ich habe ein ähnliches problem mit einem ATmega165. Dabei handelt es sich um eine schaltung(inkl. Software) die bereits besteht und von jemanden mir unbekannten entwickelt wurde. und zwar wird fogendes gemacht: - single conversion mode - 4 ADC pins werden gemuxt(dabei wird pro pin 32x gesamplet und dann mux) - es wird nur dann gemuxt, wenn die vorherige wandlung abgeschlossen ist - nach dem umschalten wird auch noch relativ lange gewartet Problem: bei einem der eingänge wird ab und zu falsche werte gelesen, was folgendermaßen aussieht(wenn der fehler auftritt): - die ersten 2-20 samples haben den ADCwert ca. 580(die folgenden sind i.o.) - der korrekte wert wäre ca. 602 - der vorherige pin hatte den ADCwert ca. 500 - die quelle ist ein strommäßig vernünftig dimensionierter spannungsteiler mit poti(nicht bewegt+mit oszi "sauber") Iq=16mA das ganze unterliegt einer Serienstreuung von etwa 10%. durch tauschen eines controllers konnte man den effekt auf einem Board eliminieren Frage: - kann sich etwas der oben genannten punkte auf den Fehler auswirken? - wie sieht es eigentlich mit dem ADC-clock aus? im datenblatt steht 50-200 kHz und welche einschränkungen es bei höherer frequenz gibt. aber wie sieht es bei niedrigerer f aus, da der µC mit der internen 1MHz + CKDIV8 fuse gesetzt läuft und der ADC prescaler auf 128 eingestellt ist, was heist, dass ich weit unter 50 kHz mit der ADC clock bin! - kann hier der hase im pfeffer liegen? Gruß+Danke
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.