Forum: Mikrocontroller und Digitale Elektronik C167-XC Drehzahlerfassung


von Markus Berend (Gast)


Lesenswert?

Hallo,

ich hab hier einen miniatur-Motor der eine kleine Scheibe auf der Welle 
hat. In dieser Scheibe ist ein Loch. Um die Scheibe herum ist eine 
Lichtschranke mit ner kleinen Schaltung aufgebaut.

Auf jeden Fall bekomme ich pro Umdrehung des Motors genau eine positive 
Flanke von der Lichtschranke.

Den Motor steuere ich mit einer CAPCOM Einheit des Controllers per PWM 
an. Funktioniert auch sehr gut. Der Drehzahlbereich liegt zwischen 0 und 
8500 1/min !

Wie messe ich am besten die Drehzahl des Motors mit der positiven Flanke 
der Lichtschranke?

Meine erste Überlegung war einen General Purpose Timer überlaufen zu 
lassen und in dessen Interrupt einen anderen Timer im Counter Modus(der 
die Flanken der Lichtschranke zählt) auszulesen und zurückszusetzen.

Vielleicht gibt es aber ja auch geeignetere Hardware auf dem C167-XC !?

Viele Grüße,
Markus

von TManiac (Gast)


Lesenswert?

Hi,

Als erstes für das Verständis was meinst du mit "C167-XC"? Vielleicht 
einen XC167 ?

Die Drehzahl lässt sich auch mit der CapCom messen. Daher der Name 
Capture und Compare. Je nach dem was für einen 167 du nun genau hast, 
und welche CapCom du für die Ansteuerung des Motors (und auch auf was 
für eine Weise) benutzt.

Grundsätzlich kannst du die CapCom so konfigurieren, dass ein Timer 
läuft. Ein Kanal wird als Capture (logisch) konfiguriert, dass er bei 
einer positiven, oder auf Wunsch auch geht auch die negative Flanke den 
Wert des Timers Speichert (capture) und einen Interrupt auslöst. Je nach 
CapCom Einheit kann der Timer per Hardware einen Reset erhalten oder man 
löscht ihn per Software oder man rechnet immer von einem Capture zum 
nächsten.

Prinzipiell geht zur Drehzahlmessung auch ein Gated-Timer der GPT.

Man erhält halt immer einen Zeitwert der Umdrehung und muss bei Bedarf 
in Umdrehung pro Zeit umrechnen.

Gruß TManiac

von Markus Berend (Gast)


Lesenswert?

Hallo,

oh Sorry war schon spät gestern :)!
Es ist ein XC167-CI

So ganz verstanden habe ich deinen Ansatz aber noch nicht.

Man konfiguriert also z.B. fden Timer 0 der CAPCOM1 Unit als Timer.

Einen Kanal dieses Timers(z.B. Channel 2) konfiguriert man als "Capture 
on positive Transition at Pin CC2IO (P6.2). Und man aktiviert den 
Capture Interrupt. So dass bei jeder positiven Flanke der Lichtschranke 
ein Interupt ausgelöst wird. In diesem Intterupt fragt man dann das 
Capture Register (CC2) ab was einer bestimmten Zeit entspricht. Sofort 
nach dem Auslesen des Registers lässt man den Timer resetten und von neu 
anfangen zu laufen.

Blicke ich das soweit richtig?

Wenn ja: Ich kann den Timer maximal so konfigurieren, dass er seinen 
Overflow bei 419,4304000 ms hat. Aber das bedeutet ja dass ich nur 
vernünftige Drehzahlwerte bekommen würde wenn der Motor eine Umdrehung 
schneller als 419,43 Millisekunden ausführt!?

Viele Grüße

von TManiac (Gast)


Lesenswert?

Hallo Marcus,

Das Meißte stimmt schon. Der Timerwert zum Zeitpunkt des Flankenwechsels 
wird automatisch durch die Hardware gespeichert. Also muss nur der 
Reset, sprich das CC2T0 = 0 in deinem Beispiel durchgeführt werden. Am 
Besten man stoppt vorher den Timer und startet ihn danach neu.
Der Rest passt so bei dir.
Die Maximale Periode der CapCom Timer ist aber 1677.72 ms (bei 40 Hz 
Takt).

Die elegantere Version ist halt das nutzen der GPT2.
Hier lassen sich der Timer 5 so konfigurieren, dass er bei einem 
Interrupt seinen Wert in GPT2_CAPREL speichert und sich selber resetet. 
Also erhält man ohne jeglichen Software Overhead im Register GPT2_CAPREL 
die Umdrehungszeit. man muss nur ab und zu mal nachschauen was drin 
steht :)
Noch hinzu kommt das man drei verschieden Pins zur Auswahl hat (CAPIN, 
T3IN, T3EUD). Die Periode der GPT2 ist 3.28 ms(Resul:50 ns) bis 3.355 
s(Resul:51.2 μs).

Im "An Insiders Guide to Planning XC166 Family Designs" von Infineon 
gibt es ein paar nützliche Tips. Du kannst unteranderem auch das Signal 
der Lichtschranke direkt als Frequenzqrundlage für den PWM Ausgang 
nutzen (siehe Kapitel 9.6.3).

Gruß TManiac

von Markus Berend (Gast)


Lesenswert?

Hi,

den besagten Timer 5 konfiguriert man dann also so, dass er bei einer 
positiven Flanke der Lichtschranke seinen aktuellen Timerwert in das 
GPT2_CAPREL speichert!? Das ist ja ne recht feine Sache! Bei sehr 
langsamen Drehzahlen bietet sich ja dann an den Timer bis 3,355 sec 
laufen zu lassen. Die Auflösung die dann entsteht reicht immernoch dicke 
aus!

Nun angenommen der Motor bleibt plötzlich stehen. Es kommt also keine 
Flanke mehr von der Lichtschranke am Timer 5 an. Dann tut er auch nichts 
mehr am CAPREL Register schreiben sondern erst wenn wieder eine Flanke 
kommt oder!?
Dann müsste ich für nen Timer 5 Overflow noch einen Interrupt einrichten 
wo dann das Register gleich 0x0000 gesetzt wird um zu signalisieren, 
dass der Motor sich nichtmehr dreht.
Der CAPREL Registerwert 0 ist ja eigentlich ein Äquivalent zu einer 
Zeit. Dann kann man ja den Registerwert 0x0000 beim Lesen als "keine 
Drehzahl" annehmen...

Ist diese Überlegung korrekt oder tut der Timer 5 wenn er überläuft auch 
ohne Interrupt eine 0 in das CAPREL Register einschreiben?

Gruß!

von TManiac (Gast)


Lesenswert?

Hi,

>Ist diese Überlegung korrekt oder tut der Timer 5 wenn er überläuft auch
ohne Interrupt eine 0 in das CAPREL Register einschreiben?

Nein, ganz so viel Luxus gibt es dann wohl auch nicht.
Der Rest stimmt aber alles. Ich nutze die Konfiguration auch als Quelle 
für den Drehzahlwert bei meiner Kennfeldzündung. Den Wert 0x0000 Schreib 
ich nicht erst ins CAPREL, sondern schalte bei einen Überlauf gleich den 
Ausgang ab.

Das Automatische Speichern ist genau das Capture. Falls du noch irgend 
welche Zeiten messen musst. Aber nur der T5 kann sich bei einem 
Interrupt auch automatisch wieder auf 0x0000 setzen.

Mal noch als Überlegung:
3 Sekunden bis zur Erkennung des Stillstands sind sehrsehr lang. Drehst 
du den Motor wirklich so langsam? Probier auch kürzere 
Perioden/schnelleren Timertakt. ( 3 Sek pro U = 20 U pro min )

von Markus Berend (Gast)


Lesenswert?

Hi TManic,

es kann durchaus vorkommen, dass der Motor auch nur eine Umdrehung pro 
Sekunde macht. Das ist auch so ziemlich das langsamste mit dem man 
diesen Motor drehen kann. Weniger Spannung am Motor und er bleibt 
stehen.

Eigentlich würde es sich ja dann anbieten eine Periode für den Timer 5 
zu wählen die etwas über der einen Sekunde liegt um diese 
Minimaldrehzahl gerade so noch zu erfassen.
Bei einem Timerblock Prescaler von 8 und einem Prescaler für den Timer 5 
von Fcpu / 1024 würde man einen Overflow von 1,678 Sekunden erhalten. 
Der nächs kleinere Overflow Wert wäre 838,861ms. Muss mal sehen, 
vielleicht reicht mir diesesr Wert auch noch. Muss halt mal genau die 
Umdrehungszeit bei Mindestspannung messen.

Dann bin ich mal gespannt ob alles so läuft wie ich mir das Vorstelle 
wenn ichs realisiere :-)

von Alpha D. (Firma: Privat) (mhidou6)


Lesenswert?

Hallo
Ich habe dein Problem gelesen und möchte dich fragen mit welchem CAPCOM 
hast du das realisiert .ich habe das gleiche Problem .ich musse die 
Drehzahl eines Motors messen  .und das wollte ich eigentlich mit dem 
CAPCOM0// Timer T0 aber irgendwie klappt das bei mir nicht .
wie kann ich den die Zeit der Timer Ablesen ?
vielleicht kannst du mir ja helfen
Danke

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.