Hallo Gemeinde,
ich verwende derzeit einen Batterie-betriebenen Arduino Pro Mini (3,3V,
8MHz, extern Oszi) in Verbindung mit der LowPower-Library von Rocket
Scream Electronics.
https://github.com/rocketscream/Low-Power/blob/master/LowPower.cpp
Das Ganze läuft auch sehr gut bzw. ich sehe dass der Atmega328P in
seinen PowerDown-Modus geht und nur noch 4,6uA verbraucht.
Folgender Code wird verwendet:
1
// - Sketch for 'power down' mode
2
#include"LowPower.h"
3
4
voidsetup(){
5
}
6
7
voidloop(){
8
// Sleep for 8 s with ADC module and BOD module off
9
LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
10
}
Was allerdings nicht geht:
Sobald die Batteriespannung unter 2,7V fällt schaltet der
Mikrocontroller ab. Ich hatte ehrlich gesagt erwartet, dass er zumindest
noch bis 2,0V laufen würde...
Das deutet doch sehr daraufhin, dass irgendwas mit der
BrownOut-Detection nicht richtig ist oder? Kann es am externen Takt
liegen?
Muss ich irgendwelche Fuses anders setzen? Wenn ja, wie macht man das
(unter der ArduinoIDE)?
herzlichen DANK und schöne Grüße
Tim S. schrieb:> 2,7V fällt schaltet der> Mikrocontroller ab. Ich hatte ehrlich gesagt erwartet, dass er zumindest> noch bis 2,0V laufen würde...
Steht das so im Datenblatt? Und benutzt Du den Spannungsregler auf dem
Board?
Tim S. schrieb:> Das deutet doch sehr daraufhin, dass irgendwas mit der> BrownOut-Detection nicht richtig ist oder?
Das kannst Du per fuse abschalten..
Okay, da der Stromverbrauch so gering ist, kann ich jetzt davon
ausgehen, dass BOD_OFF doch wirksam ist.
Nun stellt sich mir natürlich die Frage woran es noch liegen könnte...
Die Power-LED und der Spannungsregler sind von mir vom Board entfernt
worden.
Die Batterie bzw. VCC und GND hängen an den Pins vom UART Header.
Tim S. schrieb:> Sobald die Batteriespannung unter 2,7V fällt schaltet der> Mikrocontroller ab.
Wie stellst Du das fest?
Deine Funktion scheint den Watchdog zu enablen. D.h. nach 8s wacht er
auf, BOD wird wieder aktiv und Reset.
Nimm mal PCINT zum Aufwachen, nachdem die VCC wieder auf >2,7V gestiegen
ist.
Tim S. schrieb:> ich verwende derzeit einen Batterie-betriebenen Arduino Pro Mini (3,3V,> 8MHz, extern Oszi) in Verbindung mit der LowPower-Library von Rocket> Scream Electronics.
Ein Blick ins Datenblatt (ganz oben, auf Seite 2) verrät:
Speed Grade:
̶ 0 - 4MHz@1.8 - 5.5V, 0 - 10MHz@2.7 - 5.5.V, 0 - 20MHz @ 4.5 - 5.5V
Mit 8Mhz ist halt bei 2,7 Volt Schluß
Wenns ab 1,8 Volt funktionieren soll, dann dürfen es max. 4MHz sein
Okay, gibt es nun einen (einfachen) Weg, den Takt herunter zu teilen,
damit ich auf 4Mhz komme?
Welche Auswirkungen hätte dies für meine Arduino-Entwicklungsumgebung?
Es ist wichtig für mich, dass die Schnittstellen SPI, I2C und UART
korrekt laufen (bei geringen Datenraten).
Wie gesagt, derzeit ist der "Standard"-Oszillator von 8Mhz auf dem Board
verlötet.
DANKE!
Tim S. schrieb:> DANKE!
Ungeduldig? Da studiere mal den Abschnitt "System Clock and Clock
Options" (Kapitel 9) des Datenblatts vom ATMega328P
> Okay, gibt es nun einen (einfachen) Weg, den Takt herunter zu teilen,> damit ich auf 4Mhz komme?> Wie gesagt, derzeit ist der "Standard"-Oszillator von 8Mhz auf dem Board> verlötet.>
Jein, an den 8MHz (intern oder extern) kannst du nix ändern, weil
verlötet bzw im Chip drinnen.
Du könntest höchstes die Fuse CKDIV8 setzen oder wie von dir beschrieben
per clock_prescale_set (in der Tat entspricht die Fuse CKDIV8 einem
clock_prescale_set(clock_div_8))
>> Welche Auswirkungen hätte dies für meine Arduino-Entwicklungsumgebung?> Es ist wichtig für mich, dass die Schnittstellen SPI, I2C und UART> korrekt laufen (bei geringen Datenraten).>
Genau hier liegt das Problem... Alle Taktraten der Peripherie Module des
ATMega328P werden aus dem Basistakt hergeleistet.
Während sich ohne Anpassung des Codes bei SPI und I2C, die ja ein
Clocksignal haben, "lediglich" die Geschwindigkeit ändern sollte, stimmt
beim UART z.B. die Komplette Baudraten Berechnung nicht mehr und es
kommt eine krumme Baudrate heraus. Ebenfalls würde die millis() Funktion
entsprechend langsamer zählen.
Die Arduino IDE ist halt auf 8/16 MHz Takt ausgelegt. Das Stichwort ist
hier eine Compileranweisung namens "F_CPU", in der die aktuelle
Geschwidigkeit eingetragen ist. Irgendwo in den Tiefen der ganzen Libs
des Arduino Framework ist das gesetzt.
Hier stößt das Arduino Framework an eine seiner Grenzen und evtl.
solltest du dir überlegen auf z.B. das ATMel Studio als
Entwicklungsumgebung umzusteigen.
Wenn Peter Dannegger recht hat (und wann hat er mal nicht recht), dann
steht zurzeit BOD auf 2.7 V, d.h. das Extended Fuse Byte auf FD - das
wäre jetzt mal zu verifizieren; zusätzlich zur Taktabsenkung müsste dann
also für die angestrebten 2.0 V der BOD permanent abgeschaltet (FF)
oder auf 1.8 V (FE) gestellt werden.
> BOD_OFF auch global wirksam
Wenn der BOD eingeschaltet ist (per Extended Fuse Byte), dann lässt er
sich m.E. softwaremäßig nur temporär deaktivieren, nämlich nur während
des unmittelbar folgenden sleep. Und das steht im Widerspruch zum
verlangten Betrieb bis 2.0 V herab.
Je nach Dauer des Schlafes / Entladung der Batterie macht es ggf. Sinn,
dass nach dem Aufwachen die Spannungsversorgung durch den BOD geprüft
wird.
Hier würde sich ein Absenken der BOD Levels über die Fuses auf 1.8 Volt
anbieten (siehe Anlage)
Reiner_Gast schrieb:> Je nach Dauer des Schlafes / Entladung der Batterie macht es ggf. Sinn,
Ist leider im Datenblattauszug von S. Landolt eindeutig, dass sich BOD
per Software nicht abstellen lässt. Damit dürfte es aus der
Arduino-Umgebung heraus wohl nicht machbar sein - es sei denn, man
fummelt in deren Definitionsdateien herum.
Reiner_Gast schrieb:> Hier stößt das Arduino Framework an eine seiner Grenzen
Nein!
Grenzen hat es, aber nicht an der Stelle.
F_CPU ist in der Board Definition angenagelt.
Diese kann man editieren, das ist aber, nun ja, unelegant....
Also:
Für Extrawürste, erzeuge eine eigene Boarddefinition.
Ist alles keine Raketenwissenschaft.
Okay, so wie ich es jetzt verstanden habe ist BOD_OFF also wirklich nur
in dem Sleep von 8s wirksam?
Wenn der Controller daraus navh 8sek wieder "aufwacht" prüft er die
Spannung und schaltet bei 2,7V ab?
Das würde auch zu dieser Aussage passen:
https://iot-playground.com/blog/2-uncategorised/9-arduino-low-power-sensor
Hier ist erläutert, dass ein Pro Mini noch bei 2,4V @8MHz laufen sollte
(siehe Diagramm).
Wenn ich nun eine neue Boarddefinition unter ArduinoIDE anlegen und dort
die Fuses definiere (BODLEVEL) ist das dann schon ausreichend oder muss
ich die Fuses noch "richtig" umprogrammieren via ISP?
Herzlichen Dank!
Tim S. schrieb:> Wenn ich nun eine neue Boarddefinition unter ArduinoIDE anlegen und dort> die Fuses definiere (BODLEVEL) ist das dann schon ausreichend oder muss> ich die Fuses noch "richtig" umprogrammieren via ISP?
Wenn du die Fuses in der Boarddefinition anlegst/änderst, musst du sie
noch per "Bootloader brennen" auf den µC schreiben.
Arduino F. schrieb:> Wenn du die Fuses in der Boarddefinition anlegst/änderst, musst du sie> noch per "Bootloader brennen" auf den µC schreiben.
Geht das über den vorhandenen Bootloader oder nur per ISP?
Offensichtlich kannst du dich nicht selber kundig machen.
Und nein, auf Google vorlesen, habe ich gerade wenig Lust.
Ein letzter Suchtipp: "Arduino Bootloader brennen"
Arduino F. schrieb:> Offensichtlich kannst du dich nicht selber kundig machen.
Fanboy - ich kann einen Bootloader brennen, wenn der fehlt, dazu habe
ich ISP-Hardware, die von der IDE unterstützt wird!
Die Frage ist durchaus ernst gemeint, ob sich per USB ein vorhandener
Bootloader überschreiben lässt.
Manfred schrieb:> Die Frage ist durchaus ernst gemeint, ob sich per USB ein vorhandener> Bootloader überschreiben lässt.
Naja, das wuerde bedeuten, dass sich der vorhandene Bootloader selbst
ueberschreiben muesste. => Wenn der Bootloader also nicht entsprechend
geschrieben ist (wobei ich nicht weiss, ob das moeglich ist), dass er
sich selbst erstmal in den RAM kopiert (und von da ausgefuehrt werden
kann), dann wird das nichts. Du wuerdest dir den Ast auf dem du sitzt
unterm Hintern absaegen.