Table des matières:

Commande de servomoteur avec MCU STM32F4 ARM : 4 étapes
Commande de servomoteur avec MCU STM32F4 ARM : 4 étapes

Vidéo: Commande de servomoteur avec MCU STM32F4 ARM : 4 étapes

Vidéo: Commande de servomoteur avec MCU STM32F4 ARM : 4 étapes
Vidéo: Servomoteur, potentiomètre et STM32 Nucleo 2024, Juillet
Anonim
Commande de servomoteur avec MCU STM32F4 ARM
Commande de servomoteur avec MCU STM32F4 ARM
Commande de servomoteur avec MCU STM32F4 ARM
Commande de servomoteur avec MCU STM32F4 ARM

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

    1. Choisissez l'horloge interne Cette étape
    2. Génération PWM CH1 Cette étape
  • Ensuite, à partir de la section Configuration

    1. Réglez Prescaler sur 160 Cette étape
    2. Définir la période du compteur sur 2000 Cette étape
    3. 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é: