XMEGA und READPRODUCTIONROW Probleme

  • 1
  • 2
  • 3
  • 4
  • Page 4 of 4
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 31.07.2020 - 12:11  ·  #25
Code
und habe einen LDO auf 3V3

Okay, danke für die Rückmeldung.

Was mich noch wundert ist, dass der ADC Eingang mit der geposteten Schaltung übersteuert wird.
Für den Messbereich 0R bis 36kR erhalte ich eine Aussteuerung von 1,62V bis 2,45V. Bei 32kR erhalte ich 2,4V. Die Referenzspannung ist kleiner und beträgt 2.063V.

Ansonsten hier noch ein paar Ideen und Fragen.

- Mit welchem Clock läuft die ADC, sprich wie hoch ist der peripheral clock und wie ist der prescaler für die ADC eingestellt?
- Welche sampling time ist eingestellt?
- Welcher conversion mode? single ended signed, unsigned, differential
- pullup/pull-down am Eingang deaktiviert?
- Man kann INTPUT_DISABLE Bit im PINnCTRL register setzten.
- Testweise PLL abschalten, hängt auch an AVCC
- keine Ports schalten während der Messung, wie bereits von dir angemerkt.

Kannst du dein Programm posten? Oft beantworten sich dem Leser viele Fragen, wenn man Ihnen den Programmcode mitteilt.

Mir ist auch eine Idee gekommen warum der Ausreiser bei ungefähr 7/8*FullScale entsteht.
Die sukzessive Conversion vergleicht zuerst mit ref/2, dann mit ref/4 oder 3/4ref, und dann mit 1/8, 3/8, 5/8, oder 7/8ref, und so weiter.
Angenommen der Messwert liegt etwas unterhalb 7/8ref, dann können Schwankungen beim Messwert oder bei der Referenzspannung bewirken, dass bereits beim dritten Konversationsschritt frühzeitig eine falsche Entscheidung getroffen wird und sich daraus ein statistisch höherer Mittelwert ergibt als in Wirklichkeit vorhanden ist.

Gruß
Thomas
Attachments
XMEGA und READPRODUCTIONROW Probleme
Filename: thorstenAdcAusteuerung.png
Filesize: 43.15 KB
Title:
Download counter: 120
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 31.07.2020 - 14:02  ·  #26
Hallo Thomas,
Quote by Thomas.AC

Code
und habe einen LDO auf 3V3

Okay, danke für die Rückmeldung.

Was mich noch wundert ist, dass der ADC Eingang mit der geposteten Schaltung übersteuert wird.
Für den Messbereich 0R bis 36kR erhalte ich eine Aussteuerung von 1,62V bis 2,45V. Bei 32kR erhalte ich 2,4V. Die Referenzspannung ist kleiner und beträgt 2.063V.


Ursprünglich war die Schaltung für einen ATMEGA erstellt, der hat eine interne Ref-Spannung von 2,56V. Im Normalfall sind 10k an der Linie und max. 20k.

Die interne Ref.Spannung ist doch AVCC/1,6 also 3,6V / 1,6 = 2,25V oder?

Quote by Thomas.AC

Ansonsten hier noch ein paar Ideen und Fragen.

- Mit welchem Clock läuft die ADC, sprich wie hoch ist der peripheral clock und wie ist der prescaler für die ADC eingestellt?
- Welche sampling time ist eingestellt?
- Welcher conversion mode? single ended signed, unsigned, differential
- pullup/pull-down am Eingang deaktiviert?
- Man kann INTPUT_DISABLE Bit im PINnCTRL register setzten.
- Testweise PLL abschalten, hängt auch an AVCC
- keine Ports schalten während der Messung, wie bereits von dir angemerkt.

Kannst du dein Programm posten? Oft beantworten sich dem Leser viele Fragen, wenn man Ihnen den Programmcode mitteilt.


Clock Eintrag:
Code
OSCtype                = int2MHz, PLLmul = 31, prescB = 1, prescC = 1, overdrive; // 62 MHz 


Hier ist der InitCode:
Code
//  INIT ADC

  ADCACTRLB     := $00;   // Auflösung auf 12bit und rechtsbündig
  ADCAREFCTRL   := $10;   // INTVCC / 1.6
  //ADCAPRESCALER := %00000100;   // ADCAPRESCALER auf 64 zum test
  ADCAPRESCALER := %00000111;   // ADCAPRESCALER auf 512
  
  ADCACTRLA.0   := true;  // Enable ADCA
  ADCAEVCTRL    := %00000000;   // no events input

// INIT CH0
  DDRA.0:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.1:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.2:= 0;  // 0=EINGANG  1=Ausgang
  DDRA.3:= 0;  // 0=EINGANG  1=Ausgang

// InitADCCH0
  ADCACH0CTRL    := $01; // singleended
  ADCACH0MUXCTRL := $0; // MUX CTRL MAXPOS ADC0
  ADCACH0CTRL    := ADCACH0CTRL OR $01; // singleended
  ADCACH0INTCTRL := %00000000;
  ADCACH0CTRL.7  := true;    // Starte neue Messung


Die weiteren Messungen und Auswertungen laufen dann in Zyklus, beim XMEGA384C3 hat man nur einen ADC Wandler, dieser muss nach jeder Messung eines ADC Eingangs erst auf den nächsten PIN umgeschaltet werden. Das ganze läuft bei mir im Zyklus, ich starte die Messung, der Zyklus läuft weiter und bei jedem Zyklus wird überprüft ob die Messung fertig ist, wenn ja wird der Wert verarbeitet und der nächste PIN eingestellt und die Messung gestartet.

Code
// READADC
if adPort >=4 then adPort:=0;endif; // ADC Zähler auf 0 stellen


//Messung abgeschlossen?
if ADCACH0INTFLAG.0 then
    ADCACH0INTFLAG.0:=false;  // Flag reset

    // PORTPIN ADC0
     if    adPort = 0  then
       LO(wADCBuffer):= ADCACH0RESL;    // Ziehe Werte
        HI(wADCBuffer):= ADCACH0RESH;
         AddAVfilter(ADC0Filter,integer(wADCBuffer) );
         
            ADCACTRLA.1   := true;  // flush
             inc(adPort);
              ADCACH0MUXCTRL := %00001000; // MUX CTRL MAXPOS ADC1 nächster Port
               wADC0:= GetAVfilter(ADC0Filter);
  
    // PORTPIN ADC1
     elsif adPort = 1  then
       LO(wADCBuffer):= ADCACH0RESL;    // Ziehe Werte
        HI(wADCBuffer):= ADCACH0RESH;
         AddAVfilter(ADC1Filter,integer(wADCBuffer) );
            ADCACTRLA.1   := true;  // flush
             inc(adPort);
              ADCACH0MUXCTRL := %00010000; // MUX CTRL MAXPOS ADC2 nächster Port
                wADC1:= GetAVfilter(ADC1Filter);
  
    // PORTPIN ADC2
     elsif adPort = 2  then
         LO(wADCBuffer):= ADCACH0RESL;    // Ziehe Werte
        HI(wADCBuffer):= ADCACH0RESH;
         AddAVfilter(ADC2Filter,integer(wADCBuffer) );
        inc(xForADC);
            ADCACTRLA.1   := true;  // flush
             inc(adPort);
              ADCACH0MUXCTRL := %00011000; // MUX CTRL MAXPOS ADC3 nächster Port
                wADC2:= GetAVfilter(ADC2Filter);

    // PORTPIN ADC3
     elsif adPort >= 3  then
       LO(wADCBuffer):= ADCACH0RESL;    // Ziehe Werte
        HI(wADCBuffer):= ADCACH0RESH;
         AddAVfilter(ADC3Filter,integer(wADCBuffer) );
            ADCACTRLA.1   := true;  // flush
             inc(adPort);
              ADCACH0MUXCTRL := %00000000; // MUX CTRL MAXPOS ADC0 nächster Port
                wADC3:= GetAVfilter(ADC3Filter);

     endif;
          ADCACH0CTRL.7  := true;    // Starte neue Messung
endif;  // Endif Flag ADC Messung fertig


Quote by Thomas.AC

Mir ist auch eine Idee gekommen warum der Ausreiser bei ungefähr 7/8*FullScale entsteht.
Die sukzessive Conversion vergleicht zuerst mit ref/2, dann mit ref/4 oder 3/4ref, und dann mit 1/8, 3/8, 5/8, oder 7/8ref, und so weiter.
Angenommen der Messwert liegt etwas unterhalb 7/8ref, dann können Schwankungen beim Messwert oder bei der Referenzspannung bewirken, dass bereits beim dritten Konversationsschritt frühzeitig eine falsche Entscheidung getroffen wird und sich daraus ein statistisch höherer Mittelwert ergibt als in Wirklichkeit vorhanden ist.

Gruß
Thomas


Thorsten
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 31.07.2020 - 14:48  ·  #27
DAs ist eine Schnellantwort von mir,
ich schaue mir das noch einmal in Ruhe an.

Quote

Die interne Ref.Spannung ist doch AVCC/1,6 also 3,6V / 1,6 = 2,25V oder?

Ich dachte der LDO macht 3,3V

Code

ADCACH0INTFLAG.0:=false;  // Flag reset

Das ist falsch. Zum Löschen muss man true setzten.

Tipp:
Ins SAMPCTRL Register höhere Werte reinschreiben und testweise kein overclocking betreiben.

Gruß
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 04.09.2020 - 10:02  ·  #28
Quote by Thomas.AC

DAs ist eine Schnellantwort von mir,
ich schaue mir das noch einmal in Ruhe an.

Quote

Die interne Ref.Spannung ist doch AVCC/1,6 also 3,6V / 1,6 = 2,25V oder?

Ich dachte der LDO macht 3,3V

Code

ADCACH0INTFLAG.0:=false;  // Flag reset

Das ist falsch. Zum Löschen muss man true setzten.

Tipp:
Ins SAMPCTRL Register höhere Werte reinschreiben und testweise kein overclocking betreiben.

Gruß


Hallo Thomas,

sorry für die späte Antwort. Da die XMEGA384C3, scheinbar keine Kalibrierung hat, werde ich das Ganze anderst lösen, ich mache eine Kalibrierung mit sehr guten Widerständen nach der Bestückung, beim ersten einschalten der Steuerung. Ich glaube dies ist erstmal der bessere Weg.
Aber schon mal vielen Dank für Deine Denk- und Lösungsansätzte.

Thorsten
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: XMEGA und READPRODUCTIONROW Probleme

 · 
Posted: 17.09.2020 - 18:13  ·  #29
Danke. Mache ich nur zur Beruhigung. Sorry auch für meine späte Rückmeldung, aber ich muss es gesagt haben.

Code

Da die XMEGA384C3, scheinbar keine Kalibrierung hat


Der IC Hersteller muss nur die Spezifikationen aus dem Datenblatt einhalten.
Dies kann auch mit CAL-Werten von 0 möglich sein.

Bei hoher Genauigkeit ist vielleicht eine externe Referenzspannung empfehlenswert.


Code
ich mache eine Kalibrierung mit sehr guten Widerständen nach der Bestückung

Kurzschuss wäre ein super genauer Widerstand.

Gruß
  • 1
  • 2
  • 3
  • 4
  • Page 4 of 4
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 15   97   112 · Page-Gen-Time: 0.027231s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI