ad wandler xmeag32

  • 1
  • 2
  • Page 1 of 2
nexxes
 
Avatar
 
Subject:

ad wandler xmeag32

 · 
Posted: 05.02.2013 - 19:03  ·  #1
Guten Abend Liebe forum Gemeinde,

bin ja noch ganz frisch hier möchte euch aber dennoch mit einem Problem Konfrontieren.
Ich beschäftige mich nun seit ein paar wochen mit uCs und auf empfehlung auch mit e-lab, womit ich bislang auch sehr zufrieden bin.
Nun zu meinem Problem,
ich würde gern für ein kleines Projekt den ad-wandler im xmega32A4 nutzen.
"der mag er sich aber nicht benutzen lassen"

Im Display zeigt er bei offenem Eingang einen Wert von ca. 2300-2600 und wenn ich den Eingang gegen Masse lege immer noch 120-145. Wenn ich das Messgerät anlege bricht der Wert etwas ein und ich messe etwa 450-500mV.
Das ganze ist mir grad ein unverstänlichen Rätzel. Ich hoffe ihr habt da einen Rat für mich.

Gruß Tobias

sorry wegen dem Programm, weiß grad nicht wie ich das in ein eigenes Textfenster packe
program adc_test;

Device = xmega32A4, VCC=3.3;
{ $BOOTRST $04000} {Reset Jump to $04000}


Import SysTick, LCDport, SysLEDblink,adc_a;

From System Import ;


Define
OSCtype = int32MHz,
PLLmul=4,
prescB=1,
prescC=1;
SysTick = 10; {msec}
StackSize = $0064, iData;
FrameSize = $0064, iData;

SysLedBlink = 20; {SysTicks}
SysLedBlink0 = PortC, 7, high;

LCDport = PortC;
LCDtype = 44780;
LCDrows = 2; {rows}
LCDcolumns = 16; {columns per line}

ADCrefA = REF100; // intern 1.0V reference, input pins at PortA, 4 channels
ADCprescA = 512; // prescaler 256
ADCchansA = [0]; // 4 channels in use

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
adc0 : word;

{--------------------------------------------------------------}
{ functions }
procedure InitPorts;
begin
DDRC:= %10000000; //input 0 output 1 7..0
//DDRA:= %00000000;



end InitPorts;


{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
InitPorts;

EnableInts($87);

sysledflashon (0);


loop
adc0 := getadcA(0);
lcdxy(0,0);
write(lcdout,inttostr(adc0:4));

mdelay(300);

endloop;
end adc_test.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: ad wandler xmeag32

 · 
Posted: 05.02.2013 - 19:58  ·  #2
Hallo Tobias,

schauen Sie sich mal die Errata im Datenblat XMega32A4 an, Seite 94.
Da gibt es jede Menge Probs mit dem ADC. Die hat der XMega32A4U nicht.
Möglicherweise ist dies das Problem. Ansonsten 0.5V am ADC Eingang, das
sollte eigentlich nicht möglich sein. Aber ein offener Eingang sollte auch
nicht sein. Dieser Wert von ca. 120 bei 0V Eingang könnte im Bereich
der Offset und Linear Fehler des ADC liegen...

rolf
golf
Benutzer
Avatar
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: ad wandler xmeag32

 · 
Posted: 06.02.2013 - 09:44  ·  #3
hallo tobias,
sowas ähnliches kenne ich auch.
ich habe zwar keinen xmega32 hier, aber das problem kann auch sonst wo liegen.

ich würde auf jeden Fall mal probieren den ADC direkt anzusprechen ohne den AVRco.
(diese Register gibts im XMEGA Manual damit hat man auch etwas mehr Möglichkeiten)

also mal ohne import des adc_0

bei initports mal sowas rein(je nachdem was man braucht):

ADCACTRLA := %00000001; // Bit0: ADCA Enable
// ADCACTRLB := $0C; // unsigned mode 8Bit und Freilauf Modus
ADCACTRLB := $08; // unsigned mode 12Bit und Freilauf Modus
ADCAREFCTRL := $00; // Interne Referenz 1.0V
ADCAEVCTRL := $00; // disable ADC event triggering
// ADCAPRESCALER := $04; // Teilungsfaktor 64 vom Systemclock
ADCAPRESCALER := $07; // Teilungsfaktor 512 vom Systemclock
ADCACH0CTRL := $01; // single-ended-positive Input Signal
ADCACH0MUXCTRL := $00; // PA0 als ADCPin
// ADCACH0MUXCTRL := $38; // PA7 als ADCPin


in deiner loop dann statt "adc0 := getadcA(0);" :

adc0 := word(ADCACH0RESL); // ergebnis bei 12 Bit, Lowbyte muss zuerst gelesen werden !
adc0 := adc0 + (word(ADCACH0RESH shl 8 )); // Highbyte dazu

( bei gewählter 8-bit Auflösung reicht natürlich var adc0:byte; adc0 := ADCACH0RESL; )

golf
nexxes
 
Avatar
 
Subject:

Re: ad wandler xmeag32

 · 
Posted: 06.02.2013 - 18:39  ·  #4
Besten Dank für die raschen Antworten,

rolf
habe mir das im Datenblatt mal angeschaut, kann aber auf grund mangelder Erfahrung mit der Materie keine genauen Rückschlüsse ziehen. Werde mir aber mal die U version bestellen und es damit testen.

golf
schönen Dank für die Zeilen, habe sie direkt mal eingefügt.
Bei offenem Eingang schwankt der Wert jetzt zwischen 1 und 260, wenn ich den gegen Masse leg zwischen 121 und 147 wenn ich das richtig gesehen habe.

Was mich am meißten stört ist, das es kein Statischer Wert ist, den könnte man ja mit einem offset zu nichte machen.
Auf die Paar verlorenen messpunkte könnte ich verzichten, wollte damit ein Thermoelement "auslesen". Der mir eine Spannung von 0 bis etwa 31mV ausgibt, dass ganze dann mit 32x gain und ich hätte ein Messbereich von 0-750Grad gehabt.
Werde nachher noch die anderen Controller bestellen da sah das errata wesentlich besser aus...

Gruß Tobias
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: ad wandler xmeag32

 · 
Posted: 06.02.2013 - 19:28  ·  #5
Hallo Tobias,

Thermoelement direkt mit einem ADC ? Das wird nix. Nimm doch einen Wandler-IC.

Bei meinem ersten XMega hatte ich auch ADC-Probleme und viel hat der Anschluss/die Verwendung einer externen Referenzspannung gebracht.

Gruss
Harry
golf
Benutzer
Avatar
Gender:
Location: Donauwörth
Age: 71
Posts: 256
Registered: 11 / 2009
Subject:

Re: ad wandler xmeag32

 · 
Posted: 07.02.2013 - 07:52  ·  #6
Hallo Tobias,

Harry hat da bestimmt recht mit der Referenzspannung und auch mit dem Thermoelement.

Probier mal erstmal z.b. als Adc-referenz die interne VCC/1,6, also: ADCAREFCTRL := $10;

das ergibt evtl zunächst mal eine stabilere Messung. Besser ist bestimmt eine externe Ref.

Aber das Thermoelement würde ich auch anders messen. Ich hab da vor Jahren den MAX6675 verwendet, meine ich. Das ganze ergab einen Lötofen, aus einem kleinen Pizzaofen. Damit löte ich seither problemlos meine BGA-Bauteile auf, auch FBGA sind kein Problem, z.b. bei meiner USB3-Platine.

golf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2133
Registered: 03 / 2003
Subject:

Re: ad wandler xmeag32

 · 
Posted: 07.02.2013 - 08:24  ·  #7
Hi Tobias,

oder den MAX31855 (siehe in der Rubrik "Software"). Den gibts für die unterschiedlichsten Thermoelementtypen.

Gruss
Harry
nexxes
 
Avatar
 
Subject:

Re: ad wandler xmeag32

 · 
Posted: 07.02.2013 - 20:10  ·  #8
Hallo zusammen,

das mit Vcc1,6 und RefextA(3,3V Controllerspannung) habe ich ausprobiert, leider sind die starken schwankungen geblieben. Nur das der Wert etwa um 80 erhöt ist.
Den Max31855 hatte ich vorhin auch gesehen, kostet aber auch stolze 6,42€ bei Mouser.
Sonst hab ich den nirgens gesehen. Naja was sollst Hobby war ja noch nie was kostengünstiges.....

Bestellen,Testen, Berichten


Gruß Tobias
  • 1
  • 2
  • Page 1 of 2
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: 14   136   150 · Page-Gen-Time: 0.038524s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI