编辑代码

//23档速度
#define xspeed50 2728	//2.7ms
#define xspeed75 2046
#define xspeed100 1364
#define xspeed125 1136
#define xspeed150 909
#define xspeed175 796
#define xspeed200 682
#define xspeed225 614
#define xspeed250 546
#define xspeed275 500
#define xspeed300 455
#define xspeed325 423
#define xspeed350 390
#define xspeed375 366
#define xspeed400 341
#define xspeed425 322
#define xspeed450 303
#define xspeed475 288
#define xspeed500 273
#define xspeed525 261
#define xspeed550 248
#define xspeed575 238
#define xspeed600 228

//23档速度
#define yspeed50 1875
#define yspeed75 1250
#define yspeed100 937
#define yspeed125 781	
#define yspeed150 625
#define yspeed175 547
#define yspeed200 469
#define yspeed225 422
#define yspeed250 375
#define yspeed275 343
#define yspeed300 312
#define yspeed325 290
#define yspeed350 268
#define yspeed375 251
#define yspeed400 234
#define yspeed425 221
#define yspeed450 208
#define yspeed475 198
#define yspeed500 188
#define yspeed525 179
#define yspeed550 170
#define yspeed575 163
#define yspeed600 156
//预设加速曲线
//23档速度
//200ms 每一段10ms
const unsigned short xCurve[23][2]=
{
//speed,pulseNum
 xspeed50,4,//4=10000/xspeed50
 xspeed75,5,//5=10000/xspeed75
 xspeed100,7,//7=10000/xspeed100
 xspeed125,9,//9=10000/xspeed125
 xspeed150,11,//11=10000/xspeed150
 xspeed175,13,//13=10000/xspeed175
 xspeed200,15,//15=10000/xspeed200
 xspeed225,16,//16=10000/xspeed225
 xspeed250,18,//18=10000/xspeed250
 xspeed275,20,//20=10000/xspeed275
 xspeed300,22,//22=10000/xspeed300
 xspeed325,24,//24=10000/xspeed325
 xspeed350,26,//26=10000/xspeed350
 xspeed375,28,//28=10000/xspeed375
 xspeed400,29,//29=10000/xspeed400
 xspeed425,31,//31=10000/xspeed425
 xspeed450,33,//33=10000/xspeed450
 xspeed475,35,//35=10000/xspeed475
 xspeed500,37,//37=10000/xspeed500
 xspeed525,39,//39=10000/xspeed525
 xspeed550,40,//40=10000/xspeed550
 xspeed575,42,//42=10000/xspeed575
 xspeed600,44,//44=10000/xspeed600
};

unsigned short yCurve[23][2]=
{
 yspeed50,5,//4=10000/yspeed50
 yspeed75,8,//5=10000/yspeed75
 yspeed100,11,//11=10000/yspeed100
 yspeed125,13,//14=10000/yspeed125
 yspeed150,16,//11=10000/yspeed150
 yspeed175,18,//13=10000/yspeed175
 yspeed200,21,//15=10000/yspeed200
 yspeed225,24,//16=10000/yspeed225
 yspeed250,27,//18=10000/yspeed250
 yspeed275,29,//20=10000/yspeed275
 yspeed300,32,//22=10000/yspeed300
 yspeed325,34,//24=10000/yspeed325
 yspeed350,37,//26=10000/yspeed350
 yspeed375,40,//28=10000/yspeed375
 yspeed400,43,//29=10000/yspeed400
 yspeed425,45,//31=10000/yspeed425
 yspeed450,48,//33=10000/yspeed450
 yspeed475,51,//35=10000/yspeed475
 yspeed500,53,//37=10000/yspeed500
 yspeed525,56,//39=10000/yspeed525
 yspeed550,59,//40=10000/yspeed550
 yspeed575,61,//42=10000/yspeed575
 yspeed600,64,//44=10000/yspeed600
};

unsigned short xIndexNum;
unsigned short xMoveCurve[41][2];

//查表法 T型加速
//速度档位
void xTCurveCal(unsigned char speedLevel,unsigned short pulseNum)
{
	unsigned char i;
	unsigned short pulseNumTemp;
	unsigned short pulseNumTempLast;
	unsigned short pulseNumHalf;
	unsigned char accelPulseIndexNum;
	unsigned char uniformPulseIndexNum;
	unsigned char decelPulseIndexNum;
	unsigned char totalPulseIndexNum;
	pulseNumHalf = pulseNum/2;
	pulseNumTemp = 0;
	pulseNumTempLast = 0;
    for(i=0;i<41;i++)
	{
		xMoveCurve[i][0] = 0;
		xMoveCurve[i][1] = 0;		
	}
	//速度等级超限
	if(speedLevel > 22)
	{
		xIndexNum = 0;
		return ;
	}
    //如果总脉冲数为0
	if(pulseNum == 0)
	{
		xIndexNum = 0;
		return ;
	}
	//如果总脉冲数为1	
	else if(pulseNum == 1)
	{
		xMoveCurve[0][0] = xCurve[0][0];
		xMoveCurve[0][1] = pulseNum;
		xIndexNum = 1;
		return;
	}
	//如果总脉冲数超过1
	// 计算加速段
	for(i=0;i<(speedLevel+1);i++)
	{
		pulseNumTemp += xCurve[i][1];
		if(pulseNumTemp < pulseNumHalf)
		{
			xMoveCurve[i][0] = xCurve[i][0];
			xMoveCurve[i][1] = xCurve[i][1];
		}
		else
		{
			xMoveCurve[i][0] = xCurve[i][0];	
			xMoveCurve[i][1] = pulseNumHalf - pulseNumTempLast;
			pulseNumTemp = pulseNumHalf;
            i++;
			break;
		}
		pulseNumTempLast = pulseNumTemp;
	}
	accelPulseIndexNum = i;
	// 计算匀速段
	xMoveCurve[i][0] = xCurve[i-1][0];
	xMoveCurve[i][1] = pulseNum - pulseNumTemp - pulseNumTemp;
	if(xMoveCurve[i][1] != 0)
	{
		i++;
		uniformPulseIndexNum = 1;
	}
	else
	{
		uniformPulseIndexNum = 0;
	}

	//假如加速段ACCelPulseIndexNum为4
	//匀速段为1
	//则总共为4+1+4=9段

	//假如加速段ACCelPulseIndexNum为4
	//匀速段为0
	//则总共为4+0+4=8段

	// 计算减速段 为加速段的镜像
	decelPulseIndexNum = accelPulseIndexNum;
	totalPulseIndexNum = accelPulseIndexNum + uniformPulseIndexNum + decelPulseIndexNum;
	for(;i<totalPulseIndexNum;i++)
	{
		xMoveCurve[i][0] = xMoveCurve[totalPulseIndexNum-i-1][0];
		xMoveCurve[i][1] = xMoveCurve[totalPulseIndexNum-i-1][1];
	}
	

	xIndexNum = totalPulseIndexNum;
     for (i = 0; i < 41; i++) {
        printf("xMoveCurve[%d][0] = %d, xMoveCurve[%d][1] = %d\n", i, xMoveCurve[i][0], i, xMoveCurve[i][1]);
    }
    printf("xIndexNum = %d\n", xIndexNum); 
}


unsigned short yIndexNum;
unsigned short yMoveCurve[41][2];

// 查表法 T 型加速
// 速度档位
void yTCurveCal(unsigned char speedLevel, unsigned short pulseNum)
{
    unsigned char i;
    unsigned short pulseNumTemp;
    unsigned short pulseNumTempLast;
    unsigned short pulseNumHalf;
    unsigned char accelPulseIndexNum;
    unsigned char uniformPulseIndexNum;
    unsigned char decelPulseIndexNum;
    unsigned char totalPulseIndexNum;
    pulseNumHalf = pulseNum / 2;
    pulseNumTemp = 0;
    pulseNumTempLast = 0;
    for(i=0;i<41;i++)
	{
		yMoveCurve[i][0] = 0;
		yMoveCurve[i][1] = 0;		
	}   
    // 速度等级超限
    if (speedLevel > 22)
    {
        yIndexNum = 0;
        return;
    }
    if (pulseNum == 0)
    {
        yIndexNum = 0;
        return;
    }
    // 如果总脉冲数为 1
    else if (pulseNum == 1)
    {
        yMoveCurve[0][0] = yCurve[0][0];
        yMoveCurve[0][1] = pulseNum;
        yIndexNum = 1;
        return;
    }
    // 如果总脉冲数超过 1
    // 计算加速段
    for (i = 0; i < (speedLevel + 1); i++)
    {
        pulseNumTemp += yCurve[i][1];
        if (pulseNumTemp < pulseNumHalf)
        {
            yMoveCurve[i][0] = yCurve[i][0];
            yMoveCurve[i][1] = yCurve[i][1];
        }
        else
        {
            yMoveCurve[i][0] = yCurve[i][0];
            yMoveCurve[i][1] = pulseNumHalf - pulseNumTempLast;
            pulseNumTemp = pulseNumHalf;
            i++;
            break;
        }
        pulseNumTempLast = pulseNumTemp;
    }
    accelPulseIndexNum = i;
    // 计算匀速段
    yMoveCurve[i][0] = yCurve[i - 1][0];
    yMoveCurve[i][1] = pulseNum - pulseNumTemp - pulseNumTemp;
    if (yMoveCurve[i][1] != 0)
    {
        i++;
        uniformPulseIndexNum = 1;
    }
    else
    {
        uniformPulseIndexNum = 0;
    }

    // 计算减速段 为加速段的镜像
    decelPulseIndexNum = accelPulseIndexNum;
    totalPulseIndexNum = accelPulseIndexNum + uniformPulseIndexNum + decelPulseIndexNum;
    for (; i < totalPulseIndexNum; i++)
    {
        yMoveCurve[i][0] = yMoveCurve[totalPulseIndexNum - i - 1][0];
        yMoveCurve[i][1] = yMoveCurve[totalPulseIndexNum - i - 1][1];
    }
    yIndexNum = totalPulseIndexNum;
     for (i = 0; i < 41; i++) {
        printf("yMoveCurve[%d][0] = %d, yMoveCurve[%d][1] = %d\n", i, yMoveCurve[i][0], i, yMoveCurve[i][1]);
    }
    printf("yIndexNum = %d\n", yIndexNum); 
}

   




#include <stdio.h>

int main() {
    unsigned char xspeedLevel = 19; // 设置速度档位
    unsigned short xpulseNum = 800; // 设置脉冲数
    unsigned char yspeedLevel = 19; // 设置速度档位
    unsigned short ypulseNum = 800; // 设置脉冲数
    xTCurveCal(xspeedLevel, xpulseNum); // 调用xTCurveCal函数
   yTCurveCal(yspeedLevel, ypulseNum); // 调用yTCurveCal函数

    return 0;
}