AD-Wandler PIC24FJ128GB106

Gast #2261177
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
Gast #2261378
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
Gast #2261441
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
#2261668
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
}
Gast #2263436
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

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