Forum: Digitale Signalverarbeitung / DSP / Machine Learning dsPIC33, ADC, Rauschen


von Jakob (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem beim Auslesen des ADCs vom dsPIC33FJ32GP202. Wenn 
ich die externen VREF+/- Eingänge nutze und den Eingang des ADCs auf GND 
setze, dann werden zyklisch folgende Werte ausgelesen:

0    0    0    12    0    0    0    12    0    0    0    12    ...

Bei jedem 4. Wert gibt es also einen Sprung auf 12. Dies entspricht bei 
einer Auflösung von 10 bit und einer Ref-Spannung von 3,3 V einen Sprung 
von 39 mV.

Wenn ich die VREF+/- Eingänge nicht nutze, kommt es zwar beim setzen des 
ADCs auf GND nicht zu diesem Problem, ich habe aber das Gefühl, dass 
andere Werte zu sprunghaft sind.

Mach ich irgendetwas in der Software falsch (Quelltextauszug weiter 
unten, vollständig im Anhang)?
Oder kann es ein Problem an meiner Schaltung sein? Versorgt mit Strom 
wird der Chip vom Pickit 3. AVdd und AVss sind angeschlossen. 10nF 
liegen zwischen Vdd und Vss. 10µF sind an Vcap angeschlossen. Taktgeber 
ist ein 16MHz-Quarz. VRef+/- und ADC sind an POTIs angeschlossen.
Oder sind Sprünge von 39 mV bei diesem Chip normal?

Vielen Dank für Hilfe!




  AD1PCFGLbits.PCFG0 = 0;

  AD1CON1 = 0x0000; // SAMP bit = 0 ends sampling ...
  AD1CHS0 = 0x0000; // Connect RB2/AN2 as CH0 input ..
  AD1CHS0bits.CH0SA = 0b00101;  //select AN5 for CH0 +ve input

  // in this example RB2/AN2 is the input
  AD1CSSL = 0;
  AD1CON3 = 0x0000; // Manual Sample, Tad = internal 2 Tcy
  AD1CON2 = 0;
  AD1CON2bits.VCFG = 0b011;    // use external VREF+/- 011
  AD1CON1bits.ADON = 1; // turn ADC ON
  TRISB = 0b01111;  // RB4 is output

  while (1) // repeat continuously
  {
    AD1CON1bits.SAMP = 1;
    // wait 0.5 µs
    LATBbits.LATB4 = 1;
    Nop();
    Nop();
    Nop();
    LATBbits.LATB4 = 0;
    AD1CON1bits.SAMP = 0; // start Converting
    while (!AD1CON1bits.DONE);// conversion done?
    tmp = ADC1BUF0; // yes then get ADC value
    buffer[i] = tmp;

    for (i = 0; i < 240; i++)
    {
      for (j = 0; j < 1000; j++)
        Nop();
      for (j = 0; j < 1000; j++)
        Nop();
      for (j = 0; j < 1000; j++)
        Nop();
      for (j = 0; j < 1000; j++)
        Nop();
    }

    SendString(itoa(numbuf, tmp, 10));
    SendString("\r\n");
  } // repeat

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.