Table des matières:
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-23 14:46
Bonjour à nouveau les amis:) Donc, dans ce projet, nous allons contrôler un servomoteur avec STM32F4 ARM MCU. Dans mon cas, j'utiliserai la carte de découverte, mais si vous comprenez l'essentiel du problème, vous pouvez l'appliquer à chaque MCU. Donc. Commençons:)
Étape 1: Configuration matérielle et logicielle requise
En termes de matériel, nous aurons besoin de:
- Un MCU qui est dans mon cas la carte Discovery STM32f4
- Un servomoteur commun, comme SG90 ou tout autre
En termes de logiciel, nous aurons besoin de:
- STM32CubeMX
- Keil uVision
Si vous avez tout cela, passez à l'étape suivante:)
Étape 2: Configuration du STM32CubeMX
Comme vous le savez, pour contrôler un servomoteur, nous avons besoin d'un signal PWM. Les exigences en termes de signal PWM sont les suivantes:
- La période PWM doit être de 20 mS
- Le temps d'activation doit être compris entre 0,5 mS et 2,5 mS. Lorsque le temps d'activation est de 0,5 mS, le servo tourne à 0 degré, 1,5 mS à 90 degrés et 2,5 mS à 180 degrés.
Nous devons donc configurer PWM et pour cela, nous utiliserons Timer1.
- Tout d'abord, sélectionnez TIM1 dans la section Minuteries. Cette étape
-
Ensuite, à partir de la section Mode
- Choisissez l'horloge interne Cette étape
- Génération PWM CH1 Cette étape
-
Ensuite, à partir de la section Configuration
- Réglez Prescaler sur 160 Cette étape
- Définir la période du compteur sur 2000 Cette étape
- Réglez Pulse sur 50 Cette étape
- De plus, à partir de la configuration de l'horloge, réglez les horloges de la minuterie APB1 sur 16 MHz. Cette étape
Maintenant, parlons un peu de cette étape:
La fréquence de notre horloge APB1 Timer est de 16MHz. Cela signifie donc qu'il faut 16 000 000 ticks pour obtenir 1 seconde. Cependant, nous avons réglé notre prédimensionneur sur 160. Cela signifie que nous divisons notre fréquence par ce nombre et avons réduit le nombre de ticks à 100 000. Ainsi, pendant 1 seconde, nous avons besoin de 100 000 ticks. Cependant, nous avons besoin de 20 mS de période PWM comme nous l'avons indiqué précédemment. Donc, sur la base de calculs simples, nous avons besoin de 2000 ticks pour 20mS. Ainsi, en réglant Counter Period sur 2000, nous déterminons la période du signal PWM qui est de 20 mS. Nous devons maintenant déterminer le nombre de graduations pour obtenir des temps d'activation de 0,5 mS à 2,5 mS. Nous pouvons obtenir cette équation à partir de mathématiques simples et c'est:
On_Time = (Tick_Number / 100). Gardez à l'esprit que c'est le on_time qui change l'angle du servomoteur. Donc, ci-dessous l'image, je résume cette étape. Si vous avez des questions, écrivez dans les commentaires et je vous répondrai le plus rapidement possible.
Image des calculs
Après avoir fait tout cela, générez du code:)
Étape 3: Codage Keil UVision
Alors, commençons par déterminer ce que nous voulons faire ? Nous voulons écrire une fonction qui accepte le degré et l'écrire dans le servo. Alors, comment allons-nous faire? Comme nous l'avons déjà dit, pour changer d'angle, nous devons changer l'heure. Nos angles changent entre [0, 180] et notre nombre de ticks qui détermine les changements de temps entre [50, 250]. Nous avons donc besoin d'une fonction de mappage qui mappe un angle donné sur une plage de nombre de ticks. Par exemple, pour 0 degré 50 ticks, pour 180 degrés 250 ticks et ainsi de suite… Écrivons donc notre fonction de mappage:
int map(int st1, int fn1, int st2, int fn2, int valeur){ return (1.0*(value-st1))/((fn1-st1)*1.0) * (fn2-st2)+st2; }
C'est notre fonction de cartographie. Êtes-vous intéressé comment il est dérivé? Alors lis ça. Donc, nous prenons nos plages et la valeur que nous voulons cartographier.
Maintenant, écrivons une fonction qui accepte l'angle et l'associe à la plage de graduations:
void servo_write(int angle){ htim1. Instance->CCR1 = map(0, 180, 50, 250, angle); }
Comme vous pouvez le voir, ce code accepte l'angle et le mappe à la plage de nombre de ticks. Ensuite, le nombre de ticks est donné au registre CCR1 qui contrôle le temps d'activation et donc l'angle.
Cependant, pour que tout cela fonctionne, nous commençons d'abord le pwm qui peut être fait par juste une ligne de code:
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
Donc, nous avons une fonction qui accepte l'angle et l'écrit dans le servo. Testons-la et écrivons notre fonction de balayage qui est très simple:
void servo_sweep(void){ for(int i = 0; i <= 180; i++) { servo_write(i); HAL_Delay(10); } for(int i = 180; i>= 0; i--) { servo_write(i); HAL_Delay(10); } }
Donc, il suffit de compter jusqu'à 180 puis de descendre à 0 et d'écrire ces valeurs dans le servo:) Alors, voyons le résultat !
Étape 4: Le résultat:)
Alors, c'est la fin. Si vous avez des questions s'il vous plaît demander. Je me ferai un plaisir d'y répondre. Merci beaucoup d'avoir lu et j'espère que je vous verrai dans le prochain projet:)
Conseillé:
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS : 6 étapes (avec photos)
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS : Salut ! Je m'appelle Armaan. Je suis un garçon de 13 ans du Massachusetts. Ce tutoriel montre, comme vous pouvez le déduire du titre, comment construire un drone Raspberry Pi. Ce prototype montre comment les drones évoluent et aussi quel rôle ils pourraient jouer dans le
Télécommande universelle à commande gestuelle avec Node-MCU : 12 étapes
Télécommande universelle à commande gestuelle avec Node-MCU : Bonjour à tous et bienvenue dans ce projet ! Je suis assez paresseux et le cauchemar d'un paresseux c'est de regarder la télé quand on se rend compte que la télécommande est trop loin ! Je me suis rendu compte que ma télécommande ne sera jamais trop loin si je l'ai toujours sous la main
Interfaçage du servomoteur avec NodeMCU : 6 étapes (avec photos)
Interfaçage du servomoteur avec NodeMCU : Bonjour à tous, voici mon premier projet Instructable. Vous voulez donc commencer avec NodeMCU ? Eh bien, je suis ici pour partager avec vous. Aujourd'hui, je vais vous montrer comment démarrer avec NodeMCU. Allons-y ! NodeMCU a à bord ESP8266-12E fait le b
Tutoriel Arduino - Commande de servomoteur avec potentiomètre : 5 étapes
Tutoriel Arduino - Commande de servomoteur avec potentiomètre : cette instructable est la version écrite de mon "Arduino : Comment contrôler un servomoteur avec potentiomètre" Vidéo YouTube que j'ai téléchargée récemment. Je vous recommande fortement de le vérifier.Visitez la chaîne YouTube
Commande du clavier du servomoteur : 7 étapes
Commande du clavier du servomoteur : la première consiste à configurer le servomoteur. Le fil du milieu va au port 5VLe gauche va au port GNDConnectez le dernier (le fil de commande) au port 9