Forum: Mikrocontroller und Digitale Elektronik Frequenz Erzeugung mit avr


von Basti (Gast)


Lesenswert?

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...

von Falk B. (falk)


Lesenswert?

Ja. Siehe Timer und Output Compare Funktion.

von Wolfgang (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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 ;-)

von m.n. (Gast)


Lesenswert?

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 ;-)

von Basti (Gast)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Ludwig (Gast)


Lesenswert?

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"

von Basti (Gast)


Lesenswert?

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?

von Norbert S. (norberts)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Lurchi (Gast)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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? ;-)

von Basti (Gast)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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 ;-)

von Falk B. (falk)


Lesenswert?

@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.

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

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