Forum: Mikrocontroller und Digitale Elektronik Schrittmotor Position speichern. Wo?


von Thomas W. (thomas0906)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

DU kannst den EEPROM als Ringbuffer nutzen, dann wirst du das ausfallen 
vermutlich nicht mehr erleben, zusätzlich kannst du auch den Ausfall der 
Spannung detektieren und erst dann schreiben.

von Peter II (Gast)


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.

von Dorfy (Gast)


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.

von Thomas W. (thomas0906)


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

von Peter II (Gast)


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.

von oszi40 (Gast)


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?

von Ralf (Gast)


Lesenswert?

Thomas W. schrieb:
> Wie aber detektiert man den Spannungsausfall und schreibt dann OHNE
> SPANNUNG noch einen Wert weg????
- Brown-Out-Detection
- Stützkondensator/ Akku

von Anton (Gast)


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.

von oszi40 (Gast)


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.

von (Ein) (Gast)


Lesenswert?

Falls du eine Uhr brauchst... Die DS1307 zB hat einen 
batteriegepufferten RAM.

von Thomas W. (thomas0906)


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

von oszi40 (Gast)


Lesenswert?

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

Entweder extern
oder mit sinnreichem Programm nur den letze Position bei Ausfall.

von Dennis U. (atmegadennis)


Lesenswert?

Du kannst Dir auch überlegen, dein Elektronisches Problem mechanisch zu 
lösen, indem du Deine Übersetzung zum Geber änderst, das deine 6 
Umdrehungen nur noch einer Geberumdrehung entsprechen. Die Frage ist wie 
genau du positionieren musst.

von Michael_ (Gast)


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.

von Purzel H. (hacky)


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.

von Datenverlust (Gast)


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.

von Thomas W. (thomas0906)


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

von oszi40 (Gast)


Lesenswert?

Thomas W. schrieb:
> die ich aufbohren muß, damit sie gepreßt
Zahnrad in Drehmaschine einspannen könnte helfen.

Es bleibt das Spiel Zwischen den Zahnrädern! Schau Dir mal einen alten 
Radio-Drehko an. Da sind deshalb 2 Zahnräder mit einer Feder verspannt.
Bild siehe Wiki 
http://de.wikipedia.org/w/index.php?title=Datei:Kombidrehko.jpg&filetimestamp=20080619084913

von Klaus (Gast)


Lesenswert?

Ich Sag nur Glasmaßstab! Die können heute die Absolute position ohne 
Referenzfahrt zurückgeben. Ist allerdings auch nicht billig.

von Michael_ (Gast)


Lesenswert?

Also, wer mit solchen wackeligen Plastzahnrädern arbeitet, hat kein Geld 
für teure Messmittel.
Aber warum nimmst du keine Zahnriemen?
Die sind präzise und leise.

von Thomas W. (thomas0906)


Lesenswert?

Zahnriemen wären toll.
Aber auch die habe ich nicht passend gefunden:

Zahnscheiben mit Bohrung 5mm.
Schraubbar auf Welle.
Übersetung 1:5.
Riemenlänge ca. 30-40 cm.

Nichts gefunden...

von Michael_ (Gast)


Lesenswert?

Schau mal bei CONR.. in den Sonderkatalog Modellbau.
Die sind aus Alu, welche man aufbohren kann. Oder eine Zwischenhülse 
einsetzen.

von Thomas W. (thomas0906)


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

von Ulrich P. (uprinz)


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

von Thomas W. (thomas0906)


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

von oszi40 (Gast)


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.

von Ulrich P. (uprinz)


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

von tobi (Gast)


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

von Ulrich P. (uprinz)


Lesenswert?

Danke für das Update, tobi.
Die BrownOut ist sehr wichtig!

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.