|
|
(43 révisions intermédiaires par 3 utilisateurs non affichées) |
Ligne 35 : |
Ligne 35 : |
| Ces cartes (de couleur verte) ont été développées pour le marché professionnel.<br> Ces cartes embarquent en général de très nombreux composants électroniques supplémentaires. Elles sont souvent assez chères. | | Ces cartes (de couleur verte) ont été développées pour le marché professionnel.<br> Ces cartes embarquent en général de très nombreux composants électroniques supplémentaires. Elles sont souvent assez chères. |
| | | |
− | = Introductions aux ateliers STM32 = | + | = '''Introductions aux ateliers STM32''' = |
| <br> | | <br> |
| Dans les ateliers, on va utiliser l'outil "STM32CubeMx" pour la génération de code "canevas" et l'IDE "eclipse" pour la compilation et le debug. | | Dans les ateliers, on va utiliser l'outil "STM32CubeMx" pour la génération de code "canevas" et l'IDE "eclipse" pour la compilation et le debug. |
Ligne 41 : |
Ligne 41 : |
| http://wiki.labaixbidouille.com/index.php/Installation_de_l%27environnement_de_d%C3%A9veloppement_OpenSTM32 | | http://wiki.labaixbidouille.com/index.php/Installation_de_l%27environnement_de_d%C3%A9veloppement_OpenSTM32 |
| | | |
− | = Les ateliers STM32 = | + | = '''Les ateliers STM32''' = |
− | | + | |
− | == Premier programme “blinky” ==
| + | |
− | Ce tout premier programme va nous permettre de valider l'installation de l'environnement de développement SW4STM32. <br>
| + | |
− | Dans notre exemple nous allons utiliser la carte “Nucleo32” de référence “NUCLEO-F303K8”. <br>
| + | |
| <br> | | <br> |
− | [[Fichier:Nucleo32.png|center|]]
| |
− | === Création du projet avec STM32CubeMx ===
| |
− | On va utiliser “STM32CubeMx” pour générer la trame du code source :<br>
| |
− | Après avoir ouvert “STM32CubeMx”.
| |
− | Il faut exécuter “New Project”. <br>
| |
− | Dans la fenêtre ouverte, il faut choisir l’onglet “Board Selector”. <br>
| |
− | Le “Type of Board” et “MCU Series” doivent correspondre à la carte connectée. <br> Dans notre exemple, on choisira “Type of Board” : Nucleo32 (le nombre de cartes listées n'étant pas très grand, il ne sera pas nécessaire de préciser “MCU Series”)<br>
| |
− | Dans le champs “Boards List:”, on choisit la carte connectée en double cliquant. Dans notre exemple : “Nucleo32” de référence “NUCLEO-F303K8” <br>
| |
− |
| |
− | Sur cette carte, une LED est connectée sur la broche “PB3” (appellation de STM32) correspondant à la broche D13 du connecteur arduino.<br>
| |
− |
| |
− | Dans l’onglet “Pinout”, il faut cliquer dans le dessin du chip sur la broche “PB3”. Dans le menu, il faut sélectionner “GPIO_Output”. La broche change alors de couleur en devenant verte.<br>
| |
| <br> | | <br> |
− | [[Fichier:STM32CubeMX.PNG]] | + | [[ 1 - Premier programme “blinky”]] |
| <br> | | <br> |
| + | [[ 2 - Commander l'intensité lumineuse d'une LED (PWM)”]] |
| <br> | | <br> |
− | Dans le menu “Project” -> “Settings…”, on ouvre la boîte de dialogue “Project Settings”
| + | [[ 3 - Commander une LED RGB par PWM”]] |
− | * On saisi un nom de projet (“Project Name”) et le répertoire (“Project Location”).
| + | |
− | * Avec le bouton “Browse”, on choisit le répertoire “workspace”, qu’on avait spécifié lors de l'installation d'eclipse.
| + | |
− | * Dans la liste “Toolchain / IDE” il faut choisir le “SW4STM32” '''(très important!!!)'''.
| + | |
− | * On ferme le dialogue par “OK”.
| + | |
| <br> | | <br> |
− | Lors de la première utilisation de STM32CubeMx, toutes les sources des firmware packages ne sont pas encore installées. <br>
| + | [[ 4 - Contrôle d’un moteur "servo à rotation continue" avec un variateur PWM”]] |
− | Il nous est proposé de les télécharger depuis le site st.com.
| + | |
| <br> | | <br> |
− | Par le menu “Project” -> “Generate Code…”, on peut générer automatiquement le code de base.<br>
| + | [[ 5 - Utiliser un "bouton poussoir" avec un "GPIO in"]] |
− | Dans la boîte de dialogue “Code Generation”, on faut cliquer sur “Open Project” pour visualiser le code dans eclipse.<br>
| + | |
− | === Développement du code source dans eclipse ===
| + | |
− | Le projet “Blinky” contient les répertoires :
| + | |
− | * “Drivers”,
| + | |
− | * “Inc”,
| + | |
− | * “Src”
| + | |
− | * “startup”.<br>
| + | |
− | Il faut ouvrir “main.c” du répertoire “Src”.<br>
| + | |
| <br> | | <br> |
− | Dans la fonction “void main(void)”, on trouve trois appels de fonction “HAL_Init()”, “SystemClock_Config()” et “MX_GPIO_Init()” nécessaires pour l’initialisation du système.<br>
| + | [[ 6 - Contrôle d’un moteur "pas à pas" avec quatres "GPIO out" ]] |
− | Ensuite, il y a une boucle infinie, dans laquelle on peut ajouter son propre code, par exemple : <br>
| + | |
− | | + | |
− | <syntaxhighlight lang="cpp" enclose="div">
| + | |
− | while (1)
| + | |
− | {
| + | |
− | HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 1 ); // LED on PB3 ON
| + | |
− | HAL_Delay(500); // wait 500 milli seconds
| + | |
− | HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 0 ); // LED on PB3 OFF
| + | |
− | HAL_Delay(500); // wait 500 milli seconds
| + | |
− | }
| + | |
− | </syntaxhighlight>
| + | |
− | | + | |
− | === Compilation ===
| + | |
− | Pour compiler le projet, il faut aller dans le menu “Project” -> “Build Project”.<br>
| + | |
− | Eclipse va utiliser la toolchain “GNU Tools ARM Embedded” pour la compilation.
| + | |
− | === Débogage ===
| + | |
− | Pour déboguer le projet; il faut aller dans le menu “Run” -> “Debug”.<br>
| + | |
− | Dans la boîte de dialogue “Debug As” il faut choisir “Ac6 STM32 C/C++ Application”.<br>
| + | |
− | Eclipse va utiliser OpenOCD et STLink pour communiquer avec le microcontrôleur.<br>
| + | |
− | Avec les fonctionnalités de debug, on peut avancer pas à pas dans le code et voir la LED s’allumer et s'éteindre.<br>
| + | |
− | “Resume (F8)” va exécuter le code sans intervention supplémentaire de l’IDE et donc la LED va clignoter...
| + | |
− | | + | |
− | === Rajout d'une LED externe ===
| + | |
− | On peut facilement rajouter une LED externe en montant la carte nucleo32 F303K8 sur une plaque d'essai (breadbord)et en branchant l'anode (broche la plus longue) d'une LED sur la broche D13 et sa cathode à une résistance d'environ 220 Ohms reliées au 0V (GND).
| + | |
| <br> | | <br> |
| + | [[ 7 - Afficher des infos avec le "Virtual COM port" ]] |
| <br> | | <br> |
− | [[Fichier:Blinky_LED_ext.jpg|sans_cadre|Nucleo32 Blinky avec LED externe|600px]] | + | [[ 8 - I2C (Inter Integrated Circuit) ]] |
| <br> | | <br> |
− |
| |
− | ==Commander une LED avec un variateur PWM==
| |
− |
| |
− | Si on connecte une LED à des broches digitales comme vu dans le programme "blinky", on a seulement deux possibilités : "on" avec la pleine luminosité et "off" éteint.
| |
− | <br>
| |
− | En utilisant le PWM (en anglais "pulse wide modulation"), on peux faire varier la luminosité de la LED.
| |
− |
| |
− | ===Explication du PWM===
| |
− | Si on allume la LED, il y a une tension de 3.3 volt sur la broche, pour éteindre, on applique 0 volt:
| |
− | <br>
| |
− | <br>
| |
− | [[Fichier:PWM_OnOff.png|sans_cadre|600px]]
| |
− | <br>
| |
− | <br>
| |
− | Si on change rapidement (par exemple 100 fois par seconde) entre "on" et "off", l’œil humain ne distingue plus ce changement et on a l’impression, que la LED brille avec une luminosité moindre:
| |
− | <br>
| |
− | <br>
| |
− | [[Fichier:PWM_OnOff100.png|sans_cadre|600px]]
| |
− | <br>
| |
− | <br>
| |
− | A partir d’une certaine fréquence (25 fois par seconde), celle ci n’est plus importante car elle n'est plus perceptible à l’œil.
| |
− | <br>
| |
− | <br>
| |
− | [[Fichier:PWM_OnOff25.png|sans_cadre|600px]]
| |
− | <br>
| |
− | <br>
| |
− | Une periode "T" est défini par le temps entre deux allumage "on" (front montant du signal).
| |
− | <br>
| |
− | Maintenant, on peut diminuer ou augmenter le temps "t1" de l’état "on" par rapport à l’état "off". Par exemple dans le dessin, "t1" est à un quart de "T".
| |
− | <br>
| |
− | <br>
| |
− | [[Fichier:PWM_Tt.png|sans_cadre|600px]]
| |
− | <br>
| |
− | <br>
| |
− | Ce rapport t1/T est appelé le rapport cyclique ("duty cycle").
| |
− | * S’il est à 0 ( t1 = 0 ), la LED est "off" en continue.
| |
− | * S’il est à 1 ( t1 = T ), la LED est "on" en continue.
| |
− | * Si on modifie le rapport de "t1 beaucoup plus petit que T" (la LED brille très peu) à "t1 presque égale à T" (la LED brille beaucoup), on peux varier la luminosité de la LED.
| |
− |
| |
− | ===Support du PWM par les STM32===
| |
− | Sur STM32, le PWM est supporté par l’utilisation du timer et des drivers HAL (source code "Hardware Abstraction Layer" distribué par ST).
| |
− | <br>
| |
− | Il faut savoir que les STM32 contiennent plusieurs types de timer avec des fonctionnalités différentes. Une description des timers se trouve dans les fichiers (en anglais) de STMicroelectronics:
| |
− | * [http://www.st.com/content/ccc/resource/technical/document/application_note/54/0f/67/eb/47/34/45/40/DM00042534.pdf/files/DM00042534.pdf/jcr:content/translations/en.DM00042534.pdf Application Note 4013] et
| |
− | *[http://www.st.com/resource/en/application_note/dm00236305.pdf Application Note 4776].
| |
− | <br>
| |
− | <br>
| |
− | On va utiliser l’outil STM32CubeMx pour générer le code source de base.
| |
− | * Première étape: Créer un nouveau projet en sélectionnant la carte sur laquelle on va travailler.
| |
− | * Dans l’onglet "Pinout" de la fenêtre principale, on sélectionne un timer (par exemple "TIM3"), qui propose plusieurs "Channel" avec la fonction "PWM Generation".
| |
− | <br>
| |
− | <br>
| |
− | [[Fichier:PWM_Pinout.png]]
| |
− | <br>
| |
− | <br>
| |
− | On peut voir sur l’image de la puce que la broche PA5 est utiliser pour le canal 1 du timer 3: "TIM3_CH1".
| |
− | <br>
| |
− | Pour calculer des valeurs "t1" et "T", il faut configurer le timer dans l’onglet "Configuration" en cliquant sur le bouton "TIM3" dans la rubrique "Control".
| |
− | <br>
| |
− | <br>
| |
− | [[Fichier:PWM_Config.png]]
| |
− | <br>
| |
− | <br>
| |
− | Dans l’onglet « Parameter Settings » de la boite de dialogue, il faut configurer le timer.
| |
− | <br>
| |
− | Pour cela, il faut savoir que le timer est sequencé par l’horloge du CPU. Dans le cas de la carte sélectionné, cette fréquence est de 80 MHz.
| |
− | <br>
| |
− | Si on configure le "Prescaler" (voir image) du timer à 80, le timer va déclencher l’incrémentation du compteur avec une fréquence de 1 MHz (80 MHz / 80). Il faut configurer une deuxième valeur "Counter Periode" à 100.
| |
− | <br>
| |
− | Ainsi, chaque micro seconde, le timer va incrémenter (en commençant à 0 jusqu’à 100). Ce temps (100 micro secondes) corresponds au "T".
| |
− | Maintenant on peut générer le code source.
| |
− | <br>
| |
− | <br>
| |
− | Pour le contrôle du timer, il faut trois fonctions:
| |
− | * Démarrer le timer: HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_1 );
| |
− | * Arrêter le timer: HAL_TIM_PWM_Stop( &htim3, TIM_CHANNEL_1 );
| |
− | * Modifier la valeur de "t1": __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, Value );
| |
− |
| |
− | ===Allumage d’une LED===
| |
− | La valeur de la variable "Value" peut être réglée entre 0 (LED éteint) et 100 (LED allumé avec 100 % puissance). Avec de simples boucles, on peut réaliser un "blinkly en continue":
| |
− | <br>
| |
− | HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_1 );
| |
− | /* Infinite loop */
| |
− | while (1)
| |
− | {
| |
− | for ( int i = 0; i < 100; i ++ )
| |
− | {
| |
− | __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, i );
| |
− | HAL_Delay( 10 );
| |
− | }
| |
− | for ( int i = 100; i > 0; i -- )
| |
− | {
| |
− | __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, i );
| |
− | HAL_Delay( 10 );
| |
− | }
| |
− | }
| |
− |
| |
− | =='''Commander une led Rgb par PWM'''==
| |
− |
| |
− | =='''Contrôle d’un moteur "servo à rotation continue" avec un variateur PWM'''==
| |
− |
| |
− | Le PWM peut être utilisé pour le contrôle d’un moteur "servo à rotation continue", comme ceux qui sont intégrés dans le robot du lab.
| |
− | <br>
| |
− | Dans ce tutoriel, on va utiliser le moteur de adafruit (https://www.adafruit.com/product/154). Sur la page internet, on trouve une information importante dans la section des détails techniques: "Required Pulse: 500us-2500us".
| |
− | <br>
| |
− | ===Configuration du timer du STM32===
| |
− | L'utilisation/configuration du timer se fait exactement la même façon comme pour commander une LED, mais il nous faut alors générer des pulses d’une longueur "t1" de 500 à 2500 micro secondes.
| |
− | <br>
| |
− | Ainsi dans la boite de dialogue de configuration du timer, il faut maintenant configurer la deuxième valeur "Counter Periode" à 2500. Ainsi la periode "T" est 2500 micro secondes.
| |
− | <br>
| |
− | Le fonctionnement du moteur est la suivante:
| |
− | * Si on envoie une impulsion "plus petite que la moitié" égale à (2500 + 500 ) / 2 = 1500 micro secondes, le moteur tourne "à gauche".
| |
− | * Si elle est "plus grande que la moitié", le moteur tourne "à droite".
| |
− | <br>
| |
− | <br>
| |
− | Avec un peu de marge sur les valeurs, on peut décrire le scénario suivant:
| |
− |
| |
− | HAL_TIM_PWM_Start( &htim3, TIM_CHANNEL_1 );
| |
− | /* Infinite loop */
| |
− | while (1)
| |
− | {
| |
− | /* tourne à gauche... */
| |
− | __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, 1000 );
| |
− | /* … pendant 5 secondes */
| |
− | HAL_Delay( 5000 );
| |
− | /* tourne à droite... */
| |
− | __HAL_TIM_SET_COMPARE( &htim3, TIM_CHANNEL_1, 2000 );
| |
− | /* … pendant 5 secondes */
| |
− | HAL_Delay( 5000 );
| |
− | }
| |
Il existe plusieurs familles de microcontrôleurs STM32, classés selon leur cœur ARM
STMicroelectronics propose toute une gamme de cartes de prototypage pour diverses applications et différents microcontrôleurs STM32.
Historiquement, les “discovery boards” étaient développées pour montrer aux clients les possibilités du microcontrôleur STM32.
De nombreuses cartes (de couleur verte) embarquent des composants supplémentaires (par exemple un accéléromètre) pour montrer leur fonctionnement et leur mise en œuvre.
Les cartes de la gamme “nucleo” (de couleur blanche), sont en général (pour la gamme nucleo 64) équipés des connecteurs compatibles “arduino shield”.
Ainsi un grand nombre de "shields arduino" peuvent être utilisés avec ces cartes.
Ces cartes (de couleur verte) ont été développées pour le marché professionnel.
Ces cartes embarquent en général de très nombreux composants électroniques supplémentaires. Elles sont souvent assez chères.