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


von Björn Maaß (Gast)


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

von ERDI - Soft (Gast)


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.

von Peter Dannegger (Gast)


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

von Björn Maaß (Gast)


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?

von Peter Dannegger (Gast)


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

von Björn Maaß (Gast)


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 ?

von Tobias Schneider (Gast)


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

von Peter D. (peda)


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

von Björn Maaß (Gast)


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.

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
Noch kein Account? Hier anmelden.