arduuno NANO zum Strom Sparer machen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    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!

    • arduuno NANO zum Strom Sparer machen

      Hallo zusammen,

      mein Trenn-Relais im WoMo hat den geist auszugeben,

      möchte dies durch eine elektronische Lösung ersetzen ...

      Als Leistungsteil werde ich mehrere BTS555 verwenden ...

      Im Standby sollte der MCU so wenig Strom wie möglich verbrauchen, den FT232RL würde ich entfernen, wird da eh nicht gebraucht ...

      Der MCU sollte nur alle 100-1000 ms (je nach dem was möglich ist) mal schauen ob alles OK ist, und dann wieder im Ruhe-Modus warten ...

      Erst wenn der Motor läuft oder eine externer Lade-Strom vorhanden ist, soll der MCU dann voll laufen und die Ströme und Spannungen überwachen
      und entsprechend das Last-Teil steuern ...

      was und wie ist mit Bascom im Bereich Standby ( Idle Mode / ADC / Power Save Mode / Stand By ) machbar ...
    • Du kannst Timer oder Watchdog so konfigurieren, dass er den Atmega durch einen Interrupt aufweckt.
      Für extremes Stromsparen nehme ich gern Timer2 mit externem 32kHz Quarz, der den AVR einmal pro Sekunde weckt. Kann man gleich eine Uhr nebenher programmieren.

      Andererseits wird im WOMO die Batterie sicher auch ihre Selbstentladung haben, die üblicherweise deutlicher ins Gewicht fällt, als ein Atmega.
    • Das mit der Selbstentladung ist eine praktische Ausrede. Aber keine besonders gute. Wenn man dann viel Zubehör mit Stromverbrauch im Bereich der Selbstentladung hat, ist es dann doch wieder ein nicht zu unterschätzender Betrag.
      Langer Rede kurzer Sinn, versuche mal den Verbrauch möglichst niedrig hin zu bekommen. Das Wie interessiert mich auch. :)
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mal kurz dazwischen gefragt...Wie hoch ist der typische Stromverbrauch von einem Atmega der ganz normal mit seinem 1 MHZ Takt läuft.
      In einem KFZ sind soviele elektronische Steuergeräte verbaut die noch Stunden nach Beendigung der Fahrt sich "unterhalten"
      Da kann der Verbrauch eines einzelnen AVR nicht so schlimm sein.
    • Für meine Schwiegermutter habe ich mal einen "Pillenwarner" mit Attiny25 gebaut.
      Verbrauch liegt im Powerdown bei 3V etwa bei 5μA.
      Im Prinzip recht einfach, alles was Strom verbraucht, ADC, AC etc abschalten und ein paar Register setzen.
      Anregung dazu habe ich mir hier geholt:


      Den Arduino in den Schlaf Modus setzen und wieder aufwecken

      shelvin.de/arduino-in-den-slee…down-schlaf-modus-setzen/


      Unter 2.4.1 Watchdog-Abschaltung zu finden

      reaktivlicht.de/kochbuch_V3.pdf
    • feuerring schrieb:

      Ja nur überflogen,

      habe aber da meine Probleme ... wie bekomme ich den MCU wieder zurück
      da es keine externen Interrupts gibt ...

      Timer/Counter2 interrupt (ADC) ?
      oder watchdog (Power-down Mode)

      Gerade mal auf den NANOo getestet, geht relativ einfach.

      Quellcode

      1. Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
      2. Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
      3. Enable Interrupts
      4. Config Watchdog = 1024 'Watchdog auf Resetmodus mit 1sek Zeit einstellen
      5. Wdtcsr.wdie = 1 'WDIE Bit auf 1 setzen, damit beim WDT-Timeout ein Interrupt ausgeführt wird und kein Reset
      6. Start Watchdog
      7. Do
      8. Toggle PortB.5
      9. Config Watchdog = 512 'Watchdog auf Resetmodus mit 0,5 sek Zeit einstellen
      10. Wdtcsr.wdie = 1
      11. powerdown ' oder Idle
      12. loop
      13. End
      Alles anzeigen
    • das "Arduino Pro Mini " sind da die Pins im 2,54 mm Raster, sieht irgenwie ungleichmäßig aus ?

      die Watchdog-Abschaltung scheint für meine Zwecke genau das richtige zu sein ... bis 8 Sek im Sleep-Mode ist mehr aus ausreichend.

      klar hat ein Akku eine Selbstentladung, möchte aber meinen kostbaren Solar-Strom nicht unnötig in einem klassischem Relais verpulvern.

      Derzeitige elektronische Trenn-Relais arbeiten intern bis auf paar teure Ausnahmen mit einem normalem Relais und dann nimmt so
      ein Relais genre mal 250-500 mA auf ... da möchte ich vermeiden.

      werde auf jeden-Fall hier weiter über das Projekt hier weiter Berichten ...

      Erstmal habe ich mir einen BTS555 bestellt um den für meine Zwecke zu Testen,
      vor allem wie gut die Sense-Ausgänge sind um Ströme damit zu messen ...

      Im Endeffekt wird mein plantes Trenn-Relais ein kompletten E-Block ersetzen,
      als Anzeige werde ich ein 2x16 LCD- Display nehmen, dies wird natürlich abschaltbar gemacht.
    • feuerring schrieb:

      das "Arduino Pro Mini " sind da die Pins im 2,54 mm Raster, sieht irgenwie ungleichmäßig aus ?
      Ja das ist ein 2,54mm Raster an den I/O-Pins. Du meinst warscheinlich wegen der nach innen versetzten Pins an der Stirnseite? Da wird normalerweise der RS-232 Adapter für die Programmierung über den Bootloader angeschlossen.
      Gruß Peter

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Peter_Kn ()

    • Wie ist bei dir die Funktion 'Trennrelais'? Bei mir ist es so, das nur wenn der Motor läuft durch das 'Lichtmaschine läuft'-Signal die Wohnraumbatterie an die Lima geschaltet wird. Im Stand ist das Relais offen, damit nicht versehentlich die Starterbatterie leer gesaugt wird.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Wie ist bei dir die Funktion 'Trennrelais'?
      Das klassische Trenn-Relais wird über (D+) geschaltet, so das die Aufbau-Batt mit der Starter-Batt verbunden wird, wenn die Lima Strom liefert.

      Möchte aber gerne auch beim autarkem stehen und zum Überwintern die Starter-Batt mit der Aufbau-Batt verbinden,
      wenn die Spannung an Aufbau-Batt über 14,0V steigt und somit die Starter-Batt mit geladen wird, diese Funktion
      soll zuschaltbar sein, der MCU soll die Ströme und Spannungen überwachen und mit berücksichtigen ...
      Vor allem möchte ich über alle Zustände bei Bedarf informiert werden (LCD-Anzeige),
      derzeit habe ich mehrere V/A Anzeigen die ich gerne Ersetzen würde ...

      weiterhin will ich die 12V-Aufbau-Elektrik(Tiefentlade-Schutz) und den Kühlschrank(12V) über je einen BTS555 schalten.

      Weiterhin soll das Trenn-Relais auch als Starthilfe-Möglichkeit funktionieren, ist die Starter-Batt zu schwach zum starten,
      verbindet man das Trenn-Relais manuell für 5 Minuten, diese Verbindung wird dann beim Starten manuell oder durch Überwachen der Spannung an der Starter-Batt dann getrennt.
    • Hallo
      brauch eure Hilfe, irgenwie bin ich zu blöd ...


      Quellcode

      1. ' Fehler-Melde-Tableau
      2. ' R. Greinert
      3. ' 02-2017
      4. '
      5. ' Basis - RS232
      6. '
      7. '
      8. '
      9. ' ------------ Bascom - Parameter ----------------------------------------------
      10. $regfile = "m328pdef.dat"
      11. $crystal = 16000000
      12. $hwstack = 100
      13. $swstack = 100
      14. $framesize = 100
      15. $baud = 9600
      16. Config Portb.5 = Output ' Herzschlag
      17. Portb.5 = 0
      18. Print "Start ... in 5 Sekunden"
      19. Waitms 5000
      20. Dim N As Byte
      21. Config Watchdog = 4096
      22. Enable Interrupts
      23. Stop Watchdog
      24. Reset Watchdog
      25. Do
      26. If N > 100 Then
      27. Print "go sleep"
      28. N = 0
      29. Reset Watchdog
      30. Start Watchdog
      31. Config Powermode = Idle
      32. End If
      33. Portb.5 = 1
      34. Waitms 100
      35. Portb.5 = 0
      36. Waitms 500
      37. Print N
      38. If N < 255 Then N = N + 1
      39. Loop
      Alles anzeigen
      Also MCU startet und wartet 5 Sekunden, dann fäng die LED am Port PortB.5 zu blinken 100 ms an 500 ms aus und über die RS232 wird n ausgegeben,

      hat n den Wert 100 erreicht wird der Watchdot gestartet und die MCU in Standby geschickt, auch das funktioniert soweit ...

      nur nach 4 Sekunden blinkt die LED am PortB.5 sehr schnell und nichts weiteres passiert keine Ausgabe an der RS232,
      auch nach dem drücken der Reste-Knopf blinkt die LED sofort los, als ob das Programm gar nicht starten würde ...
    • Um einfach mal weit zu kommen, habe ich ein Programm gefunden was mit WD-Interrupt als Zähler läuft ...


      Quellcode

      1. ' Watchdog TEST
      2. ' R. Greinert
      3. ' 04-2017
      4. '
      5. '
      6. '
      7. ' Beispiel von:
      8. ' http://www.roboternetz.de/community/threads/50982-Watchdog-Interrupt
      9. ' ------------ Bascom - Parameter ----------------------------------------------
      10. $regfile = "m328pdef.dat"
      11. $crystal = 16000000
      12. $hwstack = 100
      13. $swstack = 100
      14. $framesize = 100
      15. $baud = 9600
      16. Config Portb.5 = Output ' Herzschlag
      17. Portb.5 = 0
      18. Print "Start ... in 5 Sekunden"
      19. Waitms 5000
      20. Dim Zeit As Byte 'Wird alle x Sekunden um 1 erhöht
      21. Dim Wdtflag As Byte 'Wird alle x Sek auf 1 gesetzt, zum anzeigen, dass die Watchdogtimer-ISR ausgelöst wurde und das WDIE Bit im WDTCSR Register wieder auf 1 gesetzt werden muss
      22. Enable Interrupts
      23. Config Watchdog = 1024 'Watchdog auf Resetmodus mit x sek Zeit einstellen
      24. Wdtcsr.wdie = 1 'WDIE Bit auf 1 setzen, damit beim WDT-Timeout ein Interrupt ausgeführt wird und kein Reset
      25. Start Watchdog
      26. On Wdt Isr_wdt
      27. Wdtflag = 0
      28. Zeit = 0
      29. Do
      30. If Wdtflag = 1 Then
      31. Reset Watchdog
      32. Wdtcsr.wdie = 1
      33. Wdtflag = 0
      34. End If
      35. Loop
      36. 'Diese Interruptroutine wird beim Timeout vom Watchdogtimer ausgelöst und dient
      37. ' der Zeitmessung und dem Resetten des WDTs
      38. Isr_wdt:
      39. Wdtflag = 1
      40. Incr Zeit
      41. Print "ZEIT " ; Zeit
      42. Return
      Alles anzeigen
      jetzt muss ich probieren wie ich das für mich umschreibe ...
    • So kann ich es lassen ...


      Quellcode

      1. ' Watchdog TEST
      2. ' R. Greinert
      3. ' 04-2017
      4. '
      5. '
      6. '
      7. ' Beispiel von:
      8. ' http://www.roboternetz.de/community/threads/50982-Watchdog-Interrupt
      9. ' ------------ Bascom - Parameter ----------------------------------------------
      10. $regfile = "m328pdef.dat"
      11. $crystal = 16000000
      12. $hwstack = 100
      13. $swstack = 100
      14. $framesize = 100
      15. $baud = 9600
      16. Config Portb.5 = Output ' Herzschlag
      17. Portb.5 = 0
      18. Print "Start ... in 5 Sekunden"
      19. Waitms 5000
      20. Dim N As Byte
      21. Config Watchdog = 1024 'Watchdog auf Resetmodus mit x sek Zeit einstellen
      22. Wdtcsr.wdie = 1 'WDIE Bit auf 1 setzen, damit beim WDT-Timeout ein Interrupt ausgeführt wird und kein Reset
      23. Start Watchdog
      24. On Wdt Isr_wdt
      25. Enable Interrupts
      26. Do
      27. ' ---- LED an / aus
      28. Portb.5 = 1
      29. Waitms 50
      30. Portb.5 = 0
      31. Waitms 100
      32. If N > 5 Then
      33. N = 0
      34. ' Print "go ... Powermode = Idle"
      35. ' Reset Watchdog
      36. Config Powermode = Idle
      37. End If
      38. Loop
      39. ' ---- WDT - Interrupt-Routine
      40. Isr_wdt:
      41. Reset Watchdog
      42. Wdtcsr.wdie = 1
      43. ' Print "WDT - Interrupt-Routine "
      44. N = N + 1
      45. Return
      Alles anzeigen
      jede Sekunde gibt es ein WD-Interrupt , was man auch für eine Zeit-Basis nehmen könnte ...

      im Hauptprogramm Do/Loop kann das Programm die MCU je nach Bedarf dann in den IDLE versetzen,
      beim Nano sinkt der Strombedarf von 25 mA auf 15 mA ... denke wenn ich den CH340 und die Power-LED noch ablöte sinkt der Strom noch um einiges ...

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von feuerring ()

    • Hallo feuerring,
      funktioniert dein Programm wirklich so, wie du es möchtest? Ohne es jetzt ausprobiert zu haben scheint es folgendes zu machen:
      Du startest zu Anfang den WDT, mit 1 Sekunde Wartezeit.
      Dann gehst du in die Hauptschleife und lässt die LED blinken.
      Irgendwo dazwischen kommt dann der Interrupt. Dort resettest du den WDT (also setzt den Zähler auf 0), obwohl er da sowieso 0 ist. Und du erhöhst den Zähler N.
      Dies läuft dann 5 mal. In der Hauptschleife setzt du den Zähler N = 0 und gehst in Idle. Der WDT hat dabei irgendeinen Wert, da du ihn vorher nicht resettest. Evtl. kommt der Interrupt schon nach einer 1/1000 sec. Dann geht das Spiel sofort wieder los.
      Die Verwendung des Watchdogs als Timer kannst du machen, sieht mir aber eher seltsam aus, Warum nicht über einen normalen Timer? Der WDT ist ja eigentlich dafür gedacht einzugreifen, wenn mal etwas nicht so läuft wie geplant oder eine Aktion unerwartet lange dauert.
      Außerdem solltest du den WDT resetten, bevor du in Idle gehst

      Edit: Ich sehe gerade, dass du die Wartezeiten bleim Blinken stark verkürzt hast. Daher ist die 1/1000 sec. natürlich nicht möglich. Aber grundsätzlich hängt die verbleibende Idle Zeit von der Durchlaufzeit der Hauptschleife ab, was eher ungewöhnlich ist.
      Idle ist übrigens der Spar-Modus mit dem höchsten Stromverbrauch. Der WDT kann auch aus dem Powerdown Modus aufwecken.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von hero ()

    • um Verwirrungen gleich auszuschließen, ich bin "feuerring" nur von der Arbeit aus ...

      Also der WT führt alle Sekunde eine Interrupt Routine aus, ob man darin ein Reset Watchdog ausführen muss oder ob es auch ohne geht kann ich erst heute Abend zu Hause testen.

      in der Hauptroutine DO/ Loop Schleife kommt noch das Hauptprogramm, ich habe zum testen nur erst mal zum eine blinkende LED rein gepackt ...

      Später werden dort alle Parameter eingelesen z.B. AD-Werte usw. ... gibt es auf Grund der Parameter für den MCU nichts zu tun wird diese dann in den "Powermode = Idle" versetzt.

      "Der WDT kann auch aus dem Powerdown Modus aufwecken" auch das werde ich heute Abend mal testen ...

      Ich wollte nur Zeigen das man den WD auch als Interrupt Routine gut funktioniert,

      ohne den Beitrag "http://www.roboternetz.de/community/threads/50982-Watchdog-Interrupt" wäre ich da nicht drauf gekommen,

      Denn Bascom unterstützt scheinbar nur den Restet, der sich aber mit einem "Bootloop" Festfrist ... oder wie arbeitet Ihr mit dem WD

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Mr_Martini ()

    • feuerring schrieb:

      jede Sekunde gibt es ein WD-Interrupt , was man auch für eine Zeit-Basis nehmen könnte ...
      so betrachtet, wäre der Mond auch eine Zeitbasis ;)
      Der WDT wird von einem internen (128kHz?) RC-Oszillator getaktet.


      Mr_Martini schrieb:

      Denn Bascom unterstützt scheinbar nur den Restet, der sich aber mit einem "Bootloop" Festfrist ..
      leider ist das alte Forum kaputtgegangen, da hatten wir ein paar Beispiele.
      Aber wo ist das Problem? Du hast doch gefunden, was du gesucht hast.


      hero schrieb:

      Und du erhöhst den Zähler N.
      Dies läuft dann 5 mal.
      Und nur jedes 5. mal wird der Controller dann in 1x den Sleep geschickt. Also von 6 Durchläufen ist er 5 Durchläufe wach.