Schrittmotor Position speichern. Wo?

OP #2232076
Lesenswert?

Hallo

Ich möchte die Position eines Schrittmotors speichern.
Der Schrittmotor läuft bei mir von 0 is 9600 Steps in z.B. 4 Minuten.

Dabei gibt es soll Positionen (alle 32 Steps), an denen er anhalten 
könnte.

Was aber, wenn jemand die Spannungsversorgung während des Laufens
ausschaltet?

Dazu müßte ich die Ist-Position bei JEDEM Step abspeichern, damit der uC 
nach dem Einschalten den ctr weiter zählen kann, um auf die richtige 
Position zu kommen.

Wo speichere ich nun mit einem PIC solche Werte?
Ständig das EEPROM beschreiben?
Was passiert, wenn die max. Anzahl Schreibzyklen überschritten wird?
Dann müßte ich ja den PIC austauschen... das geht garnicht.

Was gibt es noch für Möglichkeiten schnell und vor allem unendlich oft 
einen Wert(2 Byte) abzuspeichern?

Gruß
Thomas
Gast #2232082
Lesenswert?

die Frage ist ob speichern dich wirklich weiter bringt. Was ist wenn der 
Strom weg ist und jemand an dem Schrittmotor dreht?

Eventuell ist es sinnvoller einen Sensor zu verwenden der dir die 
Position zurückgibt.
Gast #2232098
Lesenswert?

Bei incrementaler Positionserfassung benötigst Du eine Referenz. Auch 
muß das System tolerant gegenüber Fehlpositionierungen sein, denn auch 
Dein µC kann sich mal "verzählen".
Sollten beide Bedingungen nicht vorliegen, dann mußt Du ein absolutes 
Meßprinzip verwenden.
OP #2232106
Lesenswert?

Sensor ist vorhanden.
Der wirkt/kalibiriert aber immer erst, wenn eine Zielposiiton erreicht 
ist.
Auch dann soll die ISTPosition abgespeichert werden.

Ringbuffer im EEPROM ist eine gute Idee.

Wie aber detektiert man den Spannungsausfall und schreibt dann OHNE 
SPANNUNG noch einen Wert weg????

Gruß
Thomas
Gast #2232113
Lesenswert?

Thomas W. schrieb:
> Wie aber detektiert man den Spannungsausfall und schreibt dann OHNE
> SPANNUNG noch einen Wert weg????

jain, du musst schnell genug sein, man kann die Spannung vor dem 
Spannungsregler messen und hat dann noch ein paar ms zeit wo die 
schaltung vom Kondensator versorgt wird.
Gast #2232114
Lesenswert?

Die Schildbürger haben einfach einen Ritz ins Boot gemacht, damit sie 
die versenkte Glocke im See "wiederfinden".

Wenn Du z.B. Position 417 Dir merkst, muß der Motor bedingt durch 
Masseträgkeit nicht mehr dort stehen wo Du denkst. Eine Schlitzscheibe 
mit Erkennung der Null-Position wäre eine Idee od. ähnlich wie beim 
Floppy auf den Rand fahren und dann neu die Schritte zählen?
Gast #2232139
Lesenswert?

Ob die ist Position bei Spannungsausfall noch ins EEPROM
gerettet werden kann oder nicht, ist nach meiner Erfahrung
nebensächlich, weil bei Spannungsausfall der Schrittmotor
immer noch etwas nachläuft, wg. Massenträgheit, die Istposition
stimmt dann sowieso nicht mehr zuverlässig.

Somit ist eine Neuinitialisierung aus einer definierten Lage
heraus sowieso erforderlich.

Wenn absolute Lageerkennung nötig ist würde ich eher zu einer
optischen Positonserfassung raten, da sind dann halt mehrere
Lichtschranken nötig.
Gast #2232146
Lesenswert?

Spannungsausfall kann man am Netzteil z.B. über Optokoppler prüfen. Aber 
ob der Motor dann noch in der Position steht wo Du glaubst?? Je nach 
mechanischer Belastung muß der Motor auch nicht da stehen wo Du 
möchtest.
OP #2232171
Lesenswert?

Hi

Ok, dann müßte ich mir also die letzte SOLL Position merken.

Nach Spannungsausfall Nullpunkt anfahren/kalibrieren und von dort die 
letzte SOLL Position anfahren.

Das ist alles ein bißchen blöd, weil meine Sensor 360 Grad Drehwinkel 
mißt, ich aber insgesamt 6 mögliche volle 360 Grad Umdrehung benötige.
Da wollte ich eigentlich am Schrittcounter festmachen, in welcher 
Umdrehung ich gerade bin. Eventuell muß ich diesen Wert auch noch 
Speichern.

Nichtsdestotrotz bleibt die Frage, wo man Daten ablegt, wenn man 
innerhalb der Lebenszeit eines Prozessors mehr Schreibzugriffe benötigt, 
als das EEPROM verkraftet?

Gruß
Thomas
Gast #2232244
Lesenswert?

>Was gibt es noch für Möglichkeiten schnell und vor allem unendlich oft
>einen Wert(2 Byte) abzuspeichern?
Dafür hat man mal den Microprozessor erfunden, wo man in eine Zelle 
EEPROM/RAM immer den aktuellen Wert beliebig oft hineinschreiben kann 
:-)
Und es kommt darauf an, wie es mechanisch aussieht. Verrate es doch mal.
Laß einfach nach Wiederkehr des Stromes den SM gegen NULL fahren und 
zähl die Schritte.
Fertig.
#2232254
Lesenswert?

Man koennte sich auch ueberlegen was ein stromausfall bedeutet. Wenn der 
Strom ausfaellt, im klassischen Sinne, dann macht erst der Schittmotor 
nichts mehr, bevor der Controller nichts mehr macht. Es waere zumindest 
denkbar den Controller im Sleepmodus ab Batterie oder supercap mit ein 
paar uA weiterlaufen zu lassen und zu hoffen, dass der Strom hinreichend 
schnell wieder kommt.
Ich wuerde mich auch meinen Vorrednern anschliessen, wenn ein 
Stromausfall ein Problem ist, sollte man das loesen. Den Controller kann 
man leichter weiter laufen lassen. Das Problem wird eher der Motor sein.
Gast #2232286
Lesenswert?

Ideen zur Hardware:

Sicher geht das nur dadurch, dass der Ausfall der Stromversorgung 
erkannt wird. Am Besten vor den Gleichrichtern.
> Dabei gibt es soll Positionen (alle 32 Steps), an denen er anhalten
könnte.
Puffere die Stromversorgung des Schrittmotors und des µC so, dass die 32 
Schritte auch nach Ausfall der Stromversorgung sicher möglich sind.

Erkenne ob das Netzteil Strom liefert. Wenn die Stromversorgung ausfällt 
(oder das Gerät ausgeschaltet wird), startet folgendes Notprogramm:
* Steuere zum nächsten Haltepunkt und halte dort an (natürlich nur, wenn 
der Stepper bereits läuft)
* Schreibe die Position ins EEPROM. Ein EEPROM verträgt >10000 
Schreibzyklen (genauer Wert s. Datenblatt), täglich zweimal Schreiben 
entspricht einer Lebensdauer von ca. 13 Jahren. Das sollte ausreichend 
sein.

Wenn es sich jemand zum Spiel macht, immer wieder absichtlich die 
Stromversorgung zu kappen, dann ist er selber schuld, wenn die 
EPROM-Zelle in kürzerer Zeit kaputt geht.
Oder einen Zähler einbauen (und im EEPROM speichern), der die 
Schreibvorgänge mitzählt. Nach der halben maximalen Anzahl 
(=Sicherheitsfaktor 0,5) auf die nächsten Speicherzellen wechseln. 
Hiefür wird noch zusätzlich eine Speicherzelle benötigt, die auf die 
aktuell zu verwendenden Speicherzellen zeigt.

Das Problem, dass Drehungen die von aussen erfolgen nicht erfasst 
werden, besteht weiterhin. Dies kann nur mechanisch registriert werden 
um bei Prozessorstart die aktuelle Position abzufragen. Wobei eine 
schrittgenaue Erfassung evtl. nicht ohne ist. Zusammen mit den 6 
Umdrehungen fällt mir als Idee spontan ein, dies durch zwei abzutastende 
Scheiben zu realisieren (ähnlich stunden- und Minutenzeiger einer Uhr). 
Damit hat sich aber auch das EEPROM-Problem erledigt.
OP #2232380
Lesenswert?

Hi

Danke für die Ideen!

Ich könnte mit Zahnrädern arbeiten 1:6.
Dabei jedes Zahnrad mit Sensor ausrüsten.

Habe aber schon mit Zahnrädern experimentiert und hatte immer 
Laufgeräusche. Muß dazu sagen, daß ich lange im Internet gesucht habe 
und keine passenden Zahnräder gefunden habe:

Wunsch:
Motor 5mm Achse (Ritzel z.B. 10 Zähne Modul 0,5)
Wichtig: Befestigung mit Inbusschraube)

2. Welle 4mm Achse (Zahnrad mit 60 Zähnen Modul 0,5)
Wichtig: Befestigung mit Inbusschraube)

Momentan hab ich Zahnräder, die ich aufbohren muß, damit sie gepreßt 
passen. Bekomme die Bohrung aber nicht hin, da sich der Kunsstoff nicht 
gerade einspannen läßt, weich, verformt sich etwas. Dadurch wir alles 
schief und eiert etwas -> Geräusche!


P.S. Aber auch da darf ich dann niemals über den Maxwert des großen 
Zahrades kommen, sonst denkt er, daß er auf der anderen Seite ist :-)
Das läßt sich aber per Software einrichten.

Gruß
Thomas
OP #2233569
Lesenswert?

Hmmm

Die interessanten Zahnscheiben dort haben eine Bohrung von 8mm
Meine Konstruktion hat eine 4mm Achse.

Die 10Z Scheibe hat 4mm.
Müßte ich auf 5mm aufbohren.
Wenn das schiefgeht, eiert es wieder :-/

Außerdem recht teuer, die Teile ca. 60 Euro, weil ich ja 2 Riemen 
bräuchte.
Einen zum Antrieb und einen für die Umdrehungsmessung + - 3 Umdrehungen.
Aber wenns funktioniert...

Gruß
Thomas
(Firma: DC3AX) #2233839
Lesenswert?

Also das mechanische problem kann ich nicht lösen.

Aber Idee 2) noch mal aufgegriffen:
Wenn Du nur die Endposition speicherst, wirst Du vermutlich sehr viel 
weniger Speichervorgänge haben und Du weist immer wo du hin sollst, egal 
wo du gerade bist.
Wenn die Mechanik jetzt nicht zu leicht zu verstellen ist durch 
Fremdeinwirkung, dann kannst Du dazu noch speichern, wo Du her kommst. 
Du kennst also dann den Teilabschnitt. Wenn Du jetzt noch eine 
Markierung anbringst, die Dein System erkennen kann, dann kannst Du 
relativ schnell in die richtige Richtung auf Zielposition fahren und 
must nur einen Bruchteil an Schreibzyklen ins EEPROm schreiben.

Viele uC bieten auch eine Möglichkeit im Deep-Sleep sehr lange mit dehr 
wenig Spannung aus zu kommen. Du könntest also Akku/Batterie/GoldCap 
vorsehen und die Werte im RAM halten. Das zuschalten der externen 
Versorgung löst einen Reset aus. Deine Software startet und prüft, ob im 
RAM an verschiedenen Stellen besondere Werte stehen und entscheidet 
dann, ob der Puffer einen gültigen letzten Wert retten konnte, oder 
nicht. Wenn ja, dann entsprechend die letzte Zielposition anfahren, wenn 
nicht, Kalibrieren und Ausgangsstellung.
Zusätzlich zur Reset-Leitung, die durch Ansteigen der 
Versorgungsspannung getriggert wird, musst Du natürlich auch die 
Versorgungsspannung selbst überwachen. Fällt diese Ab, dann schick den 
uC ganz schnell in Deep-Sleep/Halt.

Das läst sich auch recht einfach mit einem eventuell vorhandenen 
Comparator machen. Ein Pin an Vcc (5V) und einen an VBatt (3V). Fällt 
Vcc unter Vbatt gibt der dann einen Interrupt aus, der das System in 
Halt schickt. Das geht so schnell, dass keine unnötige Energie aus der 
Standby-Versorgung abgezogen wird.

Gruß, Ulrich
OP #2233910
Lesenswert?

Hallo Ulrich

Genau so habe ich es jetzt geplant.
Ich werde die letzte IST Position speichern.
Ich werde die letzte SOLL Posiiton speichern.

Wenn es beim Einschalten einen Unterschied gibt, dann fahre ich zurück 
zum IST und wieder neu zum SOLL.

Den Rest muß ich mit sinnvoller Mechanik lösen.
Wobei eine unverwechselbare Positionierung mit zwei Zahnrädern möglich 
wäre, auf die ich dann jeweil einen Drehwinkelsensor platziere.

Gruß
Thomas
Gast #2233937
Lesenswert?

1.Man beachte diverse Ungenauigkeiten zwischen Schrittmotorstellung und 
Drehwinkelsensor. Es wäre an der Zeit den Schleier etwas zu lüften was 
Du mit dem Schrittmotor überhaupt bewegst.

2.Deine IST-Position wird kaum genau sein, weil der wahrscheinlich Motor 
noch Schwung hat.
(Firma: DC3AX) #2233944
Lesenswert?

Allgemein noch mal zu EEPROM:

Bitte beachten, wie das EEPROM organisiert ist. Normalerweise werden I2C 
EEPROMs in Bänken zu je 8/16/32 Bytes organisiert. Bei einem 
Schreibzugriff wird eine Bank in einen Puffer geladen, die zu änderndern 
Daten überschrieben und dann die Bank komplett gespeichert. Möchte man 
die Lebensdauer verlängern, muss man also Offsets in Vielfachen der 
Bankgröße wählen.
Wie das in den uC internen EEPROMs gelöst ist, kann ich nicht sagen, das 
verrät aber das jeweilige Datenblatt.

Beim AVR (ich weiß nicht, wie es beim PIC ist) sollte man Adresse 0 
meiden, da bei einem Spannungsabfall zuerst die Address-Leitungen 
wegkippen, die Lösch-/Schreibspannung aber noch ausreichend anliegt. 
Damit ist nicht nur der Inhalt der zu schreibenden Zelle ungültig, es 
wird auch Adresse 0 zerlegt.
Wer da sicher gehen will, muss zwei Resets auslösen, einen, der bei 
ausreichender Restversorgung einen Interrupt zum Speichern auslöst und 
einen bei niedrigerem Spannungspegel, der dann wirklich den Reset zieht.
Auch die Spannungssicherung im AVR, die das Schreiben des EEPROM/FLASH 
verhindern soll, hilft da übrigens nicht weiter, wenn der Schreibvorgang 
bereits angelaufen ist.

Ist alles für AVR, beim PIC also ggf. mal die AppNotes und Erratas 
durchsehen.

Gruß, Ulrich
Gast #2233989
Lesenswert?

Ulrich P. schrieb:
> Beim AVR (ich weiß nicht, wie es beim PIC ist) sollte man Adresse 0
> meiden, da bei einem Spannungsabfall zuerst die Address-Leitungen
> wegkippen, die Lösch-/Schreibspannung aber noch ausreichend anliegt.
> Damit ist nicht nur der Inhalt der zu schreibenden Zelle ungültig, es
> wird auch Adresse 0 zerlegt.

Dies war nur ein Problem der ersten AVRs, hält sich aber hartnäckig....

Wichtiger ist, die Brown-Out-Detection zu programmieren, denn wenn die 
MCU noch auf einen halben-Haxen läuft, da kann viel schiefgehen (hatte 
schon gelöschte Flash-Pages durch vermutlich irre programm counters....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren