PIC18F4520 ADC-Konvertierung in MC18

Ich habe ein Dilemma.

Ich muss ADC-Werte von PIC18F4520 lesen . Meine Konfiguration und mein Code lauten wie folgt:

#define OSC INTIO67
int adc_result = 0;

void main(void)
{
    OSSCON = 0x70; //Set it as 8Mhz.
    OSCTUNEbits.PLLEN = 1; //Enable PLL 4x multiplier, thus we have 32 Mhz internal clock.

    //Set PORTA direction ports as input
    TRISA = 0xFF;

    OpenADC( ADC_FOSC_32      &
         ADC_RIGHT_JUST   &
         ADC_4_TAD,
         ADC_CH0          &
         ADC_REF_VDD_VSS  &
         ADC_INT_OFF, ADC_5ANA);

    while (1) {
        SetChanADC(ADC_CH0);
        ConvertADC();
        while (BusyADC());
        adc_result = ReadADC();
    }
    CloseADC();
}

Das Problem ist folgendes:

  1. Wenn ich es in MPLAB v8.x ausführe, ist mein Lesen etwas abseits und mein Debugging wird beendet.
  2. Ich kann den PIC nicht erneut debuggen, da ich Fehlermeldungen wie "Cannot enter debug mode" erhalte.

Wie behebe ich diese Probleme? Ist meine ADC-Konfiguration auch korrekt (da ADC eine Uhr für die ADC-Konvertierung benötigt) mit meiner internen Uhr? Ist es richtig, das Taktsignal auf 32 MHz einzustellen?

Ich programmiere mit PicKit2 (mit dem schwarzen Knopf).

Nur zur Verdeutlichung: Debuggen Sie ein echtes Gerät oder simulieren Sie es? Fügen Sie den richtigen Header für das Gerät hinzu (in Ihrem Code werden keine Includes angezeigt)?
Ich debugge ein echtes Gerät. Ich habe nur WDTauf OFFund LVPauf gesetzt OFF. Meine Includes sind 18f4520.h, sowie adc.h.

Antworten (1)

Sie stellen das Taktsignal des ADC nicht auf 32 MHz ein. Der Parameter ADC_FOSC_32teilt die Uhr durch 32 (siehe Seite 225 des Datenblatts ). Dies stellt zusammen mit den Auswahlbits für die Erfassungszeit ( ADC_4_TADin Ihrem Fall) die minimale (/maximale) A/D-Erfassungszeit sicher (siehe Seite 359). Wenn Sie diese Anforderungen verletzen, erhalten Sie keine gültigen/genauen Ergebnisse.

Mit den Gleichungen auf Seite 228 können Sie rechnen und überprüfen, ob die Anforderungen erfüllt sind.

Einige andere Punkte:

  • In Ihrem Code starten Sie die ADC-Konvertierung niemals durch Aufrufen von ConvertADC.
  • Sie konfigurieren den Port aals Ausgang durch Einstellung, TRISA = 0x0;möchten aber, dass er als Eingang konfiguriert wird (wie Ihr Kommentar sagt). TRISA = 0xFF;würde alle Pins an Port a als Eingang konfigurieren.


Um die Erfassungszeit etwas zu erweitern ( T A D ): Diese Zeit wird benötigt, damit sich die interne Schaltung wahrscheinlich auflädt. Wenn diese Zeit zu kurz ist, erhalten Sie keine/schlechte Ergebnisse.

Für 32 MHz (ohne Divisor) T A D wären 31ns. Das ist zu schnell. Mindestens 0,7 us sind erforderlich, damit der ADC wahrscheinlich funktioniert. Sie wählen also einen richtigen Divisor aus, um ihn zu erhalten T A D über 0,7 us. Ein Divisor von 32 wird es hier tun, T A D = 1 uns > 0,7 us.

Danke, wie stelle ich das Taktsignal des ADC auf Fosc(in diesem Fall 32 MHz)? Außerdem habe ich ConvertADC(), es war ein Tippfehler. Verzeihung.
Nochmals: Sie müssen überprüfen, ob die Erfassungszeit ( T A D ) erfüllt ist. Auf Seite 359 sehen Sie das Minimum T A D ist 0,7 us. Für eine höhere Oszillatorfrequenz muss man also einen größeren Teiler wählen. Tabelle 19-1 gibt Ihnen einen Überblick. Ich würde Ihnen empfehlen, das Datenblatt zu lesen , zumindest Abschnitt 19, ADC.