Quelles sont les implications du fonctionnement d'un ATmega328P à 8 MHz et 3,3 V avec le système Arduino?

8

Je travaille sur un arduino personnalisé qui fonctionnera à 3,3 V sans régulateur ni puce USB (pour la consommation d'énergie). J'ai entendu dire que l'overclocking de la puce à 16 MHz / 3,3 V est généralement bien, mais j'aimerais quand même rester dans les spécifications.

Premièrement: pour fonctionner à 8 MHz, dois-je simplement remplacer le cristal? Ou dois-je faire autre chose?

Deuxièmement: dois-je apporter des modifications au code pour refléter la nouvelle vitesse? J'utilise des connexions série, SPI et I2C dans ce projet, ainsi que le système d'exploitation NilRTOS et les fonctions millis / delay. Y en aura-t-il qui seront cassés? Le code fonctionnera-t-il sensiblement plus lentement?

Troisièmement: comment puis-je programmer la puce? Est-il correct de le programmer dans un Arduino Uno à 16 MHz, puis de le transplanter sur l'arduino personnalisé?

Quatrièmement: la consommation d'énergie changera-t-elle à 8 MHz?

Merci!

Vulcain
la source
2
Il existe de nombreuses cartes compatibles Arduino 3,3 V, Sparkfun Pro mini en étant un exemple. Il est pris en charge par l'IDE afin que tous les ajustements spécifiques à l'horloge soient effectués pour vous une fois que vous les aurez sélectionnés dans la liste déroulante `` boards ''.
Oleg Mazurov
À 8 MHz, vous utiliserez probablement l'oscillateur interne au lieu d'un cristal. Méfiez-vous lorsque vous compilez du code que lorsque vous choisissez par exemple "Pro Mini 328p à 8 MHz" que 8 est appliqué au code, je ne suggérerais donc pas de compiler à 16 MHz puis de transplanter ou vous pouvez constater qu'un retard (1000) prend deux secondes comme exemple simple. Et vérifiez l'économie d'énergie / sommeil dans le code H2OhNo. (Un autre moment où je suggère que vous obteniez n'importe quel programmeur au lieu de vous limiter aux téléchargements en série, recherchez Tindie pour "ISP".)
Patrick Tudor

Réponses:

7

La formule semble être volt * 5,9-6,6 = mhz (valable entre 1,8 v et 4,5 v), donc à 3,3 v, cela donnerait 12,8 mhz. Sachez que si vous utilisez une fréquence de 12,8 MHz, TOUTE chute en dessous de 3,3 V PEUT causer des problèmes (et très difficile à diagnostiquer aussi!) Ou vous POUVEZ vous en tirer.

Cependant, les puces Arduino Atmega328p ont une détection de "brunissement" réglée à 4,3 V - toute baisse en dessous, la puce s'arrête. Vous pouvez obtenir un FAI (AKA ICSP) pour changer les fusibles - allez sur http://www.engbedded.com/fusecalc/ pour savoir sur quoi régler les fusibles. Vous pouvez également utiliser le FAI pour lire les fusibles actuels, ou bien reprogrammer la puce sans carte Arduino - tous mes projets ont un en-tête à 6 broches. Si vous faites cela, avant de reprogrammer en utilisant la carte Arduino, vous devrez "Graver Bootloader" (dans le menu des outils). Notez que la programmation peut toujours être effectuée via Arduino IDE.

Alternativement, si vous voulez aller "léger" (et avoir un FAI), vous pouvez changer les fusibles pour utiliser l'horloge interne de 8 MHz - cela libère également 2 broches supplémentaires! Sachez cependant que l'horloge interne peut dériver 1,2 heure par jour (= 5%), contre 1,7 seconde par jour (= 20 parties par million) sur un cristal de quartz typique. Si vous ne l'utilisez pas pour le chronométrage, cela n'a probablement pas d'importance.

Vous devrez modifier le timing, pour votre code - vous devez ajouter un boards.txt avec les paramètres corrects pour votre puce / vitesse d'horloge, etc. - vous pouvez copier les paramètres de l'entrée de la carte, changer le nom et changer le paramètre "build.f_cpu"; redémarrez (ou démarrez) votre Arduino IDE, allez dans "Outils-> Carte" et sélectionnez la carte que vous avez ajoutée.

Vous pouvez déplacer la puce sur / hors de la carte, et la reprogrammer là (notez que la carte sélectionnée dans Outils-> Carte est la carte FINALE, pas la carte de programmation). Faites attention à le brancher / débrancher - vous finirez par plier les broches! Alternativement, vous pouvez utiliser ISP (ICSP), comme mentionné ci-dessus - fortement recommandé. La programmation ISP fonctionnera également si la puce est réglée par défaut en usine, tant qu'elle dispose d'une horloge de travail.

La quantité d'énergie utilisée par la puce dépend énormément de ce que vous en faites - pas seulement les vitesses d'horloge, la source d'horloge, etc. mais également les modes de veille. Si vous dormez beaucoup, il peut dessiner moins en courant plus vite qu'en courant plus lentement - si presque tout votre temps est endormi, alors la consommation d'énergie doit être comptée par cycle d'horloge, pas par seconde - si votre horloge est la moitié de la vitesse, et demi-courant, puis vous tirez le même courant par instruction. Puisque le reste de votre temps est endormi, vous n'en tirez aucun avantage. Voir http://www.gammon.com.au/power pour une très bonne répartition de la consommation d'énergie, des conseils sur la façon d'économiser de l'énergie, etc.

Si vous ralentissez trop votre horloge, la série et l'i2c peuvent devenir peu fiables (à moins que vous ne ralentissiez la vitesse), mais je m'attendrais à pouvoir descendre à 1 mhz avant que cela ne soit un problème - une puce de 1 mhz essayant de faire 9600 bps a 104 instructions par bit de données transférées. i2c fonctionne à 100 khz, vous obtenez donc 10 instructions par bit (à 1 mhz) - éventuellement en le poussant. 8 MHz devrait être bien. Test, test, test.

MISE À JOUR: Il y a 3 paramètres possibles pour la détection de brunissement - il y a 3 valeurs possibles pour l'AtMega328p: désactivé, 1,8 V, 2,7 V et 4,3 V. J'avais l'impression (ci-dessus) que les Arduinos étaient normalement réglés sur 4.3v; ce n'est apparemment pas le cas (voir commentaire ci-dessous). Je me souviens avoir vu quelque part qu'il y avait une détection de baisse de tension. C'est quelque chose à garder à l'esprit, si votre Arduino se réinitialise, en particulier lorsque vous mettez des charges plus importantes sur la batterie (moteurs en marche, plusieurs LED, etc.).

AMADANON Inc.
la source
Merci pour cette réponse! Je suis un peu déconcerté par ce que vous avez dit à propos de la coupure du détecteur de coupure en dessous de 4,3 V. Je fonctionne maintenant à 3,7 V et cela fonctionne bien; n'a pas eu à modifier les fusibles.
Vulcan
@ user40, voir la section "MISE À JOUR" au bas de mon message.
AMADANON Inc.
4

Premièrement: pour fonctionner à 8 MHz, dois-je simplement remplacer le cristal? Ou dois-je faire autre chose?

Non, exécutez sur l'oscillateur interne comme suggéré par AMADANON Inc.

Alternativement, réglez le fusible "diviser l'horloge par 8" (qui le ferait fonctionner à 2 MHz à partir d'un cristal de 16 MHz), puis changez la division en code à 2, c'est-à-dire.

#include <avr/power.h>

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

Ou pour programmer dans un autre Uno, laissez le fusible tranquille, programmez à 16 MHz, puis abaissez l'horloge dans la puce cible, en espérant qu'il fonctionne suffisamment longtemps à 3,3 V pour exécuter cette première instruction. La chose la plus sûre serait d'installer simplement un cristal ou un résonateur de 8 MHz sur la carte cible. Cependant, si le timing n'est pas critique, exécutez avec l'oscillateur interne.

Deuxièmement: dois-je apporter des modifications au code pour refléter la nouvelle vitesse? J'utilise des connexions série, SPI et I2C dans ce projet, ainsi que le système d'exploitation NilRTOS et les fonctions millis / delay.

Si vous dites à l'IDE que vous avez un processeur à 8 MHz (par exemple un Lilypad), il devrait alors régler les retards, les calculs de débit en bauds, etc. de manière appropriée.

Y en aura-t-il qui seront cassés?

I2C et SPI sont auto-synchronisés. Ils peuvent fonctionner à différents tarifs. Je doute qu'il y aura des problèmes avec eux. En ce qui concerne la série, à condition que les calculs soient effectués correctement, une large gamme de débits en bauds devrait toujours être disponible.

Le code fonctionnera-t-il sensiblement plus lentement?

Eh bien oui, il fonctionnera à mi-vitesse par rapport à 16 MHz.

Troisièmement: comment puis-je programmer la puce? Est-il correct de le programmer dans un Arduino Uno à 16 MHz, puis de le transplanter sur l'arduino personnalisé?

Vous pouvez le faire. Ou vous pouvez connecter un en-tête ICSP ou un en-tête FTDI et le programmer in situ.

Exemples ici: http://www.gammon.com.au/breadboard

Quatrièmement: la consommation d'énergie changera-t-elle à 8 MHz?

Oui, il est quelque peu réduit.

Vous pouvez le réduire considérablement davantage en utilisant d'autres techniques décrites sur http://www.gammon.com.au/power et référencées par AMADANON Inc.

Nick Gammon
la source
Merci Nick! J'ai déjà lu votre site Web auparavant et cela m'a aidé à réduire radicalement ma consommation d'énergie. En conséquence, les AA et les AAA sont maintenant une source d'alimentation viable pour cet appareil, ce qui est très important car le poids est important. Alors merci aussi pour ce site Web - c'est un énorme service pour la communauté et vraiment utile pour des gens comme moi.
Vulcan