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