Motor paso a paso de control STM32: accionamiento de motor paso a paso de circuito cerrado basado en la interrupción del temporizador de la biblioteca HAL + control preciso del número de pulsos

1. Controlador de circuito cerrado de motor paso a paso

El controlador de circuito cerrado del motor paso a paso utilizado en este artículo es el controlador de circuito cerrado del motor paso a paso Emm42_V4.0. El controlador de circuito cerrado tiene su propio algoritmo de control de circuito cerrado vectorial FOC, que puede realizar un control de tres circuitos de par, velocidad y posición.
Como se muestra en la figura siguiente, A+, A-, B+ y B- del controlador de motor de circuito cerrado de 42 pasos están conectados al motor paso a paso, y el motor paso a paso se acciona y controla mediante habilitación, pulso y terminales de dirección a la derecha.

Dos, configuración de CubeMx

Primero se requiere la configuración del reloj.

1、Configuración del reloj

inserte la descripción de la imagen aquí
Antes de configurar el reloj, primero debe abrir el RCC en Configuración y configuración, seleccionar Resonador de cristal/cerámica para abrir el oscilador de cristal externo.
Luego configure los parámetros de acuerdo con la frecuencia del oscilador de cristal externo de su microcontrolador, como se muestra en la siguiente figura.
inserte la descripción de la imagen aquí

2. Configuración del temporizador del terminal de pulsos

Vuelva a Pinout & Configuration nuevamente, seleccione el temporizador que desee en Temporizadores, aquí elijo el temporizador 2 y luego enciendo el reloj interno (Fuente del reloj: Reloj interno).
Configure la función del canal como salida PWM (Generación PWM). Aquí utilicé 4 motores paso a paso, por lo que se seleccionaron 4 canales. (El siguiente video solo muestra un motor paso a paso, y lo mismo ocurre con otros motores paso a paso. El cableado y el programa complementario estarán bien).
Luego abra la Configuración de NVIC para habilitar la interrupción del temporizador. Como se muestra abajo.
inserte la descripción de la imagen aquí
A continuación, configure la frecuencia del temporizador de acuerdo con el reloj que configuró en el paso anterior y la frecuencia que puede transportar su unidad.
Por ejemplo, la frecuencia de pulso máxima del controlador que uso es de 120 KHZ y la velocidad máxima es de más de 2200 revoluciones, es decir, si quiero alcanzar la velocidad más alta, puedo configurar un motor paso a paso con un ángulo de paso de 1,8° para ser 16 subdivisiones, es decir, (360 ÷ 1,8) × 16 = 3200 pulsos por revolución ( el número de pulsos de control se mencionará a continuación), y luego usar 120K ÷ 3200 = 37,5 revoluciones/s, es decir, 2250 revoluciones por minuto. Como se muestra en la siguiente figura, mi tim2 pertenece a APB1 y la configuración del reloj es 84MHZ.
inserte la descripción de la imagen aquí
El microcontrolador que uso es STM32F407, por lo que el bus APB1 aquí corresponde a los temporizadores generales tim2 ~ 5, los temporizadores básicos tim6, tim7 y los temporizadores generales tim12 ~ 14. El bus APB2 corresponde a los temporizadores avanzados tim1, tim8 y temporizadores de uso general tim9 ~ 11.
Así que tenga cuidado de no hacer un mal uso de la frecuencia del reloj del temporizador APB1 como frecuencia del reloj APB2 .
Por lo tanto, tomando mi configuración como ejemplo, use 84M ÷ 120K = 700, y luego use este 700 para asignar el coeficiente del preescalador y el período de conteo, como se muestra en la siguiente figura. Aquí, para facilitar la configuración del ciclo de trabajo PWM más adelante, el período de conteo se establece en 100 y luego el PSC es 7.
Fórmula: Frecuencia de salida PWM = frecuencia del reloj del temporizador ÷ ((psc+1) × (arr + 1)).
inserte la descripción de la imagen aquí

Utilice un osciloscopio para comprobar si hay algún problema con la frecuencia y la forma de onda. El programa utilizado aquí se describirá en detalle a continuación, con un ciclo de trabajo del 50% y una frecuencia de 120 KHZ.
inserte la descripción de la imagen aquí

3. Habilitar y dirigir la configuración del pin del terminal

Como se muestra en la figura siguiente, haga clic izquierdo en el pin que desea usar para configurarlo como salida, lo cual es muy simple. Aquí utilizo PC0-4 como terminal de habilitación y PG0-4 como terminal de dirección. Puede elegir los pines que no ocuparán las funciones que necesita como pines simples de salida de alto y bajo nivel según sus necesidades.
inserte la descripción de la imagen aquí
Luego ingrese al Administrador de proyectos para configurar el nombre del proyecto y el entorno de compilación, generar archivos .c, .h, etc., y estará bien.

Tres, programa de motor paso a paso de control de interrupción del temporizador STM32F407

Primero ponga el diagrama de configuración de pines, el programa se ve un poco más claro.

0. Diagrama de configuración de pines

La configuración de pines se muestra a continuación.
inserte la descripción de la imagen aquí

1. La función de biblioteca HAL utilizada

La función de estas dos funciones se explicará a continuación.

HAL_TIM_PWM_Stop(&htimx,TIM_CHANNEL_x);
HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_x);

2. Configuración de inicialización del temporizador de disparo de pulso

En el proyecto generado por CubeMx, solo necesita encontrar el programa de inicialización de acuerdo con el temporizador previamente configurado, y luego agregar el siguiente programa al final del programa, pero necesita configurar los parámetros de acuerdo con el temporizador y canal que configure. . Si está configurado en el temporizador 2, simplemente presione Ctrl F para buscar MX_TIM2_Init.

// 添加程序
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);

La función HAL_TIM_PWM_Start es una función para iniciar la salida PWM, que corresponde a los 4 canales del temporizador 2 como se muestra arriba. La siguiente es la función de inicialización modificada inicial que generé en base a la biblioteca HAL. Se propone sConfigOC para la conveniencia de escribir la función de configuración PWM a continuación. Ambos pasos son necesarios.

/* ============================== 步进电机脉冲触发定时器初始化 ============================== */

TIM_HandleTypeDef htim2;
TIM_OC_InitTypeDef Motor_PWM_sConfigOC = {
    
    0};

/* TIM2 init function */
void Motor_PWM_MX_TIM2_Init(void)
{
    
    

  TIM_ClockConfigTypeDef sClockSourceConfig = {
    
    0};
  TIM_MasterConfigTypeDef sMasterConfig = {
    
    0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 7-1;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 100-1;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  Motor_PWM_sConfigOC.OCMode = TIM_OCMODE_PWM1;
  Motor_PWM_sConfigOC.Pulse = 0;
  Motor_PWM_sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  Motor_PWM_sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &Motor_PWM_sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &Motor_PWM_sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &Motor_PWM_sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    
    
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &Motor_PWM_sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    
    
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim2);
	
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);

}

3. Ajuste del pulso del motor paso a paso

Como se muestra a continuación, tome el motor paso a paso 1 como ejemplo, primero detenga la salida PWM del canal 1 del temporizador 2, luego configure el ciclo de trabajo, configure el canal y encienda el PWM nuevamente. HAL_TIM_PWM_Stop es una función para detener la salida PWM del temporizador x canal x.

void Motor1_pwm_Set(int motor1_n)
{
    
    
   HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
   Motor_PWM_sConfigOC.Pulse = motor1_n;
   HAL_TIM_PWM_ConfigChannel(&htim2, &Motor_PWM_sConfigOC, TIM_CHANNEL_1);
   HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

4. Habilitar, deshabilitar y cambiar la dirección del motor paso a paso.

Como se muestra a continuación, configure los niveles alto y bajo.

void Motor1_enable(void)			// 电机1使能
{
    
    
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
}
void Motor1_disable(void)			// 电机1失能
{
    
    
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
}
void Motor1_course(char course_mod)			// 电机1改变方向
{
    
    
	if(course_mod == 1){
    
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0, GPIO_PIN_SET);}		// 正转
	else if(course_mod == 0){
    
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0, GPIO_PIN_RESET);}			// 反转
}

5. El motor paso a paso gira hacia adelante programa main.c

Arranque el motor paso a paso 1, ajuste el ciclo de trabajo al 50% y gírelo hacia adelante.

int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	Motor_PWM_MX_TIM2_Init();
	Motor_PWM_MX_TIM2_Init();	// 定时器初始化

	Motor1_pwm_Set(50);		// 设置占空比为50%(50/100)
	Motor1_course(1);		// 正转
	Motor1_enable();		// 使能
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

6. Demostración de efectos de vídeo

control de motores paso a paso

4. El motor paso a paso de circuito cerrado controla con precisión el número de pulsos

1. La función de biblioteca HAL utilizada

De manera similar, las funciones de estas tres funciones se explicarán a continuación.

HAL_TIM_PWM_Start_IT(&htimx, TIM_CHANNEL_x);
HAL_TIM_PWM_Stop_IT(&htimx, TIM_CHANNEL_x);
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);

2. Cambie la frecuencia de pulso del motor paso a paso.

Primero, establezca el número de pasos de subdivisión del motor paso a paso en 16, como se muestra en la figura siguiente; aquí se utiliza un motor paso a paso con un ángulo de paso de 1,8 °. Con esta configuración de parámetros, se envían 16 pulsos para girar 1,8°, por lo que los pulsos necesarios para realizar una revolución son (360° ÷ 1,8°) × 16 = 3200 pulsos.
inserte la descripción de la imagen aquí
Basado en el controlador del motor paso a paso anterior, quiero cambiar la velocidad a aproximadamente 5 revoluciones/s, por lo que debemos cambiar la frecuencia de pulso a 120 KHZ. Usando los 3200 pulsos por revolución mencionados anteriormente, se requieren 16000 pulsos para 5 revoluciones, así que cambie 120 KHZ a 16 KHZ. Luego calcule nuevamente el PSC, que es (84M ÷ 16K) ÷ 100 = 52,5.
Cambie el PSC en la inicialización del temporizador de disparo de pulso del motor paso a paso anterior Motor_PWM_MX_TIM2_Init a 53:

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 53-1;

Al mismo tiempo, se debe eliminar la función HAL_TIM_PWM_Start() anterior, es decir, se debe eliminar el siguiente programa:

  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);

3. Cambie el programa de configuración de pulso del motor paso a paso.

Debido a que ya no usamos HAL_TIM_PWM_Start y HAL_TIM_PWM_Stop, estas dos funciones también deben eliminarse al cambiar el programa. Tome el motor paso a paso 1 como ejemplo y cambie al siguiente programa:

void Motor1_pwm_Set(int motor1_n)
{
    
    
   Motor_PWM_sConfigOC.Pulse = motor1_n;
   HAL_TIM_PWM_ConfigChannel(&htim2, &Motor_PWM_sConfigOC, TIM_CHANNEL_1);
}

Por supuesto, vale la pena señalar que la función que definimos ahora no tiene un programa para detener PWM, por lo que debemos recordar llamar a HAL_TIM_PWM_Stop_IT para apagar la salida del temporizador PWM antes de cambiar el PWM .

4. Función de devolución de llamada de interrupción del temporizador PWM

Antes de utilizar la interrupción del temporizador, recuerde redefinir la función de devolución de llamada del temporizador en su programa.
Opcionalmente, agregue el siguiente programa a su stm32f4xx_it.c:

/* USER CODE BEGIN 1 */
int PWM_num = 0;	// 脉冲数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
    
    
	if(htim->Instance == htim2.Instance)	// 确认是否为步进电机脉冲中断的回调
	{
    
    
		PWM_num ++;
		if(PWM_num >= 3200)		// 第3200次(一圈)
		{
    
    
			PWM_num = 0;
			HAL_TIM_PWM_Stop_IT(&htim2, TIM_CHANNEL_1);		// 停止输出PWM
			//HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);		// 翻转led灯电平 
		}
	}
}
/* USER CODE END 1 */

En el programa anterior, puede ver que PWM_num se está acumulando, y se acumulará una vez cada vez que se llame a la función de devolución de llamada. Llamaremos a la función HAL_TIM_PWM_Start_IT una vez en la función principal. Puede adivinarlo adivinando. El propósito de esto La función es permitir que el temporizador emita PWM y la función de devolución de llamada se llama cada vez que se envía un pulso .
Como se muestra en la figura siguiente, la función biblioteca HAL señalada por la flecha ha sido escrita para nosotros y llamará a nuestra función de devolución de llamada de interrupción mencionada anteriormente.
inserte la descripción de la imagen aquí

5. El motor paso a paso gira un círculo hacia adelante y el programa main.c de circuito cerrado

El siguiente es el programa de funciones principal:

int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	Motor_PWM_MX_TIM2_Init();
	
	Motor1_pwm_Set(50);
	HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
	Motor1_course(1);
	Motor1_enable();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

6. Demostración de efectos de vídeo

Motor paso a paso de circuito cerrado: control preciso del número de impulsos

5. Enlace del programa

El programa ha sido empaquetado y subido a los recursos de csdn.
CSDN: biblioteca HAL STM32F407 programa de motor paso a paso de control de interrupción del temporizador
CSDN: biblioteca HAL STM32F407 control de interrupción del temporizador motor paso a paso de circuito cerrado el número de pulso de control preciso
también se puede descargar a través del siguiente enlace:

Programa de motor paso a paso de control de interrupción del temporizador STM32F407 :
enlace: https://pan.baidu.com/s/1svRzVW_7elkHg7wwQ4AN5A
Código de extracción: hpzq
Número de pulso de control de precisión del motor paso a paso de circuito cerrado de control de interrupción del temporizador hpzq :
enlace: https://pan .baidu .com/s/1QIyusKAbusqyMl_VTkjKxg
Código de extracción: 4rml

Soy estudiante y actualmente estoy estudiando. Este artículo puede considerarse como mis notas de estudio. Corríjame si me equivoco.

Supongo que te gusta

Origin blog.csdn.net/xztli/article/details/127179256
Recomendado
Clasificación