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
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
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
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...)
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.