Hallo, habe bei einem Xmega 128A1 den Adc mit Interrupt eigerichtet. Interen Referenz 1 Volt. Wenn ich dann den ADC Eingang gegen Masse ziehe ist der nie 0 sondern immer etwas drüber. Liegt das an der Configuration? Controllertakt 16Mhz hier die Einstellungen: ldi temp,ADC_RESOLUTION_8BIT_gc sts ADCA_CTRLB,temp; für 8 Bit betrieb 8-bit right-adjusted result clr temp ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc sts ADCA_CH0_CTRL,temp clr temp ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc sts ADCA_CH1_CTRL,temp clr temp ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc sts ADCA_CH2_CTRL,temp ldi temp,ADC_PRESCALER_DIV8_gc;Vorteiler einschalten sts ADCA_PRESCALER,temp ldi temp,ADC_REFSEL_INT1V_gc;ADC_REFSEL_VCC_gc;ADC_REFSEL_INT1V_gc ;Referenzspannung auswählen sts ADCA_REFCTRL,temp ldi temp,0x01 sts ADCA_CALCTRL,temp ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc sts ADCA_CH0_INTCTRL,temp ;Interrupt auf Kanal 0 für ADC Freigeben clr temp ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc sts ADCA_CH1_INTCTRL,temp ;Interrupt auf Kanal 1 für ADC Freigeben clr temp ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc sts ADCA_CH2_INTCTRL,temp ;Interrupt auf Kanal 2 für ADC Freigeben clr temp ldi temp,ADC_CH_MUXPOS_PIN0_gc ; Pin 0 sts ADCA_CH0_MUXCTRL,temp ldi temp,ADC_CH_MUXPOS_PIN1_gc ; Pin 1 sts ADCA_CH1_MUXCTRL,temp ldi temp,ADC_CH_MUXPOS_PIN2_gc ; Pin 2 sts ADCA_CH2_MUXCTRL,temp ldi temp,ADC_ENABLE_bm sts ADCA_CTRLA,temp; ADC A einschalten abgefragt wird dann im ADC Interrupt: lds SREG_sich,CPU_SREG push temp lds temp,ADCA_CH0RES ; hier weiß ich nicht genau ob das 8 Bit Ergebniss im H oder L Register zu finden ist sts 0x2000,temp sts PortC_out,temp pop temp sts CPU_SREG,SREG_sich reti
Ich kenn die XMEGAs jetzt nicht direkt, aber ich könnte mit vorstellen, dass dein Ground-Signal nicht ganz sauber ist, d.h. deine Schaltung könnte evtl. Schwingen. Setz mal sofern noch nicht vohanden Abblockkondensatoren ein. Kannst du mal deine Schaltung posten??
Hallo, na ja die Schaltung am ADC ist einfach nur ein Potti gegen Gnd und Aref wenn ich aber GND gegen eine negative Spannung "austausche" dann komme ich auch auf Null also so denke ich gibt es Probleme mit dem Mittelpunkt oder der ADC Kalibriert nicht richtig oder ich bin zu blöd das Datenblatt zu verstehen.
Das wird ein Layoutproblem sein. AGND muß von DGND insofern abgetrennt sein, daß sich beide nur an einem Punkt, nämlich an der Spannungsversorgung treffen. Kein digitales Signal und kein nennenswerter Strom darf über AGND fließen.
Hallo, das ist normal, das hab ich auch. Der Nullpunkt liegt bei mir ca. 200 counts unter dem GND. Steht aber auch im Datenblatt..
>das ist normal, das hab ich auch. Der Nullpunkt liegt bei mir ca. 200 >counts unter dem GND. Steht aber auch im Datenblatt.. Wie bitte? Von 2 LSB ist die Rede also maximal +-3 AD-Werte bei 12 Bit. Mein XMega macht +-2 ADC-Werte bei 12 Bit. Bei ARef >2,5V gibt es größere Abweichungen, das ist in den Errata vermerkt.
ich habe die Interne 1V Spannung benutzt aber den Aref pin über eine 10uH Induktivität mit VCC versorgt und 100n gegen Masse geschalten.
bei 8 Bit auflösung welche Byte muß ich eigentlich auslesen das High oder Low also ADCA_CH0RES oder ADCA_CH0RES+1? das Datenblatt sagt bei 8 Bit das High Byte also ADCA_CH0RES+1. Aber wenn ich das nehme dann geht nix.
Die Xmegas sollen einen Bug im 12 Bit ADC haben, daher verzögert sich auch die Serienfertigung. Käuflich sollen die ersten Xmegas (ohne Bug) ab April sein. Muster gibt es zwar noch, aber nur wenn man unterschreibt dass man den ADC nicht verwendet bzw. über den Bug informiert ist. So hat es mir zumindest mein Distri gesagt.
Klar funktionieren die Muster, lediglich ARef muß unter 2.5V bleiben, also meinethalben 2V. Habe ich seinerzeit über eine LED als Referenz extern angeschaltet. >ich habe die Interne 1V Spannung benutzt aber den Aref pin über eine >10uH Induktivität mit VCC versorgt und 100n gegen Masse geschalten. ARef |= AVcc
bei meinem einfachen Aufbau habe ich einfach ACC mit VCC verbunden, mit einem 100nF gestützt. Verwendet wird die interne 1V Referenez, 12 bit unsigned, single ended. Dabei habe ich dann ca. den Offset wie im Datenblatt in Abb. 25-11 ( Seite 295 ) beschrieben ist.
Ach ja, jetzt wird es klar: der XMega kann im Single ended unsigned mode etwas unterhalb von GND messen, also laut Datenblatt 0.05x VREF, was etwa 200 ADC-Werten entspricht. Dies ist eine Besonderheit, um beispielsweise Nulldurchgänge ohne aufwändige, externe Beschaltung messen zu können. Für Messungen bis und oberhalb GND zieht man diesen Offset einfach vom Wandlergebnis ab. Der obere meßbare Wert ist außerdem um 200 reduziert, so daß man maximal bis 3895 (0xF37) messen kann.
Hallo, ja das hat geholfen. Was ich jetzt noch festgestellt habe ist das die Eingänge sich gegenseitig beeinflussen oder wenn ich die ADC Channels gleichzeitig mit ldi temp,ADC_CH0START_bm|ADC_CH1START_bm|ADC_CH2START_bm|ADC_ENABLE_bm sts ADCA_CTRLA,temp starte. Abfragen tue ich dann im ADC Interrupt für jeden Kanal extra es gibt also für jeden CH einen extra Interrupt. erhöhe ich den Wert von CH0 dann erhöhen sich auch CH1 und 2 mit erhöhe ich CH1 erhöht sich CH2 mit und CH0 verändert sich nicht erhöhe ich CH2 verändern sich 0 und 1 nicht
ldi temp,ADC_CH_MUXPOS_PIN0_gc ; Pin 0 sts ADCA_CH0_MUXCTRL,temp ldi temp,ADC_CH_MUXPOS_PIN1_gc ; Pin 1 sts ADCA_CH1_MUXCTRL,temp ldi temp,ADC_CH_MUXPOS_PIN2_gc ; Pin 2 sts ADCA_CH2_MUXCTRL,temp ldi temp,ADC_ENABLE_bm sts ADCA_CTRLA,temp; ADC A einschalten so hier und vorher ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc sts ADCA_CH0_INTCTRL,temp ;Interrupt auf Kanal 0 für ADC Freigeben clr temp ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc sts ADCA_CH1_INTCTRL,temp ;Interrupt auf Kanal 1 für ADC Freigeben clr temp ldi temp,ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc sts ADCA_CH2_INTCTRL,temp ;Interrupt auf Kanal 2 für ADC Freigeben
Und wie sind die Control-Register des ADC geladen, speziell was die Art der Messung angeht?
so hier: ldi temp,ADC_RESOLUTION_8BIT_gc sts ADCA_CTRLB,temp; für 8 Bit betrieb 8-bit right-adjusted result clr temp ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc sts ADCA_CH0_CTRL,temp clr temp ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc sts ADCA_CH1_CTRL,temp clr temp ldi temp,ADC_CH_INPUTMODE_SINGLEENDED_gc sts ADCA_CH2_CTRL,temp ldi temp,ADC_PRESCALER_DIV4_gc;Vorteiler sts ADCA_PRESCALER,temp ldi temp,ADC_REFSEL_VCC_gc;Referenzspannung auswählen sts ADCA_REFCTRL,temp
noch vergessen im Interrupt von CH2 wird der ADC dann wieder für die nächste Messung "angeworfen" so: ADA_CH2: lds SREG_sich,CPU_SREG push temp lds temp,ADCA_CH2RES ;8 Bit ergebniss auslesen CH 0 sts 0x2002,temp clr temp ldi temp,ADC_CH0START_bm|ADC_CH1START_bm|ADC_CH2START_bm|ADC_ENABLE_bm sts ADCA_CTRLA,temp ;Start Adwandler auf Kanal0 pop temp sts CPU_SREG,SREG_sich reti
Hallo, mein Fehler war der ich hatte den ADC_PRESCALER auf /4 Eignestellt bei 16Mhz Taktfrequenz sind das 4Mhz das ist zu schnell habe dann auf /8 Eingestellt das war dann auch noch zu schnell mit /16 lief es dann. Mfg René
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.