Guten Tag, ich sitze gerade an einem Projekt, wo ich die Frequenzen zweier Signale messen soll. Ich werde höchstwahrscheinlich einen dsPIC der Firma Microchip mit mind. 2 Input-Capture Eingängen zu verwenden. Am Kanal 1 soll das Signal 1 bearbeitet werden. Also im Endeffekt soll bei jeder zweiten fallender Flanke ein Interrupt ausgelöst werden und rechne anschließend die Frequenz aus. Darüberhinaus soll die Anzahl der Perioden mitgezählt werden. Parallel dazu möchte ich am Kanal 2 das Signal 2 mit dem gleichen Prinzip wie am Kanal 1 auswerten. Jetzt werdet ihr euch fragen was das sein soll. Ich habe zwei Zahnräder mit jeweils 60 Zähnen. Zwei Zähne wurden herausgefräßt, um ein Referenz zu haben damit ich die Position kenne. An den jeweiligen Zahnräder befindet sich noch ein Induktiv-Drehzahlgeber. Bei einer Umdrehung tauchen somit 58 Impulse, wobei ein Impuls die dreifache Periode hat als die anderen. Ich möchte im Endeffekt den Phasenunterschied zwischen den beiden Zahnrädern messen und gleichzeitig die Drehzahl. Im ersten Absatz habe ich ja kurz erklärt wie ich da vorgehen will. Bin ich auf dem richtigen Weg? Danke im voraus
> Bin ich auf dem richtigen Weg?
Was denkst DU?
Klingt das ganze für dich nach einem gangbaren Weg?
Denkst du, du kriegst das hin?
Wenn ja - dann machs einfach.
Du musst auch lernen deine eigenen Entscheidungen zu treffen und dazu zu
stehen. Wenn es dein Projekt ist, dann überleg dir, wie du möglichst
schnell mit möglichst wenig Aufwand ein Testprogramm schreiben kannst,
mit dem du feststellen kannst, ob das ganze Erfolg haben könnte oder
nicht.
Du hast den dsPic vor dir, du hast die Hardware vor dir, du hast den
Sensor an den dsPic angekabelt - dann mach Vorversuche in der
Signalauswertung, mach Vorversuche in der Drehzahlmessung (zunächst mal
1 Sensor) und in 30 Minuten weißt du, was Sache ist.
Wir alle müssen unsere Designentscheidungen selbst treffen. Manchmal
gehts gut, manchmal gehts weniger gut und manchmal merkt man in den
Vorstudien, dass man in die Sch... gegriffen hat. Dann muss man sich
halt was anderes überlegen. So ist das nun mal im Berufsleben. Aber auch
du musst deine eigenen Entscheidungen treffen. Das gute daran: Aus
Fehlern lernt man. Das gilt für dich genauso, wie es für uns gilt. Gut,
man muss nicht jeden Blödsinn erst mal ausprobieren um zu sehen, dass es
Blödsinn ist - aber du hast für dich ein Konzept gemacht, du bist davon
überzeugt dass es so klappen könnte, auf den ersten Blick spricht nicht
viel dagegen - dann setz dich hin und probier es aus!
Ja du hast recht.
Ich möchte mich hierfür entschuldigen.
>Was denkst du?
Ich denke, dass es nicht klappen wird. Denn wenn ich im ersten Interrupt
versuche die Position und den Drehzahl zu bestimmen kann es passieren,
dass der 2. Kanal einen Interrupt auslöst und somit das erste nicht
vollständig abarbeiten kann.
Ich habe keinen richtigen Ansatz, womit ich was anfangen kann.
Aus diesem Grund kann ich auch nicht meinen ersten Test machen.
Soll ich lieber zwei µC verwenden und somit die beiden Kanäle separat
bearbeite und mit einem dritten die Phase ausrechne?
Canco schrieb: > Ja du hast recht. > Ich möchte mich hierfür entschuldigen. Du brauchst dich nicht entschuldigen. Ich versteh schon, dass das bei den ersten mal nicht einfach ist. Man will ja auch nichts falsch machen. Und genau da liegt der Trugschluss. Wer radfahren lernen will, muss auch akzeptieren, dass er mal runterfällt. > >>Was denkst du? > > Ich denke, dass es nicht klappen wird. Denn wenn ich im ersten Interrupt > versuche die Position und den Drehzahl zu bestimmen kann es passieren, > dass der 2. Kanal einen Interrupt auslöst und somit das erste nicht > vollständig abarbeiten kann. Ähm. Dir ist aber schon klar, dass so ein µC in Millionstel Sekunden Dinge erledigen kann, für die du Minuten brauchst? Wie weit dreht sich dein Zahnrad in 1 Millionstel Sekunde? Weiters: Dir ist auch klar, was eigentlich der große Trick am Capture Modus eines Timers ist? > Soll ich lieber zwei µC verwenden und somit die beiden Kanäle separat > bearbeite und mit einem dritten die Phase ausrechne? Mach dir eines zur Regel: Die Dinge werden nicht einfacher, wenn man mehrere µC auf ein Problem ansetzt. Ganz im Gegenteil. Es ist naiv zu glauben, dass man einfach nur genügend viele µC auf ein Problem schmeisst und dann löst sich alles irgendwie in Wohlgefallen auf.
@Ingo: Das habe ich vergessen noch mitzuteilen. Ich gehe von max. Drehzahlen von 10.000min^-1. @kabuchegg: Soviel ich weiß passiert beim Input Capture folgendes: Je nachdem wie ich es konfiguiere wird bei abfallender bzw. steigender Flanke am Capture-Eingang der aktuelle Wert eines Timers ins Buffer geschrieben. Wenn man nun bei jeder zweiten abfallender bzw. steigender Flanke einen Interrupt auslöst und die Differenz der beiden Werten, die im Buffer stecken, ausrechnet hat man nun die Periodendauer. Im Interruptroutine kann man noch eine Variable höchzählen lassen um die Position ausrechnen zu können. Für einen Kanal klappt dass ja sehr gut (denke ich). Aber was passiert wenn ich zwei Input-Captures laufen lasse und die Interrupts der jeweiligen Kanäle sich überkreuzen? Oder geht das mit nur einem Interrupt?
Mit wieviel millionen U/min drehen denn die Räder, daß Du Zeitprobleme vermutest? Das Input Cature behält den Zeitstempel bis zum nächsten Impuls bei. Ein Delay, weil gerade ein anderer Interrupt läuft, spielt also keine Rolle. Du kannst beide Zeitstempel in aller Ruhe nacheinander auswerten. Das sollte sogar ein 8-Bitter schaffen, z.B. ATmega162.
Canco schrieb: > @Ingo: Das habe ich vergessen noch mitzuteilen. Ich gehe von max. > Drehzahlen von 10.000min^-1. Also 160 Umdrehungen in der Sekunde. Pro Umdrehung kriegst du 60 (eigentlich 58, aber für die Flankendifferenz sind das 60) Pulse. Macht 10000 Flanken pro Sekunde. Von einer Flanke zur nächsten vergehen also 0.0001 Sekunden oder 0.1 Millisekunde. Ein mit 16Mhz getakteter Mega (und der ist im Vergleich zu deinem dsPic wiederrum schnarchlangsam), schafft in dieser Zeit ca. 1500 Befehle abzuarbeiten. > Je nachdem wie ich es konfiguiere wird bei abfallender bzw. steigender > Flanke am Capture-Eingang der aktuelle Wert eines Timers ins Buffer > geschrieben. Wenn man nun bei jeder zweiten abfallender bzw. steigender > Flanke einen Interrupt auslöst und die Differenz der beiden Werten, die > im Buffer stecken, ausrechnet hat man nun die Periodendauer. Im > Interruptroutine kann man noch eine Variable höchzählen lassen um die > Position ausrechnen zu können. Für einen Kanal klappt dass ja sehr gut > (denke ich). Aber was passiert wenn ich zwei Input-Captures laufen > lasse und die Interrupts der jeweiligen Kanäle sich überkreuzen? Dann wartet der eine Interrupt eben so lange bis der andere Interrupt fertig behandelt ist. Ein Mega-µC hätte dazu 1500 Befehle Zeit. Der Zeitstempel geht ja nicht verloren - genau deshalb hast du ja deinen Capture. Solange die Zeitstempel auf jedem der beiden Kanäle stimmen, kannst du die Datenauswertung dazwischen ruhig auch ein bischen verschieben bzw. verzögert machen. Wenn für dich als Mensch die eine Flanke um Vormittag um 9:15 kommt und die nächste Flanke kommt am Nachmittag um 16:57 bzw. auf der zweiten Leitung, die du ebenfalls überwachen musst, kommt die eine Flanke um 9:16 und die andere um 14:10, dann ist es für den zweiten Kanal ziemlich egal, ob du um 9:17 mit der Rechnerei anfängst oder erst nach dem Mittagessen um 12:45, weil du mit dem ersten Kanal so lange beschäftigt warst. Die Zeitstempel müssen stimmen und du musst mit deiner Rechnerei fertig sein, ehe auf demselben Kanal der nächste Messwert eintrudelt. Wenn du aber dazwischen geügend Zeit hast, dann ist das alles kein Problem.
Ok, danke für die schnelle Antwort. Ich gebe mal ein kleines Zahlenbeispiel, um mein Problem zu verdeutlichen. Ich habe ein µC mit 40MIPS. Also eine Instruktion dauert 25ns. Im Kanal 1 (also mein erster Input-Capture Pin) muss ich alle 100µs einen Zeitstempel abholen und im Interruptroutine bearbeiten. Meine Interruptroutine würde vermutlich 1us dauern. Also nach 101µs wäre ich fertig. Dummerweise taucht im zweiten Kanal genau 0,5µs vor dem ersten Kanal ein Start-Flag und im zweiten Flag würde ein Interrupt auftauchen (also bei 100,5µs). Was macht der µC in einem solchen Fall? Was würde man als Gegenmaßnahme vornehmen? Wenn die zwei Interruptroutine durchläuft, springt er dann in die erste Interruptroutine zurück?
Die genaue Zeitmessung übernimmt die Input Capture Hardware. Es macht dabei gar nichts, wenn der µC beschäftigt ist, wenn der Interrupt ausgelöst wird. Das ein Interrutp ansteht wird erst einmal von der Hardware in einem Falg gespeichert. Da hat der µC zeit sich drum zu kümmern bis der nächste Interrupt der gleichen Art kommt. Extra drum kümmern braucht man sich nicht - das macht der µC schon von sich aus richtig. Hier in dem Beispiel muss der µC also nur schnell genug sein, um innerhalb von 100 µs 2 der Interrupts zu verarbeiten. Bei der gar nicht so schlecht geschätzten Zeit von 1 µs für eine ISR reicht das also locker - die restlichen 98 µs langweilt sich der µC. Andersherum ausgedrückt hat man knapp 50 µs Zeit für die ISR. Wenn man es richtig macht, kann man auch bei jedem Impuls die Zeitdifferenz zum Vorgänger berechnen. Es muss also nicht extra zwischen Start und Stopp unterschieden werden.
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.