基于STM32的Z轴位移台闭环反馈控制

 一、PWM输出的CubeMX配置

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

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

3、配置时钟

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

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控制步进电机转动

二、外部中断EXTI配置

1、配置引脚PE2接收外部光电限位开关的信号,完成中断触发。同时配置PA0、PC13引脚接收KEY1和KEY2按键的信号以触发中断。

2、中断优先级配置

3、生成代码后,打开main函数编写HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)回调函数以完成中断处理。

/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0)//  GPIO_PIN_0 上发生中断时执行
    {
//		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, 1);
//		HAL_Delay(3000);
			//printf("\r\n %d \r\n",CurrentPosition);
			HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1);	
    }
		
		if(GPIO_Pin == GPIO_PIN_13)//  GPIO_PIN_13 发生中断时执行
    {     
			HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);	
    }

		if(GPIO_Pin == GPIO_PIN_2)//  GPIO_PIN_12 发生中断时执行
    { 
			//HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, 1); //电机正转
			//HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);	//使能TIM2的PWM CHANNEL_1输出
		 // HAL_Delay(100);
			//HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_1);	
			//HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, 1); //电机正转
			
			//HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);	//使能TIM2的PWM CHANNEL_1输出
		  //HAL_Delay(1000);
			HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1);	
    }
}

/* USER CODE END 0 */

三、配置定时器编码模式

1、配置定时器为编码模式以接收编码或光栅信号,选择TIM2定时器。(!!!注意:一定要选择自动重装载寄存器容量大的定时器--32位寄存器,因为小的寄存器无法存储较大的光栅信号)

2、使用默认PA15和PB3引脚接收光栅信号,我的光栅传感器出来的信号是24V信号,需通过简单的串联电阻以降压,如下图。 

3、生成代码后,打开main函数配置HAL_TIM_Encoder_Start打开编码器以开始计数、__HAL_TIM_GET_COUNTER函数以获取光栅信号的值。

 /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM4_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
	CurrentPosition = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));//获取定时器的值(即光栅信号累计值)
   // HAL_UART_Transmit(&huart1,&CurrentPosition, 4, 1000);
//	printf("\r\n 很棒!!! \r\n");
//	printf("\r\n %d \r\n",CurrentPosition);
	HAL_Delay(1000);
	//printf("\r\n %d \r\n",CurrentPosition);
	
	__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, 300);    //修改占空比=50/计数周期(499)+1
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);						 //使能TIM2的PWM CHANNEL_1输出

  /* USER CODE END 2 */

四、

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值