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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.