Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeitsmesser mit PIC18fxxx und USB


von Paul K. (paul-cgn)


Lesenswert?

Hallo zusammen,

ich plane aktuell einen Geschwindigkeitsmesser basierend auf zwei 
Lichtschranken und einem PIC18F44550 der per USB an einem PC hängt.

Auf dem PC soll die gemessene Geschwindigkeit dargestellt werden.

Die USB Kommunikation ist soweit kein Problem.
Für die Lichtschranken verwende ich eine IR-Photodiode und eine IR-LED, 
auch das hat bisher in einer einfachen Schalter mit OP-AMP auf einem 
Steckboard gut geklappt.

In meiner Frage hier geht es mir nur darum wie ihr mir empfehlen würdet 
den Anschluss und die Programmierung des PIC vorzunehmen.
Meine Erfahrungen mit Mikrokontrollern sind noch sehr grundlegender Art, 
daher habe ich mir das Manual von dem PIC durchgelesen und mir folgendes 
überlget:

Ich möchte die beiden integrierten Comparatoren die im PIC vorhanden 
sind (CCP1 und CCP2) nutzen um auszuwerten ob eine der beiden 
Lichtschranken unterbrochen wurde.

Die erste Lichtschranke/Photodiode würde an CCP2 hängen.
Ich würde den Timer3 (16 bit counter) resetten (mittels Special Event 
Trigger von CCP2) sobald die erste Schranke unterbrochen wurde.
Die zweite Schranke würde ich an CCP1 hängen und einen Iterrupt 
generieren lassen, sobald diese Unterbrochen wurde und dann den 
aktuellen Zählerstand von Timer3 auslesen um anschliessen die Berechnung 
der Geschwindigkeit vorzunehmen.

Dabei sind mir nun folgende Dinge nicht ganz klar:
Frage 1: im manual steht das die CCP Module jeweils eine "Timer 
Resource" haben bzw. das ein Timer als "as the time base" verwendet 
wird. Was genau ist damit gemeint? Heisst das der Comparator führt bei 
jedem increment des Timers eine Prüfung durch (ich bin eher davon 
ausgegangen das er permanent vergleicht und sofort einen Iterrupt 
generiert sobald der Grenzwert überschritten bzw. unterschritten wird).

Frage 2: wenn ich nun den Special event trigger von CCP2 nutzen möchte 
um Timer3 zu resetten, kollidiert das dann mit der "Timer Resoruce" 
Einstellung aus Frage eins?

Frage 3: Wenn nun eine zweite Unterbrechung des ersten Lichstrahls 
stattfindet, bevor der zweite Lichtstrahl unterbrochen wurde, erfolgt in 
meinem aktuellen Plan ja ein weiterer Reset des Timer3 durch den CCP2, 
das soll natürlich nicht erfolgen. Daher die Frage wie lange dauert es 
den CCP2 special Event trigger nach dem ersten Durchbrechen des ersten 
Strahls zu deaktivieren? wird dadurch ggf. die die Auswertung des 
zweiten Strahls beeinflusst? (ich plane die Lichtschranken in einem 
Abstand von ca. 10cm aufzustellen und damit Geschwindigkeiten von ca 60 
kmh zu messen. Somit ist der Zeitunterschied zwischen dem Durchbrechen 
der ersten und der zweiten Lichtschranke nach meinen Berechnungen 6ms)

Im Ablauf würde das so aussehen:

1.) 1. Photodiode hat einen Spannungsabfall -> der als Comparator 
konfiguriert CCP2 erkennt die Unterbrechung und Triggert sofort einen 
Reset vom Timer3
2.) durch den generierten Interrupt von CCP2 wird eine Funktion 
aufgerufen, welche den Interrupt fpr CCP2 dekativiert und gleichzeitig 
den Interrupt Flag löscht
3.) Timer3 beginnt zu zählen (prescaler 1:8 damit auch langsamer 
Geschwindigkeiten nicht sofort zu einem, Zählerüberlauf führen, da ich 
ein 20Mhz Quarz einsetze)
4.) wenn nun die 2. Photodiode an CCP1 einen Spannungsabfall hat wird 
wieder ein Interrup generiert, welcher eine Funktion aufruft die den 
aktuellen Zählerstand aus dem Timer3 ausliest
5.) Anhand des Zählerstands wird nun die Geschwindigkeit berechnet 
(dabei sollte ja ein Zählerwert bei 20Mhz) dank einem Prescaler von 1:8 
im Timer3 und dem teilen der Fosc durch 4 [waren doch 4 Takte pro 
Instruction beim PIC oder?]) 20.000.000Hz/4/8 = 0,0000016 Sekunden 
(0,0016 ms) entsprechen, korrekt?
6.) nach dem Berechnen der Geschwindigkeit wird diese per USB an den PC 
gemeldet und der Interrupt-Flag gelöscht und der CCP2 wieder scharf 
geschaltet.


Danke für Euren Input und Tips.

Viele Grüße
Paul

von Erich (Gast)


Lesenswert?

Deine Ablaufpläne sind zu kompliziert.
Es geht vermutlich sehr viel einfacher durch Nutzung des "Capture" modes 
der Timereinheit(en) im uC.

Info auch hier:  Beitrag "Capture/Compare"

von Paul (Gast)


Lesenswert?

Danke für die Antwort!
Ich hatte auch einen Denkfehler drin, da ja ccp1 und ccp2 keine 
comparator Funktion haben sondern eine compare funtion :) somit muss ich 
eh die comparator Einheit nutzen, da ich möglichst keine externen 
komparatoren einsetzen möchte um alles simpel vom Aufbau zu halten.
Kann ich mit dem internen comparator auch direkt die compare Einheit 
feuern? Oder braucht dIe immer eine externe Flanke? (die im Zweifel vom 
dem uC selbst kommt durch einen IO der vom comparator auf High gezogen 
wird?)

Danke und Gruss
Paul

von Tobias K. (Gast)


Lesenswert?

Deine Idee mit dem Special Event Trigger funktioniert so nicht.

Den gibt es nur im Compare Mode. Also wird er durch einen bestimmten 
Timerwert ausgelöst. Nicht durch einen Input.

Aber du könntest beide Module im  Capture Modus laufen lassen.
Beide Module haben den gleichen Timer als Basis(im Timer3 Register 
einzustellen).

Somit steht z.B.: in CCPR1 der Zeitpunkt wann die erste Schranke 
ausgelöst hat und im CCPR2 der Zeitpunkt für die zweite Schranke.

Differenz bilden, Timerüberlauf noch berücksichtigen und du besitzt die 
Zeit, den Weg und...

das Gesuchte :)

PS: Die CCP Module haben Schmitt Trigger Eingänge, könnten bei 
geeigneter Beschaltung also ohne Comperatoren funktioniern.

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.