PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motortreiber A4988 abschalten



Moppi
07.01.2019, 09:23
Hallo,

nachdem ich nun meine Schaltung (für den Rolloantrieb) im Betrieb habe und sehen konnte, wie weit die Schaltung mit der Akkuleistung auskommt, musste ich noch mal suchen gehen.
10 Tage ist nicht schlecht, aber eigentlich finde ich ein bisschen wenig. Also habe ich angefangen zu rechnen und zu schauen, was der A4988 so benötigt. So bin ich im Datenblatt von Pololu drauf gestoßen, dass der gut 4 bis 8mA benötigen kann, obwohl die Ausgänge abgeschaltet sind. So in etwa könnte das auch hinkommen. Ich bin umgerechnet pro Stunde für die gesamte Schaltung mit µC und Treiber auf ca. 8.6mA gekommen. Wenn ich 2mA abziehe für den ATmega328 und die Spannungsregelung (ist bestimmt schon etwas hoch gegriffen) dann bleibe ich bei ca. 6.5mA. Wenn ich jetzt noch was für den Schrittmotor abziehe, da der ja auch ab und an läuft (nicht lange und oft), dann dürften schätzungsweise um die 4mA übrig bleiben, die verpuffen. Also will ich die abstellen. Den A4988 habe ich immer mit Enable auf LOW und den Sleep auf LOW, wenn ich den Motor nicht brauche. Jetzt habe ich gedacht, ich könnte gleich die Logikspannung des A4988 abschalten, um hier wirklich sparsam zu werden und nur, wenn ich den Motor brauche, den A4988 mit 5V zu versorgen. Nun meine Frage, ob es hier Bedenken gibt, weil die Motorspannung mit 12V würde am A4988 angelegt bleiben. Oder lieber die Logikspannung angeschlossen lassen und den Enable-Eingang des A4988 verwenden?

MfG

shedepe
07.01.2019, 10:05
Hallo,
erst mal ein Tipp für die Zukunft. Probier mal deinem Text mehr Absätze zu verpassen. Das macht das ganze viel lesbarer.

Wen nich das richtig verstanden habe: Du hast einen Schrittmotortreiber und willst Stromsparen indem du die Logikspannung abschaltest. Im Allgemeinen würde ich Motorspannung und Logikspannung abschalten und zwar in der Reihenfolge. Sonst hat man nämlich leicht Ströme von der Motorspannung zurück in den Logikteil. In dem Fall könnte es aber funktionieren weil der Chip einer "VDD Undervoltage Lockout" hat. D.h. wenn VDD < 2,6V dann schaltet der auch den Rest ab. Es sollte aufjedenfall nichts im Chip kaputt gehen. Ob der Stromverbrauch dadurch sinkt musst du messen.

Nochmals der Hinweis, die Aussage ist für diesen Chip gültig. Bei anderen ICs mit Power und Logikspannung sollte man i.R. immer zuerst Logik, dann Power anlegen.

Moppi
07.01.2019, 11:08
"Power und Logikspannung sollte man i.R. immer zuerst Logik, dann Power anlegen" hier weiß ich nicht genau, was Du damit meinst.

Bei dem Motortreiber ist es ja so, dass der eine Motorspannung hat, die angelegt wird (für den Ausgangstreiber) und eine für die Logik (5V). Man schließt ja immer beides an und schaltet dann ein.

Die Frage ist, denke ich, ob der Enable-Eingang am 4988 das tut, was ich mir vorstelle, nämlich das ganze Teil wirklich abschalten oder eben anschalten. Ansonsten wäre die Frage, ob die Versorgungsspannung weggeschaltet werden könnte, wenn die 12V am Motorspannungseingang des 4988 anliegen. Würde ich es Schrittweise in Betrieb nehmen, würde ich es sicher auch so machen: zuerst Versorgungsspannung dran und dann die 12V-Motorspannung zuschalten, danach die Ausgänge zuschalten.

Danke!

Nachtrag:
Habe gerade gelesen, dass bei Enable On/Off die interne Logik dennoch in Betrieb bleibt. Es sollen nur die Ausgänge abgeschaltet werden. Allerdings tut das auch Sleep schon - dachte ich.
So, wie ich es gerade noch mal gelesen habe, ist der Sleep schon der richtige Eingang, um den 4988 größtenteils abzuschalten. So wäre also über den Sleep-Eingang die größte Ersparnis drin.

MfG

shedepe
07.01.2019, 11:32
Power = Motorspannung. Logikspannung ist klar. Je nach Chip ist es Sache des Anwenders sicherzustellen, dass zuerst die Logikspannung angelegt wird und dann die Motorspannung. Da muss im Zweifelsfall durch spezielle externe Beschaltung passieren (Im einfachsten Fall ist das ein fetter Kondensator ;) ). Bei den meisten modernen Chips ist das nicht mehr tragisch. Man sollte trotzdem im Datenblatt schauen ob darauf hingewiesen wird, es gibt manchml. Problem sind dabei wie gesagt Ströme die vom Leistungsteil in den Logikteil fließen können. Das sind auch die Ströme die einem die einen Strich durch die Rechnung machen können, wenn man die Logikspannung zum Stromsparen abschalten will.

Bei dem gewählten IC kannst du durchaus die Logikspannung abschalten. Dadurch wird dann so ziemlich alles im IC lahmgelegt, wenn man das VDD Undervoltage Lockout so interpretieren darf. Leider sind keine Diagramme mit dabei die eine Aussage zu treffen.

Moppi
07.01.2019, 11:47
Problem sind dabei wie gesagt Ströme die vom Leistungsteil in den Logikteil fließen können.

So ähnlich waren meine Bedenken ja auch.

Danke!

Ich werde es dann wohl mal versuchen.

MfG

Ceos
07.01.2019, 12:00
Ich habe mir das Datenblatt mal angesehen und da unterscheiden sich die beiden inputs für Sleep und Enable ja zumindest darin dass bei Sleep zusätzlicha cuh die Logik und der interne Wandler abgeschaltet werden ... leider steht im Datenblatt nichts darüber wie sich das auf den Stromverbrauch auswirkt, aber wenn da schon von 2+5mA die Rede ist nur im Fall von disabled ist das schon recht happig.

Ein Atmega mit 2mA im standby hört sich auch äußerst verdächtig an, da solletst du nochmal prüfen wieviel parasitärer Stromverlust durch deine Referenzen drauf geht.

Und einen Guten Spannungsregler zeichnet ein Verluststrom von weniger als 0.5mA aus, da muss man aber auch meinst in den mittleren einstelligen Euro Bereich wechseln

Moppi
07.01.2019, 19:15
Ich habe es erst einmal umkonstruiert. Einen Draht von VDD gegen +5V getrennt und Sleep und Reset überbrückt - so kommt die Spannung vom HIGH-Pegel, am Sleep-Eingang, auch am VDD an. Funktioniert zumindest erst mal. Werde es beobachten. Was die Außenbeschaltung, bezüglich Spannungsteiler, am Atmega angeht, kann ich daran nicht viel ändern. Einen bestimmten Arbeitsbereich muss ich mit den Fotowiderständen erreichen. Und alle Spannungsteiler sind entweder gegen +5V oder +12V über mindestens 40kOhm beschaltet. Bei den Fotowiderständen ist es lichtabhängig (dunkler hochohmiger - bis MOhm). Der Analaogeingang dafür liegt aber über mindestens 40kOhm an GND, wie die anderen Analogeingänge auch.

MfG

Ceos
08.01.2019, 06:49
Du könntest die unnötigen Spannungsteiler ebenfalls von + trennen. aber vergiss nicht dass ein Transistor einen Spannungsabfall über C-E verursacht und damit deine Arbeitspunkte verschiebt.

Oder falls du noch Pins frei hast, klemmst du die Widerstände nicht gegen + sondern hängst sie an einen Portpin den du an und ausschaltest, wenn du sie gerade brauchst.

Die Lichtmessung muss ja nicht permanent laufen sondern nur 1 mal in der Minute bestenfalls! Und im Sleep sollte ein Atmega auch <1mA verbrauchen

Moppi
08.01.2019, 08:04
Das ist mir zu viel Beschaltung, auch noch mit Transistoren oder so alles weg zu schalten. Mal von den einstreuenden Fehlern (Temperatur ...) abgesehen. Ich habe schon jetzt keinen Platz mehr. Das Gehäuse wird dann immer globiger, sieht dann sehr besch.. aus. Sonst hätte ich schon direkt größere Akkus verplant.

Ich kann jetzt das gesamte Projekt nochmal erklären, aber es steht in meinem Blog alles drinnen.

Was die Ports angeht, die wollte ich ungern für so Experimente nutzen. Weil ich nicht sicher bin, inwieweit die Verschaltung eines Sensors mit dem ATmega direkt Messfehler mit sich bringen könnte. Bei einem Test am 328P mit den Fotowiderständen ist mir mal aufgefallen, dass das Ergebnis vom ADC in seinen Abweichungen sinusförmig ausfällt. Da habe ich auch die gemeinsame Spannungsquelle benutzt. Deswegen habe ich jetzt hier den Fotowiderständen einen eigenen Spannungsregler zugestanden. Ob das sinnig war, weiß ich nicht so genau, aber ich wollte einfach, dass es sauber funktioniert.

Die Lichtmessung läuft alle 4.2s, weil einmal pro Minute zu langsam wäre, in der Reaktionszeit. Das hat bestimmte Gründe, weswegen ich diese Steuerung überhaupt baue.

Was ich jetzt noch sehen werde, ob das Abschalten der Logikspannung einen Mehrverbrauch hervorruft. Das wäre noch möglich (weil ja die volle Akkuspannung für den Motor ständig am A4988 anliegt) was ich nicht hoffe.

MfG

Moppi
11.01.2019, 09:15
Nach dem, was ich jetzt an den Akkus messen kann, sieht es so aus, dass sich die Laufzeit verlängert, wahrscheinlich verdoppelt (dass sie sich verdreifacht wäre wohl zu optimistisch). Also war das wohl jetzt mal mit dem Motortreiber nicht so falsch gedacht.

MfG

Ceos
11.01.2019, 09:49
könntest du die schaltung denn mal skizzieren und hier ablichten? dann kann man mal sehen ob da noch 1 oder 2 minimalistische optimierungen drin sind :)

Moppi
11.01.2019, 10:29
Gerne, mache ich es noch mal (Bild aus Album):

https://www.roboternetz.de/community/attachment.php?attachmentid=33850&d=1544805309

Unterschied zur realen Beschaltung ist marginal:

Statt A1, wird A3 verwendet.
Statt A0, wird A1 verwendet.

Das ist nur wegen der praktischen Handhabe beim Löten und so.



Und was ich schon geschrieben habe A4988:

RESET und STEP überbrückt.
VDD nach 5V vom ATmega328P gekappt, statt dessen Verbindung von STEP nach VDD (ist hier im Bild eigentlich auch schon da).


Optimierungspotential haben vielleicht noch die nicht beschalteten I/O-Ports des Kontrollers; falls das dazu führt, dass er mehr Strom zieht. Dann könnte ich natürlich die internen Pull-Up-Widerstände einschalten.
Tieferer Schlafmodus (jetzt IDLE) geht nicht, so weit ich weiß, weil ich den Timer#1 auch für eine Software-Uhr verwende.

Aber wie ich schon mal schrieb, steht alles dazu in meinem Blog (falls Erklärungsbedarf). Wäre jetzt - denke ich - nicht sinnvoll, hier alles nochmal hin zu schreiben (Speicherplatz etc.).


MfG

Ceos
11.01.2019, 11:43
ne da gibt es wirklich kaum noch potential :) wie gesagt der +Vcc#1 5V könnte noch direkt über einen Port Pin gehen, ob udn wie stark sich das auf die Messung auswirkt müsste man ggf. prüfen, aber so wäre der Spannungsteiler an den Analogen Inputs noch abgeschaltet, aber das spart bei dir im idealsten Fall eh nur 0.2mA ;D (angenommen die Photoresistoren wären auf 0 und deine 5V würden über die 47k abfallen)

ich suche mich gerade durch das datenblatt:
-du könntest die clock runtersetzen um strom zu sparen (system clock prescaler nutzen und dabei deine timer nicht vergessen anzupassen)
-sofern nicht schon umgesetzt könntest du den einfachsten sleep mode IDLE benutzen um zwischen 2 Messungen strom zu sparen und ggf. POWER-SAFE einsetzen, dann läuft der timer auch weiter aber dein AIO ist offline und braucht ein paar takte zum hochfahren länger (dein code rennt ja bestimmt nicht permanent durch ein NOP während er auf den timer wartet oder ?)
-Brown Out Detection über die Software (nicht fuses) ausschalten, sodass der BOD während des sleep ebenfalls abgeschaltet wird
-PRR Regsiter udn alle Peripherie abschalten die nicht benötigt wird

Moppi
11.01.2019, 12:00
Auf jeden Fall mal bei Searcher in den Blog schauen, der hat gerade dieses Phänomen, der Empfindlichkeit von ADCs.

MfG

Ceos
11.01.2019, 12:06
ich würde auf jeden fall mal das PRR Register hernehmen und die unnötige peripherie abschalten (schließlich ahst du ja einen picoPower Prozessor genommen wegen der Funktion XD)

und was das BOD abschalten bewirkt kann ich leider nciht sagen aber man kann es ja mal probieren :D

EDIT: Kommando zurück, ich seh gerade du benutzt ja die power.h schon .. ich mach das zwar lieber selber über die register aber das ist mein persönlciher geschmack :P

Moppi
11.01.2019, 12:23
Ich dachte irgendwo gelesen zu haben, dass BOD normalerweise gar nicht eingeschaltet ist, wenn man es selber nicht tut.
Nun habe ich gerade nochmal im Datenblatt nachgesehen und mir im boards.txt die Fuse-Bits angeschaut:

uno.bootloader.extended_fuses=0xFD

entspricht: 11111101

Wenn ich das richtig interpretiere, sind Bit#0 bis #2 die BODLEVEL Fuses. Die stünden ja dann auf 101 und damit wäre BOD an.

Sehe ich das richtig?

Habe noch ein sleep_bod_disable(); hinzugefügt.

Ansonsten hatte ich alles andere abgeschaltet.

power_spi_disable();
power_twi_disable();
power_timer2_disable();
power_adc_disable();
power_timer0_disable();


Fehlt noch was?

MfG

Ceos
11.01.2019, 12:40
Bit 7 – PRTWI0: Power Reduction TWI0

check.

Bit 6 – PRTIM2: Power Reduction Timer/Counter2

check.

Bit 5 – PRTIM0: Power Reduction Timer/Counter0

check.

Bit 3 – PRTIM1: Power Reduction Timer/Counter1

wakeup timer.

Bit 2 – PRSPI0: Power Reduction Serial Peripheral Interface 0

check.

Bit 1 – PRUSART0: Power Reduction USART0

ich meine was von uart bei dir gelesen zu haben, evtl. einen jumper pin mit internem pullup gegen gnd und nur einschalten wenn auch gejumpert (sowas wie ein debug jumper).

Nochmal korrektur, nein sehe ich nicht bei dir, hab das sayHello als Debug abgetan :P den kannst noch abshalten
EDIT3: (Gerade nachgelesen bei 8Mhz wären das 0.1mA, vll. solltest du den Spannungsteiler doch über einen pin schaltbar machen, die 0.2mA sind scheinbar signifikant)

Bit 0 – PRADC: Power Reduction ADC

den brauchst du ja. (korrektur ADC nicht Analog) also auch CHECK

sieht soweit gut aus

Moppi
11.01.2019, 12:48
Tückisch ist aber sleep_bod_disable();
Das muss direkt vorm Schlafengehen passieren.

Wenn das funktioniert, dann habe ich ja jetzt sogar ein: power_a4988_disable(); :p

Wenn ich richtig rechne, komme ich auf 0,47mA für alle Spannungsteiler.
Wenn der Motor läuft, geht das unter, denke ich. Theoretisch könnte ich dort noch an der Schraube für den Motorstrom drehen, weiß aber auch nicht, ob das lohnenswert ist. Ein Unterschied ist, ob die Akkus 10 Tage durchhalten oder 20 oder 30 Tage. Aber auf 2 Tage mehr oder weniger kommt es dann nicht wirklich an.

Danke Dir, so weit, Ceos!

MfG