分享:步进电机细分驱动思路及程序

2019-12-13 18:21发布

微步驱动原理:
     细分驱动,把加在线圈上的电压 从最大到最小的过程,分四次给完,产生四个中间
         状态,即四细分。伟力电机内部转子一个分步角度为60度。四细分之后,就变成
     15度。外部指针则转1/12度。
细分方法:
     根据电流等分,得到四个电压点,根据这四个电压点,预先计算出四个PWM值。
         于是一个过程就需要24个点。
         单片机需要处理的就是电流的方向控制。由伟力电机时序图,可以分析出每一个相的
         电流方向。有四种情况。
         正相增大,正相减小,反向增大,反向减小。



const unsigned char OCRnA_Val[24] =
{
    5,48,94,163,220,247,250,247,220,163,94,48,5,207,161,92,34,8,5,8,34,92,161,207
}; //微步码 两个线圈中电流相位是60度,


void step_moto_control(void)
{
    if(direction_flag)  //正转  
    {   
        if(OCRnA_Num_L==0)
        {
            OCRnA_Num_L = 23;
            coil_1B_ON();     
        }
        else
              OCRnA_Num_L--;                  
        if(OCRnA_Num_L<=12) coil_1B_CLE();  
        OCR0A  =  OCRnA_Val[OCRnA_Num_L];   //左线圈电流
               
        if(OCRnA_Num_R==0)
        {
             OCRnA_Num_R = 23;
             coil_2B_ON();   
        }
        else
          OCRnA_Num_R--;
        if(OCRnA_Num_R<=12) coil_2B_CLE();
        OCR0B  =  OCRnA_Val[OCRnA_Num_R];
    }
    else  //反转
    {
        OCRnA_Num_L++;
        if(OCRnA_Num_L>=13) coil_1B_ON();  
        if(OCRnA_Num_L>23)
        {
           OCRnA_Num_L=0;
           coil_1B_CLE();     
        }
        OCR0A  =  OCRnA_Val[OCRnA_Num_L];  
        OCRnA_Num_R++;
        if(OCRnA_Num_R>=13) coil_2B_ON();
        if(OCRnA_Num_R>23)
        {
           OCRnA_Num_R=0;
           coil_2B_CLE();   
        }
        OCR0B  =  OCRnA_Val[OCRnA_Num_R];
     }
}  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
49条回答
terencechang
2019-12-16 04:15
/**************************************************************
步进电机速度控制函数
***************************************************************/
void Speed_Control(void)
{
           unsigned int angle_difference = 0;
        unsigned int Speed_control_temp = 0;
        if(current_angle == set_angle)
        {
                 Speed_control_Val = 50;
                 return;
        }  
        else
        {
            if(direction_flag==CCW)
                  angle_difference = current_angle - set_angle;
        else if(direction_flag==CW)
                 angle_difference = set_angle - current_angle;
                if(angle_difference>=100) //>=9
                {
                     if(angle_difference>=1080)             //>90
                          Speed_control_temp  =  1;         
                         else if(angle_difference>=720)         //60
                              Speed_control_temp  =  2;
                         else if(angle_difference>=540)         //>45
                              Speed_control_temp  =  3;
                 else
                      Speed_control_temp  =  2160/angle_difference;    //根据当前误差求出速度
                                  if(Speed_control_temp>=20) Speed_control_temp = 20;
                     if(Speed_control_Val>Speed_control_temp)   //加速
                     {
                                  Speed_control_Val -= 1;
                              if(Speed_control_Val<=Speed_control_temp)
                                  {
                                       Speed_control_Val = Speed_control_temp;       
                                  }
                     }
                         else                                 
                         {
                               if(angle_difference<=120&&Speed_control_Val<=4)           //<10   减速
                                   {
                                            Speed_control_Val += 1;
                                   }           
                         }                 
                }
        }       
}

一周热门 更多>