Welche Auswirkungen hat der Betrieb eines ATmega328P mit 8 MHz und 3,3 V mit dem Arduino-System?


8

Ich arbeite an einem benutzerdefinierten Arduino, das mit 3,3 V ohne Regler oder USB-Chips (für den Stromverbrauch) betrieben wird. Ich habe gehört, dass das Übertakten des Chips mit 16 MHz / 3,3 V im Allgemeinen in Ordnung ist, aber ich möchte trotzdem innerhalb der Spezifikation bleiben.

Erstens: Muss ich nur den Kristall ersetzen, um mit 8 MHz zu arbeiten? Oder muss ich noch etwas tun?

Zweitens: Muss ich Codeänderungen vornehmen, um die neue Geschwindigkeit widerzuspiegeln? Ich verwende in diesem Projekt serielle, SPI- und I2C-Verbindungen zusammen mit dem NilRTOS-Betriebssystem und den Millis / Delay-Funktionen. Wird eines davon kaputt sein? Läuft der Code merklich langsamer?

Drittens: Wie kann ich den Chip programmieren? Ist es in Ordnung, es in einem Arduino Uno mit 16 MHz zu programmieren und dann auf das benutzerdefinierte Arduino zu transplantieren?

Viertens: Wird sich der Stromverbrauch bei 8 MHz ändern?

Vielen Dank!


2
Es gibt viele Arduino-kompatible 3,3-V-Boards, darunter Sparkfun Pro mini. Es wird von der IDE unterstützt, sodass alle uhrspezifischen Anpassungen für Sie vorgenommen werden, sobald Sie es aus der Dropdown-Liste "Boards" auswählen.
Oleg Mazurov

Bei 8 MHz ist es wahrscheinlich in Ordnung, den internen Oszillator anstelle eines Kristalls zu verwenden. Beachten Sie beim Kompilieren von Code, dass bei Auswahl von "Pro Mini 328p bei 8 MHz" 8 auf Code angewendet wird. Ich würde daher nicht empfehlen, für 16 MHz zu kompilieren und dann zu transplantieren, da sonst eine Verzögerung (1000) möglicherweise zwei Sekunden dauert als einfaches Beispiel. Überprüfen Sie im H2OhNo-Code den Energiespar- / Ruhezustand. (Ein weiterer Moment, in dem ich vorschlage, dass Sie überhaupt einen Programmierer haben, anstatt sich auf serielle Uploads zu beschränken, suchen Sie in Tindie nach "ISP".)
Patrick Tudor

Antworten:


7

Die Formel scheint Volt * 5,9-6,6 = MHz zu sein (gültig zwischen 1,8 V und 4,5 V), also würde dies bei 3,3 V 12,8 MHz ergeben. Beachten Sie, dass bei einem Betrieb mit 12,8 MHz JEDER Abfall unter 3,3 V Probleme verursachen kann (und auch sehr schwer zu diagnostizieren ist!), Oder dass Sie damit durchkommen.

Arduino Atmega328p-Chips haben jedoch eine "Brown-out" -Erkennung von 4,3 V - bei jedem Abfall darunter wird der Chip heruntergefahren. Sie können einen ISP (AKA ICSP) beauftragen, die Sicherungen zu wechseln. Unter http://www.engbedded.com/fusecalc/ können Sie herausfinden, auf welche Sicherungen die Sicherungen eingestellt werden sollen. Sie können auch den ISP verwenden, um die aktuellen Sicherungen zu lesen oder den Chip ohne Arduino-Karte neu zu programmieren - alle meine Projekte haben einen 6-poligen Header. Wenn Sie dies tun, müssen Sie vor dem Neuprogrammieren mit der Arduino-Karte "Bootloader brennen" (im Menü "Extras"). Beachten Sie, dass die Programmierung weiterhin über die Arduino IDE erfolgen kann.

Wenn Sie alternativ "leicht" werden möchten (und einen ISP haben möchten), können Sie die Sicherungen austauschen, um die interne 8-MHz-Uhr zu verwenden - dies spart auch 2 zusätzliche Pins! Beachten Sie jedoch, dass die interne Uhr 1,2 Stunden pro Tag (= 5%) driften kann, verglichen mit 1,7 Sekunden pro Tag (= 20 ppm) bei einem typischen Quarzkristall. Wenn Sie es nicht zur Zeitmessung verwenden, spielt dies wahrscheinlich keine Rolle.

Sie müssen das Timing für Ihren Code ändern - Sie müssen eine board.txt mit den richtigen Einstellungen für Ihren Chip / Ihre Taktrate usw. hinzufügen - Sie können die Einstellungen aus dem Eintrag für die Karte kopieren, den Namen ändern und ändern die Einstellung "build.f_cpu"; Starten Sie Ihre Arduino IDE neu (oder starten Sie sie), gehen Sie zu "Tools-> Board" und wählen Sie das Board aus, das Sie hinzugefügt haben.

Sie können den Chip auf der Karte ein- und ausschalten und dort neu programmieren (beachten Sie, dass die unter Tools-> Karte ausgewählte Karte die FINAL-Karte und nicht die Programmierkarte ist). Seien Sie vorsichtig beim Ein- und Ausstecken - schließlich werden Sie die Stifte verbiegen! Alternativ können Sie ISP (ICSP) wie oben erwähnt verwenden - sehr zu empfehlen. Die ISP-Programmierung funktioniert auch, wenn der Chip werkseitig ist, solange er eine funktionierende Uhr hat.

Wie viel Strom der Chip verbraucht, hängt stark davon ab, was Sie damit machen - nicht nur Taktraten, Taktquelle usw., sondern auch Schlafmodi. Wenn Sie viel schlafen, zieht es möglicherweise weniger, wenn Sie schneller laufen als langsamer - wenn fast Ihre gesamte Zeit schläft, sollte der Stromverbrauch pro Taktzyklus und nicht pro Sekunde gezählt werden - wenn Ihre Uhr halb so schnell ist und halber Strom, dann ziehen Sie den gleichen Strom pro Befehl. Da der Rest Ihrer Zeit im Schlaf verbracht wird, erhalten Sie keinen Vorteil. Unter http://www.gammon.com.au/power finden Sie eine sehr gute Aufschlüsselung des Stromverbrauchs, Tipps zum Energiesparen usw.

Wenn Sie Ihre Uhr zu stark verlangsamen, werden Seriell und i2c möglicherweise unzuverlässig (es sei denn, Sie verlangsamen die Geschwindigkeit), aber ich würde erwarten, dass dies vorher auf 1 MHz reduziert werden kann, was ein Problem darstellt - ein 1-MHz-Chip, der versucht, 9600 Bit / s zu erreichen hat 104 Anweisungen pro übertragenem Datenbit. i2c läuft mit 100 kHz, sodass Sie 10 Anweisungen pro Bit (bei 1 MHz) erhalten - möglicherweise drücken. 8 MHz sollten in Ordnung sein. Test, Test, Test.

UPDATE: Es gibt 3 mögliche Einstellungen für die Brown-Out-Erkennung - es gibt 3 mögliche Werte für den AtMega328p: deaktiviert, 1,8 V, 2,7 V und 4,3 V. Ich hatte den Eindruck (oben), dass Arduinos normalerweise auf 4,3 V eingestellt waren; anscheinend ist das nicht der Fall (siehe Kommentar unten). Ich erinnere mich, dass ich irgendwo gesehen habe, dass ein Brownout erkannt wurde. Dies ist zu beachten, wenn Ihr Arduino zurückgesetzt wird, insbesondere wenn die Batterie stärker belastet wird (laufende Motoren, mehrere LEDs usw.).


Danke für diese Antwort! Ich bin etwas verblüfft über das, was Sie über das Abschalten des Brownout-Detektors unter 4,3 V gesagt haben. Ich laufe jetzt mit 3,7 V und es funktioniert einwandfrei. Ich musste keine Änderungen an den Sicherungen vornehmen.
Vulcan

@ user40, siehe Abschnitt "UPDATE" am Ende meines Beitrags.
AMADANON Inc.

3

Erstens: Muss ich nur den Kristall ersetzen, um mit 8 MHz zu arbeiten? Oder muss ich noch etwas tun?

Nein, laufen Sie auf dem internen Oszillator, wie von AMADANON Inc. vorgeschlagen.

Alternativ können Sie die Sicherung "Takt durch 8 teilen" einstellen (die bei einem 16-MHz-Kristall mit 2 MHz betrieben wird), und dann im Code die Division wieder auf 2 ändern.

#include <avr/power.h>

void setup ()
  {
  // slow clock to divide by 2
  clock_prescale_set (clock_div_2);
  } // end of setup

Oder für die Programmierung in einem anderen Uno lassen Sie die Sicherung in Ruhe, programmieren Sie mit 16 MHz und lassen Sie dann den Takt im Zielchip fallen, in der Hoffnung, dass er bei 3,3 V lange genug funktioniert, um diesen ersten Befehl auszuführen. Am sichersten wäre es, nur einen 8-MHz-Quarz oder Resonator auf der Zielplatine zu installieren. Wenn das Timing jedoch nicht kritisch ist, fahren Sie mit dem internen Oszillator.

Zweitens: Muss ich Codeänderungen vornehmen, um die neue Geschwindigkeit widerzuspiegeln? Ich verwende in diesem Projekt serielle, SPI- und I2C-Verbindungen zusammen mit dem NilRTOS-Betriebssystem und den Millis / Delay-Funktionen.

Wenn Sie der IDE mitteilen, dass Sie einen 8-MHz-Prozessor (z. B. ein Lilypad) haben, sollten Verzögerungen, Baudratenberechnungen usw. entsprechend angepasst werden.

Wird eines davon kaputt sein?

I2C und SPI sind selbstgetaktet. Sie können mit einer Vielzahl von Raten laufen. Ich bezweifle, dass es Probleme mit ihnen geben wird. Was die Serien betrifft, sollte, sofern die Berechnungen richtig durchgeführt werden, noch ein breiter Bereich von Baudraten verfügbar sein.

Läuft der Code merklich langsamer?

Nun ja, es läuft mit halber Geschwindigkeit im Vergleich zu 16 MHz.

Drittens: Wie kann ich den Chip programmieren? Ist es in Ordnung, es in einem Arduino Uno mit 16 MHz zu programmieren und dann auf das benutzerdefinierte Arduino zu transplantieren?

Du kannst das machen. Oder Sie können einen ICSP-Header oder einen FTDI-Header anschließen und vor Ort programmieren.

Beispiele hier: http://www.gammon.com.au/breadboard

Viertens: Wird sich der Stromverbrauch bei 8 MHz ändern?

Ja, es ist etwas reduziert.

Sie können es erheblich reduzieren, indem Sie andere Techniken verwenden, wie unter http://www.gammon.com.au/power beschrieben und von AMADANON Inc. beschrieben.


Danke Nick! Ich habe Ihre Website bereits gelesen und sie hat mir geholfen, meinen Stromverbrauch radikal zu senken. Infolgedessen sind AAs und AAAs jetzt eine brauchbare Stromquelle für dieses Gerät, was eine große Sache ist, da das Gewicht wichtig ist. Vielen Dank auch für diese Website - sie ist ein großer Service für die Community und sehr hilfreich für Leute wie mich.
Vulcan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.