Forum: Mikrocontroller und Digitale Elektronik AD-Wandler PIC24FJ128GB106


von Dani (Gast)


Lesenswert?

Guten Tag
Ich habe folgendes Problem;
Ich versuche mit einem Codebeispiel von Microchip meinen AD-Wandler 
(PIC24FJ128GB106) anzusteuern, jedoch kann ich keinen Wert auslesen und 
erhalte immer 0.

hier mein Code
1
  
2
  TRISB=0xFFFF;
3
  int ADCValue, count;
4
  int *ADC16Ptr;
5
  AD1PCFG = 0b1111111111011111;        // Only AN5 as analog input
6
  AD1CON1 = 0x00E0;              // Internal counter triggers conversion
7
  AD1CHS = 0b0000010100000000;        // Connect AN5 as positive input
8
  AD1CSSL = 0;      
9
  AD1CON3 = 0x0F00;              // Sample time = 15Tad, Tad = Tcy
10
  AD1CON2 = 0x003C;               // Set AD1IF after every 16 samples
11
  AD1CON1bits.ADON = 1;             // turn ADC ON
12
  while(1)                   // repeat continuously
13
    {      
14
    ADCValue = 0;               // clear value
15
    ADC16Ptr = &ADC1BUF0;          // initialize ADC1BUF pointer
16
    IFS0bits.AD1IF = 0;           // clear ADC interrupt flag
17
    AD1CON1bits.ASAM = 1;           // auto start sampling for 31Tad
18
    // then go to conversion      
19
        
20
    while (!IFS0bits.AD1IF);         // conversion done?
21
    AD1CON1bits.ASAM = 0;           // yes then stop sample/convert 
22
    for (count = 0; count < 16; count++)   // average the 16 ADC value
23
    {
24
    ADCValue = ADCValue + *ADC16Ptr++;
25
    }
26
    ADCValue = ADCValue >> 4;
27
    
28
    }

die einzige Anpassung die ich vorgenommen habe, ist den angewählten Pin 
von AN0 auf AN5 umzuschreiben (Regeister AD1PCFG und AD1CHS).
Wieso kann ich also nun keine Werte auslesen?

Bedanke mich im voraus für die Hilfe

von DJ T. (Gast)


Lesenswert?

Probier mal:

AD1CSSL = 0b0000000000100000;  (genau invertiert zu AD1PCFG)

von Dani (Gast)


Lesenswert?

Hat leider nicht funktioniert erhalte immer noch keinen Wert aus dem 
AD-Wandler

von Andreas G. (beastyk)


Lesenswert?

Moin,

mal so eine Frage: Was hast du den an dem Pin angeschlossen, gibs einen 
Schaltplan oder ein Bild von der Schaltung?
Und hast du vielleicht mal das ganze an AN0 probiert, also so wie 
Microchip das vorher auch geschrieben hat (damit könnte man ja auch 
sagen ob es definitv an dem Wechsel von AN0 auf AN5 liegt!)?

Gruß
Andi

von Dani (Gast)


Lesenswert?

Habe es jetzt mal mit AN0 versucht, hier funktioniert der AD-Wandler
Ich möchte ein Mikrofon an den AD-Wandler hängen. Die Mikrofonschaltung 
funktioniert auch.
Das bedeutet doch das die Konfiguration nicht stimmt, aber welches 
dieser Config-Bits stimmt nicht

von Michael H. (morph1)


Lesenswert?

Hättest du das mit AN0 nicht geschrieben, wäre meine erste Frage danach 
welches Debug-Paar du verwendest, da gibts ein sehr berühmtes Fehlerchen 
bei fast allen PIC24F.

Würde dir übrigens raten die bereits definierten Bitfelder zu nutzen 
welche der C30 zur Verfügung stellt, ist deutlich einfacher zu lesen.
1
void adcInit(void)
2
{
3
  AD1CON1bits.ADON = 0;      // disable ADC
4
  
5
//        5432109876543210
6
  AD1CSSL = 0b0000000011110011;  // define input scan ports
7
  
8
  AD1CON1bits.FORM = 0;      // Integer (0000 00dd dddd dddd)
9
  AD1CON1bits.SSRC = 7;      // Internal counter ends sampling and starts conversion (auto-convert)
10
  AD1CON1bits.ASAM = 1;      // Sampling begins immediately after the last conversion completes; SAMP bit is auto-set
11
    
12
  AD1CON2bits.SMPI = 5;      // Interrupts are at the completion of conversion for each 5th sample/convert sequence
13
  AD1CON2bits.BUFM = 0;      // Buffer is configured as one 16-word buffer (ADC1BUFn<15:0>)
14
  AD1CON2bits.ALTS = 0;      // Always uses MUX A input multiplexer settings
15
  AD1CON2bits.CSCNA = 1;      // Scan inputs
16
  AD1CON2bits.VCFG = 0;      // Voltage Reference Configuration AVdd / AVss
17
  
18
  AD1CON3bits.ADRC = 0;      // Clock derived from system clock
19
  AD1CON3bits.SAMC = 31;      // 31 TAD
20
  AD1CON3bits.ADCS = 63;      // 64 x TCY
21
  
22
  AD1CHSbits.CH0NA = 0;      // VR-
23
  AD1CHSbits.CH0SA = 0;      // AN0
24
  
25
  AD1CON1bits.ADON = 0;      // enable ADC
26
  
27
  _AD1IF = 0;
28
  _AD1IE = 1;
29
}

von Dani (Gast)


Lesenswert?

Ich verwende PGED1 und PGEC1
muss ich das Ganze jetzt auf PGED2 und PGEC2 legen?
Wenn ja, ist das nur hardwaretechnisch möglich?

von Klaus (Gast)


Lesenswert?

Dani schrieb:
> AD1CHS = 0b0000010100000000;        // Connect AN5 as positive input

Ist das so richtig?

MfG Klaus

von Dani (Gast)


Lesenswert?

Ja mit grosser Wahrscheinlichkeit schon.

Was ich nicht verstehe warum es mit AN0 funktioniert?!

von Michael H. (morph1)


Lesenswert?

Dani schrieb:
> Ich verwende PGED1 und PGEC1
> muss ich das Ganze jetzt auf PGED2 und PGEC2 legen?

Nein im Gegenteil! Das ist genau das richtige Paar.

von Dani (Gast)


Lesenswert?

okey aber wo liegt denn dann der Fehler?

Komme nicht mehr weiter habe schon x-verschidene Konfigurationen 
ausprobiert

von Manuel (Gast)


Lesenswert?

Hallo

Meine Konfiguration sieht so aus:
1
void ADC_Init(void)
2
  {
3
  AD1PCFGL = 0x0000;         // Alle Pins Auf analog setzen
4
  AD1PCFGH = 0x0000;
5
6
  AD1CON1bits.FORM = 0b00;   // integer format
7
  AD1CON1bits.SSRC = 0b111;  // auto convert
8
  AD1CON1bits.ASAM = 1;      // Auto-Sampling aktivieren
9
 
10
  AD1CON2bits.VCFG = 0b000;  // AVdd und AVss als referenz
11
  AD1CON2bits.CSCNA = 1;     // Scan inputs
12
  AD1CON2bits.SMPI = 0b1111; // 16 Werte in den den Buffer schreiben  
13
  
14
  AD1CON3bits.SAMC = 0b1111; // Auto Sample Time Tad
15
  AD1CON3bits.ADCS = 0b00111111;  // 64 TCY 
16
  
17
  AD1CSSL = 0xFFFF;    // Alle 16 AN Pins scanen auch wenn digital
18
                       // damit z.B. AN7 Wert im Buffer ADC1BUF7 liegt
19
      
20
  AD1CON1bits.ADON = 1; // ADC einschalten
21
  }

Nach dieser Initialisierung kann ich einfach irgend wo im Code den Wert 
für AN0 aus dem ADC1BUF0 Register, den Wert für AN1 aus dem ADC1BUF1 
Register, ... lesen.

Bei mir funktioniert dieser Code auf einem PIC24FJ256GA110 einwandfrei.

Gruss Manuel

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.