Hi Ich benötige einen Rechteck generator der von 0-3000hz erzeugen kann in 0.25hz schritten. Geht das.mit den timern eines avr? Mit der quarzfrequenz auswahl bin ich flexibel...
Rechne es dir aus. Bei 3000,00Hz ist die Dauer einer Periode um 28ns länger als bei 3000,25Hz. Wenn du mit deiner Quarzfrequenz innerhalb der im Datenblatt angegebenen Grenzen bleiben willst und nicht auf Jitteralgorithmen zurückgreifen willst, wird das also nichts.
Die Frage ist noch, wie Du die Frequenz einstellen willst. Per RS232 gibt es etwas Fertiges mit einem ATtiny4313: http://mino-elektronik.de/Generator/takte_impulse.htm#bsp2 Danach folgen weitere Frequenzgeneratoren (u.a. für Schrittmotore), die auch per Poti eingestellt werden. Allerdings ist dabei die Auflösung wegen des ADCs (nur 10 Bit) nicht so hoch. Die einfachste Schaltung kommt mit einem ATtiny25 aus.
m.n. schrieb: > Die Frage ist noch, wie Du die Frequenz einstellen willst. Nein, die Frage ist, ob die Taktfrequenz und der Timer überhaupt in der Lage sind, solch fein abgestufte Frequenzen zu erzeugen. Unklar ist bisher noch, wie genau die Frequenz stimmen muss. Und falls jemand fragt, der Unterschied der Periodendauer bei 3000Hz + oder - 0.25Hz ist ziemlich genau gleich ;-)
Wolfgang schrieb: > Nein, die Frage ist, ob die Taktfrequenz und der Timer überhaupt in der > Lage sind, solch fein abgestufte Frequenzen zu erzeugen. Du hast doch schon vorgerechnet, daß es nicht exakt geht! Meine Glaskugel sagt mir daher, daß auch 0,5 Hz Auflösung reichen, oder der AVR mit 36 MHz getaktet werden sollte ;-)
Ganz genau muss es nicht sein ich habe ein ziemlich schlecht geformtes sign am Eingang und erzeuge einen sauberen rechteck am Ausgang. Wenn es mal 0,27 oder so sind macht das nicht ich kann per Software die passende Vergleichs Frequenz wählen
Unter Verwendung des 64MHz-PLL-Takts des ATtiny24/45/85 wäre es prinzipiell möglich, die gewünschten Frequenzen mit einem maximalen Fehler von 0,069Hz zu erzeugen. Voraussetzung ist allerdings eine genaue Kalibration des internen RC-Oszillators, da der PLL-Takt von diesem abgeleitet wird. Diese Kalibration kann mit einem externen Quarz und einem Stück Software realisiert werden, das die Frequenz des RC-Oszillators ständig mit der Quarzfrequenz vergleicht und das OSCCAL-Register entsprechend anpasst. Mit den 64MHz wird der Timer1 getaktet. Da dieser nur 8 Bit breit ist, ist allein damit noch kein Herunterteilen auf 3kHz möglich. Man kann aber per Software durch laufendes Anpassen eines OC-Registers den Zeitpunkt der jeweils nächsten Flanke des Ausgabesignals festlegen. Es wäre sogar denkbar, durch geschickte Kombination des OSCCAL-Bytes und dem Teilerfaktor die Auflösung noch zu steigern. Das alles ist nicht ganz trivial, wäre aber mal einen Versuch wert.
Einfach & willig, AVR-DDS: Beitrag "DDS Sinus erzeugung" Der Thread ist ein wenig länglich. Wichtig ist die DDS-Version mit 7 Takten pro Aktualisierung ab diesem Beitrag: Beitrag "Re: DDS Sinus erzeugung"
Yalu, danke. Im Prinzip bräuchte ich nicht zu kalibrieren, wenn ich beide timer mit dem gleichen Takt betreibe (Frequenz lesen) dann ist die Abweichung ja immer die gleiche oder?
Moin, Auch mit dem Herumschrauben am Osccal Register wird das nichts mit der Auflösung. 0,25/3000Hz ist etwa 0,0083% Auflösung oder 83ppm. Das ist die Größenordnung eines Quarzes mit nicht optimalem Layout. Das Osccal hat etwa eine Auflösung in der Grössenordnung von 0,5-1%. Gruß, Norbert
Basti schrieb: > Yalu, danke. Im Prinzip bräuchte ich nicht zu kalibrieren, wenn ich > beide timer mit dem gleichen Takt betreibe (Frequenz lesen) dann ist die > Abweichung ja immer die gleiche oder? Die 64MHz-PLL kann leider nicht direkt am Quarzoszillator, sondern nur am RC-oszillator betrieben werden, und dieser ist eben nicht sehr genau und zudem driftbehaftet, weswegen man eine Kalibrierung braucht. Norbert S. schrieb: > Das Osccal hat etwa eine Auflösung in der Grössenordnung von 0,5-1%. Danke für den Hinweis. Ich hatte nicht im Kopf, dass die Kalibrierung mit OSCCAL sooo grob ist. Dann kompensiert man die Ungenauigkeit des RC-Oszillators also besser dadurch, dass man bei der Generierung des Rechtecksignals die gewünschte Frequenz mit einem Korrekturfaktor multipliziert. Zur Steigerung der Auflösung könnte das OSCCAL-Register aber trotz der großen Sprünge nützlich sein, weil damit Zwischenwerte in der erzeugten Frequenz möglich sind, die alleine durch Herunterteilen der 64MHz nicht erreichbar sind.
Einfach mit dem Timer und 50 ns Raster reicht die Auflösung nicht ganz aus um so fein zu werden. Im Prinzip könnte man den Quarz für den Takt per varicap etwas ziehen. Die etwa 160 ppm zum füllen der Lücken in der Digitalen Einstellung könnte man gerade noch erreichen. Mit dem 64 MHz Grundtakt für den schnellen Timer könnte es ggf. gehen. Nur halt dann nicht quarzstabil. Nachstellen per Oscal Register bringt da eher wenig. Eher schon parallel ein Ref Signal vermessen und dann den eingestellten Wert für den Timer anpassen.
Es soll ein AVR verwendet werden. ATXmega gehören auch zu dieser Gattung, die lt. Datenblatt bis 32 MHz betrieben werden können. Damit wären die Anforderungen doch zu erfüllen, zumal bei tieferen Frequenzen die Auflösung immer besser wird. Oder man taktet - wie oben angedeutet - den Controller ein wenig höher. Oder noch bequemer, man nimmt einen STM32Fxxx µC. Soll ich dafür ein kleines Programm mit 5 ns Auflösung der Periodendauer schreiben? ;-)
Wird wohl Zeit mal langsam mit stm32 anzufangen. Ich hatte eigentlich einen tiny45 geplant. Lt Entwickler des Zielgerätes sollten 1hz Auflösung ausreichen ich werde es ersteinmal testen und dann sehen
Basti schrieb: > Ich hatte eigentlich > einen tiny45 geplant. Beispielcode dafür hatte ich Dir ja weiter oben verlinkt. Hier noch einmal exlizit: http://mino-elektronik.de/Generator/takte_impulse.htm#bsp6 Setze F_MIN auf 0.5 und F_MAX auf 3000.0. Dann kannst Du mit einem Poti schon einmal spielen. Wie Du die Frequenz einstellen willst, hast Du noch nicht verraten. Elegant wäre ein Drehgeber mit hoher Auflösung. Ein biliger Schrittmotor reicht schon aus: Beitrag "Schrittmotor als Drehgeber mit Dynamik, AVR" Weiter unten findet sich die Datei "dg_stepp.log", anhand derer man sehen kann, wie schnell und gut aufgelöst man Sollwerte einstellen kann. Es sollte kein Problem sein, beide Programme zu kombinieren. Geschickt wäre es vielleicht, einen ATtiny4313 bzw. ATmega48 zu verwenden, der Sollwert und Istwert auf einem LCD anzeigen kann. Da sieht man dann genau, was Sache ist. > Lt Entwickler des Zielgerätes sollten 1hz > Auflösung ausreichen Das wußte meine Glaskugel doch gleich ;-)
@Basti (Gast) >Wird wohl Zeit mal langsam mit stm32 anzufangen. Nö, es wird Zeit, sich mit dem Thema Netiquette zu befassen. >Ich hatte eigentlich >einen tiny45 geplant. Lt Entwickler des Zielgerätes sollten 1hz >Auflösung ausreichen Was soll denn WIRKLICH INSGESAMT erreicht werden? 0,25 Hz Auflösung schafft auch eine DDS per Timer auf einem AVR problemlos, ABER! der Jitter ist halt immer bis zu 1 Timertakt, bei 20 MHz halt 50ns. AVR - Die genaue Sekunde / RTC Außerdem sollte man bedenken, daß 0,25Hz AUFLÖSUNG bei 3kHz schon 83ppm sind, da kommt man langsam an die Abgleichgenauigkeit von normalen Quarzen ran, sprich, wenn es wirklich auch so GENAU sein soll, muss man den QUarz per Trimmer abgleichen. Oder einen ausreichend genauen Quarzoszillator als Taktquelle benutzen.
Basti schrieb: > Wird wohl Zeit mal langsam mit stm32 anzufangen. Falls Du das machen möchtest, kann ich Dir ein kleines Programm geben, welches auf einem STM32F407 und damit direkt auf einem Discovery-Board läuft. Selber habe ich ein kleines Board mit LC-Anzeige und TCXO, weshalb Genauigkeit und die von Dir gebrauchte Auflösung kein Problem sind. Die Frequenz wird an PE5 ausgegeben und ist im Bereich 0,1 Hz - 10 kHz in 0,1 Hz Schritten einstellbar. Die Einstellung erfolgt per Drehgeber (Schrittmotor) an PD0 und PD1 und kann per LCD 16x2 angezeigt werden. Anbei der Quellcode für die Frequenzerzeugung.
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.