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
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
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
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
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ß!
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 )
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.