Forum: Mikrocontroller und Digitale Elektronik Tachosignal aus Hall-Sensoren von EC Motoren generieren


von Dominik H. (dominik_ulm)


Lesenswert?

Hallo und guten Tag zusammen!

Kurz zum Hintergrund meiner Problematik:
Ich betreibe einen Maxon EC6 mit Hallsensoren und einer starken 
Untersetzung. Ungeregeltes Bewegen funktioniert mit der aktuellen 
Elektronik (Allegro A4915 Motortreiberbaustein) problemlos, ich möchte 
dem Motor aber gerne eine Positionsregelung verpassen.
Einen zum Motor gehördenen Encoder zu benutzen, kommt aufgrund des 
beschränkten Bauraums leider nicht in Frage, der Motor würde für die 
mobile Anwendung dann zu lang werden.
Stattdessen folgender Gedanke:
Ich untersetze sehr stark (221:1) und übertrage das ganze anschließend 
auf eine Schwenkmechanik welche mit 2 Umdrehungen der 
Getriebeabtriebswelle 100° Schwenkbewegung macht. Hier ist mir eine 
Positioniergenauigkeit im Bereich von 1° völlig ausreichend. D.h. ich 
habe rechnerisch 440 Motorumdrehungen für den vollen Bewegungsumfang, 
d.h. ca. 4 Motorumdrehungen pro 1° Schwenkbewegung.
Ich würde jetzt gerne einfach die Hallsensor-Signale des EC-Motors 
nutzen um meine Positionsbestimmung durch zu führen. (Zwar an sich nur 
eine sehr "grobe" Positionsbetsimmung, bei 4 Umdrehungen pro gewünschtem 
1° Genaugikeit aber völlig ausreichend). Ich habe mir überlegt die 
Hallsensor-Signale z.B. auf die entsprechenden Counter Eingänge meines 
µC (z.Z. PIC18F25K22) zu legen. Um eine Richtungsinformation zu 
erhalten, langt einfaches Mitzählen nicht, ich muss hierfür bei jeder 
Signaländerung einen Interrupt auslösen und die (gespeicherten) alten 
Zustände der Hallsensoren mit den aktuellen vergleichen. Sollte 
eigentlich kein Problem darstellen.
Aaaaber:
Bei einer Nenndrehzahl von 750 1/s des Motors und 6 Zustandsänderungen 
pro Umdrehung bekomme ich alle (1/(750*6))=0,000222s einen Interrupt.
Ich befürchte, nun zwei Dinge, erstens wird mir die Zeit zum ausführen 
des eigentlichen Regelungsalgorithmus sehr eng werden (sollte aber 
trotzdem lösbar sein).
Zweitens bekommt der µC seine Sollwerte via I2C übermittelt.
Dessen Interrupt braucht meiner Erfahrung nach höchste Priorität, da die 
Kommunikation sonst Probleme bereitet. D.h. entweder verliere ich 
während der Kommunikation Positionsinformationen, weil im worst Case 
mehrere Hallsensro-Interrupts hintereinander nicht abgehandelt werden, 
oder ich störe meine Kommunikation :(
Jemand eine Idee, wie das gelöst werden könnte? Gibt es vielleicht 
Logik/Tachobausteine (gerne BUS-fähig) die aus den Hallsensor-Signalen 
ein einfaches Rechtecksignal und ein FORWARD/BACKWARD Signal generieren?
Ich habe bereits nach EC-Motortreibern gesucht, es gibt welche mit 
Tachofunktion, die genau das ausspucken, aber meine sonstigen 
Spezifikationen leider nicht erfüllen (Riieeeeßige Teile). :(

Sorry für soviel Text, habe versucht, dass Problem und meine Gedanken 
dazu so detailiert wie Möglich zu beschrieben.

Danke für lesen und mitdenken,
Dominik

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Vergiss das mit dem Flanken-Interrupt. Nimm einen Timmer und schau dir 
zyklisch den Zustand der drei Hallsensor-Leitungen an. Die Auswertung 
funktioniert dann im Prinzip genauso wie bei einem Encoder mit 2 
Signalen, Tabellen-basiert. Das sind nur wenige Zeilen Code, die im 
Timer-Interrupt benötigt werden.

Edit: Ein "Tacho" gibt übrigens ein analoges, von der Geschwindigkeit 
abhängiges Signal. Das ist sichelich nicht das was du meinst?! Du redest 
vermutlich von einem Encoder-Signal. Dein Hallsensor ist aber nichts 
anderes, nur mit 3 statt mit 2 Spuren.

Mit freundlichen Grüßen
Thorsten Ostermann

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Thorsten Ostermann schrieb:
> Vergiss das mit dem Flanken-Interrupt. Nimm einen Timmer und schau dir
> zyklisch den Zustand der drei Hallsensor-Leitungen an. Die Auswertung
> funktioniert dann im Prinzip genauso wie bei einem Encoder mit 2
> Signalen, Tabellen-basiert. Das sind nur wenige Zeilen Code, die im
> Timer-Interrupt benötigt werden.

Das würde ich nicht machen, da die Abtastrate immer >=5 kHz liegen 
müßte, um 0,222 ms Impulsabstand zu erkennen. Da sind die 
Flanken-Interrupts angenehmer ;-)

Dominik H. schrieb:
> Zweitens bekommt der µC seine Sollwerte via I2C übermittelt.
> Dessen Interrupt braucht meiner Erfahrung nach höchste Priorität, da die
> Kommunikation sonst Probleme bereitet.

Dann stimmt etwas mit Deiner IIC-Übertragung nicht, oder erledigt der 
PIC das nicht mit Hardware?

von Dominik H. (dominik_ulm)


Lesenswert?

Thorsten Ostermann schrieb:
> Vergiss das mit dem Flanken-Interrupt. Nimm einen Timmer und schau dir
> zyklisch den Zustand der drei Hallsensor-Leitungen an. Die Auswertung
> funktioniert dann im Prinzip genauso wie bei einem Encoder mit 2
> Signalen, Tabellen-basiert. Das sind nur wenige Zeilen Code, die im
> Timer-Interrupt benötigt werden.
>
> Edit: Ein "Tacho" gibt übrigens ein analoges, von der Geschwindigkeit
> abhängiges Signal. Das ist sichelich nicht das was du meinst?! Du redest
> vermutlich von einem Encoder-Signal. Dein Hallsensor ist aber nichts
> anderes, nur mit 3 statt mit 2 Spuren.
>
> Mit freundlichen Grüßen
> Thorsten Ostermann

Hi Thorsten,
was spricht gegen den Flankeninterrupt? Ist doch eigentlich einfacher, 
als die Alternative, vor allem wird nur dann ausgelöst, wenn wirklich 
nötig.
Was dann abgehandelt wird, ist ja eine andere Fragestellung.

Tacho war die beste Bezeichung die mir einfiel. Am besten wäre ein 
Rechtecksignal mit Flankenwechsel pro Kommutierungsänderung und ein 
Kanal High/Low für Vorwärts/Rückwärts, so spucken es auch die 
EC-Treiberbausteine aus. Das wäre µC-seitig deutlich 
einfacher/blitzschnell zu handeln.

von npn (Gast)


Lesenswert?

Thorsten Ostermann schrieb:
> Edit: Ein "Tacho" gibt übrigens ein analoges, von der Geschwindigkeit
> abhängiges Signal. Das ist sichelich nicht das was du meinst?! Du redest
> vermutlich von einem Encoder-Signal.

Weder - noch :-)
Als Tachosignal wird im allgemeinen bei BLDC-Ansteuerung und Encodern 
ein Signal verstanden, was einen Impuls mit einer bestimmten Pulslänge 
pro Umdrehung liefert. Der hat auch keine Richtungsinformation. Einfach 
nur ein Impuls pro Umdrehung. Daraus kann die Geschwindigkeit mittels 
Integrator erzeugt werden (die ist dann analog). Oder eben eine 
Information, ob der Motor überhaupt dreht. Also die Bezeichnung 
"Tachosignal" ist in diesem Zusammenhang schon völlig korrekt.

von Dominik H. (dominik_ulm)


Lesenswert?

m.n. schrieb:
> Thorsten Ostermann schrieb:
>> Vergiss das mit dem Flanken-Interrupt. Nimm einen Timmer und schau dir
>> zyklisch den Zustand der drei Hallsensor-Leitungen an. Die Auswertung
>> funktioniert dann im Prinzip genauso wie bei einem Encoder mit 2
>> Signalen, Tabellen-basiert. Das sind nur wenige Zeilen Code, die im
>> Timer-Interrupt benötigt werden.
>
> Das würde ich nicht machen, da die Abtastrate immer >=5 kHz liegen
> müßte, um 0,222 ms Impulsabstand zu erkennen. Da sind die
> Flanken-Interrupts angenehmer ;-)
Sehe ich auch so.
>
> Dominik H. schrieb:
>> Zweitens bekommt der µC seine Sollwerte via I2C übermittelt.
>> Dessen Interrupt braucht meiner Erfahrung nach höchste Priorität, da die
>> Kommunikation sonst Probleme bereitet.
>
> Dann stimmt etwas mit Deiner IIC-Übertragung nicht, oder erledigt der
> PIC das nicht mit Hardware?
Tut er an sich. Meiner Erfahrung nach (Und frag bitte nicht wieso :D) 
macht das I2C-Modul zicken, bzw ist nicht mehr ansprechbar, wenn es nach 
auslösen seines Interrupts zu lang warten muss.
Und selbst wenn das glatt geht, muss ich ja trotzdem die ankommenden 
Daten in meine Variablen schreiben, wenn ihr der Zeit mehr als ein 
Flanken-Interrupt kommt, gehen die mir wahrscheinlich verloren. 
Theoretisch wäre es möglich das hinzubekommen, wenn sichergstellt ist, 
dass die Kommunikation inklusive abspeichern weniger lang dauert, als 
ein Kommunikationszyklus. Bzw. um den Worst-Case anzunehmen unterbechen 
des Flanken-Interrupts, abhandeln der Kommunikation und zurückspringen 
in die Routine des Flankeninterrupts.
Jemand ne Idee, ob man das irgendwie berechnen kann, oder am besten über 
Pin-toggle am Oszi misst, wie lang das jeweils dauert?

von npn (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal ein Ausschnitt aus dem L6235, wo man sieht wie der Tacho-Impuls 
aus den Hallsignalen mittels MMV erzeugt wird.

von m.n. (Gast)


Lesenswert?

Dominik H. schrieb:
> Meiner Erfahrung nach (Und frag bitte nicht wieso :D)
> macht das I2C-Modul zicken, bzw ist nicht mehr ansprechbar, wenn es nach
> auslösen seines Interrupts zu lang warten muss.

Das würde ich abklären. Ist dort ggf. ein Timeout vorhanden, den man 
höher setzen könnte?
Mit PICs kenne ich mich nicht aus, aber ein Flankeninterrupt mit Zähler 
sollte doch in weniger als 5 µs abgehandelt sein.

IIC nehme ich immer gerne, wenn der µC schon viele Interrupts zu 
bedienen hat und IIC geduldig auf die Bearbeitung warten kann. 
Vielleicht ginge bei Dir auch Polling.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo "npn",

> Thorsten Ostermann schrieb:
>> Edit: Ein "Tacho" gibt übrigens ein analoges, von der Geschwindigkeit
>> abhängiges Signal. Das ist sichelich nicht das was du meinst?! Du redest
>> vermutlich von einem Encoder-Signal.
>
> Weder - noch :-)
> Als Tachosignal wird im allgemeinen bei BLDC-Ansteuerung und Encodern
> ein Signal verstanden, was einen Impuls mit einer bestimmten Pulslänge
> pro Umdrehung liefert.

Soso. Wer definiert denn hier, was "im Allgemeinen" bedeutet? In der 
elektrischen Antriebstechnik gibt bzw. gab es analoge Tachogeber. Wenn 
jemand Tachosignal sagt, geht man in der Antriebstechnik davon aus, dass 
ein solches Signal gemeint ist.
http://de.wikipedia.org/wiki/Tachogenerator

Mit freundlichen Grüßen
Thorsten Ostermann

von npn (Gast)


Lesenswert?

Thorsten Ostermann schrieb:
> Hallo "npn",
>
>> Thorsten Ostermann schrieb:
>>> Edit: Ein "Tacho" gibt übrigens ein analoges, von der Geschwindigkeit
>>> abhängiges Signal. Das ist sichelich nicht das was du meinst?! Du redest
>>> vermutlich von einem Encoder-Signal.
>>
>> Weder - noch :-)
>> Als Tachosignal wird im allgemeinen bei BLDC-Ansteuerung und Encodern
>> ein Signal verstanden, was einen Impuls mit einer bestimmten Pulslänge
>> pro Umdrehung liefert.
>
> Soso. Wer definiert denn hier, was "im Allgemeinen" bedeutet? In der
> elektrischen Antriebstechnik gibt bzw. gab es analoge Tachogeber. Wenn
> jemand Tachosignal sagt, geht man in der Antriebstechnik davon aus, dass
> ein solches Signal gemeint ist.
> http://de.wikipedia.org/wiki/Tachogenerator
>
> Mit freundlichen Grüßen
> Thorsten Ostermann

Guten Morgen Torsten,

ich schrieb aber nicht von ausdrücklich analogen Tachogeneratoren, 
sondern vom Begriff "Tachosignal" bei Ansteuerung von BLDC-Motoren. Und 
dort gilt als Tachosignal nun mal ein Impuls-Signal, dessen 
Impulshäufigkeit von der Drehzahl abhängt. Ich habe noch das Beispiel 
vom L6235 (zwei Beiträge darunter) angehängt. Und bei PC-Lüftern 
beispielsweise (die ja auch mit BLDC angetrieben werden) heißt das 
genauso "Tachosignal". Da wird einmal pro Umdrehung ein Impuls fester 
Länge gebildet. Im Gegensatz zu den Hall-Signalen, deren Impuls ja immer 
bis zum Beginn der nächsten Kommutierungsphase dauert und damit dessen 
Länge von der Drehzahl abhängt.

Damit will ich nur sagen, ich habe nicht von "im Allgemeinen" 
gesprochen, sondern "im allgemeinen bei BLDC-Ansteuerung". Und daß die 
Begriffe je nach Anwendungsgebiet unterschiedliche Bedeutung haben 
können, wissen wir ja beide, oder? Was heißt zum Beispiel 
"Transmission"? Die einen kennen das Wort nur aus der Zeit, als 
Maschinen mit Lederriemen von der Decke aus angetrieben wurden. Die 
anderen sagen, das ist die Durchlässigkeit eines Materials. Der Dritte 
denkt an die Register-Kopplung von Orgeln und der Vierte meint damit 
eine Funkübertragung. Und alle haben sie Recht. Aber eben in ihrem 
speziellen Anwendungsfall.

So ist es auch mit dem Begriff "Tachosignal". Er sagt lediglich aus, daß 
eine Geschwindigkeitsinformation vorhanden ist. Ob die jetzt analog oder 
digital oder sogar in Form eines Zahlenwertes auf dem CAN-Bus vorliegt, 
bleibt es doch ein Tachosignal.

Einverstanden? :-)

von S. K. (hauspapa)


Lesenswert?

>Wenn jemand Tachosignal sagt, geht man in der Antriebstechnik davon aus

Das ist eben nur die halbe Wahrheit. Die andere Hälfte ist, das z.B. 
jeder Lüfter mit Tachoausgang ein digitales "Ich dreh mich mit..." 
rausgibt. Das ist wenn man Lüfter synchronisieren will um akustische 
Schwebungen loszuwerden auch gut so.

Dein Problem lässt sich mit einem Timer auf external clock source 
bewältigen. Der zählt halt einfach vor sich hin und ab und zu fragst Du 
wie weit er schon ist. Die Drehrichtung musst Du natürlich eigenständig 
händeln.

Evtl. können Deine Timer auch Quadratursignale direkt verarbeiten. Schau 
Dir einmal bitte:
http://ww1.microchip.com/downloads/en/AppNotes/00696a.pdf an und 
Vergleiche mit Deinem Controller.

viel Erfolg
hauspapa

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo "npn",

> So ist es auch mit dem Begriff "Tachosignal". Er sagt lediglich aus, daß
> eine Geschwindigkeitsinformation vorhanden ist. Ob die jetzt analog oder
> digital oder sogar in Form eines Zahlenwertes auf dem CAN-Bus vorliegt,
> bleibt es doch ein Tachosignal.
>
> Einverstanden? :-)

Na gut ;)

Mit freundlichen Grüßen
Thorsten Ostermann

von S. K. (hauspapa)


Lesenswert?

>Gibt es vielleicht
>Logik/Tachobausteine (gerne BUS-fähig) die aus den Hallsensor-Signalen
>ein einfaches Rechtecksignal und ein FORWARD/BACKWARD Signal generieren?

Altmodische Lösung:

Onsemi MC33039 als Taktquelle
und ein Zustandsautomat aus 1x74HC175 und 2x74HC00

Das ganze bedient dir 2 Timer mit externer Taktquelle. Einer zählt 
Schritte rechts rum, der andere Schritte links herum oder 1 Timer mit 
up/down.
Auf 6 Positionen pro Umdrehung genau.

Den Zustandsautomaten mit 3 ICs könnte man genauso altmodisch in eine 
Eprom mit mindestens 7 Adress und 5 Datenleitungen schreiben. Ohne 
Zusatzlogik mit 3 Position pro Umdrehung.

Ein kleiner 8 Haxel PIC oder Attiny in Endlosschleife nur für diese 
Aufgabe macht das sicher ohne weiteres drum herum. Ein 6 Beiner geht 
auch, dann aber nur 4 Positionen pro Umdrehung.

Irgendwie klingt Dein Problem sehr "dienstlich".

viel Erfolg
Hauspapa

: Bearbeitet durch User
von S. K. (hauspapa)


Lesenswert?

Eigentlich sollte direktes Mitzählen bei >1ms zwischen den Interrupten 
auch für den Hauptproessor keine grosse Hürde sein. Um grosse Handstände 
zu vermeiden sollte der Interrupt innerhalb 200us angesprungen werden. 
Der gesamte Drehbereich passt in eine 16 bit Variable, alles andere 
passt in 8 bit. Das gibt <1% zusätzliche Prozessorlast. Die 
Interruptdauer (Einsprung, Pins einlesen, Vergleich, Zähler 
increment/decrement, Rücksprung)müsste man ausprobieren, kann aber nicht 
sonderlich lange dauern.
Eins sauberes Gesamtkonzept vorausgesetzt...

viel Erfolg
Hauspapa

von Dominik H. (dominik_ulm)


Lesenswert?

S. K. schrieb:
>>Gibt es vielleicht
>>Logik/Tachobausteine (gerne BUS-fähig) die aus den Hallsensor-Signalen
>>ein einfaches Rechtecksignal und ein FORWARD/BACKWARD Signal generieren?
>
> Altmodische Lösung:
>
> Onsemi MC33039 als Taktquelle
> und ein Zustandsautomat aus 1x74HC175 und 2x74HC00
>
> Das ganze bedient dir 2 Timer mit externer Taktquelle. Einer zählt
> Schritte rechts rum, der andere Schritte links herum oder 1 Timer mit
> up/down.
> Auf 6 Positionen pro Umdrehung genau.
>
> Den Zustandsautomaten mit 3 ICs könnte man genauso altmodisch in eine
> Eprom mit mindestens 7 Adress und 5 Datenleitungen schreiben. Ohne
> Zusatzlogik mit 3 Position pro Umdrehung.
>
> Ein kleiner 8 Haxel PIC oder Attiny in Endlosschleife nur für diese
> Aufgabe macht das sicher ohne weiteres drum herum. Ein 6 Beiner geht
> auch, dann aber nur 4 Positionen pro Umdrehung.
>
> Irgendwie klingt Dein Problem sehr "dienstlich".
>
> viel Erfolg
> Hauspapa

Hallo Hauspapa,

Danke für die Anregungen. Werde ich mir mal in Ruhe zu gemüte führen :)
Was verstehst du unter dienstlich?

LG
Dome

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.