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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.