步进电机-STM32高级定时器输出正弦波pwm控制四相五线步进电机

前面的文章介绍了单片机控制步进电机四相四拍、四相八拍的方式。用的是持续电平驱动,这种驱动方式电机的噪音大,震动明显,正弦波驱动方式,这种方式能很好的解决噪音和震动问题。前面的文章也介绍了使用定时器产生符合正弦波规律的PWM,下面教大家用正弦波替代持续电平。

这是定时器的配置部分,里面配置了PWM的输出IO管脚,配置了定时器,配置了定时器更新中断。

void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseStructure.TIM_Period=512;	
	TIM_TimeBaseStructure.TIM_Prescaler= 7;	
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_Pulse=512;                 
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
	TIM_OC2Init(TIM1, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
	
	TIM_ARRPreloadConfig(TIM1, ENABLE);	
	TIM_Cmd(TIM1, ENABLE);
	
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);		 										
	
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
	TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);										
}

定时器更新中断按照四相四拍的要求使能或禁止定时器PWM输出,代码如下

void TIM1_UP_IRQHandler(void)
{	
	if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)	
 	{		
		pwm_index++;
		if(pwm_index>35)
		{
			pwm_index=0;
			pwm_count++;
			if(pwm_count>3)pwm_count=0;
			
			if(pwm_count==0)TIM1->CCER=0x2ABB;
			if(pwm_count==1)TIM1->CCER=0x2BBA;
			if(pwm_count==2)TIM1->CCER=0x3BAA;
			if(pwm_count==3)TIM1->CCER=0x3AAB;
				
		}
		TIM1->CCR1 = indexWave[pwm_index];	
		TIM1->CCR2 = indexWave[pwm_index];	
		TIM1->CCR3 = indexWave[pwm_index];	
		TIM1->CCR4 = indexWave[pwm_index];
		
		TIM_ClearITPendingBit (TIM1, TIM_IT_Update);	
	}
}

至此完成了四相四拍的正弦波驱动,实验证明,正弦波驱动步进电机噪音和震动明显减小

这是PWM输出的波形图

 

这是实物图

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值