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
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.
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.
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.
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
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.
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?
Thomas W. schrieb: > Wie aber detektiert man den Spannungsausfall und schreibt dann OHNE > SPANNUNG noch einen Wert weg???? - Brown-Out-Detection - Stützkondensator/ Akku
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.
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.
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
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.
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.
>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.
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.
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.
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
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
Ich Sag nur Glasmaßstab! Die können heute die Absolute position ohne Referenzfahrt zurückgeben. Ist allerdings auch nicht billig.
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.
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...
Schau mal bei CONR.. in den Sonderkatalog Modellbau. Die sind aus Alu, welche man aufbohren kann. Oder eine Zwischenhülse einsetzen.
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
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
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
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.
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
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....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.