Ich muss mit einem ATmega (16/32) das Tachsignal von 8 Lüftern auswerten. Es kommen also 8 Rechtecksignale mit einer Frequenz um die 20-40Hz an. Ich schreibe die Programme mit Basecom AVR und hab bisher nur Beispiele/Lösungen mit Timern gehört. Aber ich hab nun mal nicht genug Timer um alle Frequenzen gleichzeitig zu messen. Das Puls/Pausenverhältnis des Rechtecksignal ist 50/50. Es würde also reichen, wenn ich wüsste wie lange die Pins jeweils auf High sind. Hat jemand eine Idee wie man sowas realisiren kann???? Genauigkeit ist nicht ganz so wichtig. Mfg Bimbo385
>Hat jemand eine Idee wie man sowas realisiren kann???? Ja... >20-40Hz Wirklich sooo schnell? Man könnte einen Timer so laufen lassen, dass er mit einer Frequenz von 80Hz ein Interrupt auslöst, in dessen Service-Routine die Signale, die an 8 I/O-Pins anliegen parallel einliest. Dann kann man feststellen, ob sich zwischen den beiden Abfragen etwas geändert hat und sich die Zeit zwischen zwei Änderungen merken, um dann die Signaldauer zu berechnen
Ums genauer zu machen könnte ich ja auch ne höhere abfragefrequenz nehmen. Ich mach also folgendes (bin noch anfänger): Ein Interrupt mit z.B. 80Hz. In der Interruptrutine mache ich dan folgendes (alles einmal für jeden Kanal): Wenn der Alte Wert des Signal mit dem neuen übereinstimmt (keine Änderung)rechne ich die Zählvariable +1. Wenn der Alte Wert nicht übereinstimmt (Also Änderung), dann Schreibe ich die Aktuelle Zählvariable Raus und setzte die wieder auf null zurück. Dann muss ich nur noch den Zählwert mit der Periodendauer des Interrupts multiplizieren und hab dann die Halbe Periodendauer des Eingangssignals. die mal Zwei und dann hoch -1 und ab dafür.... Ich hoffe das war einigermaßen verständlich. Danke erstmal!!! Mfg Bimbo385
du kannst den Timer mit 1000 Hz (oder noch schneller) laufen lassen und jeweils einen Port einlesen und mit dem zuvor eingelesenen Wert vergleichen. Somit kannst du den Flankenwechsel erkennen. Wenn kein Flankenwechsel statt findet, so erhöhst du einen Zähler. Beim Flankenwechsel speicherst du den Inhalt des Zählers in eine weitere Variable und setzt den Zähler wieder auf 0 (das ganze brauchst du 8x für jeden Pin) In der weiteren Variable steht dann die Periodendauer in ms (bei 1000Hz Timerfrequenz) Gruß Roland
Genauso hab ich das ja in Post 3 Gemeint!!! SUPER!!!!! Dan währe das also geklärt. Vieln Dank! Wenn es noch einwände gibt, dann sagt es ruhig. Mfg Bimbo385
Wieso bin ich mit 80Hz unterwegs? Ich meinte wohl das Shannon-Theorem, was man eher in Verbindung mit ADCs benutzen sollte... Für das Frequenzmessproblem kann man auch "einfach" einen Timer laufen lassen und diesen beim Wechsel an den Pins auslesen. Den Wechsel kann man vermutlich mit der PinChange-Interrupt-Funktion erkennen und behandeln.
nun dann bräucht ich ja aber für jedes Rechtecksignal einen eigenen Timer. Ich hab aber 8 Signale aber blos 3 Timer. Wie soll das dann gehen??? Mfg Bimbo385
>(das ganze brauchst du 8x für jeden Pin)
1x für jeden Pin genügt, d. h. 8x insgesamt.
>Wie soll das dann gehen???
Es mit nur einem Timer: Wenn dessen Wertebereich groß genug ist (z.B.
16bit), dann zieht man den ersten Zeitstempel vom zweiten Zeitstempel
ab.
Wenn man mit einem begrenzten Zahlenraum (wie 16bit-breite
Integerzahlen) arbeite, kommt es bei der Subtraktion einer grösseren
Zahl von einer kleineren nur quasi zu einem negativen Ergebnis. Da es in
diesem Zahlenraum keine negativen Zahlen gibt, kommt es zu einem
Überlauf (eher Unterlauf zu nennen), und man fängt wieder von "oben" an.
@ Rahul Bahnhof??? Was für Zeitstempel??? Wiso werte Subtrahieren??? Die rechtecksignale kommen mit unterschiedlicher Frequenz an. Also brauch ich pro Signal einen eigenen Timer. Zumindest, wenn ich die Pinänderung als Interruptquelle nehme. Ich hab aber nur 3 Timer aber 8 Signale. Geht also nicht. Ist mir jetzt auch egal ich mach das jetzt so wie in Post 3 und 4 beschrieben. Mfg Bimbo385
>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.
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.