lqhm0927 发表于 2011-3-4 22:12:27

步进电机程序

请帮忙看下自己写的一部分步进程序,已实验过能工作。
请问这样改变CCR1的值行吗,有更好的方法吗
void TIM3_IRQHandler(void)
{
   u16 temp;
   static u16 x_step,counter;

   if(TIM3->SR&=0x0002)       
   {
      TIM3->SR&=0xfffd;        //清中断标志

             *X_EN=0;//开X驱动器       
                if(xup_step==0)                  //加速段结束
                {
                   if(xhigh_step==0)          //高速段结束
                   {
                          if(xdown_step==0) //减速段结束
                          {
                             TIM3->CR1&=0xfffe;//关定时器和中断
                             TIM3->DIER&=0xfffd;
                             *X_EN=1; //关X驱动器
                             *X_CLK=1;
                              x_step=0;
                          }
                          else
                          {
                             counter=1000000/(START_FRE+(UPDOWN_FRE*xdown_step));//减速段,调整脉冲频率
                             if((TIM3->CCR1+counter)>0xffff)
                             {
                                 temp=0xffff-TIM3->CCR1;
                                 TIM3->CCR1=counter-temp;
                              }
                             else
                             {
                                 TIM3->CCR1+=counter;       
                             }                                                      
                          *X_CLK=~*X_CLK;    //步进脉冲改变状态
                         if(*X_CLK)
                         {
                            x_step++;          //步数加一
                            xdown_step--;
                         }                             
                          }
                   }
                   else
                   {
                      if((TIM3->CCR1+counter)>0xffff) //高速段,调整脉冲频率
                          {
                             temp=0xffff-TIM3->CCR1;
                             TIM3->CCR1=counter-temp;
                          }
                          else
                          {
                             TIM3->CCR1+=counter;       
                          }                                 
                          *X_CLK=~*X_CLK;    //步进脉冲改变状态
                      if(*X_CLK)
                      {
                         x_step++;           //步数加一
                         xhigh_step--;
                      }                          
                   }
                }
                else
          {
                   counter=1000000/(START_FRE+(UPDOWN_FRE*x_step));//加速段,调整脉冲频率
                   if((TIM3->CCR1+counter)>0xffff)
                   {
                          temp=0xffff-TIM3->CCR1;
                          TIM3->CCR1=counter-temp;
                   }
                   else
                   {
                      TIM3->CCR1+=counter;       
                   }          
                   *X_CLK=~*X_CLK;   //步进脉冲改变状态
                   if(*X_CLK)
                   {
                      x_step++;           //步数加一
                      xup_step--;
                   }
                }                    
   }
}
/**************************TIM3配置*********************************/
void TIM3_Configuration(void)
{
   TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;                           //基本结构体变量定义   
   TIM_OCInitTypeDefTIM_OCInitStructure;                     //输出结构体变量定义
      
   TIM_DeInit(TIM3);

   TIM_TimeBaseStructure.TIM_Prescaler = 35;                                   //TIM基本初始化
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_Period =65535;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
   
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;                   //TIM输出通道初始化
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;            
   TIM_OCInitStructure.TIM_Pulse =65535;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      

   TIM_OC1Init(TIM3,&TIM_OCInitStructure);
   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);                  //开定时器中断
   
   TIM_Cmd(TIM3,ENABLE);
}

wind2100 发表于 2011-3-5 08:01:39

STM32 基本定时器

/*******************************************************************************
* Function Name: TIM2_IRQHandler
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{              
       /* 方法1:
       // Clear TIM2 update interrupt
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

       TIM_SetAutoreload(TIM2, Motor2Tcnt1Val);           //TIM2->ARR = 1000 ;        // T1Tcnt1Val 1000
       
       Motor2DriveInTimer();       //Motor-Driver       
       */

       static u16 capture = 0;

       //----------------TIM_IT_CC1---------------------------------------------
       if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)   //1ms
               {
          // Clear TIM2 Capture Compare1 interrupt pending bit
          TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);                                                               
                Motor1DriveInTimer();       //Motor-Driver
                capture = TIM_GetCapture1(TIM2);
      TIM_SetCompare1(TIM2, capture + Motor1Tcnt1Val);
                }

       //----------------TIM_IT_CC2---------------------------------------------
          else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
          {
          // Clear TIM2 Capture Compare2 interrupt pending bit
          TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
                Motor2DriveInTimer();       //Motor-Driver
                capture = TIM_GetCapture2(TIM2);
      TIM_SetCompare2(TIM2, capture + Motor2Tcnt1Val);
          }

        //----------------TIM_IT_CC3---------------------------------------------
          else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
          {
          // Clear TIM2 Capture Compare3 interrupt pending bit
          TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
                Motor3DriveInTimer();       //Motor-Driver
          capture = TIM_GetCapture3(TIM2);
      TIM_SetCompare3(TIM2, capture + Motor3Tcnt1Val);
          }

        //----------------TIM_IT_CC4---------------------------------------------
          else
          {
          // Clear TIM2 Capture Compare4 interrupt pending bit
          TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
                Motor4DriveInTimer();       //Motor-Driver
                capture = TIM_GetCapture4(TIM2);
      TIM_SetCompare4(TIM2, capture + Motor4Tcnt1Val);
          }
//-------------------------------------------------------------------------------          
}

lqhm0927 发表于 2011-3-6 22:17:56

对不起没看懂
页: [1]
查看完整版本: 步进电机程序