//下面处理在整步的时候共振的消除,这里只是根据
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条评论)
登录后参与讨论