零基础使用STM32CubeMX配置PWM输出控制步进电机

CubeMX配置

1、打开CubeMX并选择自己的芯片版本

2、系统时钟RCC选择外部晶振Crystal/Ceramic Resonator

3、配置时钟

4、配置定时器为PWM输出模式,根据上一步配置的时钟频率72MHZ设置预分频系数为18-1,设置计数周期为500-1。根据公式:PWM输出频率 = 定时器时钟频率 ÷ ((预分频系数+1) × (计数周期 + 1))计算得到,PWM输出频率为8khz。

5、设置PWM输出引脚,此处使用默认的PA15引脚

6、电机转动方向引脚配置,此处配置为PF8,配置输出电平为高high,开漏输出Output Open Drain上拉Pull-up(很重要!!!!!!)


7、项目生成配置,注意保存路径不要有中文

8、设置只拷贝使用到的库,分离.c和.h文件,然后生成代码完成CubeMX的配置。

9、打开main函数配置如下代码,实现三秒正转,三秒反转

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	
	__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 50); //修改占空比=50/计数周期(499)+1
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);	     //使能TIM2的PWM CHANNEL_1输出

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, 1); //电机正转
		HAL_Delay(3000);

		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, 0); //电机反转
		HAL_Delay(3000);
		
  }
  /* USER CODE END 3 */
}

10、实验发现直接使用PF8引脚输出3.3V信号无法控制电机正反转(因为控制器需要5V信号驱动电机),采用外部上拉实现5V输出,此时需配置引脚为开漏输出且查看datasheet芯片手册tIO口号是否带有FT标识。必须带有FT标识才能通过开漏输出加外部上拉输出5V电平。外部上拉原理如下图所示。

11、实物连接图及运行视频

stm32控制步进电机转动

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例代码,用于在stm32cubemx使用PWM控制42步进电机: 首先,需要在stm32cubemx配置PWM和中断。在main.c文件中,需要添加以下代码: ```c #include "main.h" #include "stm32f4xx_hal.h" /* TIM handler declaration */ TIM_HandleTypeDef htim1; /* PWM Configuration */ TIM_OC_InitTypeDef sConfigOC; /* Step counter */ uint8_t step_counter = 0; /* Step sequence */ uint8_t step_sequence[] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09}; /* Function prototypes */ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); /* PWM callback function */ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { /* Disable PWM output */ HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1); /* Increment step counter */ step_counter++; /* Check if step counter is greater than step sequence length */ if (step_counter >= sizeof(step_sequence)) { /* Reset step counter */ step_counter = 0; } /* Set new PWM duty cycle based on step sequence */ sConfigOC.Pulse = step_sequence[step_counter]; /* Update PWM duty cycle */ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); /* Enable PWM output */ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } /* PWM initialization function */ static void MX_TIM1_Init(void) { /* Timer handler declaration */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* Enable TIM1 clock */ __HAL_RCC_TIM1_CLK_ENABLE(); /* Initialize TIM1 handler */ htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 255; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* Initialize PWM configuration */ sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; /* Initialize TIM1 PWM */ HAL_TIM_PWM_Init(&htim1); /* Configure TIM1 PWM channel */ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); /* Configure TIM1 master mode */ sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig); /* Configure TIM1 clock source */ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig); /* Enable PWM output */ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); /* Register PWM callback function */ HAL_TIM_PWM_RegisterCallback(&htim1, HAL_TIM_PWM_PULSEFINISHED_CB_ID, HAL_TIM_PWM_PulseFinishedCallback); /* Enable PWM interrupt */ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1); } /* PWM MSP initialization function */ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { /* TIM1 clock enable */ __HAL_RCC_TIM1_CLK_ENABLE(); /* TIM1 GPIO Configuration */ GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } /* PWM MSP de-initialization function */ void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) { /* TIM1 GPIO de-configuration */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8); /* TIM1 clock disable */ __HAL_RCC_TIM1_CLK_DISABLE(); } /* System initialization function */ void System_Init(void) { /* Reset all peripherals, initialize the Flash interface and the Systick */ HAL_Init(); /* Initialize PWM */ MX_TIM1_Init(); /* Start PWM output */ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } int main(void) { /* System initialization */ System_Init(); /* Infinite loop */ while (1) { /* Do nothing */ } } ``` 在这个示例中,我们使用STM32F4系列的TIM1作为PWM定时器,使用了PA8引脚作为PWM输出步进电机的步序列存储在step_sequence数组中,步进电机的步数存储在step_counter变量中。 在HAL_TIM_PWM_PulseFinishedCallback回调函数中,我们首先停止PWM输出,然后根据步序列设置新的PWM占空比,并重新启动PWM输出。在这个过程中,我们还递增了step_counter变量,并检查它是否超过了步序列的长度。如果超过了步序列的长度,我们就将step_counter重置为0。 在MX_TIM1_Init函数中,我们初始化了PWM定时器和PWM通道,并配置PWM的占空比和时钟源。我们还使用HAL_TIM_PWM_RegisterCallback函数注册了PWM回调函数,并使用HAL_TIM_PWM_Start_IT函数启用了PWM中断。 最后,在System_Init函数中,我们初始化了系统和PWM,并在主循环中不做任何事情。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值