www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer für Frequenz


Autor: timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alfred (Gast)
Datum:

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

So einen will ich auch :-)

Beste Grüße

Alfred

Autor: timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, also hier hab ich das jetzt mal so geschrieben:
// Toogle OC0A on Compare -> CTC
TCCR0A |= (1<<COM0A0) | (1<<WGM1);

// Prescaler = 64 -> 15625
TCCR0B |= (1<<CS00) | (1<<CS02) | (1<<CS00);

// Wert, welcher nacher die Frequenz bestimmt
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

Autor: timer (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.