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.