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 ;-)
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.
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
@ 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?
@ 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 :-)
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.
@ 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.
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)
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
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.
@ 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?