Annuaire d'articles
Le moteur pas à pas entraîné dans cet article est le moteur pas à pas de base 28BYJ-48, qui appartient au niveau d'entrée de gamme, est relativement facile à conduire et le prix est relativement bon marché, donc le pilote de moteur pas à pas sera parlé au début !
1. Principe d'entraînement du moteur pas à pas
J'ai déjà vu une image dynamique sur Internet qui décrit en détail le processus d'entraînement du moteur pas à pas. Les étudiants qui n'ont pas de connaissances professionnelles peuvent également la lire. C'est relativement facile à comprendre !
Revenons au moteur pas à pas que nous avons utilisé dans cet article. Les moteurs et pilotes courants sont présentés ci-dessous. Bien sûr, le module de pilote ULN2003 est également de type SMD, mais ils sont similaires, il n'y a pas de grande différence, vous pouvez choisir vous-même. !
La méthode d'entraînement du moteur pas à pas peut être décrite comme suit :
- 1. Un moteur pas à pas est un actionneur qui convertit les impulsions électriques en déplacement angulaire.
- 2. Lorsque le pilote pas à pas reçoit un signal d'impulsion, il entraîne le moteur pas à pas pour faire pivoter un angle fixe (et un angle de pas) dans la direction définie.
- 3. Contrôlez le déplacement angulaire en contrôlant le nombre d'impulsions, de manière à atteindre l'objectif d'un positionnement précis.
- 4. En même temps, la vitesse et l'accélération de la rotation du moteur peuvent être contrôlées en contrôlant la fréquence des impulsions, de manière à atteindre l'objectif de régulation de la vitesse.
Spécifique au moteur mentionné dans cet article, le moteur pas à pas 28BYJ48 :
- 1. La tension d'entraînement est DC5V-DC12V.
- 2. Chaque signal d'impulsion modifie une fois l'état de mise sous tension d'une certaine phase ou d'un enroulement biphasé du moteur pas à pas, ce qui correspond au rotor tournant d'un certain angle (un angle de pas).
- 3. Lorsque le changement d'état de mise sous tension termine un cycle, le rotor tourne d'un pas.
- 4. Le moteur pas à pas à quatre phases peut fonctionner dans différents modes de mise sous tension.Les modes de mise sous tension communs sont simples (mise sous tension d'enroulement monophasé) à quatre temps (ABCDA) double (mise sous tension d'enroulement biphasé) quatre temps (AB-BC-CD-DA) -AB), huit temps (A-AB-B-BC-C-CD-D-DA-A).
2. Conception d'entraînement de moteur pas à pas
Le diagramme de relation correspondant au nombre de battements mentionné ci-dessus est le suivant :
Ici, je le liste dans un tableau:
Quatre éléments huit temps
enroulement | une | deux | Trois | Quatre | Cinq | six | Sept | Huit |
---|---|---|---|---|---|---|---|---|
UNE | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
B | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
C | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
ré | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
Schéma de principe correspondant
Quatre simples quatre coups
enroulement | une | deux | Trois | Quatre |
---|---|---|---|---|
UNE | 0 | 1 | 1 | 1 |
B | 1 | 0 | 1 | 1 |
C | 1 | 1 | 0 | 1 |
ré | 1 | 1 | 1 | 0 |
Schéma de principe correspondant
Quatre éléments doublent quatre temps
enroulement | une | deux | Trois | Quatre |
---|---|---|---|---|
UNE | 0 | 0 | 1 | 1 |
B | 1 | 0 | 0 | 0 |
C | 1 | 1 | 1 | 0 |
ré | 0 | 1 | 1 | 0 |
Calcul de l'angle de rotation :
L'angle de pas du moteur pas à pas 28BYJ-48 est de 5,625 degrés, c'est-à-dire que chaque impulsion tourne de 5,625 degrés et 360/5,625 = 64, donc 64 impulsions font un tour, mais cela se réfère au rotor du moteur et au rotor à l'arbre de sortie il y a un réducteur de vitesse connecté, le rapport de réduction est de 64, puis le rotor tourne 64 fois, et l'arbre de sortie tourne une fois , donc la conclusion est que 64*64 = 4096 impulsions peuvent faire tourner l'arbre de sortie une fois.
Du point de vue du calcul correspondant à quatre et huit temps :
Formule de calcul à 8 temps = angle 64/360/8, formule de calcul à 4 temps = angle 64/360/4.
3. Écriture du pilote de moteur pas à pas
Tout d'abord, nous initialisons les broches correspondantes dans cubemx :
écrivez quatre programmes correspondant au quatre temps simple
selon le timing mentionné ci-dessus. Écrivez quatre programmes correspondant au double quatre temps
selon le timing mentionné ci-dessus. Programme correspondant à huit temps
Notez que la différence entre les quatre éléments ci-dessus de quatre temps et de huit temps est la précision. Il n'y a pas de différence dans d'autres choses. Bien sûr, la précision de huit temps est supérieure à celle de quatre temps :
Bien sûr, si on veut faire mieux, on peut aussi préparer la fonction de vitesse de direction vers le bas.Changer de direction revient en fait à inverser la séquence de quatre temps et de huit temps évoquée plus haut, ce qui est aussi très pratique !
Ici, j'ai également ajouté la fonction d'angle, qui est également mentionnée dans la méthode de calcul d'angle mentionnée ci-dessus !
La situation d'appel dans la fonction principale est la suivante, ici nous la faisons pivoter de 180 degrés vers l'avant et de 180 degrés vers l'arrière
4. Code source
uln2003.c
/*
* uln2003.c
*
* Created on: Feb 17, 2022
* Author: LX
*/
#include "uln2003.h"
void motor_stop()
{
MA_LOW;MB_LOW;MC_LOW;MD_LOW;
}
void motor_start_sig4(uint8_t motor,uint8_t speed) //四项单四拍
{
switch(motor)
{
// 0111 1011 1101 1110,这个过程逆向为反向
case 0:
MA_LOW;MB_HIGH;MC_HIGH;MD_HIGH;
break;
case 1:
MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 2:
MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
break;
case 3:
MA_HIGH;MB_HIGH;MC_HIGH;MD_LOW;
break;
}
HAL_Delay(speed);
motor_stop();
}
void motor_start_dou4(uint8_t motor,uint8_t speed) //四项双四拍
{
switch(motor)
{
// 0110 0011 1011 1100,这个过程逆向为反向
case 0:
MA_LOW;MB_HIGH;MC_HIGH;MD_LOW;
break;
case 1:
MA_LOW;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 2:
MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 3:
MA_HIGH;MB_HIGH;MC_LOW;MD_LOW;
break;
}
HAL_Delay(speed);
motor_stop();
}
void motor_start_eig(uint8_t motor,uint8_t speed) //四项八拍
{
switch(motor)
{
// 0111 0011 1011 1001 1101 1100 1110 0110,这个过程逆向为反向
case 0:
MA_LOW;MB_HIGH;MC_HIGH;MD_HIGH;
break;
case 1:
MA_LOW;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 2:
MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
break;
case 3:
MA_HIGH;MB_LOW;MC_HIGH;MD_LOW;
break;
case 4:
MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
break;
case 5:
MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
break;
case 6:
MA_HIGH;MB_HIGH;MC_HIGH;MD_LOW;
break;
case 7:
MA_LOW;MB_HIGH;MC_HIGH;MD_LOW;
break;
}
HAL_Delay(speed);
motor_stop();
}
uint8_t motor;
void motor_uln2003(uint8_t dir,uint8_t speed)
{
for(uint8_t i = 0;i<8;i++)
{
if(dir == 1)
{
motor++;
if(motor > 7)motor = 0;
}
else
{
if(motor == 0)motor = 8;
motor--;
}
motor_start_eig(motor,speed);
}
}
void motor_angle(uint8_t dir,uint16_t angle,uint8_t speed)
{
static uint8_t flag = 1;
if(flag == 1)
{
for(uint16_t num;num<64*angle/45;num++)
{
motor_uln2003(dir,speed);
flag = 0;
}
flag = 1;
}
}
uln2003.h
#ifndef ULN2003_H_
#define ULN2003_H_
#include "main.h"
#define MA_HIGH HAL_GPIO_WritePin(INTC_GPIO_Port, INTC_Pin, GPIO_PIN_SET)
#define MA_LOW HAL_GPIO_WritePin(INTC_GPIO_Port, INTC_Pin, GPIO_PIN_RESET)
#define MB_HIGH HAL_GPIO_WritePin(INTD_GPIO_Port, INTD_Pin, GPIO_PIN_SET)
#define MB_LOW HAL_GPIO_WritePin(INTD_GPIO_Port, INTD_Pin, GPIO_PIN_RESET)
#define MC_HIGH HAL_GPIO_WritePin(INTB_GPIO_Port, INTB_Pin, GPIO_PIN_SET)
#define MC_LOW HAL_GPIO_WritePin(INTB_GPIO_Port, INTB_Pin, GPIO_PIN_RESET)
#define MD_HIGH HAL_GPIO_WritePin(INTA_GPIO_Port, INTA_Pin, GPIO_PIN_SET)
#define MD_LOW HAL_GPIO_WritePin(INTA_GPIO_Port, INTA_Pin, GPIO_PIN_RESET)
void motor_stop();
void motor_start_sig4(uint8_t motor,uint8_t speed);
void motor_start_dou4(uint8_t motor,uint8_t speed);
void motor_start_eig(uint8_t motor,uint8_t speed);
void motor_uln2003(uint8_t dir,uint8_t speed);
void motor_angle(uint8_t dir,uint16_t angle,uint8_t speed);
#endif /* ULN2003_H_ */