Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC


von Steffan (Gast)


Lesenswert?

Hallo,

ich wollte für den ATmega128 einen Trigger programmieren (der ATmega hat 
nämlich nicht wie z.B. der ATmega16 eine Autotrigger Funktion)

Hierbei stoße ich auf etwas, was ich mir nicht erklären kann.
hier mal der Codeausschnitt:
1
#define ADC_RUN (_BV(ADEN)|_BV(ADSC) |_BV(ADFR)|_BV(ADIF)|_BV(ADPS2)|_BV(ADPS1) |_BV(ADPS0) ) //|_BV(ADPS0)
2
#define ADC_STOP 0x00
3
int16_t pegel=0;
4
int16_t pegel_null=0;
5
int16_t ADC_TRIGGER;
6
int ADC_WAIT_TIME;
7
ADC_WAIT_TIME=0;
8
9
do {
10
    ADCSRA = ADC_RUN;    
11
    while(bit_is_clear(ADCSRA, ADIF));
12
    ADC_TRIGGER = ADC- 32768;
13
    printf("ADC_TRIGGER= %5u\n", ADC_TRIGGER );
14
    if (ADC_WAIT_TIME < 50)
15
    {
16
      ADC_WAIT_TIME++;
17
      printf("ADC_WAIT_TIME= %5u\n", ADC_WAIT_TIME );
18
    }
19
20
  /*  
21
    else if ((ADC_TRIGGER >= (pegel_null+pegel)) || (ADC_TRIGGER <= (pegel_null-pegel)))
22
    {
23
      printf("...da war der Trigger\n");
24
      printf("Pegel= %5u\n", ADC_TRIGGER );
25
      goto run;
26
    }
27
  */  
28
29
} while(-1);
30
ADCSRA = ADC_STOP;

So, ich hoffe ich habe nichts wichtiges vom Code vergessen.
Der ADC bekommt eine externe Refferenzspannung von ca. 4,88V
Auf den ADC0 Kanal wird ein Offset von 2,44V gegeben.

Nun zu dem was mich verwundert:
Die else if ist zum Test auskommentiert, da der Trigger sonst auslöst.
Aber warum macht der das?
Wenn ich die Zeile
1
ADC_TRIGGER = ADC- 32768;
abändere in
1
ADC_TRIGGER = ADC;
Dann wird mir mit der printf Anweisung auf dem Monitor konstant und 
permanent der Wert 32768 ausgegeben.
Wenn ich allerdings die Zeile
1
ADC_TRIGGER = ADC- 32768;
so belasse, würde ich annehmen, dass über die printf Anweisung ständig 
eine 0 auf dem Monitor zu sehen sein müßte, aber statt dessen schleicht 
sich dort sporadisch eine 65472 ein. Und die löst dann natürlich die 
else if Anweisung aus, aber wo kommt die 65472 her bzw wie kommt die 
zustande?
Habe es auch schon in einzelnen Schritten versuche also:
1
ADC_TRIGGER = ADC- 32768;
2
ADC_TRIGGER = ADC_TRIGGER - 32768;
aber das hat auch nicht geholfen.

Ich hoffe das mir jemand helfen kann.

MFG

von Steffan (Gast)


Lesenswert?

Ok, ich sollte wohl erst einmal
1
printf("ADC_WAIT_TIME= %5d\n", ADC_WAIT_TIME );

schreiben.

So, und irgendwie ist mir da wohl doch ein Fehler unterlaufen, es kommt 
doch der Wert 32704 und daraus wird dann -64
Ich denke mal, das dies das Rauschen des ADC ist denk
Wenn ich den Trigger also auf 65 setzt klappt es.

MFG

von Matthias L. (Gast)


Lesenswert?

>ADC_TRIGGER = ADC- 32768;
>ADC_TRIGGER = ADC_TRIGGER - 32768;


ADC_TRIGGER ist eine VORZEICHENBEHAFTETE Zahl:

ALso Wertebereicht:                       -32768 ..  -1  .. 0 .. +32767
zugehoriger Inhalt der Speicherzelle:      65535 ..32768 .. 0 .. +32767

Das ADC Register ist einfach ein 16bit Register.
Negative Werte werden über das Vorzeichenbit (Bit15=1) dargestellt 
(Zweierkomplement).

Das bedeutet: Negative Werte werden im Register als (unsigned) Werte 
größer 32767 dargestellt....

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.