步进电机-STM32单片机定时器正弦波输出

前面的文章介绍了单片机控制步进电机四相四拍、四相八拍的方式。用的是持续电平驱动,这种驱动方式电机的噪音大,震动明显,下面介绍正弦波驱动方式,这种方式能很好的解决噪音和震动问题。

首先需要准备下stm32的正弦波PWM表,可以用EXCEL生成。

配置单片机定时器的PWM输出。

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_Low;
        
        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);                                                                                
}

配置定时器的数据更新中断,在中断里更新CCR的值改变占空比。

void TIM1_UP_IRQHandler(void)
{        
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)        
         {                
                pwm1_index++;if(pwm1_index>36)pwm1_index=0;
                pwm2_index++;if(pwm2_index>36)pwm2_index=0;
                pwm3_index++;if(pwm3_index>36)pwm3_index=0;
                pwm4_index++;if(pwm4_index>36)pwm4_index=0;
                TIM1->CCR1 = indexWave[pwm1_index];        
                TIM1->CCR2 = indexWave[pwm2_index];        
                TIM1->CCR3 = indexWave[pwm3_index];        
                TIM1->CCR4 = indexWave[pwm4_index];        
                TIM_ClearITPendingBit (TIM1, TIM_IT_Update);        
        }
}

至此可以看到定时器输出的符合正弦波规律的PWM波。

可以对比下用正弦波代替持续电平的效果

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
步进电机是一种控制精度较高的电机,常用于需要精确调节转动角度的应用中。在STM32单片机中,可以通过编写程序来控制步进电机的转动。 首先,我们需要连接步进电机STM32单片机的GPIO端口上。这可以通过将电机的控制引脚分别连接到单片机的IO口上,并在程序中配置相应的IO口为输出模式。 接下来,我们需要编写程序来控制步进电机的转动。可以通过使用定时器和延时函数来生成脉冲信号,从而控制步进电机的转动角度。 首先,我们需要配置相关的定时器,选择合适的预分频和计数值,以控制脉冲信号的频率和占空比。 然后,我们可以编写一个函数来控制步进电机的转动。这个函数可以接收参数,例如要旋转的角度和转动方向。然后根据参数计算得出需要发送的脉冲数,并通过控制IO口的高低电平来发出相应数量的脉冲信号,从而控制步进电机的转动。 在主程序中,我们可以调用这个步进电机控制函数来实现具体的功能。例如,我们可以通过按下按钮来触发步进电机转动,或者通过外部的传感器来监测环境状态,并根据需要调整步进电机的角度。 综上所述,通过编写STM32单片机的程序,我们可以实现对步进电机的控制。控制步进电机的基本原理是通过发送脉冲信号来控制电机的转动角度,然后通过程序逻辑判断来确定发送多少脉冲信号以达到目标转动角度。这样可以使步进电机精确地转动到指定的位置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值