Résumé de la commande de moteur pas à pas (1)

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 !
insérez la description de l'image ici
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. !
insérez la description de l'image ici

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 :
insérez la description de l'image ici

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
1 1 1 1 1 0 0 0

Schéma de principe correspondant
insérez la description de l'image ici

Quatre simples quatre coups

enroulement une deux Trois Quatre
UNE 0 1 1 1
B 1 0 1 1
C 1 1 0 1
1 1 1 0

Schéma de principe correspondant
insérez la description de l'image ici
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
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 :
insérez la description de l'image ici
écrivez quatre programmes correspondant au quatre temps simple
insérez la description de l'image ici
selon le timing mentionné ci-dessus. Écrivez quatre programmes correspondant au double quatre temps
insérez la description de l'image ici
selon le timing mentionné ci-dessus. Programme correspondant à huit temps
insérez la description de l'image ici

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 !

insérez la description de l'image ici
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 !
insérez la description de l'image ici
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
insérez la description de l'image ici

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_ */

Je suppose que tu aimes

Origine blog.csdn.net/m0_51220742/article/details/123658350
conseillé
Classement