原创 步进电机驱动-dsPIC33F步进电机驱动程序解读-速度与位置控制器2

2014-4-3 09:23 2061 25 25 分类: 工业电子 文集: 步进电机驱动笔记

 

//下面处理在整步的时候共振的消除,这里只是根据
    if(stepSize == ST_FULLSTEP)
    {
        //下面设置的值都是经验值,可以根据电机的实际情况进行调整
        int min=200, max=900;
       //如果最大的速度还没有到你现在的输出速度,就不需要消除共振了 
        maxSpeed = abs((int)speedOut);
        resonanceCompensation = OFF;
        //如果确实是速度控制的模式
        if(uGF.positionControl == SPEED_CONTROL)
        {//整步共振点通常在这个范围
            if(fullStepMode == FULLSTEP_TWO_PHASE_ON)
            {          
                min=300;//共振的起点
                max=750;//共振的终点
            }
            else//而波形驱动的在这个范围
            {
                min=460;        //共振的起点
                max=600;        //共振的终点
            }
        }    
        //如果速度在上面的这些范围之内,则开启共振消除
        if(maxSpeed<max && maxSpeed>min)
                resonanceCompensation = ON;        //打开共振消除
    }
    else//否则关闭共振消除
    {
        resonanceCompensation = OFF;                //关闭共振消除
    }
//这里只是通过速度来判断共振消除的入口,在PI处理函数中,有进行共振消除的具体算法    
 
//抗积分饱和速度的更新
    if(speedOut < PI_ANTI_WINDUP_SPEED && speedOut > -PI_ANTI_WINDUP_SPEED )
    {
        PI_antiWindUp =  PI_ANTI_WINDUP_GAIN1;
    }
    else
    {
        PI_antiWindUp =  PI_ANTI_WINDUP_GAIN2;
    }
//上面其实就是根据不同的速度,设置PI_antiWindUp的值,这里值的处理函数在PI处理函数中,有具体的算法
    
//定时器中断暂时关闭,防止参数的更改。
 
    IEC0bits.T3IE = 0;       
    if(speedOut > MINIMUM_SPEED)//如果速度不是很小,而是在最小速度以上,则分为正负速度两种情况
    {
        ltemp = SPEED_PRE_SCALE/speedOut;  //根据这个时钟设置和现在输出的速度设置ltemp 
        T2CONbits.TON = 1;                  
        directionFlag = MOTOR_FORWARD;   //正向,设置标志
    }
    else if(speedOut < -MINIMUM_SPEED)
    {
        ltemp = SPEED_PRE_SCALE/speedOut; 
        T2CONbits.TON = 1;                  
        directionFlag = MOTOR_REVERSE;      //同上面的设置,反向
    }
    else    
    {     
        T2CONbits.TON = 0;                  //如果速度太小,则开启定时器,重启清零
        TMR2 =0;                            
        TMR3 =0;
        ltemp = SPEED_PRE_SCALE/MINIMUM_SPEED;  //计算ltemp 值,以最小的速度开始计算
        if(uGF.currentControlLoop == OFF)            //如果闭环关闭,则设置最大的参考值,并进行计算微步,在微步里面设置了每一步的参考电压。
         maxRefValue = OPEN_LOOP_VOLTAGE;
        CalcStep();
    }
    
    speed2Time = (directionFlag*ltemp*stepSizeCount)>>SPEED_POST_SCALE;       //根据ltemp 计算出到设定速度的时间,然后判断如果这个时间小于斩波周期,则直接设置为斩波周期。
    
    if (speed2Time < PWM_FCY)
    {
        speed2Time = PWM_FCY;
    }
    IEC0bits.T3IE = 1;      // Enable Timer2/3 interrupt
}
//结束速度和位置的控制,这里只是进行PI计算的一个入口,PI具体如何进行处理的算法,在PI计算函数中有讲述。

文章评论0条评论)

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