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:
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).
Sie stellen das Taktsignal des ADC nicht auf 32 MHz ein. Der Parameter ADC_FOSC_32
teilt die Uhr durch 32 (siehe Seite 225 des Datenblatts ). Dies stellt zusammen mit den Auswahlbits für die Erfassungszeit ( ADC_4_TAD
in 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:
ConvertADC
.a
als 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.Für 32 MHz (ohne Divisor) 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 über 0,7 us. Ein Divisor von 32 wird es hier tun, uns > 0,7 us.
Fosc
(in diesem Fall 32 MHz)? Außerdem habe ich ConvertADC()
, es war ein Tippfehler. Verzeihung.
PetPaulsen
Buhake Sindi
WDT
aufOFF
undLVP
auf gesetztOFF
. Meine Includes sind18f4520.h
, sowieadc.h
.