Forum: Mikrocontroller und Digitale Elektronik Sinus eines Funktionsgenerators AD-Umsetzen


von Adrian (Gast)


Lesenswert?

Hallo,
ich würde gerne die Sinusschwingung eines Funktionsgenerators mit dem 
Atmega8 digitalisieren und dann über die USART ausgeben lassen. Jetzt 
habe ich festgestellt, dass der Funktionsgenerator über den ADC0-Eingang 
in die Schaltung zurückwirkt, d.h. immer wiedere in periodischen 
Abständen wird der analoge Sinus falsch interpretiert.
Ist der EIngang des Atmega8 überhaupt geeignet, ein 
"potentialunabhängiges Signal" zu interpretieren oder muss das 
Signal-GND mit dem des Atmega8 übereinstimmen.
Ich habe bei meiner Schaltung einfach den Masseanschluss des 
Funktionsgenerators mit dem Masseanschluss des Atmega verbunden und dann 
entsprechende den Siganalausgang(0-5V sinusförmig)an den Eingang ADC0 
gelegt. Gibt es eine andere Möglichkeit???
Gruß
adrian

von Realpotter (Gast)


Lesenswert?

Naja, der GND sollte derselbe sein, sonst misst man Mist.

von Karl H. (kbuchegg)


Lesenswert?

> d.h. immer wiedere in periodischen
> Abständen wird der analoge Sinus falsch interpretiert

Wie hoch war die zu messende Frequenz?
Welchen Prescaler hast du im Mega8 benutzt?
Sagt dir das 'Shannonsche Abtasttheorem' etwas?

von Adrian (Gast)


Lesenswert?

Wird denn nicht durch verbinden der GND, das Potential des 
Funktionsgenerators auf das des Atmega gezogen?
Und ist es möglich, dass der Funktionsgenerator das AD-Wandlung stört?
habe nicht gedacht, dass die Sinusspannung über den ADC-Einggang 
zurückwirken kann. Aber ich sehe dutlich, dass bei abgeschalteter 
Versorgungsspannung des Atmega über ein 7805 die Power LED pulsiert.
Für die Auswertung eines Funktionsgenerators ist ein ATmega, also nicht 
fähig?

von Realpotter (Gast)


Lesenswert?

Gehen sollte das schon. Wenn der Mega nicht gespiesen wird, fliesst das 
Signal in den Mega und speist so die gesammte Schaltung. Der 
Funktionsgenerator hat wahrscheinlich 50 Ohm, da kommen dann 100mA 
zusammen. Ich koennt mir vorstellen, dass das UART den ADC stoert, 
zeitlich, meine ich. Kommt auf das Timing und die pufferung an.

von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

die zu messende Frequenz lag bei 10Hz und die Sampelrate liegt bei 20Hz, 
habe sie aber auch schon hoch gesetzt auf 50Hz. aber immer wieder diese 
aussetzter.

von Karl H. (kbuchegg)


Lesenswert?

Adrian wrote:
> die zu messende Frequenz lag bei 10Hz und die Sampelrate liegt bei 20Hz,
> habe sie aber auch schon hoch gesetzt auf 50Hz. aber immer wieder diese
> aussetzter.

OK. 10Hz sollte kein Problem sein.
Zeig mal dein Programm.

von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

also hier mal mein Programm.

von Adrian (Gast)


Lesenswert?

hallo,
hat denn noch jemand einen Einfall, woran es liegt, dass ich periodisch 
immer wieder einen falschen Wert empfange?
habe heute mit einem Osszi, mit angelegtem Sinus des 
Funktionsgenerators, die Uref gecheckt aber die ist stabil.
Hilfe! Mir fällt nix mehr ein!
adrian

von Adrian (Gast)


Lesenswert?

hi zusammen,
habe noch mal bischen getestet.
Wenn ich das USART RX Interrupt komplett herauskommentiere, dann bekomme 
ich einen Sinus ohne "Abweichungen" => also ist wohl ein Fehler im Rx 
Interrupt. Komisch ist, dass während der Messungen das Interrupt nicht 
aktiv ist oder nicht sein sollte, weil ich kein Zeichen sende. Warum 
kann der Interrupt dennoch meine Messung beeinflussen?
Bekomme über einen Zeitraum von 15sec. beim Programm mit Rx_I. 
300Messpunkte, beim Prog ohne Rx_I nur 150Messpunkte?!
Würde mich auch über kleine Tipps freuen!
gruß
adrian

von Realplotter (Gast)


Lesenswert?

Der ADC laeuft auch am Interrupt ? An einem Timer Interrupt, oder anm 
ADC interrupt ?

von Adrian (Gast)


Lesenswert?

Der ADC läuft über einen timer Interrupt. siehe Anhang vom 07.08!
Jetzt habe ich nur den RxI auskommentiert.

von Realplotter (Gast)


Lesenswert?

Da ist einiges falsch. Der timer0 kann den ADC im interrupt neu starten, 
nicht im main das TIFR abfragen. Un dann dann den ADC interrupt 
verwenden,um das resultat in einem buffer wegzuschreiben.

von Adrian (Gast)


Lesenswert?

ich dachte es sei besser die Interrupts nicht so voll zu schreiben und 
deswegen die AD-Wandlung in der main.
Also den ADU-Code ins Timer Interrupt und dann sollte doch jeder Wert 
über USART einzeln versendet werden. Buffer?
ber der Hauptfehler muss doch auch im RxI stecken!?

von Wolfram Q. (quehl)


Lesenswert?

ich hab den ADC auch ohne Interrupt gemacht. Das mag Ansichtssache oder 
projektabhängig sein.
Auf jeden Fall sind mir die SEI im Interrupt aufgefallen. Die sollten 
raus. So wie ich das sehe, läuft das Ganze auch langsam ab. Müßte daher 
ansonsten laufen. Ich habe für den Uart einen Puffer verwendet, damit 
das schneller abläuft. Ich habe keine Wartezeiten drin, sondern es wird 
geprüft, ob der MC noch etwas tun kann. Möglicherweise liegt ein 
Timingproblem vor. Ich hatte das gehabt, daß der MC nichts empfangen 
hat, obwohl das Programm richtig ist. Der Fehler lag daran, daß ich im 
PC den UART Pufferspeicher ausgeschaltet hatte. Es wurden ständig Daten 
vom MC zum PC übertragen und da war keine Zeit für die Übertragung vom 
PC.
Mal prüfen, ob der Mux während einer Umsetzung gesetzt wird. Mux im 
Uartempfang hätte ich nicht gemacht.

mfg

von Uwe (Gast)


Lesenswert?

Hi!
mal so am Rande,
>Ich habe bei meiner Schaltung einfach den Masseanschluss des
>Funktionsgenerators mit dem Masseanschluss des Atmega verbunden
Dein Funktionsgenerator macht nicht zufällig +/- 2,5V(5V) gegen GND?
Wäre jedenfalls ungesund für den AVR wenn die Spannung am Eingang 
negativ wird.

Viel Erfolg, Uwe

von Realplotter (Gast)


Lesenswert?

Wenn der Timer kommt und meint der ADC sollte mal, so wird das dem main 
signalisiert. Wenn nun ein UART interrupt kommt, so wird das Starten des 
ADC verzoegert, da das main unterbrochen wird.

von Adrian (Gast)


Lesenswert?

hallo zusammen,

>Dein Funktionsgenerator macht nicht zufällig +/- 2,5V(5V) gegen GND?
>Wäre jedenfalls ungesund für den AVR wenn die Spannung am Eingang
>negativ wird.
also der Funktionsgenerator macht nur im Bereich von 0 bis +5V eine 
Sinusschwingung, keine negative Halbwelle.

>Wenn nun ein UART interrupt kommt, so wird das Starten des
>ADC verzoegert, da das main unterbrochen wird.
Grundsätzlich möcht ich durch das senden des Zeichens "A","B" oder "C" 
ja einen neuen AD-Eingang wählen und auch damit eine neue ADW einleiten.

Kann es sein, dass die die Werte im UDR nicht nur als zu sendende Werte 
interpretiert werden, sondern das mir damit der RxInterr.startet und 
kurzfristig die Ausgänge wechselt?
Wodurch erkennt der Atmega8, das sich im UDR ein Empfangenes Zeichen 
befindet und nicht ein zu sendendes?

gruß
adrian

von Realplotter (Gast)


Lesenswert?

Da UDR besteht effektiv aus 2 Registern, wenn man liest, liest man vom 
Empfangsregister, wenn man schreibt, schreibt man ins Senderegister.

von Adrian (Gast)


Lesenswert?

okay, dann fällt das schon mal als fehlerquelle heraus.
schreibe grade an einem geänderten Prog.

von Adrian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
habe jetzt mal das Prog. von Jörg X.
>Autor: Jörg X. (Gast)
>Datum: 04.08.2007 13:59
>Dateianhang: adcsend.asm
genutzt und noch ein wenig umgestrickt.
Aber auch hierbei die gleichen Fehler bei der Aufnahme des Sinus.
Jetzt habe ich mir noch einen ATmega8 gekauft, weil ich dachte es kann 
doch nur am Chip liegen und immer noch diese Fehler.
Schicke mal als Anhang das Prog. wenn jemanden was auffällt, einfach 
schreiben!
gruß
adrian

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.