Frequenzgenerator mit ATtiny2313

Gast #1997315
Lesenswert?

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.
Gast #1997566
Lesenswert?

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.
Gast #1998449
Lesenswert?

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.
Gast #1998506
Lesenswert?

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)
#1998795
Lesenswert?

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.
Gast #1998866
Lesenswert?

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) :-)
Gast #1998999
Lesenswert?

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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren