Forum: Mikrocontroller und Digitale Elektronik PIC 24 MUX A Channel Scanning Verständnis


von Microchip (Gast)


Lesenswert?

Hallo liebe Community!

Ich verwende den PIC24FJ128GB204 für eine simple AD Converting - 
Anwendung. Mein Problem ist die ADC Konfiguration.

Datenblatt PIC24FJ128GB204: 
http://ww1.microchip.com/downloads/en/DeviceDoc/30005009c.PDF

Referenz Manual:
http://ww1.microchip.com/downloads/en/DeviceDoc/39739b.pdf


Auf Seite 358(Datenblatt)/ Seite 9(Referenz Manual) das CSCNA Bit: Da 
steht, dass mit AD1CSSH und AD1CSSL die SCAN Inputs(glaube ich) gewählt 
werden. Was ich nicht verstehe ist, dass ich bei den Registern nur 
wählen kann, ob ein Channel eingeschalten werden soll, oder nicht. Da 
geht für mich nicht auf, welches Bit für welchen Eingang steht.
Könnte mir auch jemand den ADC Scanning Prozess erklären, weil ich im 
Datenblatt keine verständliche Erklärung gefunden habe ?

Danke im Voraus!

LG

von Hmm (Gast)


Lesenswert?

Hallo,

der ADC dieses PIC hat Differenzeingänge und zwei Muxer. Du musst also 
mindestens ZWEI Eingänge programmieren.
Das tut man mit CH0SA für den positiven Eingang und CH0NA für den 
negativen EIngang. Oder CH0SB und CH0NB für MUX_B.

Wenn du ganz klassich single-ended messen willst, kannst du CH0NA 
einfach mit Masse verbinden, indem du einfach  11101 auf CH0NA 
programmierst, und dann einfach CH0SA auf den gewünschten Port Mappen.

Beispiel:
Du willst AN3 gegen Masse messen: CH0SA = 3; CH0NA = 0;
Du willst AN3 gegen AN2 messen : CH0SA = 3; CH0NA = 2;

Tipp:
Das Diagramm Fig. 24-1 betrachten.


Folgender Code läuft auf einem PIC24FJ128GA204, der den gleichen ADC 
hat:
1
void initadc(uint8_t init)
2
{
3
    if(init != 0){
4
        
5
        aVBATT = tVBATT = 1;
6
        aVUSB = tVUSB = 1;
7
        
8
        AD1CON1 = 0;
9
        AD1CON1bits.ADSIDL = 0;     //Stopp in idle
10
        AD1CON1bits.MODE12 = 1;     //12Bit Mode
11
        AD1CON1bits.FORM   = 0b00;  //dezimales Format
12
        AD1CON1bits.SSRC   = 0b0111; //Autoconvert
13
14
        AD1CON2 = 0x00;
15
        AD1CON3 = 0x00;
16
        AD1CON3bits.SAMC = 0b10000; //SampleTime 16 TAD (TAD = Taktperiode)
17
        AD1CON3bits.ADCS = 0b00000101;  // TAD = 4 * TCY (ADCCLOCK = 4MHz / 4)
18
19
        AD1CON5 = 0x0000;
20
        AD1CON5bits.LPEN    = 1;    //Zurück in Low Power Mode nach sscan
21
        AD1CON5bits.BGREQ   = 1;    //Bandgap Referenz einschalten
22
23
24
        AD1CHSbits.CH0NA = 000;     //<<-- damit erden wir den neg. Eingang von MUXA
25
        AD1CON1bits.ADON = 0;       //dont switch ADC on for now        
26
    }
27
    else{
28
       AD1CON1 = AD1CON2 = AD1CON3 = AD1CON5 = 0;   
29
    }
30
}
31
32
33
unsigned int ADCSample(uint16_t *OUT, unsigned int Channel)
34
{
35
    unsigned int CNT = 0;
36
    if(Channel >=31)
37
    {   //report invalid value
38
        return 1;
39
    }
40
    AD1CHSbits.CH0SA = Channel; //<<<<-- damit wählen wir den postiven EIngang aus
41
    AD1CON1bits.ADON = 1;       //Enable ADC
42
    //__delay_us(80);
43
    AD1CON1bits.SAMP = 1;       //Sample
44
    //__delay_us(80);
45
    //wait for result with timeout
46
    while(!AD1CON1bits.DONE && (CNT < TIMEOUT)){CNT++;};
47
    if(CNT >= TIMEOUT)
48
    {   //Timeout
49
        AD1CON1bits.ADON = 0;       //disable ADC
50
        return 2;
51
    }
52
    *OUT = ADC1BUF0;
53
    AD1CON1bits.ADON = 0;       //disable ADC
54
    return 0;
55
}

Das ist Pfusch, und sehr simpel, funktioniert aber. Für meinen Zweck 
(Batteriespannung messen) hat es immer getan.

von Micid (Gast)


Lesenswert?

Oha vielen Dank!!!!!!!!!

von Microchip (Gast)


Lesenswert?

Nur mal eine Frage: Darf ich den Zustand Unimplemented verwenden?
Wieso muss man die Band Gap Referenz einschalten?

von Microchip (Gast)


Lesenswert?

Was soll ich mit den AD5CON.CM0 und AD5CON.CM1, weil ich es nicht 
ausschalten kann.

von Hmm (Gast)


Lesenswert?

Microchip schrieb:
> Was soll ich mit den AD5CON.CM0 und AD5CON.CM1, weil ich es nicht
> ausschalten kann.

Nichts. Das wird nur verwendet, wenn der Compare-Mode aktiv ist.

Sonst wäre noch zu sagen, dass das Datenblatt nicht behautet, 
detailliert zu sein, sondern es ist lediglich eine Zusammenfassung. Der 
ADC hat ein eigenes Handbuch mit 58 Seiten.
Im Ersten Abschnitt wird auf folgendes Dokument verwiesen:
DS39739

Das findet man hier:
http://ww1.microchip.com/downloads/en/DeviceDoc/39739a.pdf

Dort ist auch der Compare-Mode beschrieben. Man kann damit Analogwerte 
überwachen, ohne die CPU zu beschäftigen. Sinnvoll ist das für Dinge wie 
kapazitiv Touch.


Was nicht implementierte Bits angeht, die würde ich nicht setzen. Ich 
hatte schon erhöhten Stromverbrauch dabei. Normalerweise passiert aber 
nichts.

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.