Hallo, ich habe vor mit einem ATtiny2313 einen Frequenzgenerator zu realisieren. Der Frequenzbereich liegt zwischen 1MHZ...5MHZ - schafft das der 2313? Wenn ja, wie könnte man das machen? Gruß Kalle (Karl-Heinz)
Durch Teilen kann man Frequenzen von Takt geteilt durch 2,4,6,8,... einstellen. Wenn man keinen Wert auf ein Symetrisches Signal legt gehen auch Teiler von 3,5,7,.... So direkt ohne extra Hardware geht es nicht besonders gut. Die Schritte werden reichlich grob, und nur in Teilen des Bereiches könnte man den internen "RC"-Oszillator verstimmen - vermutlich auch nicht gewünscht. Um auch die höheren Frequenzen fein Einstellbar zu machen bräuchte man zusätzliche Hardware.
Hallo, Danke für die Antwort. Kann man das nicht mit dem Timer realisieren? Damit habe ich auch schon LEDs blinken lassen, nur ist da halt die Frequenz viel kleiner... Konkret geht z.B. um eine Frequenz von 4,864MHZ... kann das der Timer nicht so genau schaffen? Gruß Kalle (Karl-Heinz)
Nimm doch einen VCO (Voltage Controlled Oszillator), dessen Ausgangsfrequenz kanst du über eine Eingangsspannung einstellen. :-)
@Floh: Das ist eine sehr gute Idee! dann mach ich aber noch eine PLL dran. Was für ein PLL Chip empfiehlt sich da? (Hab nur Erfahrungen mit höheren Frequenzen) Gruß Kalle (Karl-Heinz)
Nachtrag: Habe mir gerade den 74HC4046 angeschaut. Hat der schon einen VCO integriert? Wenn ja, wie kann ich den Nutzen? Ich komm mit dem Datenblatt nicht ganz klar. Gruß Kalle (Karl-Heinz)
Das PLL IC 4046 kann man schon ganz gut nutzen. Bei den meisten Lösungen wird man noch einen Teiler dazu brauchen. Mit PLL und Teiler kann man eine Freuquenz um z.B. dem Faktor 256 hochsetzen. Die niedrigere Frequenz kann dann der µC erzeugen, mit genügend Auflösung. Genau mit der Kombination hab ich einen Frequenzgenerator aufgebaut - geht bis knapp 20 MHz (Grenze des HC4046) und mit gut 16 Bit Auflösung relativer Auflösung für die Frequenz. D.h. bei den 4,6... MHz etwas besser als 100 Hz Auflösung. Der µC erzeugt bei mit die Frequenz per Moduliertem Teiler (fractional divider). Besser wäre aber wohl Software DDS und ein Comperator (ggf. reicht der Eingang den 4046). Wenn man mutig ist, könnte man ggf. auch nur den VCO des 4046 für den Takt des µC nutzen und dann den µC die PLL Funktion in Software laufen lassen um die Frequenz an einen extra Takt (z.B. 32 kHz Quarzoszillator) anzubinden. Ist aber sicher etwas Trickreich.
ok, wird es einfacher, wenn meine Frequenz fix ist? Also z.B. fix 4,864MHZ? wie kann man das am einfachsten lösen? Gruß Kalle (Karl-Heinz)
Eine feste Frequenz macht es schon einfacher, vor allem ohne µC. Am einfachsten geht es wenn man einen passenden Quarz findet. Ggf. auch mit der 2,3,4, 5 - fachen Frequenz. Mit einem PLL ginge auch ein einfaches gebrochenes Verhältnis wie 4/3 oder 5/4 . Wie genau und stabil muss die Frequenz denn sein ? Ggf. hilft aus ein Hinweis wofür die Frequenz gebraucht wird.
Bin mir fast sicher, dass ich schon mal einen Quarz mit dieser Frequenz gesehen habe. Guck mal bei Farnell (HBE) oder Conrad. Ist auf jeden Fall keine übliche Frequenz. Mit freundlichen Grüßen, Valentin Buck
Es geht um einen Stereocoder, in dem ist ein 4,864MHZ Quarz drin. Weil ich aber keinen 4,864MHZ Quarz habe, möchte ich diese Frequenz mit einem µC (oder sonst wie) erzeugen. Nach dem Quarz kommt ein 4060, der die Frequenz teilt? (Ausgang ist PIN4, also teilt er durch 128) -> 38KHZ... Habe gerade versucht 38KHZ mit einem mega32 zu erzeugen... Leider ist es zu ungenau, oder ich mach was falsch... Hier das Programm
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #ifndef F_CPU
|
4 | #define F_CPU 12000000UL
|
5 | #endif
|
6 | #include <util/delay.h> |
7 | #include <stdint.h> |
8 | #include <avr/interrupt.h> |
9 | |
10 | ISR(TIMER1_COMPA_vect) |
11 | {
|
12 | cli(); |
13 | |
14 | PORTB ^= 1; |
15 | |
16 | OCR1A += 316; |
17 | |
18 | sei(); |
19 | }
|
20 | |
21 | int main() |
22 | {
|
23 | DDRB = 0xFF; |
24 | |
25 | TCCR1B |= (1<<CS10); |
26 | //TCCR1B |= (1<<CS11);
|
27 | //TCCR1B |= (1<<CS12);
|
28 | |
29 | TIMSK |= (1<<OCIE1A); // Interrupt freischalten |
30 | |
31 | OCR1A = 0; |
32 | |
33 | sei(); |
34 | |
35 | while(1) |
36 | {
|
37 | }
|
38 | |
39 | return 0; |
40 | }
|
Den Takt erhällt der mega32 aus einem 12MHZ Quarz... kommen da an PB0 keine 38KHZ raus? Gruß Kalle (Karl-Heinz)
Kalle schrieb: > Leider ist es zu ungenau, oder ich mach was falsch... Für solche Sachen eignet sich die Hardware-PWM besser. Pin setzen bei Wert 0, löschen bei compare, nebenbei noch ctc einstellen (clear timer on compare match). Der Genauigkeit wegen den 16-bit-Timer und du bist fertig. :-)
Kalle schrieb: > Leider ist es zu ungenau, oder ich mach was falsch... Wo hast du die 316 her? rein rechnerisch brauchst du bei 12Mhz 315 Timertakte um 38095Hz zu erzeugen. Das bedeutet einen Vergleichswert von 314, nicht 316 Und lass die cli() bzw sei() in der ISR weg. In deiner App sind sie zwar egal, aber wenn du das aus Gewohnheit machst, schiesst du dir nur selber ins Knie PWM Modus ist schon angesprochen worden. Für meine Begriffe ist ein CTC Modus mit der entsprechenden Einstellung, dass bei einem Match der entsprechende Pin getoggelt werden soll, noch einfacher zu benutzen. Dann macht die Hardware genau das, was deine ISR macht.
ok, ich habe es jetzt so versucht:
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #ifndef F_CPU
|
4 | #define F_CPU 12000000UL
|
5 | #endif
|
6 | #include <util/delay.h> |
7 | #include <stdint.h> |
8 | #include <avr/interrupt.h> |
9 | |
10 | int main() |
11 | {
|
12 | DDRD = 0xFF; |
13 | |
14 | TCCR1B |= (1<<WGM12); |
15 | |
16 | TCCR1A |= (1<<COM1A0); |
17 | |
18 | OCR1A = 314; |
19 | |
20 | TCCR1B |= (1<<CS10); |
21 | //TCCR1B |= (1<<CS11);
|
22 | //TCCR1B |= (1<<CS12);
|
23 | |
24 | sei(); |
25 | |
26 | while(1) |
27 | {
|
28 | }
|
29 | |
30 | return 0; |
31 | }
|
Warum funktioniert das nicht? Als Pin habe ich den PD5 (=OC1A) verwendet... macht das keine 38KHZ? Was mache ich denn falsch? Gruß Kalle (auch Karl-Heinz) :-)
Hi >Als Pin habe ich den PD5 (=OC1A) verwendet... >macht das keine 38KHZ? Beim ATTiny2313 ist das OC0B. OC1A ist PB3. > OCR1A = 314; der Wert muss 157 sein. MfG Spess
Ja, ok, ich habe jetzt doch einen mega32 genommen. Es funktioniert nun fast - heißt manchmal leuchtet die Stereolampe im Radio... (Ich habe so einen UKW-Transmitter, leider nur mono und da soll der Stereocoder ran...) macht denn der mega32 das gleiche Signal, wie der 4060 mit 4,864MHZ Quarz machen würde, wenn das Signal an PIN4 des 4060 abgegriffen wird? Gruß Kalle (Karl-Heinz)
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.