www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega 32 Freqenzzähler in C


Autor: Björn Maaß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Leute,
ich habe folgendes Problem :
Im Rahmen einer Projektarbeit wurde mir die Aufgabe übertragen den
Mikrocontroller so zu programmieren, daß er Impulse einer Lichtschranke
misst un daraus die Umdrehung eines Motors pro Minute errechnet (und
ausgibt).
Mein Lösungsansatz sieht so aus :
1. start zeitgeber
2. auslesen der momentanen zeit
3. impulse abmessen (z.B. 800)
4. auslesen der momentanen zeit
5. zeitdifferenz errechnen
6. U/Min errechnen

Als ich weiss nicht, wie ich die Punkte 1,2 und 4 programmieren soll.
Wie heissen die Befehle und wie werden sie richtig angewandt?
Mir geht es nicht darum, einen Code hier zu bekommen. Hilfestellung
wäre mir lieber. Habe schon die Forum-Suche gefragt, aber wenn was in
der Richtung dabei war, dann nur in Assembler. Auch Google konnte mir
nicht weiterhelfen. Wir programmieren hier mit dem Code Vision AVR C
Compiler Version 1.24.6 .Ein Problem ist auch, daß meine
Eglisch-Kenntnisse nicht so pralle sind.
Schon mal danke im vorraus

Autor: ERDI - Soft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann guck dir doch mal das AVR-GCC-Tutorial hier auf der Seite links
an.
Ist zwar eben nicht für den Codevision, was aber der Funktionsweise
keinen Abbruch tun sollte.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du wirst nicht umhinkommen, das Datenblatt zu schnappen und Dich in die
Funktionsweise des Timers T1 einzulesen.

Auch mußt du erstmal die maximale und die minimale zu messende Drehzahl
festlegen und wieviel Impulsen daß entspricht.

Dann wirst du merken, daß 800 Impulse warten, bei kleinen Drehzahlen
keine gute Idee ist bzw. 1 Impuls zu warten bei hohen Drehzahlen.

Üblich ist deshalb oft, eine ergonomische Zeit zu warten (z.B. 0,2s ...
0,5s), dabei die Impulse zu zählen (z.B. mit T0) und dann das Ende des
nächsten Impulses (per T1 Capture-Funktion) ermitteln. Somit erreicht
man über einen weiten Meßbereich eine hohe Genauigkeit.

Ein Timeout, z.B. nach 1s sorgt dafür, daß man 0 UpM anzeigen kann und
nicht die letze Messung in der Anzeige für immer stehen bleibt.


Peter

Autor: Björn Maaß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Erdi
hab ich schon, da sind aber entweder nicht die befehle drin (wenn ich
nicht blind bin) oder aber in Assembler

@Peter
Von der sog Torzeit habe ich oberflächlich auch schon gelesen. Mein
Ansatz ist ja die Inkrementierung davon. Welche der beiden
Möglichkeiten  schlußendlich zum Zuge kommt, weiss ich noch nicht.
Obwohl die Torzeit-Variante die vernünftigere ist.
Wie funktionieren denn T0, T1 und TimeOut?

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt keine Befehle zur Frequenzmessung, man muß sich alles selber
programmieren. Deshalb heißt es ja Mikrokontroller und nicht
Frequenzmesser.


T0, T1 und T2 sind Peripherie, die über bestimmte Register gesetzt und
gelesen werden können.
Z.B. mußt du bestimmte Bits setzen, damit ein Timer losläuft oder um zu
bestimmen, ob er den Quarztakt oder ein externes Signal zählt und viele
andere Funktion mehr.

Da hilft nur Datenblatt lesen.



Ein Timeout bedeutet, man setzt einen Timer auf, der eine bestimmte
Zeit zählt und dann z.B. einen Interrupt auslöst. Tritt nun das
gewünschte Ereignis innerhalb dieser Zeit auf, stoppt man den Timer und
es wird kein Interrupt ausgelöst.

Ein Timeout dient also dazu, das Mißlingen einer Sache zu
signalisieren, z.B. wenn keine Impulse gezählt werden konnten, weil
kein reingekommen sind (weil der Motor steht).



Peter

Autor: Björn Maaß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dacht es läuft so ab
1.zeitfenster festlegen (z.B. 1sec)
2.in diesem Zeitfenster die impulse messen

liege ich damit richtig ?

Autor: Tobias Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Danneger
Ich bewundere jedesmal deine Gelassenheit, mit der du solche Fragen
erklaerst. Ich haette nach der Frag emit dem Timeout schon lanegst das
Handtuch geworfen ...

Gruß Tobias

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich dacht es läuft so ab
1.zeitfenster festlegen (z.B. 1sec)
2.in diesem Zeitfenster die impulse messen"


Theoretisch ja, praktisch kann man aber nur ganze Impulse zählen, d.h.
ein Impuls/s kann bedeuten 60UpM aber auch 119UpM (2 Impulse/s =
120UpM).
Du hast also bei kleinen Drehzahlen einen riesen Fehler.

Deshalb macht man bei größeren Meßbereichen eine kombinierte
Impulszahl/Impulsdauermessung.

Such mal nach Frequenzmesser, das ist nichts anderes außer die Einheit
(Hz statt UpM).


Peter

Autor: Björn Maaß (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tobias
entschuldigung, aber ich dachte, daß ein Forum unter anderem dazu
dient, daß schlauere Leute (wie Peter) nicht so schlauen Leuten (z.B.
Anfängern wie mir) unter die Arme greifen.

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.