mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik variabler Frequenzgenerator


Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute

habe einen ATmega 8 und Takte diesen mit 16MHz. Nun möchte ich über 
Timer1 und verschiedenen Einstellung bezüglich Prescaler, CTC (also Wert 
in OCR) und Postscaler Frequenzen im Bereich 1Hz - 250Hz variabel 
Einstellen können. Also ich gebe die Frequenz per Tasten und LCD in den 
µC ein und er soll dann dementsprechend mit dieser Frequenz etwas 
machen.

Problem dabei:
Wie komme ich am einfachsten und am schnellsten auf die 3 oben genannten 
Werte?

Im Moment gebe ich die Frequenz vor und der Controller testet alle 
möglichkeiten durch und ermittelt jedesmal die Fehlerabweichung und am 
Ende spuckt er mir die Werte aus bei dennen der gernigste Fehler 
ermittelt wurde.

Allerdings dauert es sehr lange um so viele Werte auszutesten.

  5        65535        255   =   83557125 Möglichkeiten

1024
256
64
8
1

Gibt es da irgendwelche schlauen Algorithmen mit dennen ein solches 
Problem gelöst werden kann?

Autor: KelleRassel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Mal einen PC mit allen Kombinationen beschaeftigen und das dann in 
einer Tabelle eintragen ?

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier doch erstmal aus, wie weit die einzelnen Prescaler 'reichen':
etc...

hth, Jörg

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist das Problem?

Laut Datenblatt (ATmega48: S. 97 oben) hat das vom Timer1 im CTC Mode 
generierte Signal die Frequenz

f = F/(2 N (1 + OCR))

mit
F   = Frequenz der I/O-Module (in Deinem Fall = Systemtakt)
N   = Prescaler-Wert (1, 8, 64, 256 oder 1024)
OCR = Wert im Output Compare Register

Das nach OCR umgestellt ergibt

OCR = F/(2 N f) - 1

Damit kannst Du für jeden der fünf möglichen N-Werte den erforderlichen 
OCR-Wert berechnen. Dabei wirst Du i. a. "krumme" Zahlen herausbekommen, 
z. B. 17635.789. Da Du in das OC-Register aber nur Integers schreiben 
kannst, musst Du den krummen Wert auf die nächstliegende ganze Zahl 
runden. Das wäre hier 17636. Gleichzeitig weißt Du dann auch die 
relative Abweichung der generierten Frequenz von Deiner Wunschfrequenz, 
nämlich 17635.789/17636 - 1.

Der "beste" Prescaler-Wert, den Du dann auch nehmen solltest, ist 
natürlich der, bei dem sich die geringste relative Abweichung ergibt. 
Der zugehörige OCR-Wert darf dabei jedoch nicht größer als 65535 sein 
(warum das?).

Die Berechnung der Gleichung OCR = F/(2 N f) - 1 kann Dein Controller 
problemlos mit Float-Arithmetik erledigen. Du solltest ihn dann jedoch 
bequemerweise in C programmieren.

Ich hoffe, ich habe Dich mit soviel komplizierter Mathe nicht erschlagen 
;-)

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.