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 :)
Druckbare Version
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 :)
Gerne, mache ich es noch mal (Bild aus Album):
Bild hier
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
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
Auf jeden Fall mal bei Searcher in den Blog schauen, der hat gerade dieses Phänomen, der Empfindlichkeit von ADCs.
MfG
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
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
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
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