Tutoriels/Créer son PCB avec STM32

De Polybot Grenoble
Sauter à la navigation Sauter à la recherche

Introduction

Dans la phase de prototypage, il est commun d'utiliser des cartes de développement telles que STM32 Nucleo ou Arduino Uno. Une solution qui permet au développeur de simplement connecter la carte à un ordinateur et de téléverser le code. Les éléments externes sont reliés par des connecteurs de type "header", et le tour est joué. Au bout d'un certain temps, cette solution est affinée, et la majorité des pins ne sont plus réassignées à de nouvelles fonctions. Il peut aussi arriver que la quasi-totalité des broches soit utilisée. À moins de scotcher les fils à la carte, il arrive aussi que ces derniers se déconnectent par mégarde. C'est en général à ce moment que l'on se dit "pourquoi ne pas créer un PCB qui regroupe mes éléments externes et le microcontrôleur?". En effet, cette alternative permettrait de réduire le nombre de fils, compacter l'électronique et fiabiliser le reste de la connectique. Mais des questions suivent cette idée: comment faire? Par où commencer? Comment je vais programmer ma carte? Comment je vais souder les composants?

Dans ce tutoriel, j'aborde ces questions auxquelles j'ai répondu par ma propre expérience. Je parlerai des outils de conceptions, de la fabrication de la carte, du choix des composants, des outils de programmation, enfin, tous les éléments nécessaires pour réaliser son PCB avec STM32 embarqué. Le tutoriel suit l'ordre chronologique des étapes que j'ai suivi.

Vous êtes prêts? C'est parti.

Avant de commencer

Dans ce tutoriel, je vais présenter l'outil de développement logiciel STM32CubeIDE, car à mon gout, c'est l'outil le mieux adapter pour travailler avec les microcontrôleurs STM32. Concernant la conception de cartes électroniques, il existe une multitude de logiciels. Ici, je n'en aborde pas un spécifiquement. Je décrirai simplement le processus de conception. Libre à vous de choisir le logiciel qui vous convient le mieux. Je ferrai une liste de logiciels que je connais avec une bonne réputation. (Des pages sont en cours de rédaction sur l'utilisation de logiciels tels qu'Altium et STM32CubeIDE).

Il faut garder à l’esprit qu'il existe probablement des méthodes plus performantes pour la réalisation d'un tel projet. Mon tutoriel offre un point de départ! C'est de cette manière que je me suis lancé dans la fabrication de PCB avec microcontrôleur donnant un résultat satisfaisant. Sur la fin de la rédaction de ce tutoriel, je tenterai de faire un renseignement un peu plus poussé sur les sujets dont je n'ai pas donné d'information exhaustive. Particulièrement sur la partie parlant de la soudure portant sur le choix de l'étain et du flux. Il est aussi possible que j'ai oublié de mentionner des règles et bonnes pratiques de routage. Cependant, les informations qui suivent devraient être suffisantes pour se lancer dans la conception d'un premier PCB avec STM32.

Beaucoup d'informations complémentaire et diverses précisions sur l'implémentation d'un microprocesseur STM32 sur une carte embarquée sont données dans les "Application Notes" fournies par STMicroelectronics.

Ceci mit de côté, commençons!

Déroulement de l'opération

Dans un premier temps, on réalise le schéma technique de la carte électronique. Dans cette étape, on s'assure que toutes les fonctions que l'on souhaite incorporer sont présentes et prêtes à marcher. Puis vient l'étape du routage. Avant de passer à cette étape, il est conseillé de s'assurer que l'étape de la schématisation est terminée (mis à part des modifications mineures). Imaginez avoir routé tout le PCB, et vous vous apercevez que vous avez pris le mauvais microcontrôleur... Une fois le routage terminé, il faut également passer du temps à vérifier que toutes les pistes sont connectées au bon endroit et qu'il n'y a pas de courts-circuits ou de conflits mécaniques. Faire fabriquer le PCB prend du temps. Il serait dommage d'attendre pour rien. Après vérification, il est l'heure de commander le PCB et les composants. Une fois arrivés, il faut les assembler. Il est conseillé de suivre un certain ordre logique de soudure, en faisant, pourquoi pas, des tests de temps à autre pour vérifier que les composants fonctionnent. Quand tout est prêt et semble ne pas avoir grillé, on passe à la programmation.

Schématiser le projet

Schéma bloc

Commencer par dessiner un schéma bloc de la carte électronique souhaitée est une bonne pratique. Cela permet de repérer quels éléments doivent être interconnectés, avoir une idée des tensions d'alimentation qu'il faudra (puissance et logique) et de la disposition globale des composants sur le PCB. Ce dernier point sera très apprécié quand ce sera l'étape de routage. En plus, pour la documentation, c'est un grand plus, car simple à lire.

Choisir son microcontrôleur

Tout dépend de l'application que l'on souhaite. STMicroelectronics propose plusieurs gammes de microcontrôleurs. Sur l'image ci-dessous, on retrouve les ultra-low-power adaptées à des solutions d'appareils connectés qui doivent économiser peut d’énergie avec un compromis sur la performance. Les MCU mainstream sont les plus rependus et sont un bon compromis entre la performance et l'économie d'énergie. Et les High-performance, qui ne se penchent pas trop sur l'aspect énergie.

Ma recommandation est de choisir un microcontrôleur que l'on peut trouver dans les cartes de développement Nucleo ou Discovery. Comme ça, si jamais il y a besoin de faire des tests supplémentaires, il suffit de prendre la carte associée au MCU et continuer son code sans perdre de temps sur les problèmes de compatibilités. En plus de ça, c'est une bonne idée d'utiliser les MCU supportés par Mbed. Mbed étant une plateforme en ligne permettant de développer des solutions rapidement en utilisant leurs libraires assez haut niveau. Certains d'entre nous ont probablement commencé par cette plateforme pour programmer les Nucleo, et ont une bonne partie de leur code dessus. Il faut faciliter la transition à STM32CubeIDE qui est un logiciel offrant beaucoup plus de liberté tout en laissant la possibilité de travailler avec Mbed (ce que je ne recommande pas :p ). La liste des microcontrôleurs embarqués sur une Nucleo et supportés par Mbed sont ici. Et simplement la liste des microcontrôleurs sur carte de développement .

MCU series STM32.jpeg

STMicroelectronics propose l'outil ST MCU finder qui regroupe l'ensemble des microcontrôleurs STM (32 et 8). Cet outil est inclus dans STM32CubeIDE. Lorsqu'on commence un nouveau projet, la même interface apparaît. Cet outil permet de filtrer les microcontrôleurs par fonctions, mémoire, vitesses, nombre de broches et d'autres paramètres. Il affiche même si le MCU est utilisé dans une carte de développement!

Vous avez trouvé votre bonheur? Passons à la suite!

Schéma technique

Avant de se lancer dans le dessin technique, il est l'heure de faire le choix du logiciel de conception électronique. Bien qu'il arrive que les fichiers des schémas techniques soient compatibles entre certains logiciels, il est préférable, et plus logique, de rester sur un logiciel.

KiCad est un logiciel gratuit et assez rependu. Altium est utilisé par beaucoup de grandes entreprises. Eagle est le logiciel le plus utilisé, et, à mon impression, celui qui trouvera toujours une place dans le cœur d'un concepteur de cartes. Il existe encore la solution en ligne EasyEda, en partenariat avec le fabricant de PCB JLCPCB et un grand revendeur de composants LCSC (également partenaire de JLCPCB). L'avantage est donc que l'on est en connaissance des composants disponibles ainsi que de leur modèle.

Librairies de composants et leurs formes

Vient donc la question importante des librairies de composants. Lorsqu'on dessine le schéma technique de la carte, on ne trace pas les composants comme si c'était une image, comme on le ferrait dans Paint. On utilise les librairies qui répertorient les composants, en leur associant un symbole, une empreinte ("footprint" en anglais) et un modèle 3D. Les trois sont importants. Le symbole permet de schématiser le circuit (la première étape). L'empreinte représente la projection du composant sur le PCB, et donc les "tampons" sur lesquels se soudent les broches des composants. Et le modèle 3D permet de se rendre compte de la place que prendra le composant. C'est surtout utile lorsque l'on intègre des connecteurs à la plaque, ou plus encore, lorsque l'on fait un assemblage de PCB.

Il existe plusieurs "packages" de composants. Ils sont séparés en deux grandes familles les "through hole" et les "surface mounted" (généralement appelés "surface mounted devices" SMD). Les TH sont plus grands, souvent beaucoup plus grands, que les SMD. C'est une des raisons pour laquelle les industriels privilégient les SMD aux TH. (Une autre des raisons étant que sur la ligne d'assemblage, il est plus simple de souder les SMD). C'est donc pour cela que les composants SMD sont généralement moins chers, de par leur quantité, et que la version TH n'existe pas toujours. Il faut donc s'habituer à travailler avec les SMD!

TH vs SMD.png

Les packages sont standardisés. Souvent, un package est associé à une fonction de par ses propriétés mécaniques comme la dissipation thermique. Ci-dessous, une liste non exhaustive de packages et une généralisation de leur application: - DIP, c'est les circuits intégrés utilisés lors de prototypages sur breadboard - TO sont souvent utilisés pour les transistors MOSFET de puissance par exemple - Les régulateurs de tension prennent la forme des SOT - Les circuits intégrés en SOIC etc. Une liste complète des packages peut être trouvée sur la page wiki.

Pour les composants passifs comme les résistances et les condensateurs, deux nombres juxtaposés indiquent leur longueur et largeur. Si la puissance ne dépasse pas le 1/8 de Watt, personnellement, je recommande de travailler avec les 0805. Au-dessus, les composants prennent beaucoup de place. En dessous ce n’est pas évident de les souder. Attention aux 0402 ou moins, il est facile des les inhaler, et ce n’est pas cool!

SMD resistors size comparison.jpg

Petite astuce, il existe des règles PCB avec les footprints les plus communs. Très pratiques, abordables et élégantes, c'est un outil à avoir lors des premières conceptions de carte. Elle va bien aider quand il faut se rendre compte de la dimension des composants!

PCB rulers.jpeg

Je décris un peu plus bas, comment trouver des librairies de composants.

Alimentation

Les composants que vous allez utiliser demandent des tensions d'alimentation différentes. De manière générale, elles seront de 5V ou 3.3V, mais il est possible que vous ayez choisi des composants fonctionnant sur d'autres tensions. Il est bien plus pratique d'avoir seulement une source d'alimentation reliée à votre carte électronique. C'est pour cette raison, que vous serez amenés à intégrer des régulateurs de tension. En fonction de la tension externe que vous avez à disposition, il n'est pas exclu que vous ayez besoin d'intégrer un circuit boost pour augmenter la tension. Cependant, il est plus simple de se débrouiller pour avoir une source d'alimentation dont la tension est supérieure à la plus grande requise, pour ensuite, par le biais de régulateurs de tension, l'abaisser. Gardez en tête, que certains régulateurs ont un drop down voltage de 1V. C'est le cas pour le régulateur 5V de la Nucleo, contrairement au régulateur 3.3V qui n'a quasiment pas de chute de tension.

Les microcontrôleurs STM32 fonctionnent sur du 3.3V. Attention! Ne raccordez pas le VDD sur du 5V, cela risque d’endommager le composant. Cependant, les GPIO tolèrent le 5V. Les broches VDD doivent être reliées à 3.3V et VSS à la masse du circuit. Il est de même pour VDDA et VSSA. Ces dernières sont l'alimentation du (des) convertisseur(s) analogique numérique. Si le MCU possède des broches VBATx et VCAPx, alors VBATx doivent être reliées à 3.3V et VCAPx, ATTENTION : en série avec un condensateur à la masse. Pas directement à la masse. La capacitance de ce condensateur doit être de 2.2uF.

Nous nous inspirerons du circuit d'alimentation de la STM32 Nucelo.

5v nucleo.png 33v nucleo.png

Si vous alimentez votre circuit par une tension de 5V, le circuit de droite ne sert pas. Autrement, le 5V est généré par U3 LD1117S50TR. Comme dit précédemment, ce régulateur a une chute de tension de 1V, ce qui veut dire que si le circuit n'est pas alimenté par une tension de plus de 6V, vous n'aurez pas 5V en sortie du LD1117S50TR mais un peu moins. Le LD39050PU33R fourni un 3.3V très stable et n'a quasiment pas de voltage drop. Même si vous utilisez déjà une tension 3.3V en entrée, c'est une bonne idée de placer ce régulateur. S'il y a des variations de tension dans votre source d'alimentation, le régulateur la limitera à 3.3V. Le convertisseur 5V peut fournir 800mA et le 3.3V 500mA. Si vous ne comptez pas alimenter grand-chose d'autre avec ces régulateurs, cette combinaison convient. Autrement, si le courant souhaité est bien plus grand (quelques ampères), avoir un deuxième circuit fournissant le 5V et 3.3V de "puissance" séparément du LD39050PU33R et LD1117S50TR qui fournissent la tension "logique" évite des perturbations sur cette dernière.

Dans tous les cas, il est recommandé d'avoir une protection de la source, avec une diode ne laissant pas remonter un pic de courant dans l'alimentation globale. Et dans le paragraphe suivant, une explication de l'importance des condensateurs présents sur le circuit d'alimentation sera apportée.

Protections

Comme dit précédemment, une protection importante est celle de la source d'alimentation. Il est recommandé de toujours mettre une diode (Schottky car mieux adapté qu'une simple diode PN) entre la source d'alimentation et le circuit. Par exemple, si l'on utilise le 5V d'une connexion USB, cela évitera de griller votre prise en cas de surtension.

Une protection est une limitation de courant. Une solution est d'utiliser un fusible. Elle est adaptée pour les gros courant en général. Une autre façon de faire, serait d'intégrer une détection de courant avec un relais qui s'ouvre si le courant est trop grand. Une résistance de Shunt, de par la chute de tension, indiquerait le courant passant à travers. Avec un pont diviseur de tension, on se cale sur la chute de tension équivalente au courant que l'on souhaite détecter. Les deux valeurs sont reliées à un AOP qui les compare. La sortie est reliée au relai. Attention cependant aux caractéristiques du relais, car ils ne sont pas faits pour des courants infinis! Et attention à choisir une résistance de très faible valeur et de grande puissance pour éviter de la griller. Voici un tel circuit :

Circuit protection.jpg

Il est recommander d'isoler le microcontrôleur d'éléments de puissance par un optocoupleur. Un autre composant peut être utilisé qui est un buffer. Son avantage est qu'il peut recevoir 3.3V en entrée (la tension de sorties des GPIO d'un STM32 par défaut), et sortir du 5V (s'il est alimenté de la sorte). Ainsi, si un pic de tension remonte dans la partie logique, le MCU est protégé par une barrière.

Encore une protection est un "microcontroler supervisor". Il permet au circuit d'alimentation de se stabiliser avant que le microcontrôleur commence à fonctionner. Ce dernier possède une broche nRST qui le reset lorsque la broche en question est reliée à la masse. Un "microcontroler supervisor" ajoute un délai entre le moment où la carte est alimentée, et le moment où ce composant envoi 3.3V sur nRST. Ce délais n'est pas obligatoire, mais il permet de s'assurer que le microcontrôleur ne commence à exécuter son programme et redémarre accidentellement suite à une variation de tension.

Finalement, une dernière protection sont les capacités de découplages, dont je parle dans une autre partie.

Oscillateur externe

Contrairement aux idées reçues (en tout cas pour certains d'entre nous), les MCU STM32 n'ont pas besoin d'oscillateur externe pour fonctionner! Ils en ont un intégré. Sa fréquence est fixe, mais avec une cascade de PLL, il est possible de trouver la cadence d'horloge voulue. Cependant, cette horloge, appelée HSI, perd en précision avec la variation de température et de tension. J'ai lu sur un forum que la fréquence peut varier jusqu'à 10 à 15%! Certaines applications, comme une connexion USB fiable, requièrent une fréquence parfaite. C'est à ce moment que l'on a besoin d'un oscillateur externe. Ces derniers sont extrêmement précis, robustes et fiables. La valeur de l'oscillateur externe, ou HSE ou LSE (High speed, Low speed), doit être comprise dans une certaine fourchette, qui nous sera indiquée par STM32CubeIDE. Bien évidemment, dans la datasheet également.

Un oscillateur à cristal possède une capacité de charge. De plus, l'oscillateur doit être entouré de condensateur de faible valeur pour éviter que l'oscillateur démarre à une fréquence plus faible que sa fréquence de résonnance. Une résistance permet de réduire la puissance consommée par le cristal. Cependant, l'absence de cette résistance ne pose généralement pas de problème. En suivant l'application note AN2867, vous pourrez calculer la valeur de ces capacités en fonction de celle du cristal et de sa fréquence. Il est possible d'approximer ces valeurs. D'après AN2586, pour un HSE, il est conseillé de trouver un cristal compris entre 5pF et 25pF. Une approximation des condensateurs CL1 et CL2 donne une valeur de 10pF. Il est mentionné que pour un LSE, il ne faut pas utiliser de cristal à 12.5pF. Les broches OSC_IN et OSC_OUT sont généralement les 5 et 6 du MCU.

Oscillator stm32.png

L'oscillateur ne doit surtout pas être sujet à des perturbations électriques. Des précautions doivent être prises lors du routage et seront décrites plus tard.

Debug et flashage

Très bien, nous avons notre microcontrôleur et notre circuit. Mais comment fait on pour le programmer? Et bien il y a plusieurs solutions.

Les microcontrôleurs STM32 ont une interface de débogage appelée SWD (serial wire debug). Reliée par un programmateur ST-Link, il est possible non seulement de flasher son code sur la puce, mais aussi de le déboguer. C'est à dire exécuter les instructions ligne par ligne, lire et modifier les registres à la volée, pareil pour les variables. Bien plus pratique et moins gourmande en ressources que la technique du printf. J'aborderai dans une autre partie utilisation de ST-Link à cette fin, mais ce qu'il faut retenir, c'est qu'il n'y a pas besoin d'intégrer ST-Link sur votre circuit! L'interface SWD se présente sous la forme de deux broches, SWDIO et SWDCLK. Bien entendu, il faut également relier les masses du programmateur et de votre circuit. Si le circuit n'est pas alimenté, le programmateur peut fournir du 5V et 3.3V. Une autre chose est la broche nRST. Elle est en pull-up ce qui veut dire qu'en la reliant à la masse, le microcontrôleur est Reset. Cette broche doit être également prise en compte. A ma compréhension, lors du premier interfaçage avec le programmateur, le microcontrôleur ne sait pas qu'à tout moment, ST-Link peut invoquer le mode débogue. nRST permet au programmateur d'intercepter le microcontrôleur. Dans votre code, vous pouvez attribuer les broches SWDIO SWDCLK comme étant exclusivement réservées au débogue. Ainsi, vous n'aurait plus besoin du nRST. ST-Link pourra prendre le dessus à tout moment.

D'après AN4989, SWDIO doit avoir un pull-up et le SWCLK un pull-down.

Une fois que vous avez terminer votre code, et que vous souhaiter flasher plusieurs carte avec votre fichier binaire, d'autres solutions plus pratiques que le ST-Link existent. Les microcontrôleurs STM32 ont un bootloader vous permettant de flasher la puce. Ce mode est accessible en appliquant une combinaison de '0' ou '1' sur les broches BOOT0 et BOOT1 (BOOT1 n'est pas présente sur tous les MCU). AN2606 donne les différents mode du bootloader de tous les STM32. Le bootloader peut être entrée par différentes interfaces : SPI, CAN, Série, I2C et d'autres. Mais la plus intéressante est l'interface USB. Pas tous les microcontrôleurs STM32 possèdent cette option. Pour ceux qui l'ont, cela veut dire qu'il vous suffira de brancher un câble USB à votre ordinateur et le flashage peut commencer! Donc à garder en tête. Ne pas hésiter à intégrer un jumper pour les pins BOOT0 et BOOT1 et une prise USB (micro, mini, normale, enfin n'importe quel format). Attention, cela ne remplace pas le SWD.

Attention! un pull-down doit être placé sur les broches BOOT0 et BOOT1!!! Sinon le microcontrôleur démarrera pas systématiquement, et rentrera en mode boot en fonction des perturbations sur la broche!

Reset

Capacités de découplage

Certains circuits intégrés, et c'est le cas pour les STM32, sont sensibles aux variations de tension. Sans y remédier, il est possible que le microcontrôleur redémarre intempestivement à cause d'une chute de tension. Afin de pallier à ce problème, il est primordial de placer des capacités de découplage près de l'alimentation de chaque circuit intégré. Ces capacités vont emmagasiner de l’énergie et permettent ainsi de compenser une chute de tension. La valeur typique est comprise entre 10nF et 100nF. Dans la partie alimentation, les régulateurs de tension sont également entourés de capacités de découplage. Ces dernières sont on une valeur plus grande. Les valeurs des X5R varient moins en fonction de la température. Lorsque l'on utilise des capacités de découplage sur des circuits où des courants importants circulent, des capacités plus larges sont sollicitées.

Pour les condensateurs de 10nF à 100nF pour le découplage, utilisez des condensateurs céramiques. Pour ceux de plus de 1uF, les condensateurs Tantale devraient convenir. Les condensateurs chimiques existent également en SMD et peuvent être utilisés sur des circuits de puissance

Decoupling capacitors.png

L'alimentation du ou des convertisseur(s) analogiques numériques se voit ajouter une faible inductance en série avec le 3.3V à la place d'un condensateur. Cette inductance réduit les perturbations liées aux variations de courant. Elle prend la forme d'un composant en ferrite.

Pull down et pull up

Les résistances de pull down et pull up permettent de garder une broche d'un circuit intégré à l'état, respectivement, bas et haut. Elles sont très importantes, car elles évitent un comportement inattendu dans le cas où des perturbations agissent sur la broche. Sur les GPIO des STM32, il est possible de paramétrer la broche directement en mode pull up ou pull down. Pour les autres circuits intégrés, ce n'est pas forcement le cas, et il est impératif d'en utiliser. Imaginez si la broche de contrôle de votre pont-H reçoit du bruit en entrée, votre moteur risque de faire n'importe quoi! Un pull-down s'impose. Les valeurs typiques des pull-up et pull-down sont de 1kOhm a 10kOhm.

xp300x

Les broches

Routage et conception de son PCB

Quelques principes à respecter

Prendre en compte les moyens technologiques de fabrication

Largeur des pistes

Eviter les angles droits et aigus

Dissipation thermique

Masse

Séparer la partie puissance et logique

Chemin du retour

Oscillateur

Astuces

Où trouver des librairies de composants?

Créer des points de test

LED d'indication et boutons ou switchs

Annotations

Contraintes physiques

Fixation du PCB

Dimensions des composants et autres éléments présents sur le PCB

Fabriquer sa carte

Assemblage

Soudure

Ordre de soudure suggérée

Comment savoir si mon microcontrôleur fonctionne?

Programmation

ST-Link

STM32CubeIDE

Autres méthodes de flashage