Forum: Mikrocontroller und Digitale Elektronik Abtastrate ADC Signal nur alle 0,5 Sekunden


von Bernhard Bauer (Gast)


Lesenswert?

Hallo Mikrocontroller-Gemeinde,

ich habe meinen ADC am ATMega8 erfolgreich zum laufen gebracht, und
gebe den Wert am LCD-Display aus.
Durch die schnelle Abtastfrequenz von ca. 30kHz "flackert" aber das
letzte Bit leider. Ich brauche den Messwert nur zum Ablesen. Daher
wollte ich fragen:

Gibt es eine Routine, mit der man z.B. nur alle 0.2 Sekunden einen
ADC-Wert am Display ausgibt?

Verzögerungsschleifen habe ich in der ADC-Routine schon probiert,
brachten jedoch seltsamerweise keinen Erfolg.
Den ADC starte ich in einer Schleife manuell (ohne Interrupt) durch
setzen des ADSC Bit im ADCSRA-Register.
Vielen Dank schon mal für konstruktive Beiträge.

Gruß
Bernhard

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

du solltest dir mal generell Gedanken machen wie du dein Programm
aufbaust. Man geht da typischerweise so vor das man einen Systemtimer
aufsetzt der jede Millisekunde (oder beliebigen andere Zeitspanne, je
nach Bedarf) einen Interrupt auslöst. Im INT erhöhst du eine 16 Bit
Variable. In der Hauptschleife setzt du jetzt eine Varible auf den
aktuellen Wert deines Systemtimers. In jedem Schleifendurchlauf prüfst
du ob der Systemtimer um n größer ist als der gespeicherte Wert. Wenn
dem so ist führst du deine Aktion aus und setzt deine Variable wieder
auf den Wert des Systemtimers. Also etwa so (von C beeinflußter
Pseudocode):
1
uint16_t ticks;
2
3
//Jede ms
4
SIGNAL(TIMER)
5
{
6
    ticks++;
7
}
8
9
void main(void)
10
{
11
    uint16_t event100ms = 0;
12
    uint16_t event500ms = 0;
13
14
    initTimer();
15
    enableInts();
16
17
    while(1)
18
    {
19
        //Do something all 100ms
20
        if((ticks - event100ms)>100)
21
        {
22
            event100ms = ticks;
23
24
            //Do the 100ms stuff
25
        }
26
27
        //Do something all 500ms
28
        if((ticks - event500ms)>500)
29
        {
30
            event500ms = ticks;
31
32
            //Do the 500ms stuff
33
        }
34
    }
35
}

Obigem Code fehlen natürlich noch ein paar Schutzvorrichtungen da 16
Bit Zugriffe auf AVRs nicht atomar sind aber so sollte man das
prinzipiell machen. Du leitest damit aus nur einem INT beliebige Zeiten
ab.

Matthias

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.