原创 步进电机驱动-dsPIC33F步进电机驱动程序解读-细分算法1

2014-4-3 09:17 1916 29 29 分类: 工业电子 文集: 步进电机驱动笔记

 

/******************************************************************************
* Function:     CalcStep()
//这个函数用来计算微步的一个参考值,基于正弦表,并且在后面计算了衰减的模式
*******************************************************************************/
void CalcStep()
{
    //定义,用来存放一下会修改的参数,防止没算完的时候产生了中断
    long stepChangeRate;
    int voltageOut1temp,voltageOut2temp;
    int stepAmplitudeRef1temp,stepAmplitudeRef2temp;//guitronic,计算出来做比较的电压值
    int setDir1temp,setDir2temp; 
//把方向取值,用于计算,计算完后反给全局变量
    setDir1temp=setDir1;
    setDir2temp=setDir2;
//取得当前的电压值,用于计算下一脉冲时的跳转位置,根据方向
    voltageOut1temp = voltageOut1;
    voltageOut2temp = voltageOut2;
    stepAmplitudeRef1temp = stepAmplitudeRef1;
    stepAmplitudeRef2temp = stepAmplitudeRef2;
//首先要基于你所在的相限以及方向来确定跳转值。比如1轴如果是在第一相限,从余弦0点开始,则2轴有两种可能,1种为正弦,滞后90度为正值,一种是超前90度为负值。
if(stepCount<TABLE_SIZE_MUL2)       //判断位置,如果是在第一相限和第二相限,这里stepCount为一个正弦波被分为1024份,90度被分为256份,也就是最大为256细分。
{
    if(stepCount<TABLE_SIZE) //如果是90度以内,为第一相限
{
//这个好计算,就是DAC输出的参考电压值,计算出此时的电压值。此时2轴有两种可能。
stepAmplitudeRef1temp = (int)(((long)sineTable[stepCount]*maxRefValue)>>15);           
voltageOut1temp = stepAmplitudeRef1temp;      //这个时候把相位的这个电压值赋值给输出电压,这个电压用于跟采样做比较。                                  
setDir1temp = FORWARD;                                        //这个方向我定义为正,只是一个相对的方向
 
if(fullStepMode==FULLSTEP_WAVE_DRIVE || stepSize>ST_FULLSTEP)    //有两种模式,一种是波形驱动,也就是整步,一种是细分。
           {//如果是在细分模式
                if(directionFlag == MOTOR_FORWARD)      
               {//方向为正,开始计算轴2的位置,同样计算出余弦的参考电压值,这个时候计算的值应该是负值。
        stepAmplitudeRef2temp = (int)(((long)sineTable[TABLE_SIZE-stepCount-1]*maxRefValue)>>15);   
                                        //这个值也好计算,比如刚刚为6,余弦值32745,则正弦表位置为256-6-1。         
                                voltageOut2temp = stepAmplitudeRef2temp;
        setDir2temp = FORWARD;   //此时2轴为正,电流为正向                                      
    }
    else                                                                          
    {//也有可能另外一个轴是领先你90度,负向,此时电压为负值,大小和正向是一样的。
         stepAmplitudeRef2temp = -(int)(((long)sineTable[TABLE_SIZE-stepCount-1]*maxRefValue)>>15);
         voltageOut2temp = PWM_MAX + (stepAmplitudeRef2temp);//这里为什么要加上PWM_MAX,这个应该是做峰值电流设置的一个抵消
         setDir2temp = REVERSE;             //输出为负,方向为反向    
    }
    
}
}
else
{//这个是第二相,计算方法同上所示
if(fullStepMode==FULLSTEP_WAVE_DRIVE || stepSize>ST_FULLSTEP)
    {//这里,是从0开始,也就是说,并且为负值。
        stepAmplitudeRef1temp =  - (int)(((long)sineTable[TABLE_SIZE_MUL2-stepCount-1]*maxRefValue)>>15);  
        voltageOut1temp = PWM_MAX + (stepAmplitudeRef1temp);//同上面的道理,应该加上PWM_MAX.
        setDir1temp = REVERSE;                //此时参考轴电流为负。现在可以看出来,setDir1temp 这个参数是用来定义参考轴的电流方向,不是转向
    }
    if(directionFlag == MOTOR_FORWARD)                 //如果是正向转,则另外一轴为正向最大,或者反转,为负向最大
         {
     stepAmplitudeRef2temp = (int)(((long)sineTable[stepCount - TABLE_SIZE]*maxRefValue)>>15); //正向最大
     voltageOut2temp = stepAmplitudeRef2temp;
     setDir2temp = FORWARD;                                  //值为正,电流方向为正向
     }
     else                                                                             
     {
        stepAmplitudeRef2temp =  - (int)(((long)sineTable[stepCount-TABLE_SIZE]*maxRefValue)>>15);//此时为负值最大。
    voltageOut2temp =  PWM_MAX + (stepAmplitudeRef2temp);//同样加上PWM_MAX 
    setDir2temp = REVERSE;                              //值为负,2轴电流为反向
     }
}
}
//第三相限,还是负值,从负值最大变化到0
else
{
if(stepCount<TABLE_SIZE_MUL3)
{
stepAmplitudeRef1temp = - (int)(((long)sineTable[stepCount - TABLE_SIZE_MUL2]*maxRefValue)>>15);    //这个好计算
voltageOut1temp = PWM_MAX + (stepAmplitudeRef1temp);//负值,加上PWM_MAX 
setDir1temp = REVERSE;                                                        //轴电流方向为负值,还是要分超前还滞后两种情况
if(fullStepMode==FULLSTEP_WAVE_DRIVE || stepSize>ST_FULLSTEP)                   
    {
         if(directionFlag == MOTOR_FORWARD)           
             {
         stepAmplitudeRef2temp = - (int)(((long)sineTable[TABLE_SIZE_MUL3-stepCount-1]*maxRefValue)>>15);
                            //此时为负值,从0点开始
         voltageOut2temp = PWM_MAX + (stepAmplitudeRef2temp);
         setDir2temp = REVERSE;//电流为负,2轴为反向。
    }
    else                                                                   
    {
        stepAmplitudeRef2temp = (int)(((long)sineTable[TABLE_SIZE_MUL3-stepCount-1]*maxRefValue)>>15);  //后面计算方法类似
        voltageOut2temp = stepAmplitudeRef2temp;
        setDir2temp = FORWARD;                                                   
    }   
        } 
}
else
{
if(fullStepMode==FULLSTEP_WAVE_DRIVE || stepSize>ST_FULLSTEP)   
    {
    stepAmplitudeRef1temp = (int)(((long)sineTable[TABLE_SIZE_MUL4-stepCount-1]*maxRefValue)>>15);  
    voltageOut1temp = stepAmplitudeRef1temp;
    setDir1temp = FORWARD;                                                
}
if(directionFlag == MOTOR_FORWARD)                                 
         {
             stepAmplitudeRef2temp = - (int)(((long)sineTable[stepCount-TABLE_SIZE_MUL3]*maxRefValue)>>15);
     voltageOut2temp =  PWM_MAX + (stepAmplitudeRef2temp);
     setDir2temp = REVERSE;                                                    
}
else              
{
stepAmplitudeRef2temp = (int)(((long)sineTable[stepCount - TABLE_SIZE_MUL3]*maxRefValue)>>15);    
     voltageOut2temp = stepAmplitudeRef2temp;
     setDir2temp = FORWARD;                                   
}
}
}
//上面通过对4个相限的计算,通过stepCount来确定位置,通过超前还是滞后,也就是正传还是反转来确定另外一个轴的值,这样我们获得了一个输出的voltageOut2temp值,并且设置好电流正负的标志。

文章评论0条评论)

登录后参与讨论
我要评论
0
29
关闭 站长推荐上一条 /2 下一条