基于STM32步进电机加减速控制查表法

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 16:04   290   0

步进电机加减速查表法

1.流程图

2,代码段

1.码盘

const UNBIT16 CarAccelerationList[CAR_ACCELERATION_STEP_MAX + 1] =
{
    1897,786,603,508,448,405,372,347,326,308,
    293,280,268,258,249,241,234,227,221,215,
    210,205,200,196,192,188,184,181,178,175,
    172,169,166,164,162,159,157,155,153,151,
    149,147,146,144,142,141,139,138,136,135,
    133,132,131,130,129,127,126,125,124,123,
    122,121,120,119,118,117,116,115,115,114,
    113,112,111,111,110,109,108,108,107,106,
    106,105,104,104,103,103,102,101,101,100,
    100,99,99,98,98,97,97,96,96,95,
    95,94,94,93,93,92,92,91,91,91,
    90,90,89,89,89,88,88,88,87,87,
    86,86,86,85,85,85,84,84,84,83,83
};

2.速度改变段

void VerticalCarMotorSpeedCtr(UNBIT16 speed)
{
    if(speed > CAR_ACCELERATION_STEP_MAX)
    {
        VerticalCarMotorSpeed = CAR_ACCELERATION_STEP_MAX;
    }
    else
    {
        VerticalCarMotorSpeed = speed;
    }
    
    TIM3->PSC = (CarAccelerationList[VerticalCarMotorSpeed]/10 *7); //±1001
}

3.速度控制段(包含距离计算,方向确定,速度控制)

//±±ê·
UNBIT8 MoveVerticalCarToTargetAddr(UNBIT8 MoveCarAddr)
{
   static UNBIT16 DistanceTemp;
    switch(MoveVerticalCarSta)
    {
        case MOVE_VerticalCAR_STA_INIT:
            MoveVerticalCarSta = MOVE_VerticalCAR_STA_ACT;
            VerticalCarPulseSta = 0;
            VerticalCarPulseNum = 0;
        DistanceTemp = 0;
        MoveVerticalCarLeftFlag = 0;
        MoveVerticalCarRightFlag = 0;
        MoveVerticalCarStep = 0;
        DeviceCfg.SUBDIVIDE = 0;
        DeviceCfg.MoveStep = 0;
    
            VerticalCarMotorSpeedCtr(0);
    
        //·ò°éèà
        if(MoveCarAddr > DeviceCfg.sign) //ò
      {
        stepping_motor_reversal();
        MoveVerticalCarLeftFlag = 1;
        MoveVerticalCarStep = MoveCarAddr - DeviceCfg.sign;
      }
      else
      {
        stepping_motor_foreward();
        MoveVerticalCarRightFlag = 1;
        MoveVerticalCarStep = DeviceCfg.sign - MoveCarAddr;
      }
      
      //×±ê
      DeviceCfg.MaxStep = (MoveVerticalCarStep * STEP_MOTOR);
  
            break;
        case MOVE_VerticalCAR_STA_ACT:
           
        CatchVerticalCarPulseFunc( ); //ר
    
        if(VerticalCarPulseNum != 0)
            {
                if(DeviceCfg.MoveStep < 20)
                {
                    VerticalCarPulseNum = 0;
                }
            }
    
           if(DistanceTemp != DeviceCfg.MoveStep )
      {   
              DistanceTemp = DeviceCfg.MoveStep;      
       if(DeviceCfg.MoveStep < DeviceCfg.MaxStep/2)  //±ê°
       {
        if(VerticalCarMotorSpeed < CAR_ACCELERATION_STEP_MAX){
          VerticalCarMotorSpeed ++;                        
          VerticalCarMotorSpeedCtr(VerticalCarMotorSpeed);
        }
       }
       else if(DeviceCfg.MoveStep > (DeviceCfg.MaxStep - CAR_ACCELERATION_STEP_MAX - 20))  //á°
       {
         if(VerticalCarMotorSpeed > 0)
         {
          VerticalCarMotorSpeed --;
          VerticalCarMotorSpeedCtr(VerticalCarMotorSpeed);
         }
       }
      }
     
       if(VerticalCarPulseNum == MoveVerticalCarStep)   //àà
       {
        stepping_motor_stop();
        if(MoveVerticalCarLeftFlag == 1)   //ü±°
        {
         DeviceCfg.sign = (DeviceCfg.sign + VerticalCarPulseNum);
        }
        else
        {
         DeviceCfg.sign = (DeviceCfg.sign - VerticalCarPulseNum);
        }
        return 1;
       }
       else if(DeviceCfg.MoveStep > DeviceCfg.MaxStep + 100) //ó×ó100ò±¨í°
       {
        stepping_motor_stop();
        return 2;
       }
       return 0;   
  }   
}

4.传感器监测

void CatchVerticalCarPulseFunc(void)
{
   switch(VerticalCarPulseSta)
    {
        case 0:
            if(GetVerticalCarPlaceSta( ) == SENSOR_COVER)
            {
                VerticalCarPulseSta = 1;
                DeviceCfg.MoveVerticalCarLoseStep = 8;
            }
            break;
        case 1:
            if(GetVerticalCarPlaceSta( ) == SENSOR_DISCOVER)
            {
                VerticalCarPulseSta = 0;
            }
            else if(DeviceCfg.MoveVerticalCarLoseStep == 0) 
            {
                VerticalCarPulseSta = 2;
            }
            break;
        case 2:
            if(GetVerticalCarPlaceSta( ) == SENSOR_DISCOVER)
            {
                VerticalCarPulseSta = 3;
                DeviceCfg.MoveVerticalCarLoseStep = 8;
            }
            break;
        case 3:
            if(GetVerticalCarPlaceSta( ) == SENSOR_COVER)
            {
                VerticalCarPulseSta = 2;
            }
            else if(DeviceCfg.MoveVerticalCarLoseStep == 0)
            {
                VerticalCarPulseNum ++;
                VerticalCarPulseSta = 0;
            }
            break;
    }
}

5.中断部分

void TIM3_IRQHandler(void)   //·2                 
{
    if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) {      //ìéTIM3ü·ú·
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);          //TIMxü±ê 
     DeviceCfg.SUBDIVIDE = (DeviceCfg.SUBDIVIDE++); //·
      if(DeviceCfg.MoveVerticalCarLoseStep > 0)
     {
     DeviceCfg.MoveVerticalCarLoseStep--;  //
    }     
       if( DeviceCfg.SUBDIVIDE == 8){ //±×±ò
     DeviceCfg.SUBDIVIDE = 0; // 
     DeviceCfg.MoveStep  = DeviceCfg.MoveStep + 1;  //
    }
  }
}

6.定时器初始化段

void TIM3_Configuration(void) {
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);                //TIM3_CH1

    TIM_TimeBaseStructure.TIM_Period = 99;
    TIM_TimeBaseStructure.TIM_Prescaler = 86;                         //è×÷TIMx±¤·  ·
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                     //è±·:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;      //TIMò
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                  //ùTIM_TimeBaseInitStruct¨TIMx±ù


    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                //¨±÷:TIMí÷2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //±
    TIM_OCInitStructure.TIM_Pulse = 50;                       //è×°±÷±
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //:TIM±
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);                         //ùTIM_OCInitStruct¨èTIMx
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);                //TIMxCCR2¤×°÷
                                                                     //OC2·¨channleOC3òchannel 3
   
   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);                          //¨TIM3,íü
   
    TIM_ARRPreloadConfig(TIM3, ENABLE);                              //TIMxARR¤×°÷

    TIM_Cmd(TIM3, DISABLE);                                           //TIMxè

    TIM_CtrlPWMOutputs(TIM3, ENABLE);                                // òPWM
}

3.总结

1.步进电机加减速,首先要确定三要素,电机移动的方向,电机运动的距离步数,电机的速度控制。如果有传感器还需要传感器的高低电平计数。

2.同步:有带传感器的需要传感器和电机运动进行同步,变速和步数需要同步。不能使电机一下加速到最大值或者减速到最小值。一步一个速度进行控制。

3.最后退出加减速时,需要实时更新当前位置变化

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP