Forum: Mikrocontroller und Digitale Elektronik Frequenz messen die 3te


von Bernd (Gast)


Lesenswert?

Hallo,

ich habe schon 2 Threads gefunden die sich mit diesem Problem befassen.
Aber bitte nicht schlagen! Ich werde es noch so Probieren wie dort
beschrieben. Dennoch würde ich gerne wissen wo zum Geier mein
Denkfehler liegt!

Ich habe mir folgendes einfallen lassen:

Ich verwende einen ATmega8 den ich mit 4MHz takte. Das ganze auf einem
STK500 und als Display ein HP2118

Auf INT0 kommt ein Takt, der zwischen 15 und 250 Hz ist. (Takt für
einen Drehzahlmesser. Den Takt mache ich zur Zeit mit einem
Frequenzgenerator, 5V TTL, 50% Taktverhältnis.

Mein Hauptprogramm macht zur Zeit nicht anderes als die erfassten Werte
auf ein LED-Display auszugeben.

Meine Interruptroutine fragt den Timer 1 ab (Vorteiler 64) und stellt
ihn danach wieder auf 0, ich erfasse also jede Periode.

Weil die Routine so kurz ist, kopiere ich den Source Code der
Interruptroutine hier rein und nicht in den Anhang. (Register und SREG
rette ich natürlich, will hier nur den Kern der Routine zur Diskusion
stellen!)

IN TEMP, TCNT1L            ;* Counter T1 auslesen
IN TEMP2, TCNT1H
MOV T1L, TEMP                                           ;* Die Daten in
die Register T1L und T1H speichern (r3+r4)
MOV T1H, TEMP2

LDI TEMP, 0              ;* Counter Reseten
OUT TCNT1H, TEMP
OUT TCNT1L, TEMP

Ich erwarte also einen Wert, der sich halbiert wenn sich der Takt an
INT0 verdoppelt.

Dies ist aber nicht so!

Frequenz - ausgegebener Wert - Drehzahl laut Drehzahlmesser.
18,6 - 3356 - 500
36,45 - 1714 - 1000
68,88 - 909 - 2000
100 - 625 - 3000
130 - 480 - 4000
160,3 - 390 - 5000
191,5 - 327 - 6000
223 - 280 - 7000
258 - 242 - 8000

Interessant ist, das sich die ausgegebenen Werte verdoppeln wenn man
den ATmega8 mit 8MHz taktet.

Gruß Bernd

von Andi (Gast)


Lesenswert?

Irgend wie denkst Du ein bißchen verkehrt rum!
So wie es aus sieht, misst Du die Dauer von 2 Impulsen.
Entweder, Du rechnest es nach der Zeitlängenmessung um, evtl. mit
Tabelle im Flash die ziemlich groß werden können oder Du mißt die
Anzahl der Imulse in einer bestimmten Zeit, am besten mit
Timer-Interrupt, z. B. innerhalb einer viertel Sekunde oder auch 100mS
und multipliezierst die Anzahl der Impulse auf eine Minute hoch und
gibst es dann aus.
Wenn natürlich der AVR doppelt so schnell läuft läuft auch der Timer
doppelt so schnell und die Werte verdoppeln sich.

Gruß
Andi

von Hagen (Gast)


Lesenswert?

Also, du taktest mit 4MHz / 64 Vorteiler = 62500 Timertakte pro
Sekunde.

Du sagts:  18,6 - 3356 - 500

62500 / 3356 sind ? ja es sind 18.6

36,45 - 1714 - 1000

62500 / 1714 = 36.46

68,88 - 909 - 2000

62500 / 909 = 68.75

Oder anders ausgedrückt:

Dein Timer taktet mit 1/62500 Sekunde.

1/62500 * 3356 == ?? == 18.6

Nun verdoppeln wir den Prozessortakt auf 8Mhz, ergibt

8Mhz/64 == 2 * 62500 == 125000

Da nun in der gleichen Zeit wie vorher 2 Timertakte mehr kommen, müssen
deine gemessenen Werte sich logischerweise verdoppeln. Da aber nun mit

1/125000 dieser Wert multipliziert wird relativiert sich das wieder.

Deine Hardware hat das alles richtig gemacht ;)

Gruß hagen

von Bernd (Gast)


Lesenswert?

Hallo Andi und Hagen,

@Andi: nene, ich messe zwischen 2 steigenden Flanken, also eine
Periode. Denn ich lese ja aus was nach einer Periode da ist (zwischen 2
Interrupts) und setze den Zähler dann auf Null um die nächste Periode zu
bekommen.

@Hagen: Mensch Hagen, wie recht Du hast! Und das Peinliche: so in der
Art habe ich das während der Abendschule zum Techniker auch schon
gemacht, nur das mit dem Umrechnen ist mir nicht mehr in den Sinn
gekommen.
Ähm, Mathe war noch nie mein Ding. ;-)

Das mit dem verdoppeln kam mir deshalb komisch vor, weil die erfassten
Werte ja nicht Linear abnehmen. Ich dacht das müsste sein, weil die
Frequenz ja auch Linear steigt. Und da dachte ich an Übersprecher,
falsche konfiguration etc, nur nicht daran das ich was vergessen
habe... ;-)

OK, muß ich noch eine Umrechenroutine dazubasteln.

Danke Euch beiden!

Gruß Bernd (was bin ich froh...)

von Hagen (Gast)


Lesenswert?

Naja, du möchtest die Umdrehungen pro Minute ?
1 Impuls pro Sekunde wären dann 60 U/min. Du misst mit einer Frequenz
vom 4Mhz/64 -> 62500 Sec.


18,6 - 3356 - 500

62500 * 30 / 3356 == 559

68,88 - 909 - 2000

62500 * 30 / 909 == 2063

Um die division wirst du nicht drumrum kommen. Es sei denn du änderst
die Art und Weise wie du misst. So wie es Andi schon sagte, lässt du
den Timer zB. 10 Sekunden laufen und zählst die Anzahl der Takte in
dieser Zeit am INT0 Eingang. Diesen Wert musst du nach 10 Sekunden
einfach mit 6 multiplizieren und schon haste die Drehzahl.

Gruß Hagen

von Denis (Gast)


Lesenswert?

Hallo,
über die gleiche Problemstellung habe ich mir gestern abend auch
gedanken gemacht.

Drehzahl über Auswerung der Zeit zweier aufeinanderfolgender
Zündimpulse. Unter den Bedingungen keine Werte >Word, und daraus
maximaler Genauigkeit bin ich zu folgenden Ergebnis gekommen.

4MHz, Vorteiler 8,ein zusätzliches 8 bit Register, Genauigkeit bis 10
UPM

Dann rechne ich 50.000/Anzahl_Timertakte * 600


nur getestet habe ich es noch nicht.

von Bernd (Gast)


Lesenswert?

Hi,

wegen besserer Verständnis hier noch ein wenig Insiderwissen:

Woher kommt mein Takt den ich messen will? Der ist im Armaturenbrett
meines Autos schon vorhanden, damit wird ja der Drehzahlmesser
gesteuert. Dieser Takt kommt von einem Impulsgeber im Getriebe.

Und da die Welt böse ist und in Autos, dort wo mans nicht sieht, gerne
das billigste Material verbaut wird, haben die ICs die die
Anzeigennadeln bewegen (per Schrittmotor) in der Regel ein Kennfeld
einprogrammiert, mit dem sie leichte unliniaritäten der Impulsgeber
ausbügeln, bzw die Unliniarität die durch die Taktaufbereitung
entsteht. (Es wird aus dem "Zeug" des Impulsgebers ein sauberer
Rechteck gemacht, fragt nicht wie, ich blicke diesen Teil der
DZM-Schaltung selber nicht...)

Meine angegebenen Werte habe ich folgenderweise ermittelt:
Frequenzgenerator an den DZM und an den AVR. Dann die Nadel auf 500,
1000, 2000... gestellt und abgelesen.

Messfehler kann ich ausschließen, da der AVR was Puls/Pausenverhältnis,
Gleichspannungsanteil etc. angeht viel Kulanter als der Tacho ist. Also
aus der Richtung habe ich nichts zu befürchten.

Da ich jetzt ja einen (fast) Linearen wert habe (danke Hagen) kann ich
nun mein "Kennfeld" erstellt. Dann weis ich in welchem
Frequenzbereich ich welchen Korrekturfaktor nehmen muß um eine
ausreichende Genauigkeit zu bekommen.

Die Methode 10 Sekunden zu warten schließt sich durch den geplanten
Einsatz aus.

Ich will jetzt nicht falsch oder gar undankbar verstanden werden. Mein
Problem ist dank Hagens erstem Posting in diesem Thread gelöst.

Gruß und nochmal vielen Dank

Bernd

von Bernd (Gast)


Lesenswert?

Hi Denis,

Dein Posting hatte ich noch nicht gesehen. Ich werte wie in dem Post
eines höher nicht die Zündimpulse aus, sondern den Takt der sowieso
schon ins Armaturenbrett kommt.

Habe bei dem verbauten Motorraum absolut keine Lust noch irgendwo was
zu machen und in die Fahrgastzelle kommt man bei dem Auto auch fast
nicht rein... (War schon ein Kampf das + Kabel in den Kofferraum zu
bringen, als die Batterie vorne weichen und nach hinten mußte!)

Gruß und danke nochmal an alle Hilfsbereit!

Bernd

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.