Forum: Mikrocontroller und Digitale Elektronik Atmega8 36kHz erzeugen per Timer2


von Karl (Gast)


Lesenswert?

Hallo Leute,

bräuchte mal eure Hilfe bei einem kleinen Problem.

Und zwar habe ich hier einen Atmega8 bei welchem ich per Timer2 ein 
36khz Signal zur IR Modulation erzeugen möchte.Er rennt mit 16 MHz.

Die Initialisierung sieht wie folgt aus:
1
void timer2_init(void)
2
{
3
  TCCR2 |= (1<<WGM21)|(1<<COM20); // clear timer on compare match
4
  OCR2 =F_CPU / (36000 * 2) - 1;
5
  TCCR2 |= (1<<CS21); 
6
}

Mein Problem ist nun das ich nicht weis ob meine Einstellung für das 
OCR2 Register korrekt ist da ich ja einen Prescaler von 8 bei diesem 
Tackt nutzen muss soweit ich weiss.

Könntet ihr mir dabei Hilfestellung geben?

MfG
Karl

von Karl H. (kbuchegg)


Lesenswert?

rein logisch gedacht kann das nicht stimmen, denn in
   OCR2 =F_CPU / (36000 * 2) - 1;

kommt die Einstellung deines Vorteilers (8) gar nicht vor.

von Karl H. (kbuchegg)


Lesenswert?

Karl schrieb:

> Könntet ihr mir dabei Hilfestellung geben?

Einfach mal nachrechnen.
Dein Haupttakt ist 16000000 (=16 Mio) Pulse pro Sekunde
Durch den Vorteiler werden daraus 2000000 (= 2 Mio) Pulse pro Sekunde. 
Würdest du den Timer einfach laufen lassen und mal angenommen er könnte 
das, dann würde er in 1 Sekunde bis 2 Mio zählen.
Du willst ein Ereignis alle 1/36000 Sekunde
Wie weit muss daher der Timer zählen, bis 1/36000 Sekunde vergangen sind 
und er das Ereignis auslösen soll?

(Den Faktor 2 für den Pin-Toggle musst du noch berücksichtigen, aber das 
sollte kein Problem sein, wenn du den Rechengang erst mal verstanden 
hast)

von Karl (Gast)


Lesenswert?

Ok, weisst du wie ich den Teiler mit einrechnen muss?

von Karl (Gast)


Lesenswert?

Es müsste meiner Meinung nach dann so aussehen:

(F_CPU/8) / (36000 * 2) - 1;

Oder wie seht ihr das?

von Karl H. (kbuchegg)


Lesenswert?

Karl schrieb:
> Es müsste meiner Meinung nach dann so aussehen:
>
> (F_CPU/8) / (36000 * 2) - 1;
>
> Oder wie seht ihr das?

ausprobieren!
Zahlen einsetzen und es kommt 26 raus (nur das ganzzahlige Ergebnis 
zählt!).

Ein Timer der in 1 Sekunde bis 2000000 zählen könnte, benötigt

      2000000   ....    1
           27   ....    x
     ---------------------
           1 * 27
     x = -----------  = 0.0000135 Sekunden
           2000000

um von 0 bis 26 zu zählen (das sind 27 Zählvorgänge).

Den Wert nehmen wir mal 2 (weil ja nach dieser Zeit der Pin nur 
getoggelt wird, und es 2 Togglevorgänge benötigt um 1 Schwingung der 
Frequenz zu erzeugen) und wir haben 0.000027 Sekunden bis eine 
Schwingung fertig ist. Die Frequenz ergibt sich zu f = 1/T = 37037 Hz.

Interessantes Rechenbeispiel:
Was passiert, wenn du nicht den Vorteiler 8 benutzt, sondern einen 
Vorteiler von 1? Welchen OCR Wert musst du dann benutzen und welche 
Frequenz ergibt sich daraus?
Welchen Vorteiler wirst du daher benutzen?

von Karl (Gast)


Lesenswert?

Ok ich versuches mal:

Bei einem Teiler von 1:

(F_CPU/8) / (36000 * 2) - 1=ca. 220

Das ergibt 0,00001375 Sekunden mal 2 = 0,0000275

==> 36363,63 Periode Hz

Oder ?

von Karl (Gast)


Lesenswert?

Da das näher an der Vorgabe ist würde ich einen Teiler von 1 nutzen.

von Karl H. (kbuchegg)


Lesenswert?

Karl schrieb:
> Ok ich versuches mal:
>
> Bei einem Teiler von 1:
>
> (F_CPU/8) / (36000 * 2) - 1=ca. 220

ca. ist gut.
laut Windows Taschenrechner  221

> Das ergibt 0,00001375 Sekunden mal 2 = 0,0000275
>
> ==> 36363,63 Periode Hz

36036Hz

von Karl H. (kbuchegg)


Lesenswert?

Karl schrieb:
> Da das näher an der Vorgabe ist würde ich einen Teiler von 1 nutzen.

Ah, siehst du.
Genau darauf wollte ich hinaus.

Aus deinem Eröffnungsposting:
> da ich ja einen Prescaler von 8 bei diesem
> Tackt nutzen muss soweit ich weiss.

Davon dürfte nach dem Nachrechnen nicht mehr viel übrig geblieben sein 
:-)

Aber ich denke, du hast jetzt verstanden wie so ein Timer funktioniert 
und wie man das rechnen kann, wenn man nicht einfach stumpfsinnig 
Formeln aus dem Datenblatt anwenden will, sondern sich die Formel aus 
der Funktion 'herleitet'.

von Karl (Gast)


Lesenswert?

Ok dann werde ich das mal testen ,hoffentlich klappts bin nun schon ne 
weile dabei das ganze zum laufen zu bringen.

Danke für deine Hilfe

von Karl (Gast)


Lesenswert?

Ja nun klappts ,vielen Dank, ich hab schon gedacht hier gibt es keine 
netten Menschen mehr aber ich bin froh das es noch Leute gibts wie dich.

Vielen Dank nochmal

Karl

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.