Der erste Schritt ist der Frequenzanalyzer. Da habe ich mir überlegt, ich lege das Signal (Testweise das meines Tongenerators) auf PD3 meines ATMEGA8 und lasse meine Interrupt-Service-Routine für den Fall aufrufen, daß die Franke steigt. (Fallende Flange wäre auch möglich gewesen – ich musste mich halt entscheiden.)
In der ISR lese ich mir den Timer1 aus. Der Timer 1 ist ein 16-Bit Timer, er zählt also von 0 bis 65535. Nach 20 ms Sollte er bei einem Systemtakt von 1 MHz bei 20000 angekommen sein (1000000 / 50 = 20000).
Damit ich nicht ständig zwischen Maximum und Minimum pendle, gibt es einen Leerlauf von etwa 400 µs. Also bei weniger als 19600 Timerzählern zwischen zwei Impulsen geht es also in die eine Richtung (Gas wegnehmen, weil zu schnell) – bei mehr als 20400 Takten pro Impuls geht es in die andere Richtung (Gas geben, weil zu langsam).
Ich habe das mal mit 3 LED´s probiert – sieht gut aus. Die Toleranzschwelle muss man sicher später in der Praxis anpassen.