Forum: Mikrocontroller und Digitale Elektronik variabler Frequenzgenerator


von Thomas Frosch (Gast)


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?

von KelleRassel (Gast)


Lesenswert?

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

von Jörg G. (joergderxte)


Lesenswert?

Probier doch erstmal aus, wie weit die einzelnen Prescaler 'reichen':
etc...

hth, Jörg

von Gast (Gast)


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

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.