Ich habe eine benutzerdefinierte Arduino ATMega328-Karte, die im Allgemeinen mit 5 V bei 8 MHz betrieben wird (unter Verwendung des Arduino Pro 3.3 V 8 MHz-Profils und des Bootloaders). Der Hauptgrund, warum ich dieses Setup verwende, ist, dass ich die Karte in den Ruhezustand versetzen kann, wenn die Hauptstromversorgung unterbrochen wird und die Batterie leer wird (3 V von einer Knopfzelle). Die 5V- und 3V-Quellen sind Dioden ODER-verknüpft und der 5V-Eingang ist mit INT0 verbunden. Wenn im Code festgestellt wird, dass INT0 auf einen niedrigen Wert gefallen ist, wird der Ruhemodus initialisiert und alles wird heruntergefahren, mit Ausnahme des Watchdog-Timers, der einen 1-Hz-Zyklus beibehält, um eine interne Zählung aufrechtzuerhalten und zu überprüfen, ob der Chip wieder aufgeweckt werden soll. Dies funktioniert wunderbar, wenn zuerst 5 V angelegt werden, dann die Batterie eingelegt wird und dann5V ist nicht angeschlossen. Es geht schlafen und wenn 5V zurückgebracht werden, wacht es auf und ich kann sehen, dass es nicht die Zählung verloren hat.
Allerdings kommt das Problem , wenn 3V angelegt wird zuerst . Ich bin mir ehrlich gesagt nicht sicher, ob es überhaupt bootet. Es soll jedoch booten, prüfen, ob INT0 (Digital 2) niedrig ist, und in diesem Fall sofort einschlafen. Wenn ich mir die Stromaufnahme ansehe, sehe ich, dass sie einige Sekunden lang mit einigen mA versorgt wird und dann auf etwa 0,3 mA abfällt (immer noch höher als im Schlafmodus). Aber wenn ich 5V wieder anlege, nichts . Der Stromverbrauch steigt wieder an, reagiert jedoch nicht (über die FTDI-Serie).
Gibt es vielleicht etwas, das mir fehlt, dass es nicht auf 3V gebootet werden kann ... theoretisch sollte es gut laufen.
Update: Ich habe eine LED auf D13 gelegt und die Blinkskizze ausprobiert. Funktioniert gut, wenn von 3V oder 5V gestartet wird. Wenn ich jedoch meine Firmware starte und sie mit 3 V starte, beginnt die LED nur wild zu blinken. Ich habe keine Ahnung, was es verursacht, da ich D13 nie als etwas in meinem Code eingerichtet habe. Aber es macht mich zu etwas, das etwas mit dem Bootloader zu tun hat ...
Antworten:
Also ... stellte sich heraus, dass alles, was geschah, im Code war. Es stellt sich heraus, dass ich am Anfang meines Codes einen Interrupt auf INT0 initialisiert habe, als er niedrig war. Das Problem war, dass INT0 beim Start mit 3-V-Notstrom immer niedrig war, da INT0 an die 5-V-Leitung angeschlossen ist (so kann es in den Ruhezustand versetzt werden). Da INT0 niedrig war und der Interrupt auf niedrig ausgelöst wurde, trat ein konstanter Interrupt auf, der dem Rest des Programms keine Zeit zum Ausführen gab. Umgeschaltet, um diesen Interrupt nur zu aktivieren, wenn ich in den vollständigen Weckmodus gewechselt bin und es jetzt gut funktioniert.
quelle
Was genau passiert und warum, kann anhand der Menge der bereitgestellten Informationen nicht bestimmt werden. Ich sehe jedoch mindestens ein potenzielles Problem, das die beschriebenen Symptome zumindest teilweise erklären würde.
Sie sagten, dass Sie Dioden verwenden, um die Spannungsversorgung auszuwählen, und eine Versorgung ist eine 3-V-Batterie. Wenn Sie Standarddioden verwenden, die um ~ 0,6 V abfallen, beträgt die Versorgungsspannung zur MCU nur ~ 2,4 V. Wenn Sie Schottky-Dioden mit einem Spannungsabfall zwischen 0,15 und 0,45 verwenden, beträgt die Versorgungsspannung möglicherweise nur 2,5 V. Sie haben die BSB-Spannung auf 2,7 Volt eingestellt, sodass die MCU theoretisch niemals mit der Batterie booten kann.
Ich bin mir nicht sicher, warum Sie es bei 5 V starten, auf 3 V fallen lassen und es wieder hochfahren können. Sie könnten den BSB im Code deaktivieren ... vielleicht ... Sie sind sich nicht sicher, warum er funktioniert, aber es ist wahrscheinlich nicht garantiert, dass er funktioniert.
Ich habe eine Diodenschaltschaltung mit 5 V und 3,3 V eingerichtet, um zu sehen, wie es auf meinem Oszilloskop aussieht, wenn die Spannungen umschalten. Wenn bei 3,3 V auf 5 V umgeschaltet wird, schwingt die Spannung anfangs ziemlich stark. Dies kann möglicherweise zu Problemen führen, wenn die MCU versucht, aus dem Schlaf zu kommen. Durch Setzen einer Kappe zwischen VCC und GND wurde das Signal sehr gut geglättet. Beim Umschalten von 5 V auf 3,3 V gab es wirklich keine Schwingungen, nur einen sauberen Abfall.
Aus diesen Informationen geht hervor, dass Sie den BSB-Schwellenwert senken oder den BSB ausschalten und eine Entkopplungskappe zwischen VCC und GND setzen sollten. Sie sollten wahrscheinlich auch sicherstellen, dass Sie einen Pulldown-Widerstand an INT0 haben, und die Abschnitte des MCU-Datenblattes lesen, in denen die verschiedenen Schlafmodi und alle Überlegungen zum Schlafen und Wachen erläutert werden - das ist ziemlich kompliziert. Prost
quelle
Ich denke, das Problem liegt bei Ihrem Bootloader, aber nicht so, wie Sie denken.
Wenn ein Arduino gestartet wird, benötigt ein Bootloader, der von mehreren Aufgaben profitiert, z. B. der Suche nach einem seriellen Host oder dem Laden von Programmdaten aus Flash, viel mehr Energie als ein schlafender Arduino.
Ich denke, der Grund, warum Ihr Arduino nicht startet, ist, dass der Bootloader eine genaue Taktquelle benötigt, aber wenn Sie 3 V an ihn anlegen, wird diese Uhr durcheinander gebracht und es wird möglicherweise abstürzen oder warten, bis 3,3 V für eine stabile Quelle angewendet werden.
Betrachten Sie das Datenblatt:
Wir sehen, dass die Stromaufnahme beim Aufwachen (Ausführen des Bootloaders) wahrscheinlich etwa 2 mA betragen wird, während der Schlafstrom etwa 0,8 Mikroampere beträgt . Dies könnte sicherlich zu einem Stromausfall beim Start ohne den richtigen Strom führen.
Vielleicht sollten Sie es nur mit 5 V einschalten, oder vielleicht benötigen Sie eine Batterie mit höherem Strom und höherer Spannung.
quelle
Versuchen Sie, Ihr Arduino erneut zu laden, indem Sie zu Extras> Bootloader brennen gehen
quelle