Forum: Mikrocontroller und Digitale Elektronik Frequenzgenerator mit ATtiny2313


von Kalle (Gast)


Lesenswert?

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)

von Ulrich (Gast)


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.

von Kalle (Gast)


Lesenswert?

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)

von Floh (Gast)


Lesenswert?

Nimm doch einen VCO (Voltage Controlled Oszillator), dessen 
Ausgangsfrequenz kanst du über eine Eingangsspannung einstellen.
:-)

von Kalle (Gast)


Lesenswert?

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

von Kalle (Gast)


Lesenswert?

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)

von Ulrich (Gast)


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.

von Kalle (Gast)


Lesenswert?

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)

von Ulrich (Gast)


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.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

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

von Kalle (Gast)


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)

von Kalle (Gast)


Lesenswert?

keiner ne Idee?

von Floh (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Kalle (Gast)


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

von spess53 (Gast)


Lesenswert?

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

von Kalle (Gast)


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)

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.