Forum: Mikrocontroller und Digitale Elektronik Frequenzgenerator


von Heinerle (Gast)


Lesenswert?

Hallo,
möchte mir einen Rechteck Frequenzgenerator in Stiftform bauen.
Die Frequenz von 1Hz bis 500kHz soll mit nur einem Bedienelement, einem 
Poti einstellbar sein. Da man einen analogen VCO mit so einem weiten 
Bereich gar nicht so einfach bauen kann, überlege ich einen AVR Tiny im 
Dil-8 Gehäuse zu nehmen, SMD kann ich nicht löten.

Im Hauptprogramm würde ich mit dem ADC die Spannung am Poti messen.
Dies habe ich schon mal hingekriegt :-)
Eine kleine Routine berechnet dann den Timer-Reload Wert.
Über Timerinterrupt würde ich dann einen Port toggeln lassen.

Meine Frage an die Leute mit mehr Erfahrung als ich  /  Also an alle ;-)
wie komme ich mit der Frequenz so tief (1Hz)?
wie komme ich mit der Frequenz so hoch (500kHz)?
welchen Tiny nehmen?
In Assembler oder in C programmieren?
wie am schnellsten Port toggeln?

Mal sehen ob ihr helfen könnt ;-)

von Benedikt K. (benedikt)


Lesenswert?

Heinerle schrieb:
> Meine Frage an die Leute mit mehr Erfahrung als ich  /  Also an alle ;-)
> wie komme ich mit der Frequenz so tief (1Hz)?

Hohen Prescaler setzen: Manche AVRs haben einen von 16384, dann noch die 
256 vom 8bit Timer und man kommt bei 8MHz bis auf <1Hz runter.

> wie komme ich mit der Frequenz so hoch (500kHz)?

Kleinsten Prescaler einstellen, kleinsten Reloadwert einstellen, dann 
ist der Teilerfaktor 2. Macht also 4MHz, bzw. wenn man die PLL aktiviert 
sollten sogar 32MHz möglich sein.

> welchen Tiny nehmen?

ATtiny25

> In Assembler oder in C programmieren?

C

> wie am schnellsten Port toggeln?

Per Output Compare.

von spess53 (Gast)


Lesenswert?

Hi

Dir ist aber bewusst, das der ADC nur 1024 verschiedene Ausgangswerte 
haben kann. Damit lassen sich innerhalb deines Bereiches auch nur 1024 
verschiedene Frequenzen (im Idealfall) auflösen.

MfG Spess

von Z8 (Gast)


Lesenswert?

ATTiny 13, ASM -> 8Pinner

Gruß Z8

von Heinerle (Gast)


Lesenswert?

@ spess53 (Gast)

>Dir ist aber bewusst, das der ADC nur 1024 verschiedene Ausgangswerte
>haben kann. Damit lassen sich innerhalb deines Bereiches auch nur 1024
>verschiedene Frequenzen (im Idealfall) auflösen.

ja, ich habe überlegt, wenn jede Freuenz um den Faktor 1.0129 höher als 
die vorhergehende Frequenz ist, dann kann ich einen Frequenzbereich von
1.013^1023 = 547598Hz überstreichen. Oder habe ich da jetzt einen 
Denkfehler drin?

von Stephan H. (stephan-)


Lesenswert?

warum nicht einfach einen bistabilen Generator mit 2 Transen bauen ?
Oder auch mit nem 4093 ein R und ein C ?

von Heinerle (Gast)


Lesenswert?

@ Benedikt K. (benedikt) (Moderator)

>> wie am schnellsten Port toggeln?
>Per Output Compare.

Brauche ich da keinen Timerinterrupt?
Wie sieht das in C aus? Bin nicht so gut in C, übe noch :-)

von Karl H. (kbuchegg)


Lesenswert?

Heinerle schrieb:
> @ spess53 (Gast)
>
>>Dir ist aber bewusst, das der ADC nur 1024 verschiedene Ausgangswerte
>>haben kann. Damit lassen sich innerhalb deines Bereiches auch nur 1024
>>verschiedene Frequenzen (im Idealfall) auflösen.
>
> ja, ich habe überlegt, wenn jede Freuenz um den Faktor 1.0129 höher als
> die vorhergehende Frequenz ist, dann kann ich einen Frequenzbereich von
> 1.013^1023 = 547598Hz überstreichen. Oder habe ich da jetzt einen
> Denkfehler drin?

Im Prinzip nicht, wie ein kurzer Gegentest mit Excel zeigt.

Aber der Gegentest mit Excel zeigt auch, dass du gerade im unteren 
Bereich eine Menge 'ADC-Weg' verschenkst, bis sich deine Frequenz von 1 
Hz auf 2 Hz erhöht hat. Dafür springt sie dann im oberen Bereich bei 
einer Änderung des ADC Wertes um 1 umso heftiger.

von Heinerle (Gast)


Lesenswert?

@ Stephan Henning (stephan-)

>warum nicht einfach einen bistabilen Generator mit 2 Transen bauen ?
>Oder auch mit nem 4093 ein R und ein C ?

Damit kann ich ohne Umschalten, (was ich nicht will) nicht so einen 
breiten Frequenzbereich von 1Hz bis 500kHz abdecken.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:

> Aber der Gegentest mit Excel zeigt auch, dass du gerade im unteren
> Bereich eine Menge 'ADC-Weg' verschenkst, bis sich deine Frequenz von 1
> Hz auf 2 Hz erhöht hat. Dafür springt sie dann im oberen Bereich bei
> einer Änderung des ADC Wertes um 1 umso heftiger.

Nur mal ein paar Rechenbeispiele

ADC Wert             Frequenz

   1                    1
  55                    2
 180                   10
 358                  100
 512                  735
 536                 1000
 715                10000
 840                50000
 893               100000
...
1000               401000
1005               428000
1010               457000
1015               487000
1020               520000

Du musst also das regelnde Poti schon etwas über die Hälft aufdrehen um 
1kHz zu erreichen. Aber dann gehts schnell: Nicht ganz eine 
Vierteldrehung weiter bist du schon bei 10kH. Noch ein kleiner Tick mehr 
und du hast 100kHz etc.
Dafür hast du am anderen Ende des Potis den umgekehrten Effekt: So ruhig 
kannst du das Poti gar nicht verdrehen um da irgendeine sinnvolle 
Frequenz einstellen zu können. Davon dass man beim ADC mit einem Jitter 
von +/-1 eigentlich immer rechnen sollte, red ich mal gar nicht (ok, 
kann man durch heftiges Mittelwertbilden ev. wegkriegen)

von spess53 (Gast)


Lesenswert?

Hi

Ich habe das jetzt nicht nach gerechnet, aber so könnte es gehen.

Achte aber auf ein vernünftiges Poti. Bei preiswerten habe ich gerade im 
Bereich der Anschläge ganz lustige Sachen erlebt. Evtl. solltest du eine 
'Hold'-Taste vorsehen, damit der eingestellte Wert stabil bleibt.

MfG Spess

von Benedikt K. (benedikt)


Lesenswert?

Heinerle schrieb:

>>> wie am schnellsten Port toggeln?
>>Per Output Compare.
>
> Brauche ich da keinen Timerinterrupt?
> Wie sieht das in C aus? Bin nicht so gut in C, übe noch :-)

Das geht in C genauso wie in Asm:
CTC Mode beim Timer aktivieren, und das passende OCRxx Bit setzen: Dann 
wird jedesmal wann ein Interrupt auftritt (egal davon ob dieser 
aktiviert ist oder nicht), der Zustand des ausgangspins geändert.

PS: Ich würde eine quadratische Kennlinie nehmen:
Frequenz=ADCwert²
So hat man bei kleinen Frequenzen eine gute Auflösung, und kann auch bei 
großen Frequenzen den Wert noch gut einstellen.

Karl heinz Buchegger schrieb:

> Dafür hast du am anderen Ende des Potis den umgekehrten Effekt: So ruhig
> kannst du das Poti gar nicht verdrehen um da irgendeine sinnvolle
> Frequenz einstellen zu können. Davon dass man beim ADC mit einem Jitter
> von +/-1 eigentlich immer rechnen sollte, red ich mal gar nicht (ok,
> kann man durch heftiges Mittelwertbilden ev. wegkriegen)

Das geht schon:
Ich habe mir vor längerer Zeit mal einen Funktionsgenerator mit einem 
tiny26 gebaut, bei dem man die Frequenz zwischen 50Hz und 1MHz 
einstellen kann. Dabei werden immer die vordersten beiden Stelle 
verstellt, also so:
50Hz, 51Hz, 52Hz, ... 99Hz, 100Hz, 110Hz, 120Hz, 130Hz, ... 970kHz, 
980kHz, 990kHz, 1MHz

Das ergibt ziemlich genau irgendwas um die 1024 Schritte.
Die kann ich reproduzierbar einzelne Frequenzen einstellen die über 
längere Zeit (ein paar Stunden) maximal um eine Stufe wegdriften.
Ok, da habe ich allerdings auch ordentlich gefiltert, Hysterese 
eingebaut usw.
Wichtig ist dabei auch ein großer Potiknopf und ein leichtgängiges Poti.

von Heinerle (Gast)


Lesenswert?

@ Benedikt K. (benedikt) (Moderator)

>Ich habe mir vor längerer Zeit mal einen Funktionsgenerator mit einem
>tiny26 gebaut, bei dem man die Frequenz zwischen 50Hz und 1MHz
>einstellen kann.

1.  ob man mal einen Blick auf deinen Code werfen könnte ;-)
2.  mir würde von der Frequenzauflösung vieleicht auch reichen, nur  die 
erste Stelle zu verändern, das währen dann
54 Werte
    von 1Hz bis 500kHz
3.  Kann man zwei verschiedene Frequenzen gleichzeitig erzeugen?

von Heinerle (Gast)


Lesenswert?

Hm, ist das Feuerwerk schon abgebrannt?

Ich meine in den ersten halben Stunde 10 Antworten und jetzt nix mehr

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.