Forum: Mikrocontroller und Digitale Elektronik Frequenz aus CompareUnit berechnen


von Der M. (steinadler)


Lesenswert?

Hallo zusammen,

ich erzeuge mittels einem Timer (8MHz) und einer Compare-Unit Frequenzen 
zwischen 350 und 1260 Hz.

Wie kann man denn die Frequenz berechnen???

Also der Takt des Timers ist 8Mhz (ohne Prescaler).

Gemessene Werte:
355 Hz   :: 10800 CompareWert
1250 Hz  ::  2750 CompareWert

Wie komm ich denn auf die Zahlen???

Eine Periode dauert bei 355 Hz ja 2,81 ms.
Der Timer tickt alle 0,000125 ms.

Ich hab gerechnet 2,81  2  0,000125 und bin auf 11240 gekommen.
Im anderen Fall   0,8  2  0,000125 und das Ergebnis ist 3200.

Die Werte stimmen zwar annähernd, aber eben mit ner ziemlich großen 
Abweichung.

Ist das ein Messfehler oder ist die Rechnung falsch???

von Johannes M. (johnny-m)


Lesenswert?

Ganz allgemein:
Das nach "Compare" auflösen, und Du hast eine Gleichung für den 
erforderlichen Compare-Wert für eine bestimmte Frequenz.

von Karl H. (kbuchegg)


Lesenswert?

Micha R. wrote:

> Die Werte stimmen zwar annähernd, aber eben mit ner ziemlich großen
> Abweichung.

Du benutzt nicht zufällig den Mega8 internen
RC-Oszillator als Taktgeber?

von Der M. (steinadler)


Lesenswert?

Karl heinz Buchegger wrote:
> Micha R. wrote:
>
>> Die Werte stimmen zwar annähernd, aber eben mit ner ziemlich großen
>> Abweichung.
>
> Du benutzt nicht zufällig den Mega8 internen
> RC-Oszillator als Taktgeber?

Nein... hab nen PIC18 mit nem externen Quarz.

Ich komme auch mit der Formel von Johannes auf meine errechneten 
Ergebnisse.

Könnte es daran liegen, dass ich den Port in einem Interrupt toggle???

von Thomas (kosmos)


Lesenswert?

wenn man nicht die Capture Funktion nutzt sondern erst in der 
Interruptroutine den Zählerstand abfragt, könnte es sein das der 
Zählerstand dann schon wieder höher ist. Dann kann man einfach die 
entsprechendenden Takte vom Zählerstand abziehen.

von Der M. (steinadler)


Lesenswert?

Thomas O. wrote:
> wenn man nicht die Capture Funktion nutzt sondern erst in der
> Interruptroutine den Zählerstand abfragt, könnte es sein das der
> Zählerstand dann schon wieder höher ist. Dann kann man einfach die
> entsprechendenden Takte vom Zählerstand abziehen.

Ich machs ja umgekehrt. Ich nutze ja die Compare-Funktion, um bei einem 
bestimmten Timerwert per Interrupt den Port zu togglen.

von Johannes M. (johnny-m)


Lesenswert?

Wenn Du toggelst, musst Du den Wert noch mal durch zwei dividieren.

von Thomas (kosmos)


Lesenswert?

achso jetzt hab ichs verstanden. Tuh es doch mal simulieren könnte sein 
das das toggeln etwas Zeit in Anspruch nimmt diese wirkt sich dann bei 
höheren Frequenzen stärker aus als bei niedrigen. Könntest ja mal mit 
ein paar Messpunkte in eine Linie zeichnen um zu sehen wie linear die 
Abweichung verläuft.

z.B. 10Hz=1500 20Hz=2990 40Hz=5965.....

von eProfi (Gast)


Lesenswert?

Es fehlt vermutlich die Zeit, die der Interrupt braucht, bis der Zähler 
wieder gestartet wird.
Abhilfe: Zähler durchlaufen lassen.

Das mit dem SW-Korrigieren der Taktzyklen ist immer ungenau.

Suche mal nach Treads wie:
genaue Sekunde erzeugen
Uhr geht ungenau
etc.

Kann der PIC hardwaremäßig einen Timerausgang bedienen?
Toggle on compare?
damit könntest Du die genaue Quarzfrequenz ermitteln.
Es könnte auch sein, dass der Oszillator daneben schwingt.
Alternativ mal einen fertigen Quarzoszillator als Clock verwenden.
Diese findet man häufig auf GrafikKarten oder Mainboards oder anderen 
el. Geräten.

von Der M. (steinadler)


Lesenswert?

eProfi wrote:
> Kann der PIC hardwaremäßig einen Timerausgang bedienen?
> Toggle on compare?

Toggle on Compare gibts schon.

Aber ich bekomms nicht zum laufen.

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.