Atmega seltsames ADC Verhalten, Überlauf?

Gast #2890970
Lesenswert?

Hallo Leute,

in der uC Programmierung bin ich zwar noch nicht so geübt, ich habe 
allerdings nun folgendes Verhalten mit meinem Code festgestellt, das ich 
nicht nachvollziehen kann. Zunächsteinmal der Code:
1
uint16_t lastADCresult;    //Globale Variablen
2
uint16_t ADCResultBuffer[500];
3
uint16_t ADCBufferCurrent;
4

5
ISR(ADC_vect)   //ADC Ergebnis speichern, läuft im FreeRun-Mode
6
{
7
  lastADCresult= ADCW;
8
}
9

10
ISR(TIMER0_OVF_vect) //Tritt alle 217us auf
11
{  
12
  cli();
13
  
14
  if(ADCBufferCurrent>499)
15
    ADCBufferCurrent=0;
16
  
17
  //wird später ins Array eingefügt
18
  uint16_t measuredSteps;
19
  
20
  if(lastADCresult<=1024)  //Habe ich später zum Test eingeführt, siehe Text
21
  {
22
    if(lastADCresult>=512)
23
      measuredSteps = (lastADCresult-512);
24
    else
25
      measuredSteps = (512 -lastADCresult);
26
    
27
    ADCResultBuffer[ADCBufferCurrent] = measuredSteps;
28
  
29
    //Arrayzeiger inkrementieren
30
    ADCBufferCurrent++;    
31
  }  
32
  sei();
33
}

Das ganze dient zum Auslesen einer sinusförmigen Schwingung, um 2.5V. 
Ich möchte den Abstand des Signals zu den 2.5V messen und in das Array 
schreiben. Da ich den in den ATMega88 integrierten 10bit ADC nutze, 
liegen diese 2.5V bei 512 Steps. Aus einem mir nicht erklärlichen Grund 
ergibt sich immer folgende Belegung des Arrays: siehe Anhang. Eigentlich 
sollten keine Werte >1024 auftreten, da der ADC nur 10bit besitzt. Zu 
Testzwecken habe ich auch diese if-Abfrage oben eingebaut. An einen 
Überlauf habe ich schon gedacht, aber wo woll er auftreten? Wenn das 
Ergebnis >=512 ist, wird davon 512 abgezogen, also kommt mindestens 0 
raus. Ist es kleiner als 512, wird es von 512 abgezogen, auch hier 
sollte es mindestens 0 sein. Ich verstehe auch nicht, warum diese Werte 
nur ab ca Messwert 430 beginnen so zu schwanken. Vor Eintritt in die 
Hauptschleife des Programms wird das Array mit Nullen initialisiert.
Das gleich Verhalten tritt auch auf, wenn ich nicht den FreeRun Modus 
nutze, sondern die Konversation immer explizit starte.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren