Remarque : Comme d'autres l'ont souligné, les cotes maximales absolues ne doivent jamais être intentionnellement approchées. Ils sont le point de défaillance connu de la puce. Cependant, ils fournissent un point de conception très utile pour comprendre à quelle distance vous êtes de ce maximum. Cette réponse se concentre sur la résolution de ce qui reste de ce problème de conception - à savoir, à quelle distance doit-on être de cette valeur maximale (et pourquoi).
Il y a deux gros problèmes à considérer lors du dimensionnement du courant de sortie dans des situations statiques : la sortie de tension et la sortie thermique.
Sortie de tension
Au fur et à mesure que vous augmentez le courant de sortie, la tension de sortie commencera à "échouer" (être supérieure à celle attendue pour une sortie "basse" et inférieure à celle attendue pour une sortie "haute") en raison de l'impédance de sortie finie du pilote de sortie de la broche GPIO . Cela, à son tour, perturbera le point Q de votre circuit connecté à la sortie.
Ceci est particulièrement intéressant dans le cas d'appareils hautement non linéaires comme les LED. Si vous modifiez un peu la tension que vous appliquez à une LED, la demande actuelle change beaucoup plus par rapport.
Cela conduit au principe général selon lequel vous voulez que la tension de sortie "erreur" ne dépasse pas 10% (pour faciliter votre vie de conception).
Afin d'aller n'importe où près des maximums absolus, vous devrez subir quelque chose comme> 60% d'erreur dans votre tension de sortie. En fait, les spécifications de votre MCU ne vous montrent même pas combien d'erreur il y aurait à ce niveau de sortie.
Vous obtiendrez quelque chose comme 1V sur une sortie "haute" d'un VCC 3V. Ce niveau n'est pas assez élevé pour signaler de manière fiable "élevé" à d'autres appareils (dans les systèmes numériques).
J'ai extrait ce chiffre de votre lien de fiche technique:
Pour calculer la limite de courant (ici, étant donné Vcc = 3): 3 - 0,1 (3) = 2,7
À 2,7 V, la limite de courant nominal est de 8 mA, c'est-à-dire un peu moins que ce que vous attendiez de * 30 * mA environ ... ;-)
Une note intéressante de la physique des périphériques est que le côté n (côté bas) dans presque tous les pilotes de sortie CMOS que j'ai examinés est un peu plus fort que le côté haut de type p. En effet, les électrons (le porteur majoritaire dans les FET de type n) se déplacent environ deux fois plus facilement dans le canal que les trous (le porteur majoritaire dans les FET de type p). Pour compenser, les fabricants de puces doublent (environ) la taille du transistor de type p jusqu'à ce que les performances du pilote soient à peu près symétriques, mais le côté bas conserve généralement un léger (<10% d'avantage) malgré tout.
Ce cas ne fait pas exception ...
Vous pouvez voir sur cette figure que 0 + 0,1 (3) = 0,3 V -> 9 mA, environ 10% de plus que le 8 mA précédemment.
Vous devez donc installer vos pointages LED dans votre puce si possible. Autrement dit, concevez-les de sorte que la sortie faible = LED allumée. Quelque chose comme ça:
Sortie thermique
Courants élevés dans le pilote de broche = chaleur (évidemment). Heat ++ -> catastrophe. Les circuits d'attaque GPIO sont généralement répartis uniformément sur la périphérie de la puce par nécessité géométrique (souvent, ils déterminent la taille minimale de la puce).
Dans le cas de cette puce Atmel (ATMEGA8, voir ci-dessous), elles le sont très certainement. Les circuits GPIO sont regroupés autour des sites de connexion de fils bleu foncé dans l'anneau cyan autour de la logique (sombre) et des zones de mémoire au centre.
Tout cela n'est qu'une estimation des limites et légèrement ondulé à la main, mais l'ingénierie consiste à faire avancer les choses, alors voilà ... ;-)
L'utilisation de broches voisines à des niveaux de courant élevés devrait entraîner au moins un déclassement linéaire.
Si vous supposez que la pièce distribue la chaleur à peu près également (hypothèse juste pour votre petite matrice), vous pouvez obtenir une approximation de premier ordre en travaillant à l'envers à partir de la valeur maximale absolue (40mA) et en supposant que la broche voisine partagera 100% de la charge de chaleur.
Cela signifie que si vous avez une sortie 40mA (ne le faites pas réellement), ses voisins immédiats devraient être à 0mA. Sortie 20mA -> voisins 10mA, etc ...
Si je l'ai expliqué assez bien, alors il devrait maintenant être clair que vous choisissez le minimum entre les deux méthodes.