Ich denk mal das die Frequenz nicht höher sein darf als 16MHz ansonsten dürfte es egal sein.Mit einem T-Eingang, z.B. T0 (Pin 6) lege ich den Takt des Timers fest, dieser darf also auch nicht höher sein als die Taktfrequenz des Prozessors, richtig?
Du kannst den Timer über den T0 Eingang ansteuern, den internen Prozessortakt verwenden und ich glaub sogar den Watchdog Timer als Taktquelle verwenden.
Egal welchen dieser Eingänge du nimmst kannst Du mit dem Prescaler diesen Takt für den Timer nochmal runterteilen.
Die Timer des ATMEGA8 sind wirklich sehr vielseitig.
Das geht mit Timern die eine Comparematch Möglichkeit haben, aber was soll das bringen ?Im Hintergrund lass ich nen weiteren Timer laufen damit ich dann bei einem festen Wert, wie z.B. alle 25 ms nachschaue wie viel Impulse aufgetreten sind und daraus dann die Drehzahl berechne.
Ist es möglich beim ersten Timer zusätzlich noch einen Interrupt auszuführen, z.B. nach 100 Impulsen.
Ich würd nicht den INT0 für die Drehzahlerfassung verwenden, sondern den ICP des Timers 1. Bei dem wird nämlich der aktuelle Zählerstand gleich ins Input Capture Register des Zählers 1 abgespeichert.Sobald einer der beiden Timer überläuft bzw. den Soll-Wert erreicht hat (100 Impulse oder 25ms) setz ich beide auf 0.
Den Timer1 würde ich mit dem internen Prozessortakt 16MHz laufen lassen.
Er scafft dann 244 komplette durchläufe in einer Sekunde.
Wenn Du nun bei jedem Timer1 Overflow Interrupt ein Register mit hochzählst (Timer1 ist ein 16Bit Timer) bekommst Du einen Timer mit 24 Bit Auflösung. In diesem Timer1 Overflow Interrupt zählst Du dann noch ein zweites Register mit hoch. Dieses Register wird nach einem neuen Drehzahlimpuls wieder auf 0 gesetzt, ebenso wird das Flag "Drehzahl 0" eventuell gelöscht. Hat dieses Register einen Zählerstand höher als 244 (z.B.) wird ein Flag gesetzt das die Drehzahl 0 ist. Dieses Register fungiert also als Indikator für einen stehenden Motor.
Der Timer 1 und das zugehörige Überlauf Register wird niemals von Dir auf 0 gesetzt, sondern läuft frei durch.
Die Drehzahlermittlung wird durch abziehen des Timerwertes (24 Bit) des vorherigen ICP Interrupts ermittelt.
Die Berechnung der Drehzahl würd ich in der Hauptroutine erledigen, da dabei auch Divisionen oder ähnliches auftreten können.
Beispiel:
Ein ICP Interrupt bei 1234, der nächste bei 2345;
2345 - 1234 = 1111.
Die 1111 gehen in die Drehzahlberechnung ein die 2345 werden auf dem Speicherplatz der 1234 gespeichert - vorbereitung für die nächste Messung.
Somit erhältst Du bei jedem Impuls deines Drehzahlsensors eine neue Drehzahlausgabe.
Bei dieser Methode wird nur der Timer 1 verbraten, die beiden anderen Timer 0 und 2 bleiben für andere zwecke frei.
Im Timer1 Overflow Interrupt kannst Du dann auch gleich dein Multiplexing erledigen, wobei dann aber bei 5 Digits eine Refreshrate von unter 50Hz zustande kommt.
Also dann doch lieber einen eigenen Timer dafür verwenden z.B. Timer0 mit Prescaler 64 ( bin mir jetzt gerade nicht sicher ob das geht ) auf internen Takt. Dann komm ich auf eine Refresh Rate von 195Hz und da sollte nichts mehr flackern.
Da in deinen Interruptroutinen dann nur Speicherzugriffe, Additionen Subtraktionen und Inkremente auftreten ließe sich das wunderbar in Assembler proggen - wenn Du das willst.
Hätte ich auch so gemacht.Normalerweiße müsste es doch wie bei einem Relai eine Freilaufdiode tun die die Sperrspannung an der LED auf 0,7V bzw 0,3V begrenzt.
Ich meine aber das Du für die LED im Optokoppler noch einen Vorwiderstand brauchst.
Wenn Du nun diesen Vorwiderstand aus 2 Widerständen aufbaust und am Mittelpunkt dieser 2 Widerstände nochmal eine Z-Diode einbaust sollten auch hohe induktionsspitzen deiner LED nichts anhaben können.
Wenn Du Angst hast die Freilaufdiode wäre zu lansam kannst Du eine Schottky Diode verwenden.
Übrigens hohe Frequenzen - bei einer Drehzahl von 20000 U/min liegt bei einem Impuls pro U/min eine Frequenz von 333Hz an. Das ist dann gerade mal ein wenig mehr als Gleichstrom
Zu ATMEGA88 kann ich leider nicht viel sagen, hab damit noch nichts damit gemacht.
Lesezeichen