mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehzahlmessung per Lichtschranke


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Leute,

ich bins mal wieder. Nachdem ich dachte entlich den Hardwareteil ferig 
zu haben, darf ich jetzt wieder basteln...

Folgendes Problem.
Ich soll die Drehzahl eines Motors ermitteln. Muss nicht 100 Pro genau 
sein, weils mir langsam auch wurscht ist. Aber sollte halt grob Stimmen, 
also eine Hausnummer halt.

So ich hab jetzt nen Motor samt geschlitzer Scheibe. Bei der Scheibe 
greift eine Lichtschranke.
Ist nun die Lichtschranke unterbrochen hab ich 5 V an einem Pin an 
meinem Mega 16. Läuft nun der Schlitz in der Scheibe an der Schranke 
vorbei, krieg ich 0 Volt an einem Pin.

Die Umdrehungen will ich dann rausrechnen indem ich die Zeit zwischen 
den beiden 0Volt messe. Aber wie fang ich das am besten an.
Ich dachte daran, einen Timer zu starten, wenn das erste mal 0 Volt 
anliegen. Dort eine Variable hochzählen, solange bis er das Zweite mal 
durchläuft.

Geh ich da Richtig in der Annahme, das ich einen Interrupt zwingen 
brauche, oder kann ich den auch "Emulieren" an einem X-Beliebigen Pin 
meines Mega16?
Denn der Controller soll/muss derweilen noch einiges anderes machen.

Vorallem hab ich noch nix mit Timer und Interrupt in C gemacht...

Für Antworten wäre ich sehr dankbar!

MfG
Matthias

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm die Funktionalität des Input Capture, wenn der Controller den hat.

MW

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab etwas rumprobiert...

Timer krieg ich grob in den Griff...
Die Lichtschranke erkennt den Wechseln einwandfrei.

So jetzt brauch ich blos ne Möglichkeit auf einen X-Beliebigen Pin einen 
Interrupt auszulösen falls er von High auf Low geht.

@Michael Wilhelm
Input Capture
Kannst du mir vll in deinen eigenen Worten erklären was das ist? Weil 
das Internet macht nicht immer schlau. Und das was drinsteht ist 
irgendwie verworren bzw. unverständlich.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Input Capture heißt, dass der Timer auf einen Event seinen aktuellen 
Timerwert abspeichert in ein anderes Register. Dann wird meistens ein 
Interrupt ausgelöst. Du kannst den Wert speichern und auf den nächsten 
Event warten. Dann beide Werte voneinander abziehen, und du hast die 
Zeit.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich poste dir hier mal meine ISR (ist schon älter, also bitte den alten 
Namen verzeihen):
SIGNAL (SIG_INPUT_CAPTURE1)  // Frequenzmessung
{
  if (!(Status &(1<<ST_ICP)))  //bei neuer Zählperiode:
    {
      starttime = ICR1;  // Startzeit zuweisen
      ICP_OVF = 0;       // Timer-überlaufzähler rücksetzen
      Status |= _BV(ST_ICP);  // Start neuer Zählperiode markieren
      return;
    }
  else
    {
       stoptime = ICR1;  // Stopzeit zuweisen
       Frequenz = (ICP_OVF * 65536) + stoptime - starttime; // Zählerstand ermitteln
       Frequenz = (16000000/Frequenz);  // Frequenz berechnen
       Status &= ~_BV(ST_ICP);  // Ende der Zählperiode markieren
       TIFR |= _BV(ICF1);  // Input-capture-Flag löschen, falls inzwischen ausgelöst
    }
}


SIGNAL (SIG_OVERFLOW1)  // ICP - Overflow-Zähler
{
  ICP_OVF++;
  if (ICP_OVF >5000)  // Timeout erkennen
    {
      Frequenz = 0;
    }
}
Oben die ICP-ISR, bei jeder (vorher festgelegten) Flanke wird ein 
'Zeitstempel' des Timer1 in den ICR-Registern abgelegt, dieser wird 
einer Variablen zugeiesen. Falls die Periodendauer nun länger als der 
Zählbereich des Timer1 ist, dann läuft dieser über und die 
Timer1-Overflow-ISR wird ausgelöst. In dieser werden die Überläufe 
gezählt und ein Fehlen der Flanken erkannt (z.B. Drahtbruch oder 
abgesteckter Geber). Kommt am ICP die nächste Flanke an (eine Periode 
durchlaufen), wird die Stopzeit einer Variable zugewiesen und 
anschließend die Frequenz berechnet.

das Ganze ist natürlich nur ein Codeschnipsel (Initialisierung der 
Interrupts usw. fehlen), dürfte aber zur verdeutlichung der 
Vorgehensweise dienen.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank dir...

Auf gut Deutsch du lässt den Timer laufen. Du merkst dir dann Start und 
Stop und rechnest damit die Zeit dazwischen aus. Richtig verstanden?

Jetzt brauch ich blos noch ne Möglichkeit einen x-Beliebigen Pin als 
Interrupt zu nehmen, da die anderen schon belegt sind.

Er muss ja zwischen drin noch einiges erledigen, also der MC...

MfG
Matthias

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Richtig verstanden?
Ja.

Ich habe dafür den Input-Capture-Pin benutzt, wenn möglich benutze den.
Mit beliebigen Anderen geht's nicht so komfortabel. Evtl noch ext. 
Interruptpins frei?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke...

Ich habs jetzt auf den Input-Capture-Pin umgelötet an meiner 
Testplatine. Wenn wirklich muss ich halt noch meine eigentlich schon als 
fertig betrachtete Platine umbaun.

Blos auf was reagiert der Input-Capture-Pin?
Fallende Flanke oder auf Steigende? Muss ich den noch konfigurieren?

Ich hab grad das große DB meines Controllers überfolgen. Da heissts er 
gehört zum Timer1. Das ist der 16 Bit Timer meiners Controllers. Also 
muss ich den verwenden oder?

SIGNAL (SIG_INPUT_CAPTURE1)

Ist dann das Event wo er reinspringt beim Input-Capture...

MfG
Matthias

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das datenblatt würde ich zum Thea ICP genauer lesen, da steht eigentlich 
alles sauber drin. Der Interrupt wird bei einer von dir programmierbaren 
Flanke ausgelöst (steigend oder fallend).
Der Timer ist keinesfalls verschwendet, du kannst ihn gleichzeitig 
nutzen, vorausgesetzt der Vorteiler ist für Beides verwendbar. Ansonsten 
kannst du die Frequenzmessung ja abschalten, wenn sie nicht benutzt 
wird, dann steht der Timer1 wieder voll zur Verfügung.
Das 'SIGNAL (SIG_INPUT_CAPTURE1)' ist mittlerweile überholt im neuen 
WINAVR, da heißt's irgendwas mit 'ISR' (hab's grade nicht zur 
Verfügung).

Aber ja, das ist die ISR (das Event) die ausgeführt wird.

Meine Berechnung oben bezieht sich auf den Timer1 ohne Vorteiler, bei 
16MHz Taktfrequenz. Der Vorteiler (falls vorhanden) muss dann noch in 
die Berechnung 'rein.

>Muss ich den noch konfigurieren?
Ja. Ebenso muss Timer1 konfiguriert werden.
Die Variablen entsprechend groß (long int) wählen, da hier einiges 
zusammenkommt.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Variablen entsprechend groß (long int) wählen, da hier einiges
>zusammenkommt.

Muss nicht sein. Einfach einen Int nehmen, Daten sichern und das 
Timerregister löschen. So hast du den Zeitstempel von 0 bis zum 
gemessenen (gesicherten) Wert, wobei 1 Tick halt 1/Timerfrequenz ist.

MW

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo danke Jungs für die Infos.

Werd mich mal schlau machen und rumbasteln...falls ichs net hinkrieg 
meld ich mich nochmals.

Also danke derweilen!

MfG
Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus nochmal...

kann ich den Input-Capture-Pin so umstellen, das er nicht die low high 
sondern die high low Flanken erkennt?

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In TCCR1B das ICES1 bit. Der Name: Input Capture Edge Select

MW

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist doch im Datenblatt garnicht so missverständlich beschrieben, 
oder?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo passt schon habs soweit.

Ärger mich blos momentan mit der Rechnung...
Timertakt...Compare...auf Umdrehungen.

Mist is das momentan keine feste def. Drehzahl hab da der Motor noch 
Antrieblos ist...fehtl die Richtige Stromquelle...also muss ichs 100 Pro 
richtig rechnen...kanns aber nicht überprüfen momentan.

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.