Hallo Mikrocontroller-Gemeinde. Ich habe den AtxMega64A3. Ich kann den uC programmieren und hab schon eine größeres Programm erfolgreich zum laufen gebracht. Das einzige, was mir nicht gefällt, ist der ADC des Mikrocontrollers. Ich benutze den PA4 als Eingang und an den Pin ACO/AREF hab ich eine Referenzspannung von 2,5V angelegt. Versorgungsspannung des uC beträgt 3,3V. Ich brauche eine präzise und schnelle A/D Convertierung. Da der xMega leider einen Offset beim "Unsigned Mode" hat, wollte ich den signed Mode verwenden und deshalb liegt PA2/ADC2 an Masse. Die Initialisierung des ADC: void ADC_initialisieren(void) //signed { //load the calibration ADCA.CALL = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0) ); ADCA.CALH = ReadCalibrationByte( offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1) ); ADCA.CTRLB = 0x10; // CONVMODE: signed; RESOLUTION: 12Bit ADCA.REFCTRL = 0x30; // REFSEL: External ref. AREF pin on PORT B ADCA.PRESCALER = 0x01; // PRESCALER: 512 -> 62.5kHz ADCA.CH1.CTRL = 0x02; // INPUTMODE: Differential Input Signal ADCA.CH1.MUXCTRL = 0x22; // MUXPOS: ADC4 pin; MUXNEG: ADC2 pin ADCA.CTRLA |= 0x01; //ADC enable } Mit einem Poti habe ich die Eingangsspannung an PA4 verändert und den digitalen Wert per RS232 ausgegeben. Die Digitalisierung erfolgt mit: ADCA.CH1.CTRL |= ADC_CH_START_bm; while(!ADCA.CH1.INTFLAGS); ADCA.CH1.INTFLAGS=ADC_CH_CHIF_bm; Das Ergebnis steht dann in ADCA_CH1RES. Das Diagramm zeigt ganz deutlich einen nichtlinearen Verlauf des ADC. Da ich eine 2,5V Referenzquelle benutze, solle auch bei einem Eingangspegel von 2,5V der digital Wert von 2047 errechnet werden. Dies ist leider nicht der Fall. Egal was ich mache, der AtxMega digitalisiert nicht richtig. Den uC hab ich 30 Minuten warmlaufen lassen. Alle Signale wurden mit einem Multimeter und Oszi überprüft. Der uC wird mit dem internen Quarz (32MHz) betrieben. Benutze AVR Studio v4.18 mit WinAVR und Optimization:-O1. Über jede Hilfe wäre ich dankbar.
Servus, Nyquist-Shannon schrieb: > Über jede Hilfe wäre ich dankbar leg doch mal einen Kondensatorvon 10 -> 100nF an den Mittelpunkt deines Potis. Das Poti sollte nicht zu hochohmig sein 10K bis max 100k ist ein guter Wert. Gruß xmega
Hallo Aus Errata, rev.B: { 7. ADC has increased INL error for some operating conditions Some ADC configurations or operating condition will result in increased INL error. In differential mode INL is increased to: – 6 LSB for sample rates above 1 Msps, and up to 8 LSB for 2 Msps sample rate. – 6 LSB for reference voltage below 1.1V when VCC is above 3.0V. – 20 LSB for ambient temperature below 0 degree C and reference voltage below 1.3V. In single ended mode, the INL is increased up to a factor of 3 for the conditions above. Problem fix/Workaround: None, avoid using the ADC in the above configurations in order to prevent increased INL error. } Keines der oben genannten Punkte verletze ich. Beim der Messung habe ich einen 22kOhm Poti verwendet. Ein zusätzlicher Kondensator, wie von xmega gewünscht, brachte keine Verbesserung.
Auch aus den Errata: 2. ADC gain stage output range is limited to 2.4 V The amplified output of the ADC gain stage will never go above 2.4 V, hence the differential input will only give correct output when below 2.4 V/gain. For the available gain settings, this gives a differential input range of: – 1x gain: 2.4 V – 2x gain: 1.2 V – 4x gain: 0.6 V – 8x gain: 300 mV – 16x gain: 150 mV – 32x gain: 75 mV – 64x gain: 38 mV Problem fix/Workaround Keep the amplified voltage output from the ADC gain stage below 2.4 V in order to get a cor- rect result, or keep ADC voltage reference below 2.4 V. Ach und womit hast Du denn die analoge Eingangsspannung gemessen an PA4?
Deshalb hab ich den "ADC gain" vermieden. Der interne ADC Verstärker ist auf 2,4V limitiert und erzeugt unnötige Fehler. Die Eingangsspannung hab ich mit einem Multimeter gemessen und mit einen Oszi nachgeprüft. Habe immer auf eine "gemeinsame Masse" geachtet.
Nyquist-Shannon schrieb: > Deshalb hab ich den "ADC gain" vermieden. Der interne ADC Verstärker ist > auf 2,4V limitiert und erzeugt unnötige Fehler. > > Die Eingangsspannung hab ich mit einem Multimeter gemessen und mit einen > Oszi nachgeprüft. Habe immer auf eine "gemeinsame Masse" geachtet. Und Du meinst, dass das Multimeter keinen Linearitätsfehler hat?
Knut Ballhause schrieb: > Und Du meinst, dass das Multimeter keinen Linearitätsfehler hat? Natürlich hat jedes DMM einen Linearitätsfehler. Der Fehler erscheint mir aber als zu groß, da ich verschiedene DMMs (verschiedene Typen, verschiedene Hersteller) zum Test verwendet habe und bei allen die selbe Kennlinienform, wie im Diagramm dargestellt herausgekommen ist. Daher kann auch nicht die Vermutung von Simon K. zutreffen, dass die Batterie leer ist. (Hab ich aber bei den Batteriebetriebenen DMMs überprüft.)
Hmm. Muss ich bei Gelegenheit mal selbst überprüfen.
Hallo, sehr interessantes Thema. Ich bin auch nicht ganz zufrieden mit dem ADC. In bestimmten Bereichen scheint nicht richtig digitalisiert zu werden. Der Fehler ist ehr ein Springen. Wird zB ein bestimmtes Digit angefahren durch anlegen einer analgoen Spannung, die sich ändert, so kann ich Sprünge über mehrere Digits feststellen. Mehrere sind in dem Fall bestimmt 50. Das ist sehr reproduzierbar. Ist sowas bekannt oder sollte ich meine Software nochmals genau unter die Lupe nehmen? void init_adc_A_frun(char gain) { ADCA.CTRLA = 0x01; //ADC enable ADCA.CTRLB = 0x18; // ADCA.REFCTRL = 0x01; // = ADC_PRESCALER_DIV32_gc; // ADCA.CH0.CTRL = gain; //input mode differenz mit Gain ADCA.EVCTRL = 0x40; ADCA.CH0.MUXCTRL = 0x04;// PA0 als ADCPin ADCA.CH1.MUXCTRL = 0x08;// PA1 als ADCPin } Bedeutet der errata von oben eigentlich, dass ich niemals ein produkt aus anliegender Spannung und interner ADC Spannung > 2.4 erzeugen darf? wenn doch, was ist dann?
Hi, nimm den Xmega64A3U die neuesten Xmegas haben die Errata weitestgehen gefixt,
Danke für den Tip. Ich habe einen ATXMEGA128A1, so steht es zumindest auf dem Controller. Müsste ein U dabei stehen?
Muss nicht, aber macht das Entwickeln etwas Stressfreier ;) http://www.digikey.com/product-search/en?x=0&y=0&lang=en&site=us&KeyWords=ATXMEGA128A1U
Hallo, es scheint so als hät ich den Fehler gefunden. ADCA.REFCTRL = 0x01; Als Referenz war nur der TemSensor aktiv. ADCA.REFCTRL = 0x10; Nun ist Vcc/1.6
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.