mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8 Frequenzen messen (ATmega)


Autor: bimbo385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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

Autor: bimbo385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: bimbo385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: bimbo385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>(das ganze brauchst du 8x für jeden Pin)

1x für jeden Pin genügt, d. h. 8x insgesamt.

Autor: bimbo385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat Roland sich auch so gemeint.

Mfg Bimbo385

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: bimbo385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.