编辑代码

#include <stdio.h>

#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


#define yspeed50 1875
#define yspeed100 937	
#define yspeed150 625
#define yspeed200 469
#define yspeed250 375
#define yspeed300 312
#define yspeed350 268
#define yspeed400 234
#define yspeed450 208
#define yspeed500 188
//20档速度
//200ms 每一段10ms
const unsigned short xCurve[20][2]=
{
//speed,pulseNum
 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
};

unsigned short yCurve[10][2]=
{
 yspeed100,11,//11=10000/yspeed100
 yspeed150,11,//11=10000/yspeed150
 yspeed200,15,//15=10000/yspeed200
 yspeed250,18,//18=10000/yspeed250
 yspeed300,22,//22=10000/yspeed300
 yspeed350,26,//26=10000/yspeed350
 yspeed400,29,//29=10000/yspeed400
 yspeed450,33,//33=10000/yspeed450
 yspeed500,37,//37=10000/yspeed500
};

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;
    printf("pulseNumHalf: %u\n", pulseNumHalf);

    pulseNumTemp = 0;
    pulseNumTempLast = 0;
    printf("pulseNumTemp: %u, pulseNumTempLast: %u\n", pulseNumTemp, pulseNumTempLast);

    // 速度等级超限
    if (speedLevel > 19)
    {
        xIndexNum = 0;
        printf("speedLevel exceeds limit, xIndexNum: %u\n", xIndexNum);
        return;
    }

    if (pulseNum == 0)
    {
        xIndexNum = 0;
        printf("pulseNum is 0, xIndexNum: %u\n", xIndexNum);
        return;
    }

    // 如果总脉冲数为1
    else if (pulseNum == 1)
    {
        xMoveCurve[0][0] = xCurve[0][0];
        xMoveCurve[0][1] = pulseNum;
        xIndexNum = 1;
        printf("pulseNum is 1, xMoveCurve[0][0]: %u, xMoveCurve[0][1]: %u, xIndexNum: %u\n", xMoveCurve[0][0], xMoveCurve[0][1], xIndexNum);
        return;
    }

    // 如果总脉冲数超过1
    // 计算加速段
    for (i = 0; i < (speedLevel + 1); i++)
    {
        pulseNumTemp += xCurve[i][1];
        printf("acceleration segment, i: %u, pulseNumTemp: %u\n", i, pulseNumTemp);

        if (pulseNumTemp < pulseNumHalf)
        {
            xMoveCurve[i][0] = xCurve[i][0];
            xMoveCurve[i][1] = xCurve[i][1];
            printf("xMoveCurve[%u][0]: %u, xMoveCurve[%u][1]: %u\n", i, xMoveCurve[i][0], i, xMoveCurve[i][1]);
        }
        else
        {
            xMoveCurve[i][0] = xCurve[i][0];
            xMoveCurve[i][1] = pulseNumHalf - pulseNumTempLast;
            pulseNumTemp = pulseNumHalf;
            printf("xMoveCurve[%u][0]: %u, xMoveCurve[%u][1]: %u\n", i, xMoveCurve[i][0], i, xMoveCurve[i][1]);
            break;
        }
        pulseNumTempLast = pulseNumTemp;
        printf("pulseNumTempLast: %u\n", pulseNumTempLast);
    }

    accelPulseIndexNum = i;
    printf("accelPulseIndexNum: %u\n", accelPulseIndexNum);

    // 计算匀速段
    xMoveCurve[i][0] = xCurve[i - 1][0];
    xMoveCurve[i][1] = pulseNum - pulseNumTemp - pulseNumTemp;
    printf("uniform segment, xMoveCurve[%u][0]: %u, xMoveCurve[%u][1]: %u\n", i, xMoveCurve[i][0], i, xMoveCurve[i][1]);

    if (xMoveCurve[i][1] != 0)
    {
        i++;
        uniformPulseIndexNum = 1;
        printf("uniformPulseIndexNum: %u\n", uniformPulseIndexNum);
    }
    else
    {
        uniformPulseIndexNum = 0;
        printf("uniformPulseIndexNum: %u\n", uniformPulseIndexNum);
    }

    // 计算减速段 为加速段的镜像
    decelPulseIndexNum = accelPulseIndexNum;
    totalPulseIndexNum = accelPulseIndexNum + uniformPulseIndexNum + decelPulseIndexNum;
    printf("decelPulseIndexNum: %u, totalPulseIndexNum: %u\n", decelPulseIndexNum, totalPulseIndexNum);

    for (i; i < totalPulseIndexNum; i++)
    {
        xMoveCurve[i][0] = xMoveCurve[totalPulseIndexNum - i - 1][0];
        xMoveCurve[i][1] = xMoveCurve[totalPulseIndexNum - i - 1][1];
        printf("deceleration segment, xMoveCurve[%u][0]: %u, xMoveCurve[%u][1]: %u\n", i, xMoveCurve[i][0], i, xMoveCurve[i][1]);
    }

    xIndexNum = totalPulseIndexNum;
    printf("xIndexNum: %u\n", xIndexNum);
}




int main () {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
    printf("运行过程\n");
    xTCurveCal(3,330);
    printf("运行结果\n");
    printf("xIndexNum = %d;\n",xIndexNum);
    int i;
    for(i=0;i<41;i++)
    {
        printf("xMoveCurve[%d][0] = %d;\n",i,xMoveCurve[i][0]);
        printf("xMoveCurve[%d][1] = %d;\n",i,xMoveCurve[i][1]);
    }

    return 0;
}