Daten in EEPROM retten bei Spannungsausfall

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Daten in EEPROM retten bei Spannungsausfall

      Guten Morgen,

      ich habe vor einem halben Jahr für einen Kollegen einen Aufzug auf einem Bahnsteig seiner H0-Anlage gebaut.
      Dabei wird die Bewegung mittels eines Servos realisiert.

      Mein Problem dabei war, dass das Servo, wenn es nicht in Ausgangsposition stand (passierte bei Spannungsausfall
      während der Bewegung), nicht wusste "wo bin ich"!
      Deshalb habe ich mir eine kleine Zusatzschaltung mit einem A302 gebaut, die ein Signal gab, wenn die Spannung am
      Eingang des Sp.-Reglers 8V unterschritten hatte und die Werte im EEPROM abgespeichert hatte.

      Nun will ich mir aber diese Zusatzschaltung sparen und frage nach einer einfacheren Möglichkeit, die Stellwerte
      des Servos bei Wegfall der Spannung zu sichern.

      Hat jemand eine bessere Idee?

      Danke und schönen Sonntag noch
      Jürgen

      Anbei das Servoprogramm, das Video dazu leider nur als EMail bei Interesse
      Files
    • Wäre es nicht einfacher, nach erneutem Starten (Spannung wieder da) immer erst einmal in die eine oder die andere Endposition (mit Endschalter prüfen) zu fahren?
      Nimmst Du den Servo (gehackt?) nur als Motor? Dann mit Endschalter in eine Endposition fahren.
      Ansonsten: Servos haben ja definierte Positionen, dann könntenst Du ohne Endschalter ja direkt am Anfang des Programms sagen, dass der Servo in Position "oben" fahren soll.



      P.S.:
      Schreib auch immer die Stackwerte in Deine Programme:
      Stack-Werte richtig setzen
      Speicheraufbau
    • Denke mal so einfach ist es nicht. Erstmal habe ich keinen Endschalter. Würde ich 2 davon verwenden,
      bräuchte ich keinen Servo sondern einen normalen Getriebemotor, der bei Spannungswiederkehr in
      eine Richtung fährt. Habe ich bei einem Signal so gelöst!
      Wenn aber der Servo irgendwo in der Mitte steht wie soll dann der Impuls zur Ansteuerung aussehen,
      damit er langsam (und das ist wichtig) in die Endlage fährt? Die Pulsweite für die beiden Endstellungen
      sind bekannt. Und das Servo dreht auch um 180°!
    • Das mit dem 'langsam' ist ein gutes Argument...


      Ich sehe drei Ansätze:

      1. Niedrigspannungserkennung:
      Wenn es über Niedrigspannungserkennung laufen soll, brauchtst Du wohl zumindest eine minimale Extrahardware (Spannungsteiler, Optokoppler, Spezial-IC...) an der "Hauptspannung" und Dein Mikrocontroller kann dann über einen Kondensator/Goldcap gepuffert noch letzte Werte im EEPROM speichern. Warum ist eine kleine Extrahardware schlimm? Scheint doch zu funktionieren.

      2. Positionserkennung z.B. mit Graycode oder Poti:
      Sonst könntest Du - falls Platz vorhanden sein sollte (sicherlich nicht der Fall) - an der Seite des Aufzugsschachts einen Graycode befestigen und durch Sensoren die aktuelle Position des Aufzugs ermitteln. Oder es wird über Seile oder Ketten ein Poti mitbewegt, welches die Ermittlung der aktuellen Position ermöglicht. Das ist aber ja alles noch mehr Aufwand als die Niedrigspannungserkennung.

      3. EEPROM-Berechnungen:
      Als dritte Richtung gäbe es noch die gewagte Berechnung, wie man es schaffen kann, das EEPROM nicht kaputt zu schreiben. Wenn man von 100.000 Schreibzyklen je EEPROM-Zelle ausgeht (The EEPROM has an endurance of at least 100,000 write/erase cycles): Wieviele Positionen braucht der Servo pro Fahrt? Eine Position je Millimeter? Bei 10 Zentimeter also 100 Positionen? Bei jeder neuen Position einmal sofort den Wert ins EEPROM schreiben. 100 mal Speichern pro Fahrt. 10 Fahrten pro Tag ergäbe 1000 mal Speichern pro Tag. Dann könnte man 100 Tage Betrieb rechnen, bevor die EEPROM-Zelle vielleicht Schrott ist. Man könnte noch tricksen und die EEPROM-Speicherzelle nach x Schreibvorgängen wechseln. Dadurch könnte man die Anzahl der EEPROM-Schreibvorgänge erhöhen. Nun wirst Du natürlich sagen, dass es durchaus auch mal 100 Aufzugfahrten pro Tag geben kann und das 365 Tage und 30 Jahre lang. Dann müsste man also überschlägig 100 Fahrten mal 100 Positionen mal 365 Tage mal 30 Jahre = 10.950.000.000 Schreibvorgänge ermöglichen... Und wenn man irgendeinen Fehler macht und in einer Loop zu viel ins EEPROM geschrieben wird, dann ist es sowieso zu schnell Schrott. Also riskant... Aber in manchen Situationen kann man vielleicht mit solchen Überlegungen herangehen. 100.000 Schreibzyklen -> 1000 Aufzugfahrten -> 100 Tage -> 1 Jahr. Verteilen auf 250 EEPROM-Speicherstellen -> 250 Jahre... Alles mit Vorsicht. Meine Zahlen und Überlegungen können auch Fehler enthalten.

      Ich bin gespannt auf weitere Ideen.




      Laut Datenblatt:
      Attiny45:
      256 Bytes In-System Programmable EEPROM
      • Endurance: 100,000 Write/Erase Cycles
    • Hi, das "Problem" ist, den controller bei Stomausfall so lange am Leben zu lassen, dass der reagieren kann. Bei fertigen Netzteilen ist das nicht ganz einfach, weil die ja eine mit Elkos gepufferte Ausgangsspannung haben. Am leichtesten ist dein Vorhaben, wenn du das NT selber baust, dann kannst du gleich nach dem Gleichrichter eine Spannung abgreifen, die bei Ausfall sofort zusammen bricht. Vom Gleichrichter weiter über eine Diode zum Elko und Stabilisierung für den controller. Der Elko puffert den Stromausfall, wenn er groß genug ist, eventuell weitere Verbraucher wie Servo oder Beleuchtungen von diesem Elko abkoppeln. Die Steuerleitung vom Gleichrichter über einen Spannungsteiler an einem int-pin vom controller.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Noch eine Idee:
      Es gibt fertige kleine sogenannte Servo-Geschwindigkeitsreduzierer (Servospeed-Reducer).
      Die werden einfach zwischen Steuerelektronik und Servo geschaltet und sind sehr klein.
      Nach meinem Verständnis könnte da der Servo in irgendeiner Position stehen und wenn dann das neue (Endanschlags-)Signal kommt, dann fährt der Servo die Position langsam statt schlagartig an. Wie die das machen, habe ich noch nicht herausgefunden.
      Da wäre nur die Frage, ob das für den normalen Fahrbetrieb störend ist oder ob es da nicht auffällt, weil da ja immer nur zwischen relativ benachbarten Sollpositionen gesprungen wird.
      Kannst Du ja einmal googeln oder ausprobieren.
    • Guten Morgen,

      naja Pluto, eine Netzausfallmeldung habe ich wie oben schon erwähnt mit der kleinen Zusatzschaltung (A302).
      Die wollte ich mir aber sparen! Eine zweite Möglichkeit wäre noch die Spannung mit ADC am Eingang des
      Netzteiles zu messen.
      Zur Zeit schalte ich ja die Bewegung ab sobald die Spannung am Eingang des Netzteiles unter 8V fällt und beschreibe
      dann den EEPROM mit den aktuellen Daten. Der Aufzug fährt alle 30 Sekunden nach unten und nach ca. 4s wieder
      hoch. Eine "Fahrt" dauert ca. 6s. Wenn er oben ist und die Spannung ausfällt, wird der EEPROM nicht beschrieben.
      Also ist mit einem Ausfall pro Tag vielleicht 5mal zu rechnen. Das wären dann 20T Tage und 55 Jahre wenn mein
      Kollege jeden Tag spielt! Und wenn ich dann noch nach 80T die Bank wechseln sollte .... Solange leben auch die
      Ur-Ur-Ur-Enkel nicht.

      Sorry Stephan, das mit der langsamen Bewegung hätte ich explizit erwähnen müssen. Auch den Servospeed-Reducer
      kenne ich und setze einen bei meinen kleinen Booten ein. Ich will diese Leiterkarte aber auch für andere Bewegungen
      wie Schranken, Signale und Wasserkränen benutzen (die fleißigen Chinesen haben mir diese 40mal gebaut) aber jetzt
      fliegen mir bei den Schranken ohne den Zusatz die Schrankenbäume weg!

      Ja tschoeatsch, das Netzteil mit dem "großen" Ladeelko ist mit auf dieser kleinen Platine. Bei Interesse hier mal die
      brd-Datei. Ihr müßt diese vorher nur in "txt" umbenennen. Kann eine brd-Datei hier nicht hochladen. Aber die zip-Datei
      für die Chinesen könnt ihr auch haben.
      Files
      • ATTiny45_3.txt

        (57.67 kB, downloaded 7 times, last: )

      The post was edited 1 time, last by HJH-MD ().

    • Nur geschätzt! Im Sommer hat er mit Haus, Hof und Garten zu tun. Im Hof steht ein zweiflügliches Signal,
      ein Andreaskreuz und viele andere nette Sachen der DR! Er ist über 70 und ich habe auch nur noch ein Jahr
      bis dahin. Und ich spiele nicht sondern baue nur. Und EEPROM -Rechnen wird hier langsam zu albern. Ich habe
      nur nach einer einfacheren Lösung ohne Zusatzschaltung wegen der Platzprobleme gesucht aber noch nicht
      gefunden. Denke es geht auch nicht anders will Mann einigermaßen auf der sicheren Seite sein.

      Denke ich entwerfe mal ein kleines Netzteil für solche Zwecke bei dem diese kleine Schaltung on Board ist!
    • Der Aufzug mit einer Fahrt von 10cm rauf-runter mit Servo ist doch wohl ein Modell-Aufzug, oder?
      Warum ist es denn so essenziell wichtig, dass die Aufzugs-Position nach einem Stromausfall bekannt sein muss?

      Davon abgesehen würde es reichen, die Position (und Richtung) dann zu speichern, wenn der Stromausfall detektiert wird.
      Die Detektion könnte man machen mit Kondensator, Vorwiderstand und Z-Diode. Abgriff vor dem Gleichrichter an einer der Wechsel-Spannungsleitungen.
      Damit hat man ein 50Hz Signal, das man in Controller auswerten kann. Kommt kein Puls innerhalb z.B. 30ms, wird die Position gespeichert und der Servo gestoppt.

      Um den Servo langsam fahren zu lassen, musst du eben nicht in 6s die Servopulse kontinuierlich von 1ms auf 2ms ändern, sondern eben in z.B. 12s für die halbe Geschwindigkeit. Da der interne Servo-Befehl nur 255 Stellungen kennt, und die vielleicht nicht reichen für die Aufzugspositionen, müssen eben Pausen den Schritten eingefügt werden, so wie es @tschoeatsch bereits sagte.

      Ums mal konkreter zu sagen. Der Aufzug soll in 12 Sekunden runter fahren, und es gibt 256 einstellbare Servowerte.
      Dann rechnet man die 12 Sekunden / 256 Servoschritte und erhält die Zeit zwischen den Servo-Positionen. Im dem Fall 46,8ms Pause vor dem weiter stellen der Position.
    • HJH-MD wrote:

      einfacheren Lösung ohne Zusatzschaltung
      z.B. in eigenes Brown out per Ac Int. Sobald die Spannung unter 4V fällt schaltet er Verbraucher ab und speichert die relevanten Werte.

      HJH-MD wrote:

      sobald die Spannung am Eingang des Netzteiles unter 8V fällt
      ist schon sehr viel Zeit vergangen. Ich dachte an einen Ovf Int nach fehlender Welle (25ms), danach sind noch Sekunden übrig. Vielleicht sogar genug den Aufzug runter zu fahren?
      Gerad habe ich ein Klimagerät im Test, das spricht noch ca 30 Sekunden nach Netz Trennung.

      Ps wären Weichen und Schlagbäume nicht wichtiger als der Aufzug?
    • Wenn die Position x nicht bekannt ist, kann man auch nicht langsam zu Position A fahren. Man kann dem Servo dann nur Position A vorgeben und er knallt schlagartig von x zu A.

      Um die Position x zu haben, muss man irgendwann etwas speichern - entweder während des Betriebs vorsorglich oder bei Stromausfall, für dessen Erkennung eine Minimalhardware benötigt wird.
      Ich frage mich allerdings, ob da nicht ein Spannungsteiler aus zwei Widerständen ausreicht - und die bekommt man ja immer unter.
    • Guten Morgen Mitch,
      der Aufzug fährt etwa 5cm in 6s und steht, wie schon oben erwähnt, auf einem Bahnsteig einer H0-Anlage.
      Und es ist schon wichtig, dass die Position bekannt sein muss, da bei Spannung EIN der EEProm ausgelesen
      wird und wenn das nicht so wäre das Servo mit voller Geschwindigkeit ja erst mal zum Startpunkt fahren
      würde.
      Und der Stromausfall wird detektiert (A302) wie schon beschrieben und die aktuelle Position gespeichert.
      Und am Eingang des Ganzen liegt eine Gleichspannung von ca. 18V und kommt von einem kräftigen Trafo
      der Beleuchtung und Zubehör.
      Mein Ladekondensator hinter einer Diode hat nur 1000uF und wenn ich das Servo mal probehalber ohne die
      Elektronik abschalte ist nach ca. 1/10s Schluß. Das Servo braucht etwa 100mA zur Bewegung.

      Bei Weichen brauche ich nicht auf die langsame Bewegung zu achten aber bei Signalen und "Schlagbäumen"
      schon. Und der Aufzug macht schon was her und sieht cool aus meint mein Kollege. Baue gerade an einem
      Wasserkran und der soll schön langsam drehen! Ich würde Dir gern ein Video vom Aufzug zusenden Pluto
      aber hier geht das leider nicht. Ach die Halbschranke mit 2 Bäumen funktioniert seit 2 Jahren so ähnlich.
    • Danke für den Hinweis. Ist zwar ein Digital-Servo, hat aber auch ein Poti. Wäre mal
      eine Idee! Bei Analog-Servos muß ich immer die Spannung nach dem Impuls zuschalten
      sonst entsteht eine ungewollte Bewegung. Mache ich bei den Schranken so. Bei dem
      Aufzug ist es aber relativ egal wenn ihr euch mal die Mechanik anschaut.

      Finde übrigens cool was Du so machst. Passt aber hier nicht zum Thema!
    • ich könnte mir vorstellen, beim Einschalten das Servo in eine bestimmte Position zu bringen und zwar so, dass man nur kurz den entsprechenden Servobefahl ausgibt und bisschen wartet. Das sooft, dass der Servo durch die kurzen Befehle aus jeder Position zu dieser gewünschten Position kommt. Die Pulsausgabe an den Servo stottert sozusagen beim Einschalten, der Servo will natürlich so schnell wie möglich zu der vorgegebenen Position fahren, wird aber stetig unterbrochen, weil der Puls fehlt.
      War das jetzt so leidlich verständlich ausgedrückt?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------