Forum: Mikrocontroller und Digitale Elektronik Zeitverhalten des XMEGA ADCs


von Sebastian (Gast)


Lesenswert?

Hallo,

ich bin auf dem Gebiet der µC-Programmierung noch ein Neuling und 
versuche mich gerade an einem XMEGA32A4U. Einige grundlegende Sachen 
habe ich bereits erfolgreich zum Laufen gebracht. Jetzt habe ich 
allerdings meine Probleme bei der Nutzung des ADCs. Im ersten Schritt 
möchte ich einfach nur in Abhängigkeit eines eingelesenen ADC-Wertes 
einen Ausgangs-Pin auf High setzen. Prinzipiell funktioniert das auch, 
allerdings schwankt die Zeit zwischen angelegtem Eingangssignal (ADC) 
und setzen des Ausgangspin ziemlich stark. Ich teste das ganze auf einer 
selbst gebastelten Testplatine mit folgender Konfiguration:

- Signalgenerator an PORTA (0V ... 1V Rechtecksignal 5kHz)
- Ausgangspin an PORTE
- beide Pins werden über Oszi angeschaut
- interne Spannungsreferenz
- Abfrage im µC: Eingang > 0,5V >>> dann PORTE auf High

Wenn ich jetzt das Rechtecksignal anlege und mit dem Oszi darauf 
triggere, dann ist das Ausgangssignal stark "verschmiert". D.h. manchmal 
wird der Ausgang bereits nach 2,5µs gesetzt und manchmal erst nach 4µs 
usw. Wenn ich ein Eingangssignal mit kleinerem Anstieg habe 
(Dreiecksignal), dann wird dieser Zeitbereich noch größer.

Ich habe überhaupt keine Idee woran das liegt. Zum besseren Verständnis 
hier noch einmal mein aktueller Quellcode:

#include <avr/io.h>
#include <avr/interrupt.h>


volatile int ADC_Value    = 0x00;


int main(void)
{
    Clock_init();
    Int_init();
    ADC_init();


    PORTE.DIR                = 0xFF;


    while(1)
    {

    }
}


void Clock_init(void)
{
OSC.CTRL=0x02;
while(!(OSC.STATUS & OSC_RC32MEN_bm)); 
// Warten bis der Oszillator bereit ist
CCP = CCP_IOREG_gc;
CLK.CTRL=0x01;
}

void Int_init(void)
{
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
    sei();
}

void ADC_init(void)
{
    PORTA.DIR         =0x00;
    ADCA.CTRLA           =0x01;
    ADCA.CTRLB            = 0b00011000;
    ADCA.REFCTRL        = 0b00000000;
    ADCA.PRESCALER        = 0x00;

    ADCA.CH0.MUXCTRL    = 0b00001000;
    ADCA.CH0.CTRL        =0x01;

    ADCA.CH0.INTCTRL    = ADC_CH_INTLVL_LO_gc;
}



ISR (ADCA_CH0_vect){
    ADC_Value = ADCA.CH0.RES;

    if  (ADC_Value >= 1000)
    {
        PORTE.OUT = 0x01;
    }
    else
    {
        PORTE.OUT = 0x00;
    }

}

Danke für eure Hilfe

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.