Forum: Mikrocontroller und Digitale Elektronik Timer für Frequenz


von timer (Gast)


Lesenswert?

Hallo Leute,

ich habe einen ganz normalen ATmega32, welcher auf 16 000 000 MHz läuft,

jetzt will ich eine Frequenz auf dem OC0A ausgeben.
Die Frequenz soll zwischen 1 - 200 Hz sein.
Also einfach eine Rechteckspannung. Ich kann den Pin ja genau so 
configurieren, dass dieser getooglt wird, sobal mein Timer einen 
bestimmten Wert erreicht.
Aber irgendwie blick ich bei dem ganzen Registerchaos gar nicht mehr 
durhc.

Könntet Ihr mir etwas Hilfestellung geben?

wär Euch echt zu Danke verpflichtet ;-)

Grüße Timer

von Karl H. (kbuchegg)


Lesenswert?

timer schrieb:

> Aber irgendwie blick ich bei dem ganzen Registerchaos gar nicht mehr
> durhc.

Ist doch halb so wild.
Einfach in Funktionsblöcken vorgehen.

Der Timer soll einen Pin toggeln.
Wie macht er das?
Indem man die Compare Match Unit benutzt. Denn die kann man so 
verschalten, dass sie bei einem bestimmten Zählerstand den Pin toggelt

Wie schnell macht er das?
Wenn man nichts tut, kann man den Timer nur mittels des Vorteilers in 
seiner Geschwindigkeit einbremsen. Das wird aber für dich nicht gut 
genug sein.
ALso brauchst du eine Möglichkeit, bei der du taktgenau dem Timer seinen 
Zählbereich vorgeben kannst. Der CTC Modus bietet dir das.

Und der Rest: der ist jetzt nur noch reine Rechnerei um auf die 
gewünschte Frequenz zu kommen.

von Alfred (Gast)


Lesenswert?

timer schrieb:
> einen ganz normalen ATmega32, welcher auf 16 000 000 MHz läuft

So einen will ich auch :-)

Beste Grüße

Alfred

von timer (Gast)


Lesenswert?

Wie meinst du, taktgenau den wert vorgeben?
Also den CTC hab ich ausgewählt, aber wenn ich jetzt eben 8-Bit Counter 
hab, dann lauft der ja nach 256 zählerschritten über und dann ist das ja 
viel zu schnell...

wenn ich mal verstanden hab wie des funktionieren soll ists kein problem 
mehr.

von Karl H. (kbuchegg)


Lesenswert?

timer schrieb:
> Wie meinst du, taktgenau den wert vorgeben?
> Also den CTC hab ich ausgewählt, aber wenn ich jetzt eben 8-Bit Counter
> hab, dann lauft der ja nach 256 zählerschritten über und dann ist das ja
> viel zu schnell...

Man kann ja auch mitzählen, wie oft der übergelaufen ist.
Deine Uhr (der Sekundenzeiger) läuft ja auch laufend über und trotzdem 
kannst du nur mit dem Sekundenzeiger alleine 324 Sekunden abzählen.


Aber: Der 8_Bit Timer ist dazu wirklich nicht ideal geeignet.

von timer (Gast)


Lesenswert?

Okay, also hier hab ich das jetzt mal so geschrieben:
1
// Toogle OC0A on Compare -> CTC
2
TCCR0A |= (1<<COM0A0) | (1<<WGM1);
3
4
// Prescaler = 64 -> 15625
5
TCCR0B |= (1<<CS00) | (1<<CS02) | (1<<CS00);
6
7
// Wert, welcher nacher die Frequenz bestimmt
8
OCR0B = 100

Ich denke das dürfte so gehen oder?
Die Frequenz weicht jetzt etwas von meinem angegebenen Wert ab, aber das 
macht nix, würde es so in der Art gehen?

Grüße

von timer (Gast)


Lesenswert?

Stimmt mein Timer dann jetzt so oder geht das komplett in die Hose?
Wäre dankbar über eure Antworten.

von Karl H. (kbuchegg)


Lesenswert?

Ich kann von deinen 3 Zeilen keine einzige schlüssig nachvollziehen

Das fängt schon mal damit an, dass es im Mega32 gar keine Register 
TCCR0A bzw TCCR0B gibt


(1<<CS00) | (1<<CS02) | (1<<CS00)

Diese Einstellung ergibt laut Datenblatt keinen Vorteiler von 64
(ganz abgesehen davon, dass es nicht schlau ist, CS00 2-mal aufzuführen)

// Prescaler = 64 -> 15625

Wo kommen die 15625 her?
Im Eröffnungsposting sagtest du noch, dein µC läuft mit 16Mhz
Bei 16Mhz und einem Prescaler von 64 komme ich nicht auf 15625


// Wert, welcher nacher die Frequenz bestimmt
OCR0B = 100

Wenn dein Timer in 1 Sekunde von 0 bis 15625 zählen kann, wie lange 
braucht er dann um von 0 bis 100 zu zählen?

   15625  ......   1
     100  ......   x
-----------------------
         100
    x = ------- = 0.0064 Sekunden
         15625

 f = 1 / t   = 1 / 0.0064 = ~156 Hz

Mit dieser Frequenz tritt der Compare Match auf.
Du du aber bei jedem Compare Match nur toggelst, ist die Frequenz am Pin 
genau die Hälfte davon: ~78 Hz

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.