步进电机-STM32单片机控制四相五线步进电机的程序

单片机控制步进电机的方法很简单,可以用IO口输出脉冲控制线圈电流驱动电机旋转,可分为四相四拍,四相八拍。四相电机,有四相四拍运行方式AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。前面文档给出的表是四相八拍。

下面说下STM32单片机的程序部分,主函数只有定时器、IO初始化和循环。如下

int main(void)
{
	
	LED_GPIO_Config();
	
	
	TIM_Config();
	
  while(1)
  {      
  }
}

定时器初始化部分,使用定时器的计数功能,使能定时器中断,使用内部晶振,计算8000000/(79+1)/100 =1000 ,即1ms中断一次。

void TIM_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStructure;

	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);  
	
   
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_DeInit(TIM3);        
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;    
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;   
	TIM_TimeBaseInitStruct.TIM_Period = 100 ;  
	TIM_TimeBaseInitStruct.TIM_Prescaler = 79 ;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct ) ;       
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;     
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;     
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_ClearFlag(TIM3, TIM_FLAG_Update);            
	TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);    
	TIM_Cmd(TIM3, ENABLE);         
}

四相八拍 中断服务函数,按照A-AB-B-BC-C-CD-D-DA-A方式控制IO输出。

void TIM3_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
	{
		TIM3_count++;
		if(TIM3_count>7)
		{
			TIM3_count=0;
		}
		if(TIM3_count==0)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,1);
		}
		else if(TIM3_count==1)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,1);
		}
		else if(TIM3_count==2)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==3)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==4)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==5)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==6)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==7)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,1);
		}
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
	}
}

使用逻辑分析仪抓的信号如下

四相四拍中断服务函数,按照AB-BC-CD-DA-AB控制输出IO

void TIM3_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{
		TIM3_count++;
		if(TIM3_count>3)
		{
			TIM3_count=0;
		}
		if(TIM3_count==0)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==1)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,0);
		}
		else if(TIM3_count==2)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,1);
		}
		else if(TIM3_count==3)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_8,1);
			GPIO_WriteBit(GPIOA, GPIO_Pin_9,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_10,0);
			GPIO_WriteBit(GPIOA, GPIO_Pin_11,1);
		}
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
	}
}

别看这个步进电机小,其实挺有劲的,转起来手抓不住。直接用脉冲的控制方式噪音大,震动明显,后面介绍正弦波驱动方式,能很好的解决噪音和震动问题。

  • 20
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
使用STM32F4主从定时器驱动步进电机是一个常见的应用场景。STM32F4系列微控制器内置了多个定时器,可以利用这些定时器的输出来产生脉冲信号,控制步进电机的运动。 首先,选择一个合适的主定时器作为步进电机驱动的脉冲发生器。这个定时器的计数器值将作为步进电机每个脉冲的时间间隔。根据步进电机的要求,可在主定时器的计数器达到一定值时触发一个中断,该中断用于生成步进电机脉冲。 然后,选择一个从定时器用于计数步进电机脉冲数量。在主定时器中断中,将从定时器的计数器值清零,并设置一个较大的目标计数值,用于控制步进电机的运动。 在主定时器中断中,通过设置应的IO口的电平来控制步进电机应的引脚。根据步进电机的类型(单、双等),可以设置不同的引脚电平来控制步进电机的转动方向和步进数目。 最后,在主程序中,通过启动主定时器开始生成脉冲,同时启动从定时器开始计数。在从定时器的中断中,可以实现一些其他的功能,如改变电机转速、实现加减速等。 需要注意的是,步进电机的驱动方式还与具体的步进电机驱动芯片有关,可能需要配置一些额外的寄存器。另外,还需要根据步进电机的特性和要求,调整主定时器的计数器值、从定时器的计数范围等参数,以实现精确的步进电机控制。 综上所述,通过使用STM32F4主从定时器驱动步进电机,可以实现精确的步进电机控制,满足不同应用场景的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值