Forum: Mikrocontroller und Digitale Elektronik Zwei Input Capture parrallel laufen lassen


von Canco (Gast)


Lesenswert?

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

von M. N. (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

> 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!

von Canco (Gast)


Lesenswert?

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?

von Ingo (Gast)


Lesenswert?

Von welchen Drehzalen reden wir hier?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Canco (Gast)


Lesenswert?

@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?

von Peter D. (peda)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Canco (Gast)


Lesenswert?

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?

von Ulrich (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.