>Es mit nur einem Timer: Wenn dessen Wertebereich groß genug ist (z.B.
>16bit), dann zieht man den ersten Zeitstempel vom zweiten Zeitstempel
>ab.
Dabei gibts ein prinzipielles Problem. Wenn der Lüfter gerade sehr
langsam dreht, dann läuft der eine Zähler während einer Umdrehung
vielleicht 5 oder 6 oder 13 mal über. Der Wert aus der Subtraktion hat
dann überhaupt keine Aussagekraft, aber das sieht man ihm nicht an, wie
auch? Es kann zufällig derselbe Wert sein wie für 458 U/min, aber man
kann nicht wissen, ob der Lüfter wirklich mit 458 U/min dreht oder mit
10 U/min oder mit 2 U/min. Man kann übrigens ohne Zusatzmaßnahmen auch
nicht erkennen, ob ein Lüfter stillsteht.
Bei separaten Zählern, d. h. jeder Kanal hat einen eigenen, kann man ein
Limit definieren, ab dem ein Zähler nicht mehr weiterzählt (z. B. 250
bei 8-bit breiten Zählern). Dann kann man einen langsam laufenden Lüfter
erkennen: Wenn ein Zähler beim Auslesen auf seinem Limit-Wert steht,
weiß man, dass die Drehzahl kleiner ist als es diesem Limit entspricht.
Besser ist folgendes Verfahren. Man definiert sich eine feste "Torzeit",
z. B. 1 s, und die Frage lautet einfach, wieviele Flankenwechsel während
einer Torzeit auftreten. Dazu werden über einen schnellen Timer (z. B.
800 Hz) die acht Signale abgetastet und geprüft, ob gerade irgendeins
eine 01-Flanke aufweist. Wenn eine Flanke gefunden wird, wird der
zugehörige Kanalzähler inkrementiert. Ein weiterer Torzeit-Zähler (einer
für alle Kanäle) zählt von 0 bis 800. Wenn 800 erreicht ist, ist die
Torzeit abgelaufen. Die acht Zählerwerte irgendwo abgespeichern oder auf
ein Display schreiben (Aktualisierungsrate des Displays = Torzeit). Alle
Kanalzähler und den Torzeitzähler resetten und das Spiel von neuem
beginnen. Bei dieser Methode ist der Zählerwert angenehmerweise
proportional zur Drehzahl: Zählerwert 0 --> Lüfter steht still.
Zählerwert 30 --> 30 U/s = 1800 U/min.