天天看點

步進電機-STM32單片機定時器正弦波輸出

前面的文章介紹了單片機控制步進電機四相四拍、四相八拍的方式。用的是持續電平驅動,這種驅動方式電機的噪音大,震動明顯,下面介紹正弦波驅動方式,這種方式能很好的解決噪音和震動問題。

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

步進電機-STM32單片機定時器正弦波輸出

配置單片機定時器的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波。

步進電機-STM32單片機定時器正弦波輸出

可以對比下用正弦波代替持續電平的效果

步進電機-STM32單片機定時器正弦波輸出

繼續閱讀