Probleme mit AD des dsPIC30F4013

OP Persönliche Seite #607057
Lesenswert?

Hallo,

nutze einen dsPIC30 mit 24MHz. Als Referenzspannung für den 12Bit
A/D-Wandler dient ein MCP1525 mit 2.495V. Bei einer Spannung von 332mV
am Eingang des AD Kanals, gibt er mir einen Wert von 514 aus, obwohl es
rechnerisch 544 sein müßten. Dies zieht sich bis zum Endbereich hin.
Liegt es an der Einstellung des AD`s?


Arbeite mit dem C30
1
void init_ADC(void)
2
{
3
    ADPCFG=0xC0;
4
    ADCSSL=0x00;
5
    ADCON1bits.ADON=0;            //A/D aus
6
    ADCON1bits.ADSIDL=0;
7
    ADCON1bits.FORM=0;
8
    ADCON1bits.SSRC=7;
9
    ADCON1bits.ASAM=0;
10
    ADCON1bits.SAMP=1;
11
    ADCON1bits.DONE=0;
12
    
13
    ADCON2bits.VCFG=1;
14
    ADCON2bits.CSCNA=0;
15
    ADCON2bits.BUFS=0;
16
    ADCON2bits.SMPI=0;
17
    ADCON2bits.BUFM=0;
18
    ADCON2bits.ALTS=0;
19

20
    ADCON3bits.SAMC=16;
21
    ADCON3bits.ADRC=0;
22
    ADCON3bits.ADCS = 16;  // 
23
    ADCHS=0;
24
    ADCON1bits.ADON = 1; // turn ADC ON
25
}
26

27

28
unsigned int read_adc(unsigned char channel)
29
{
30
  ADCHS=channel;
31
  ADCON1bits.SAMP = 1; // start sampling then ...
32
  Nop();
33
  // after 31Tad go to conversion
34
  while (!ADCON1bits.DONE);// conversion done?
35
  return ADCBUF0;
36
}

Gruß Sascha
OP Persönliche Seite #607089
Lesenswert?

Hallo,

das mache ich schon.
1
unsigned int AV_ADC(unsigned char channel)
2
{
3
  unsigned long av=0;
4
  unsigned char i;
5
  for(i=16;i>0;i--)
6
    {
7
    av = av+read_adc(channel);
8
    }
9
  av = av/16;
10
  return av;
11
}

Der Kanal 2 ist über einen OP(LM358) an einen Spannungsteiler 
angeschloßen(91k/13k). Bei einer Spannung von 5V ist der Wert ganz 
genau. Bei 2.5V zeigt er mir 100mV zu wenig an und bei 8V 100mV zuviel. 
Von Linearität ist absolut nicht zu reden :(

Gruß sascha
Gast #607860
Lesenswert?

Zu sehen in Tabelle 23-37 Parameter AD05...

Aber benutze als negative Referenz lieber den externen Eingang (einfach 
mit GND verbinden) und nicht AVss. Die dsPICs ziehen leider so viel 
Strom, daß auf AVss dadurch wohl ein Offset entsteht. Takte mal den 
dsPIC langsamer und Du wirst sehen, daß auch der Offset kleiner wird.
#607929
Lesenswert?

OK, habs gesehen. War mir auch neu.

@ Sascha Focus
Teste mal wie das Ergebnis aussieht wenn du eine höhere Referenz nimmst.
Und wie hast du AVDD verbunden? Schön mit 100nF direkt am pin und 
vielleicht noch ne Spule reingebaut? Oder einen kleinen Wiederstand?

Die ganze Schaltung wär nicht schlecht.

Übrigens. Mit was hast du denn deine zB 332mV gemessen? Wenn das nämlich 
ein 10 € Multimeter war, is die Messung nix Wert.
#608133
Lesenswert?

@ willivonbienemaya

hast natürlich recht. Allerdings hab ich mich mit dem 4013 auch schon 
rumgeärgert. Darum hätt ich auf jeden Fall das aktuelle Datasheet 
durchgeschaut -  es könnte sich auch was geändert haben. Das feature 
Uref > AVss+2,7 Volt ist wirklich bescheuert.

Gerhard
OP Persönliche Seite #608156
Lesenswert?

Willivonbienemaya .. wrote:
> OK, habs gesehen. War mir auch neu.
>
> @ Sascha Focus
> Teste mal wie das Ergebnis aussieht wenn du eine höhere Referenz nimmst.
> Und wie hast du AVDD verbunden? Schön mit 100nF direkt am pin und
> vielleicht noch ne Spule reingebaut? Oder einen kleinen Wiederstand?
>
> Die ganze Schaltung wär nicht schlecht.
>
> Übrigens. Mit was hast du denn deine zB 332mV gemessen? Wenn das nämlich
> ein 10 € Multimeter war, is die Messung nix Wert.

Hi,

habe jetzt ein MCP1541 = 4.096V eingesetzt. Ist schon etwas besser. Mit 
der Beschränkung der VRef habe ich glatt übersehen. AVDD habe ich über 
einen 10R Widerstand an +5V angeschloßen. 100nF sind direkt an AVDD und 
AGND. Aber irgendwie bin ich von den PIC enttäuscht. Durch die 
Takteinstellung des AD blicke ich immer noch nicht durch.

Gemessen habe ich mit einem Meterman 33XR. Ist für den Hausgebrauch 
schon recht (Fluke 179 habe ich nur auf der Arbeit). Anbei die 
Schaltung.

Gruß Sascha
Angehängte Dateien:
#608207
Lesenswert?

Hallo Sascha,
ich hab mirs noch mal angeschaut.
Ich hab nix böses gesehen.
Hast du die Möglichkeit mal die Pins alle mit nem Oszi zu messen?

Ansonsten kannste mal mit den TAD Zeiten rumspielen.
Also hier -> ADCON3bits.ADCS

Davon abgesehen sollte man nicht enttäuscht sein von einem Controller 
wenn man nicht durchblickt. Allenfalls vom Datenblatt. Aber das ist an 
dieser Stelle nicht mal schlecht. Zum AD Wandler gibt es sogar 
Beispiele.

Bei dem AD gibt es halt einige schöne Features. ZB kann man den mit 
internem takt laufen lassen. is nützlich wenn man zb Strom sparen will. 
Dann läuft der AD Wandler weiter während der Rest schläft.

Gruß

Andreas
OP Persönliche Seite #608551
Lesenswert?

Hi,

wie schon beschrieben, ist die VREF jetzt 4.096V. Diese ist jetzt 
komplett angewählt mit ADCON2bits.VCFG=3 und auch dementsprechend 
angeschloßen. Bei Eingangsspannung von 1,30V messe ich mit dem AD auch 
1,30V. Bei 6,57V messe ich jetzt 6,65V.

Berechnen tue ich den Wert so:

test=33313;     //max Spannung 33.313V an Spannungsteiler
BATT_SPANNUNG=((((test*100)/4095)*adwert)/100);

Der OP und die ext. Dioden habe ich auch weggelassen. So langsam 
verzweifle ich. Frag mich, wo der Offset her kommt. Je höher die 
Eingangsspannung wird, desto höher wird auch die Abweichung. Auch ein 
heruntertakten bringt keinen erfolg.

Gruß Sascha
#608661
Lesenswert?

Ein Fehler erst mal: Warum teilst du durch 4095 ? 12 Bit sind 4096.
Und lass doch ma den dummen Spannungsteiler weg. da hast du nur wieder 
unerwünschte nebeneffekte und toleranzen die du beachten müsstest.
schliss doch mal deine 2,5 V referenz direkt an ohne was anderes 
dazwischen (denk an den dicken kondensator am ausgang der 2,5 V 
Referenz).

Der AD Wandler müsste ja dann auf 2500 kommen. Tut er das?
OP Persönliche Seite #608805
Lesenswert?

Willivonbienemaya .. wrote:
> Ein Fehler erst mal: Warum teilst du durch 4095 ? 12 Bit sind 4096.
Schon klar, aber zählen 0V nicht auch dazu? Wir zählen doch wohl von 0
bis 4095. Nutze jetzt eine Referenzspannung von 4.096V

Siehe Thread: Beitrag "AD werte umrechnen"

> Und lass doch ma den dummen Spannungsteiler weg. da hast du nur wieder
> unerwünschte nebeneffekte und toleranzen die du beachten müsstest.
> schliss doch mal deine 2,5 V referenz direkt an ohne was anderes
> dazwischen (denk an den dicken kondensator am ausgang der 2,5 V
> Referenz).
>
> Der AD Wandler müsste ja dann auf 2500 kommen. Tut er das?

Jepp, das macht er. Wenn ich mir den Wert des AD dezimal anzeigen lasse, 
kommt der Wert 4095 bei 4.096V am Eingang .

Gruß Sascha
#608885
Lesenswert?

Das mit den 4095 oder 4096 is mir jetzt egal.

Wenn ich ne Referenz von 4096mV hab und einen 12 Bit Ad Wandler, dann 
rechne ich gar net lang rum, sondern nehm das Ergebins und schreib mV 
dran.

>Jepp, das macht er. Wenn ich mir den Wert des AD dezimal anzeigen lasse,
>kommt der Wert 4095 bei 4.096V am Eingang .

Ich frag dich ob 2500 rauskommt und du erzählst mir: "Ja, es kommen 4095 
raus". Aha sag ich da nur.

Wenn du die Referenz mit dem eingang kurzschliesst kommt klar der 
maximalwert raus. (Oder du kannst den AD wegschmeissen)

Wiederholung der Frage: Hast du mal deine 2,5 V Referenz dran gemacht 
und geschaut was der AD Wandler sagt?

Zur Erinnerung: Du bist auf der Suche nach Messfehlern ;-)
OP Persönliche Seite #608915
Lesenswert?

Willivonbienemaya .. wrote:
> Das mit den 4095 oder 4096 is mir jetzt egal.
>
> Wenn ich ne Referenz von 4096mV hab und einen 12 Bit Ad Wandler, dann
> rechne ich gar net lang rum, sondern nehm das Ergebins und schreib mV
> dran.
>
>>Jepp, das macht er. Wenn ich mir den Wert des AD dezimal anzeigen lasse,
>>kommt der Wert 4095 bei 4.096V am Eingang .
>
> Ich frag dich ob 2500 rauskommt und du erzählst mir: "Ja, es kommen 4095
> raus". Aha sag ich da nur.
>
> Wenn du die Referenz mit dem eingang kurzschliesst kommt klar der
> maximalwert raus. (Oder du kannst den AD wegschmeissen)
>
> Wiederholung der Frage: Hast du mal deine 2,5 V Referenz dran gemacht
> und geschaut was der AD Wandler sagt?
>
> Zur Erinnerung: Du bist auf der Suche nach Messfehlern ;-)

Hatte dich falsch verstanden, sorry. Ich messe 2.491V mit dem AD. 2.491V 
mit dem Multimeter.

Gruß Sascha
OP Persönliche Seite #609224
Lesenswert?

R14 hat 100R. Wie schon vorher, habe ich mit dem Spannungsteiler diese 
Probleme. Auch ohne OP. SelnHab schon die Widerstände gewechselt, ohne 
Erfolg. Ich habe schon alles weggelassen, Dioden, OP und den 
Spannungsteiler direkt angeschloßen.

Ich raff es einfach nicht. Mit der Strommessung habe ich absolut keine 
Probleme und vor allem keine solchen Abweichungen.

Da demnächst eh ein neues Layout fällig wird, gibt es ne gute Empfehlung 
als Impedanzwandler für den AD?.

Gruß Sascha
Gast #649703
Lesenswert?

Leider hab ich noch keins. Rauschen sollte nichts, außer der PIC selber. 
Selbst wenn ich direkt an einen analogen Eingang mittel Kabel am Pin 
gehe, habe ich diese abweichungen. Im Bereich um 2,5V ist alles ok. 
Darunter messe ich zu wenig, darüber hinaus wird es immer etwas zuviel. 
Alles bei einer Referenzspannung von 4,096V. Selbst ein PIC auf 
Lochraster ohne sonstige weitere Beschaltungen hat ein ähnliches 
verhalten.

Gruß Sascha

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren