Forum: Mikrocontroller und Digitale Elektronik PIC18LF25K80 ADC liefert fehlerhafte Werte


von dilo83 (Gast)


Lesenswert?

Ich benutze einen PIC18LF25K80 mit 8MHz Quart und 4xPLL --> 32 MHz Takt, 
VDD ist 3.3V

Der ADC wird wie folgt konfiguriert:
1
void Init_ADC(void) {
2
    #define ADCON0_ADON 0b00000001
3
    #define ADCON0_START 0b00000010
4
    #define ADCON0_CHS_AN00 0b00000000
5
    #define ADCON0_CHS_AN01 0b00000100
6
    ADCON0 = ADCON0_CHS_AN01;
7
8
    #define ADCON1_VCFG_AVDD 0b00000000
9
    #define ADCON1_VNCFG_AVSS 0b00000000
10
    #define ADCON1_CHSN_AVSS 0b00000000
11
    ADCON1 = ADCON1_VCFG_AVDD | ADCON1_VNCFG_AVSS | ADCON1_CHSN_AVSS;
12
13
    #define ADCON2_ADFM_RIGHT 0b10000000
14
    #define ADCON2_ACQT_06TAD 0b00011000
15
    #define ADCON2_ADCS_FOSC64 0b00110000
16
    ADCON2 = ADCON2_ADFM_RIGHT | ADCON2_ACQT_06TAD | ADCON2_ADCS_FOSC64;
17
18
    ADCON0bits.ADON = 1;
19
}

Wegen dem 32MHz-Takt benutze ich einen Teiler von FOSC/64 (im Datenblatt 
steht FOSC/32 bis 40MHz, habe in einem anderen DB gefunden, dass bei 
Low-Power(LF) devices der Teiler bei der Taktfrequenz von 32MHz auf 
FOSC/64 gesetzt werden muss). Allerdings nahezu unabhängig von der 
Einstellung des Teilers und der Aquisition-Time (ACQT) bleibt das 
Ergebnis das selbe.

Am Pin AD1(RA1) hängt ein Widerstands-Schalter (Button1=450R, 
Button2=215R, Button3=100R, nichts gedrückt=10kR) mit Pull-Up von 715R 
auf 3.3V, der Abgriff zum ADC ist mit 100nF abgeblockt.

Wenn kein Knopf gedrückt ist wechselt der ADC-Wert zwischen 0x0F00 (was 
3.09V entspricht und korrekt wäre) und 0xFFFF (in den negativen 
Bereich). Bei Button3 (100R) schwankt der Wert zwischen den korrekten 
0x01E0 und 0xFFFF. Also immer an den Grenzen der Referenzsspannung kommt 
sporadisch der Fehlerwert (ca. jeder 2. Wert). Für Button1 und 2 steht 
der Wert auf 0x060F bzw. 0x039F stabil ohne aussetzer - also OK. Bei 
kurzgeschlossenem Eingang schwankt der Wert zwischen 0xFFF8 bzw. 0xFFFC.

Habe ähnliche Projekte mit anderen PICs und AVRs gemacht, aber solche 
Sprünge kamen dort nicht vor.

Hat von euch jemand eine Idee, woran das liegen könnte?

MfG Dirk

von Max H. (hartl192)


Lesenswert?

dilo83 schrieb:
> Wegen dem 32MHz-Takt benutze ich einen Teiler von FOSC/64
Da sagt dein Code was anderes. Die unteren 3 bits des ADCON2 Registers 
sind auf 0 (FOSC/2).

DU musst dir nicht alle bits der Register definieren, das hat Microchip 
schon für dich gemacht, z.B.
1
ADCON2bits.ADCS=0b110;      // Conversion Clock FOSC/64

von dilo83 (Gast)


Lesenswert?

Mhhh, ich glaub ich sollte mal Urlaub machen...

Mit den Bits kenn ich schon (siehe ADON) und nutz das hauptsächlich um 
einzelne Bits zu setzen. So hab ich halt ne "schönere" Bezeichnung - 
finde ich.

Vielen Dank für die schnelle Hilfe - kaum macht man's richtig, schon 
gehts.

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
Noch kein Account? Hier anmelden.