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

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

 


#ifdef BIPOLAR//
//看看混合衰减如何产生
    if(uGF.currentControlLoop == OFF && uGF.decayMode == ALTERNATE_DECAY)//OFF的话,不用PI控制模式,如果设定为混合衰减的话,执行
    {
        stepChangeRate = stepAmplitudeRef1*(1-2*setDir1)-stepAmplitudeRef1temp*(1-2*setDir1temp);//设置爬坡率,比如高细分当然爬的少
        if(stepChangeRate > 0) //旧的值减去新的值大于0,则表示电流在衰减。
        {
            stepChangeDecayNumber1 = stepChangeRate>>altDecayScale;//快衰减的周期计算  
            if(stepChangeDecayNumber1>0)     //当然大于0,电流衰减
            {
                if(stepAmplitudeRef1temp == 0)     
                    stepChangeDecayNumber1 = 32767;//如果是衰减到0,也就是衰减的最后一梯,则尽快衰减
                decay1 = alternateDecay;        //因为是电流的下降,所以要用快衰减
                stepChangeDecayCounter1 = 1;    //衰减计数用来开始计,在ADC程序里面有用到此参数
            }    
        }   
        else                               //如果电流是爬升阶段。
        {
            stepChangeDecayNumber1 = 0;      
            decay1 = baseDecay;                //默认的电流衰减模式为慢衰减
        } 
        
        //下面计算第二轴,计算方法相同
        stepChangeRate = stepAmplitudeRef2*(1-2*setDir2)-stepAmplitudeRef2temp*(1-2*setDir2temp);
        if(stepChangeRate > 0)              
        {
            stepChangeDecayNumber2 = stepChangeRate>>altDecayScale;
            if(stepChangeDecayNumber2>0)
            {
                if(stepAmplitudeRef2temp == 0)
                    stepChangeDecayNumber2 = 32767;
                decay2 = alternateDecay;        
                stepChangeDecayCounter2 = 1;
            }    
        }
        else                          
        {
            stepChangeDecayNumber2 = 0;        
            decay2 = baseDecay;                 
        } 
    }
    else      //如没有设置为混合衰减,则默认为慢衰减        
    {
        decay1 = baseDecay; 
        decay2 = baseDecay;
    }      
 
#endif  //#ifdef BIPOLAR
 
//先关掉AD,先赋值完成再打开
IEC0bits.AD1IE = 0; //关AD
//把上面计算结果保存到全局变量
voltageOut1 = voltageOut1temp;
voltageOut2 = voltageOut2temp;
stepAmplitudeRef1 = stepAmplitudeRef1temp;
        stepAmplitudeRef2 = stepAmplitudeRef2temp;
//如果采用了PI控制模式,则不需要设定参考值和方向,如果是衰减模式,则把方向值赋值给全局变量。
    if(uGF.currentControlLoop == OFF)
    {
        setDir1=setDir1temp;
        setDir2=setDir2temp;
//并根据上面设置的值来计算衰减。此函数看后面的内容。
        CalcDecay();          
    }    
//再把AD打开。
IEC0bits.AD1IE = 1;
}
 

文章评论0条评论)

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