Question:
En raison d'une surintensité, ne devrais-je pas être extrêmement prudent lors de la définition d'une broche d'E / S comme sortie?
Julian Zatloukal
2020-01-03 05:38:51 UTC
view on stackexchange narkive permalink

La question peut s'appliquer à n'importe quel microcontrôleur doté de capacités d'E / S, mais je travaille actuellement avec le populaire ATmega328p. Considérez le circuit suivant: Un simple commutateur SPST normalement ouvert avec une résistance de rappel de 10k et un condensateur en céramique attaché, connecté à n'importe quel port d'E / S. La broche spécifique doit être évidemment configurée comme INPUT dans le DDRx respectif. La fiche technique décrit, dans la section DC Characteristics, une broche d'E / S de courant de fuite d'entrée \ $ (I_ {IL} / I_ {IH}) \ $ de 1µA, tandis que loin dans l'horizon, le courant continu par broche d'E / S plafonne à 40,0 mA. Pas du tout un problème.

  DDRD = 0x00; // Port entier comme INPUT
 

enter image description here Considérez maintenant que j'ai oublié le fait que la broche donnée doit être définie comme entrée, je la mets en sortie et je règle le port HIGH.

  DDRD = 0xFF; // Port entier comme OUTPUT
PORTD = 0xFF; // Port entier HIGH
 

Bien que la fiche technique ne fournisse pas d'impédance de sortie , elle peut être estimée à 25 Ω, sur la base des graphiques donnés. Maintenant, au moment où le bouton est enfoncé, le courant trouve son chemin à travers le microcontrôleur à partir de la source 5V avec une résistance de 25Ω plus une résistance négligeable en raison de la trace de cuivre. Cela produit théoriquement une surintensité de 160 mA au-dessus du courant continu par plafond de broches d'E / S. Cela pourrait-il faire frire le port et l'appareil? enter image description here De manière analogue, si je passe en logique positive et que je règle le port sur LOW, le même problème peut se produire:

  DDRD = 0xFF; // Port entier comme OUTPUT
PORTD = 0x00; // Port entier BAS
 

enter image description here Considérant que ce type de circuit est vivement encouragé, comment cela ne semble pas poser de problèmes? Maintenant, revenons à la question initiale, ne devrais-je pas être extrêmement prudent lors de la définition d'une broche d'E / S comme sortie? Ou au moins attacher une petite résistance en série comme protection primitive?

Remarque: Vous n'êtes pas anglophone, n'hésitez pas à modifier le message si vous voyez quelque chose de bizarre.

Votre anglais, votre ponctuation, votre orthographe et votre capitalisation sont parfaits et bien meilleurs que ceux de nombreux locuteurs natifs qui publient ici.Je vais laisser quelqu'un avec plus de connaissances sur les GPIO sur ces puces répondre à votre question.+1.
@Transistor C'est plutôt flatteur à entendre!La vérité est que je prends généralement plus de temps pour écrire ce genre d’articles, j’ai juste l’impression que tout le monde tache mes écrits: »(
Tout comme lorsque vous conduisez sur une route à deux voies, veillez à ne pas changer de voie en circulation en sens inverse.Vous veillez à ce que le code corresponde à la conception du système.En général, vous ne définissez pas de contrôles de port comme ça, une lecture-modification-écriture est typique, non obligatoire, mais typique pour réduire le risque de telles erreurs.Mais des erreurs se produisent et les chips laissent sortir leur fumée.Même avec des décennies d'expérience, j'achète généralement deux ou trois de quelque chose au cas où j'en fais exploser un et que je ne veux pas attendre quelques jours / semaines pour un autre.
En même temps, si vous voulez faire du matériel ou des logiciels à ce niveau, vous prenez ce risque et vous trouvez des solutions personnelles pour prendre de bonnes habitudes, une solution pour ne pas faire d'erreurs ne fonctionne pas sur une autre personne.Chaque ligne de code que vous ajoutez ajoute un risque à la conception, donc vous ne voulez pas non plus trop de code, il en va de même pour la conception matérielle.maigre et méchant et propre, mais faites preuve de prudence.
J'ai vu des gens du matériel ajouter des trucs juste au cas où le logiciel se foutrait et de même beaucoup de logiciels nécessaires pour protéger le logiciel des gens du matériel, plutôt que tout le monde s'asseoir et en parler, et les deux côtés faisant ce qu'ils avaient ditfaites-le correctement, que ce soit un examen par les pairs, une double vérification ou autre.
@old_timer Merci d'avoir pris le temps de les écrire!Je suppose que le codage dans les systèmes embarqués n'est pas un monde magique où rien ne se passera si vous le gâchez, contrairement au développement Web ou mobile.Un mauvais code peut endommager le matériel réel, je vais en prendre note et faire attention.
@JulianZatloukal Une fois (accidentellement), j'ai mis une polarisation inverse de 5v sur vcc et gnd sur la puce ATTiny85 pendant ~ 5s - j'ai remarqué qu'elle devenait assez chaude (douloureuse au toucher) et j'ai coupé le courant.Chip fonctionnait toujours comme un champion, les architectures avr sont notoirement résistantes.
Vous devriez être * légèrement * prudent, car cela ne vous coûtera qu'environ 2 $ pour une nouvelle puce?
Six réponses:
Tom Carpenter
2020-01-03 06:21:05 UTC
view on stackexchange narkive permalink

Comme d'autres l'ont dit, vous ne devriez pas avoir de problème tant que vous vérifiez votre code.

Si vous vous trompez, dans l'ensemble, les broches ATMega IO se limiteront à environ ~ 80 mA en raison de la résistance interne des MOSFET (valeur trouvée par l'expérience). Ce n'est pas bon pour la puce, mais tant que vous ne la laissez pas dans cet état pendant une période prolongée, elle a tendance à récupérer correctement.


Si vous êtes inquiet, cela peut être une bonne idée de mettre une résistance en série avec les entrées. Quelque chose de l'ordre de 330R pour un VDD 5V, ou 220R pour un VDD 3,3V. Cela garantira que le courant de court-circuit est limité à ~ 15 mA, ce qui est confortablement conforme aux spécifications.

La résistance passe entre la broche IO et ce qui la pilote (par exemple, bouton avec pull-up ou CMOS). Comme l'ATMega a une plage de fréquences utile assez limitée (IO freq < 10MHz), la résistance supplémentaire n'aura aucun impact notable sur le fonctionnement du circuit car les entrées ont très peu de courant de fuite et de capacité

Merci d'avoir remarqué le message!Je revérifie sûrement mon code, me considérant plus comme un programmeur de nos jours!Mais j'étais en fait préoccupé par une ligne idiote dans une bibliothèque importée activant la sortie.Peut-être que je suis un peu paranoïaque.Je ne savais pas que les MOSFET limitaient le courant, c'est peut-être la raison pour laquelle je n'ai pas entendu parler de ce problème auparavant.
Vous n'êtes pas paranoïaque, les broches échouent si vous les court-circuitez à la masse ou Vdd sur un 328p.
Justme
2020-01-03 06:06:44 UTC
view on stackexchange narkive permalink

Vous devez être prudent mais pas terrifié à ce sujet.Définir une sortie de broche et la conduire dans l'autre sens entraînera la circulation de beaucoup de courant, mais elle ne s'envolera pas non plus immédiatement en fumée.Vous pouvez par exemple alimenter l'appareil avec une alimentation de laboratoire limitée lors de la mise en place d'une conception afin que ces types d'erreurs causent encore moins de dommages.Je serais plus préoccupé par le fait que le bouton-poussoir et le condensateur soient endommagés lors d'une utilisation continue, car le fait d'appuyer sur le bouton court-circuite le condensateur et une pointe de courant n'est limitée que par le cap ESR, le câblage PCB et la résistance du bouton, de sorte qu'elle peut dépasser de nombreux ampères.Et comme il y aura un rebond de contact sur le bouton-poussoir, le courant a des composants haute fréquence et cela, combiné à l'inductance parasite de longs fils, convertira les pointes de courant en pointes de tension, protégées uniquement par des diodes de protection des broches IO.Donc en général, une résistance de même 330 ohms en série commence à être une très bonne idée pour limiter le courant par le bouton poussoir.

Graham
2020-01-03 19:11:59 UTC
view on stackexchange narkive permalink

Considérant que ce type de circuit est vivement encouragé, comment cela ne semble pas poser de problèmes?

Parce que lorsque les ingénieurs configurent les E / S pour leur périphérique, ils veillent à ce qu'ils utilisent les entrées pas comme des sorties. Pour la plupart des E / S, nous définirons les broches comme entrées ou sorties au démarrage et ne les changerons jamais plus tard. Cela ne nous donne qu'une seule ligne de code que nous devons vérifier soigneusement, ce qui n'est pas une tâche exceptionnellement difficile.

Il n'y a pas besoin de résistance de protection, sauf si vous pensez qu'il est probable que vous ne ferez pas attention à votre codage. Dans ce cas, je vous suggère fortement d'améliorer vos pratiques de codage, en faisant de meilleurs tests ou en examinant votre code avant de l'exécuter.

À titre d'exemple similaire, si vous connectez un fil directement entre vos lignes d'alimentation + 5V et 0V, vous brûlerez votre alimentation. Cela ne signifie pas que vous devez protéger votre alimentation électrique - cela signifie simplement que vous devez faire attention à ne pas faire de telles erreurs!

Maintenant, revenons à la question initiale, ne devrais-je pas être extrêmement prudent lors de la définition d'une broche d'E / S comme sortie?

Oui, tu devrais. Mais alors j'espère que vous êtes tout aussi prudent sur tous les nombreux d'autres façons dont vous pourriez endommager votre circuit, comme court-circuiter les broches, tourner des deux côtés d'un pont en H, ou autre similaire erreurs.

Vous avez raison, peut-être que protéger chaque broche n'est pas fiable.Peut-être écrire quelque chose comme DDRD | = (1 << PORTD1) |(1 << PORTD5) |(1 «PORTD7);au lieu de DDRD | = 0b10100010;est moins sujet aux erreurs.Je devrais également vérifier si une bibliothèque incluse remplace certains DDRx.
@JulianZatloukal Oui, un code auto-documenté comme celui-là est bien meilleur.En règle générale, il est important d'écrire (et de commenter) le code comme si vous vous attendiez à ce que quelqu'un d'autre doive le lire et le comprendre immédiatement.Dans six mois, vous ne vous souviendrez plus exactement de ce que vous avez fait et le «quelqu'un d'autre» sera vous.:)
Parfois, les gens conçoivent des circuits qui exécuteront du code qu'ils n'écrivent pas et qu'ils ne peuvent pas examiner.Dans ces cas, il peut être judicieux de s'assurer qu'une mauvaise programmation ne tuera pas l'unité.Les exemples incluent certains modèles commerciaux de robotique et tout ce qui concerne l'éducation.
@DisplayName C'est assez vrai.Je ne dirais pas que c'est une application très courante - la plupart des gens capables de concevoir leurs cartes conçoivent également leur propre électronique.Et ce n'est pas une offense pour Julian, mais quiconque conçoit des panneaux éducatifs à usage général à vendre sera très expérimenté, donc ils ont dépassé le point où ils auraient besoin de demander à SE à ce sujet.
David Molony
2020-01-03 16:25:21 UTC
view on stackexchange narkive permalink

Peut confirmer, sur une puce arduino uno, 328p, si vous connectez une sortie pilotée à la terre ou au VDD, cela tuera cette broche.Je l'ai accidentellement fait plusieurs fois au début de mes débuts avec l'électronique.

Sur les autres puces avec lesquelles je travaille, je fais assez attention de ne pas faire cela, mais les plus modernes semblent moins sensibles à ce mode de défaillance.Par exemple, j'ai accidentellement configuré une minuterie sur un stm32 en mode pwm out et l'ai fait combattre un opto-coupleur pendant environ 15 minutes ... L'opto a largement remporté le tir à la corde ... Mais la puce STM a survécu.

La situation avec les puces arduino 328 est suffisamment mauvaise pour que les gens aient fabriqué des "ruggeduinos" avec toutes sortes de protections pour éviter les causes courantes de décès.

Modifier: L'ajout d'une résistance, d'environ 100 ohms en série avec la broche, est selon mon expérience suffisante pour éviter d'endommager la broche.

"Ruggeduinos" hahaha.Peut-être qu'un script qui inspecte le code pour les changements DDRx dans n'importe quel GPIO pourrait aider un jour.Peut-être vais-je essayer d'ajouter une résistance ou simplement prendre le risque, étant donné que mon PCB est déjà surchargé de composants.
Ruggeduino existe https://www.rugged-circuits.com/microcontroller-boards/ruggeduino-se-special-edition avec une résistance de limite de courant par broche IO et un serrage de limite de tension supplémentaire.«Les caractéristiques comprennent la protection contre les surintensités et les surtensions sur toutes les broches d'E / S et les sorties 5V / 3,3V, la protection ESD sur toutes les broches d'E / S et le port USB, la protection totale contre les surintensités du microcontrôleur et le fonctionnement jusqu'à 30V.»
TimWescott
2020-01-03 06:05:08 UTC
view on stackexchange narkive permalink

En général, le court-circuit d'une sortie logique à la masse ne tue pas immédiatement une puce.Ce n'est peut-être pas bon pour cela, mais ce n'est pas si grave que la définition par erreur d'entrées sur des sorties provoque une brûlure des choses.

Alors - continuez et utilisez les circuits recommandés, et revérifiez votre logiciel.Si vous avez des amis ou des collègues consentants, faites des révisions de code.

jw_
2020-01-03 15:30:57 UTC
view on stackexchange narkive permalink

Vous devez vérifier "Absolute Maximum Ratings" dans la fiche technique comme celle-ci http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf, qui déclare que

  Courant CC par broche d'E / S..................40,0 mA
Broches VCC et GND de courant continu...........200,0 mA
 

Ce qui signifie que si vous ne respectez pas ce qui précède, la fiabilité de la pièce ne sera pas assurée.Mais non réalisable ne signifie pas échouer maintenant ou même échouer un jour plus tard, tout est question de chance d'échouer.

Pour les cartes de développement dans le laboratoire, s'il est coûteux ou difficile d'en obtenir une autre, il faut faire plus attention.Vous pouvez utiliser une fonction spéciale pour accéder au registre qui en fait le seul point de soins à moins que la mémoire ne soit corrompue par un autre code.Mais dans la plupart des cas, ce n’est pas si coûteux ni trop long d’en obtenir un autre, alors ce n’est pas un gros problème.

BTW ESD peut avoir une plus grande chance de détruire votre carte de développement.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...