/******************************************************************************
* 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条评论)
登录后参与讨论