Zeitverhalten des XMEGA ADCs

Gast #2726205
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.