Forum: Mikrocontroller und Digitale Elektronik Probleme beim Sample'n ...


von Sascha (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

vielleicht kann mir ja einer helfen.

Ich möchte einen Sampler bauen, der von 20Hz bis 120Hz immer 16 Samples
erzeugt. Dazu ist ein wenig Mathematik nötig.

Der oben von mir erzeugte Code funktioniert im Ansatz. Muß aber leider
feststellen, das bei konstanter Frequenz (z.b. Netz) trotzdem ab und zu
mal Wackler in der Auflösung sind. Das soll bedeuten, das ich an den
LEDs ab und zu ein Flackern sehe, Auch das Oszi bestätigt ab und zu
Interferenzen. Ich habe schon sehr viel probiert, mit direktem setzen
des Timers1 nach Int0 usw. aber am stabilsten (und doch nicht stabil
genug) läuft die oben angeführte Version.

Warum wackelt der Sample ab und zu?
Hat jemand eine bessere Idee?


Sascha

von Sascha (Gast)


Angehängte Dateien:

Lesenswert?

So, eben hatte ich noch eine Idee, die hat eine weitere massive
Stabilität ins Programm gebracht. Es ist jetzt fast sehr gut. Nur noch
selten (aber immer noch ) sind die Störungen da.

Die Änderung:

Ich habe den Interrupt Ext0 für eine gewisse Zeit ausgeschaltet.


Trotzdem würde ich mich über weitere Lösungen freuen.


Sascha

von Peter D. (peda)


Lesenswert?

Ich hab nicht den geringsten Schimmer, was Du eigentlich machen willst.

Beschreib doch erstmal, was das Programm machen soll und dann, welchen
Lösungsansatz Du dafür verwendest.

Dann könnte man das Programm verstehen und sehen, wo der Fehler liegt.

Meistens ist auch schon ein Fehler im logischen Ansatz die Ursache, den
könnte man dann schon in Deiner Beschreibung erkennen.

Solche logischen Fehler sind deshalb häugfig, da die meisten erst gar
keinen logischen Ansatz machen sondern gleich drauf los programmieren.


Peter

von Sascha (Gast)


Lesenswert?

Hallo Peter,

ich dachte, der Code wäre gut lesbar, aber kein Problem.

Ich möchte immer die gleiche Anzahl an Samples in einer Periode haben.
Dazu verwende ich den Int0, um zu erkennen, wann es denn nun losgeht
mit der Periode. So starte ich den Timer0 und zähle die Prozessortakte
bis die Periode zu Ende ist. Mit der Mathematik errechne ich dann den
Comparewert für Timer1 und springe entsprechend in die Routine Timer1.


Nach jedem Ext0 wird die neue Zeit errechnet.

Wenn sich die Periode ändert, so ändert sich auch das mathematische
Ergebnis für die Zeit für Compare und somit bleibt die Samplerate
gleich .

In diesem Beispiel sind es 16 Samples.
Wie schon geschrieben, das Programm läuft jetzt fast ultrastabil, da
ist kaum noch ein Flackern der LEDS zu sehen.

Das Programm hat, obwohl es so kurz ist, schon eine Zeit gekostet,
zumal ich ermitteln mußte, wenn ich mich in einem Frequenzbereich von
20Hz bis 120hz bewege, wie groß die entspechenden Zahlen werden und wie
die Genauigkeit sich verändert.


Danke für das Interesse.
Bei weiteren Fragen einfach schreiben ...


Sascha

von Hans (Gast)


Lesenswert?

lesbar ist C ;) und am AVR isses eh wurscht was du machst..bedenke den
controller fährst mit min 4MHz und du willst max 120Hz haben... mit 16
samples müsstest du dann 1,92KHz signal basteln... d.h eigentlich ein
frequenzvervielfacher...
ich bin dafür du lässt ein PWM signal generieren...du stellst dort 50%
ein und die frequenz tust ausrechnen...das geht ohne belastung des
controllers...

in der mainloop tust einfach warsten bis die halbwelle beginnt (1 weg
gleichrichten und mit einem komperator machst draus ein rechteck)
und zählst bis zum ende durch...das machst am besten mit inline ASM...
den wert tust dann umrechnen um die periodendauer zu bekommen... und
tust 1/16tel davon dem PWM ding vorsetzen und tust wieder 50%
duty-cycle rein.... oder noch einfacher... du machst die 32fache
frequenz und machst hinten am pwm-ausgang einen teiler rein...dann hast
sicher 50% duty-cycle und der controller ist mehr oder wenig
geschützt...

so das wär die möglichkeit..andere wäre das ganze mit einer PLL zu
machen... ganz ohne controller...
das ist rein analog und du könntest bis ein paar 100KHz ohne prob
machen... wäre nur die frage was für ein VCO da arbeitet...

73 de OE6JWF

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.