Forum: Mikrocontroller und Digitale Elektronik ADC an ATMega16 hat "Aussetzer"


von Torsten B. (torty)


Angehängte Dateien:

Lesenswert?

Hallo

Seit einigen Tagen brüte ich über folgendem Problem und komme nicht 
weiter:

Mit einem ATMega16 möchte ich über den ADC0 eine Spannung (variabel über 
ein Poti) messen und mit dem Wert einen Ton (Rechteck CO1A)
in der Frequenz modulieren. Ausgabe über Kollektorstufe und Kopfhörer.
Ich habe das Programm sehr ausführlich kommentiert, damit schnell klar 
wird, was passiert.

Um noch mehr Rauschen zu eleminieren, werden bei jedem Durchlauf 8 
Messungen gemacht und der gleitende Mittelwert daraus gebildet.

Hardwareseitig habe ich Vcc mit 2uF entkoppelt, AVcc über 47Ohm an Vcc 
angeschlossen und mit 100nF entkoppelt. AREF ist ebenfalls mit 100nF 
entkoppelt.
Die zu messende Spannung kommt im Testaufbau von einem 100k Poti und 
wird über einen Tiefpass an ADC0 geführt. Die Werte des Tiefpasses habe 
ich nicht mehr im Kopf (bin auf der Arbeit), aber die Grenzfrequenz lag 
bei ca 3kHz.

Der uC läuft mit 4MHz.

Problem:

Die Spannung wird zwar vom ADC gemessen und auch in die Timer Register 
geschrieben, jedoch kommt es während der Laufzeit immer wieder zu kurzen 
Knackimpulsen.
Ich kann mir leider nicht mehr erklären, woher das kommt.
Wenn ich den Timer ohne ADC "piepen" lasse, ist alles OK. Kein knacken 
im Kopfhörer zu vernehmen.

Hat die Software einen Bug ?
Wie würdet Ihr die Hardware für diese Aufgabe aufbauen ?

Mir ist klar, dass auch mit guter Filterung nicht ständig das gleiche 
Sampleergebnis ausgegeben wird, auch wenn das Poti nicht verändert wird.
 Wenige LSBs Schwankungen würden jedoch nicht zu einem Aussetzen führen, 
sondern lediglich die Frequenz anheben bzw. senken.

Danke für jeden ernst gemeinten Beitrag.
Torsten

Info für Flieger: Es soll ein elektronisches Variometer werden. Der 
Luftdrucksensor ist noch in der Post.

von spess53 (Gast)


Lesenswert?

Hi

Dein ADC läuft mit 4MHz. Das ist viel zu schnell. Der ADC-Clock sollte 
zwischen 50 und 200kHz liegen.

MfG Spess

von Drachenbändiger (Gast)


Lesenswert?

Deinen Code habe ich nur ganz schnell auf strukturelle Probleme 
überflogen: Du lässt Interrupts zu ("sei") und aktivierst
1
ldi temp,(1<<OCIE2)
2
out TIMSK,temp
, verwendest aber keine ISR und hast keinen Eintrag in der 
Interrupt-Vektortabelle dafür!

von Torsten B. (torty)


Lesenswert?

@ Drachenbändiger :

Das stimmt, ich  habe noch eine ISR im Code gehabt, die aber damit 
nichts zu tun hatte. Ich habe den Code aufgeräumt, damit er für Euch 
schneller zu lesen ist. Die Int Aktivierung habe ich leider vergessen.

@Spess:
Aha, das habe ich nicht gewusst.
Ich gehe davon aus, dass Du nicht die Frequenz meinst, mit der ich den 
ADC starte. Hier habe ich ja "polling" angewendet.

Wo kann man das mit der ADC Clock lesen ? Habe ich das im DAtenblatt 
übersehen, oder sind das Erfahrungswerte ?

Danke Torsten

von Drachenbändiger (Gast)


Lesenswert?

Unter "Prescaling and Conversion Timing":
"...requires an input clock frequency between 50kHz and 200kHz..."

von Torsten B. (torty)


Lesenswert?

OK Danke an alle.
Ich werde das mit dem Prescaler mal probieren.

Danke
Torsten

von Torsten B. (torty)


Lesenswert?

Hallo nochmal

Hatte mich schon gefreut, weil das mit dem Prescaler schon logisch 
klang.
Hat das Problem jedoch leider nicht gelöst. Die Aussetzer beim Piepton 
sind noch immer da.

Könnt Ihr noch einmal tief in Euch gehen ?? ;-)

Bin dankbar für jeden ernsten Tip

Danke
Torsten

Ich nehme an, dass der Prescaler NICHT vor jeder Conversation neu 
gesetzt werden muss, oder ?

Hab gerade noch einmal die Taktung des Mega auf 1MHz gesetzt. Die 
Aussetzer werden auch länger ! Vielleicht hilft das jemandem ...

von spess53 (Gast)


Lesenswert?

Hi

>out OCR1AL,Pressure_DATAL  ;Low-Byte mit Offset an Timer1
>out OCR1AH,Pressure_DATAH  ;High-Byte mit Offset an Timer1

Falsch. Das H-Register muss vor dem L-Register schrieben werden.

MfG Spess

von Torsten B. (torty)


Lesenswert?

Hi Spess

Danke auch für dieses wichtige Detail. Vielleicht brauche ich es später 
noch mal. Das Stottern meiner Pieps hat es leider noch immer nicht 
beseitigt.

Hast Du noch eine Idee ? Oder kommt DIr etwas koisch vor.
Bin die nächsten Stunden noch am Rechner. Wenn DU also noch Fragen hast 
..
GERNE :-)

Ich hab den Vorteiler übrigens jetzt auf 32 gestellt -> ADC Clock 125kHz 
@ 4MHz

von spess53 (Gast)


Lesenswert?

Hi

Es wäre günstig, wenn du mal das aktuelle Programm postest.

MfG Spess

von Torsten B. (torty)


Angehängte Dateien:

Lesenswert?

Kommt sofort

Vergiss den Teil unterhalb von
Init_Beep_Timer1:

der wird nicht aufgerufen
hab nur vergessen den zu löschen

von Torsten B. (torty)


Lesenswert?

Hab mal das Oszi an den OC1A Pin gehängt.
Der Timerausgang bleibt manchmal auf High-Pegel und manchmal auf 
Low-Pegel stehen.
Vielleicht hilft das.

von spess53 (Gast)


Lesenswert?

Hi

>moreSamples: ...

Da fehlt ein 'ret'

MfG Spess

von Torsten B. (torty)


Angehängte Dateien:

Lesenswert?

Hast Recht und das wäre ein selten blöder Fehler gewesen.
In diesem Fall hat es aber nur zur Folge, dass der Mittelwert zwei Mal 
in Folge berechnet wird.
Er stottert leider noch immer.
:-)

Hab noch mal die im Augenblick laufende Version mit Kommentaren 
angehängt.

von spess53 (Gast)


Lesenswert?

Hi

>In diesem Fall hat es aber nur zur Folge, dass der Mittelwert zwei Mal
>in Folge berechnet wird.

Nein. Dein Stack läuft voll. Und dann wird der Controller unberechenbar.

MfG Spess

von Torsten B. (torty)


Lesenswert?

Ooops, DU hast natürlich Recht. Der Stack ...
Habs aber gerade noch einmal mit ret laufen lassen. Es macht im 
akustischen Fehlerbild keinen Unterschied.

sobald ich die Funktion
Ring_beschreiben

nicht aufrufe, stottert nichts mehr. Aber dann kommen logischerweise 
auch keine Werte vom ADC an.

von Karl H. (kbuchegg)


Lesenswert?

Also

entweder

* du implementierst jetzt endlich mal eine ISR für den Output Compare
  für den Timer 2

* oder du verzichtest darauf, den Output Compare Interrupt für
  Timer 2 freizugeben

* oder du nimmst das sei raus, weil du ja keine Interrupt Handler hast


Aber eines von den 3-en wirst du wohl machen müssen, wenn du nicht 
willst, dass dir der Timer 2 bei einem Output Compare einen Sprung in 
die Wüste veranstaltet und du darauf angewiesen bist, dass der µC 
irgendwie wieder von selbst auf die Füsse fällt und nach einer 
Neuinitialisierung wieder den Betrieb aufnimmt nur um dann kurze Zeit 
später durch einen nicht korrekt aufgefangenen Interrupt wieder aus der 
Bahn geschmissen zu werden.

von Torsten B. (torty)


Lesenswert?

Ist doch alles hinter ";" gesetzt und damit unwirksam.

Sorry, in der Version eben noch nicht.

Hier noch einmal die aktuelle.


hab jetzt mal nur die Zeilen

  ;  sbi ADCSRA,ADSC

;warten2:       sbic ADCSRA,ADSC
;    rjmp warten2

in

Ring_beschreiben gelöscht.

Die Funktion ist es also auch nicht.

Einzig das Starten und das Warten auf den ADC sorgen hier für Probleme.

Hoffe, ich starpaziere Eure Nerven nicht zu sehr.

von Torsten B. (torty)


Angehängte Dateien:

Lesenswert?

hier die aktuelle Version

von Karl H. (kbuchegg)


Lesenswert?

Wenn du Ring_beschreiben aufrufst, welchen Wert hat dann der Z-Pointer?

Bedenke bei deiner Antwort auch, dass der Z-Pointer durch die 
nachfolgende Mittelwertbildung erneut verändert wird. Es ist daher 
unklug davon auszugehen, dass der Z-Pointer bei Betreten der Funktion 
schon richtig stehen wird.

von Andy H. (vinculum) Benutzerseite


Lesenswert?

Und dann würde ich mir nochmal angucken, wie man den Timer 1 neu setzt, 
bevor er abgelaufen ist. Ich nehme all an, dass deine Schleife umein 
vielfaches schneller ist, als der Output von Timer1.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wenn du Ring_beschreiben aufrufst, welchen Wert hat dann der Z-Pointer?
>
> Bedenke bei deiner Antwort auch, dass der Z-Pointer durch die
> nachfolgende Mittelwertbildung erneut verändert wird. Es ist daher
> unklug davon auszugehen, dass der Z-Pointer bei Betreten der Funktion
> schon richtig stehen wird.

Ich ziehe meinen Einwand zurück.
Du pusht und popst den Z-Pointer korrekterweise in der 
Mittelwertberechnung.

von Andy H. (vinculum) Benutzerseite


Lesenswert?

>cpi ZL,SRAM_START+SampleMenge*2  ;prüfe, ob alles aufaddiert ist

Weiss nicht wo SRAM_START liegt, aber low(...) wäre besser

von Torsten B. (torty)


Lesenswert?

@  Karl Heinz:
Z-Pointer wird beim ersten Mal gesetzt (auf SRAM_START)

bei allen anderen Durchläufen wird er nicht verändert, da er in 
Gleitender_Mittelwert_10Bit durch  push/pop nicht verändert wird.

@ Andy:

Mir war bis jetzt nicht bewusst, dass man da was beachte muss.
Werde ich aber nachschlagen.
Ich glaube jedoch nicht, dass das hier das Problem ist, weil das 
Programm ja ohne die Zeilen

            sbi ADCSRA,ADSC    ;ADC starten

warten2:    sbic ADCSRA,ADSC
      rjmp warten2    ;warten bis fertig

in
Ring_beschreiben

auch ohne Stottern läuft.

Wenn es am Timer liegen würde, sähe das Problem doch auch anders aus, 
oder ?

von Andy H. (vinculum) Benutzerseite


Lesenswert?

Im PWM-Mode wird abgewartet, bis die aktuelle Periode zu Ende ist.
Im CTC-Mode wird der Wert sofort übernommen.

von spess53 (Gast)


Lesenswert?

Hi

Tritt das knacken auf, wenn du die Frequenz veränderst, oder auch bei 
konstanter Frequenz?

MfG Spess

von Torsten B. (torty)


Lesenswert?

leider auch, wenn ich die Finger vom Poti lasse.

Die Frequenz ist dann auch (zumindest hörbar konstant)

Ich dachte zuerst auch, dass es eventuell höherfrequente Impulse vom 
Schleifer des Potis sein könnten "Bürstenfeuer" sozusagen ..

von spess53 (Gast)


Lesenswert?

Hi

Noch was: Sind die Abstände konstant oder unregelmässig?

MfG Spess

von Torsten B. (torty)


Lesenswert?

sie sind unregelmäßig

ich schätze so zwischen 1 - 20 Sekunden ist alles mal dabei

von Torsten B. (torty)


Lesenswert?

hab gerade mal den sehr naiven Test gemacht und einen neuen Prozessor in 
den Sockel gesteckt. Leider ohne Erfolg

von Torsten B. (torty)


Lesenswert?

auf der Betriebsspannung habe ich durch das Schalten des OC1A Ausganges 
einen Ripple von +/- 0,2V
Ist das ein Problem ?

von spess53 (Gast)


Lesenswert?

Hi

>auf der Betriebsspannung habe ich durch das Schalten des OC1A Ausganges
>einen Ripple von +/- 0,2V
>Ist das ein Problem ?

Nicht unbedingt. Ich hoffe aber, das dein Controller ordentlich 
abgeblockt ist.
Ehrlich gesagt, fällt mir im Moment nicht mehr allzuviel ein.

MfG Spess

von Andy H. (vinculum) Benutzerseite


Lesenswert?

Also nochmal der CTC mode - wie oben schon gesagt:

If the new value written to OCR1A or ICR1 is lower than the current 
value of
TCNT1, the counter will miss the compare match. The counter will then 
have to count to its maximum value (0xFFFF) and wrap around starting at 
0x0000 before the compare match can occur.
In many cases this feature is not desirable. An alternative will then be 
to use the fast PWM mode using OCR1A for defining TOP (WGM13:0 = 15) 
since the OCR1A then will be double buffered.

Da du ständig auf OCR1A schreibst, wird dieser Zustand öfter passieren. 
Du musst also PWM mode nehmen. Dass der ADC trotz der Filterung im WErt 
schwankt, musst du mit einkalkulieren.

von spess53 (Gast)


Lesenswert?

Hi

Doch noch eine Frage um letzte Klarheiten zu beseitigen: Im Titel hast 
du von Aussetzern geschrieben (im Text allerdings von Knacken). Sind es 
wirklich Aussetzer? Und wenn ja, wie lang etwa?

MfG Spess

von Heiko (Gast)


Lesenswert?

Was mir spontan einfällt, ist daß der ADC für einen Eingangswiderstand 
von 10K optimiert ist. Vielleicht ist dein 100K Poti zu groß um die 
Eingangskapazität zuverlässig zu laden.

von spess53 (Gast)


Lesenswert?

Hi

Die Störungen gibt es, lt. Torsten, auch, wenn die Eingangsspannung 
nicht geändert wird. Da wird auch nichts umgeladen.

@Andy In diese Richtung geht meine Vermutung auch.

MfG Spess

von uwegw (Gast)


Lesenswert?

Ich vermute auch den compare miss als Ursache. Bei 4MHz und prescaler 8 
braucht der Timer immerhin ~130ms um überzulaufen... das könnte echt gut 
hinkommen.

von Torsten B. (torty)


Lesenswert?

Liebe Gemeinde

Ich möchte allen Beteiligten sehr herzlich für Ihre Zeit und Mühe 
danken.

Ich hatte heute morgen zwar nur wenige Minuten Zeit die letzten Beiträge 
zu lesen, umzusetzen und zu testen, aber allem Anschein nach hat Andy 
mit seiner CTC / Fast PWM Einschätzung Recht gehabt. Ich habe die Bits 
gesetzt und die Schaltung arbeitet, wie ich es erwartet habe. Alles gut.

Danke aber auch an alle anderen, da ich auf diese Weise auf eine Menge 
anderer Fehler aufmerksam geworden bin, die wahrscheinlich später zu 
Problemen geführt hätten.

Grüße
Torsten

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.