#define speed2mmps 50000
#define speed4mmps 25000
#define speed6mmps 16667
#define speed8mmps 12500
#define speed10mmps 10000
#define speed12mmps 8333
#define speed14mmps 7143
#define speed16mmps 6250
#define speed18mmps 5556
#define speed20mmps 5000
#define speed30mmps 3333
#define speed32mmps 3125
#define speed40mmps 2500
#define speed50mmps 2000
#define speed60mmps 1667
#define speed64mmps 1562
#define speed70mmps 1428
#define speed80mmps 1250
#define speed90mmps 1111
#define speed100mmps 1000
#define speed120mmps 833
#define speed128mmps 781
#define speed140mmps 714
#define speed150mmps 682
#define speed160mmps 625
#define speed180mmps 556
#define speed200mmps 500
#define speed240mmps 417
#define speed250mmps 400
#define speed256mmps 390
#define speed280mmps 357
#define speed300mmps 333
#define speed320mmps 313
#define speed350mmps 286
#define speed360mmps 273
#define speed400mmps 250
#define speed440mmps 228
#define speed450mmps 222
#define speed480mmps 208
#define speed500mmps 200
#define speed512mmps 195
#define speed520mmps 190
#define speed560mmps 178
#define speed600mmps 167
#define speed640mmps 156
#define speed680mmps 147
#define speed720mmps 140
#define speed760mmps 133
#define speed800mmps 125
const unsigned short xCurve[20][2]=
{
speed40mmps,2,
speed80mmps,4,
speed120mmps,6,
speed160mmps,8,
speed200mmps,10,
speed240mmps,12,
speed280mmps,14,
speed320mmps,16,
speed360mmps,18,
speed400mmps,20,
speed440mmps,22,
speed480mmps,24,
speed520mmps,26,
speed560mmps,28,
speed600mmps,30,
speed640mmps,32,
speed680mmps,34,
speed720mmps,36,
speed760mmps,38,
speed800mmps,40,
};
unsigned short yCurve[20][2]=
{
speed40mmps,2,
speed80mmps,4,
speed120mmps,6,
speed160mmps,8,
speed200mmps,10,
speed240mmps,12,
speed280mmps,14,
speed320mmps,16,
speed360mmps,18,
speed400mmps,20,
speed440mmps,22,
speed480mmps,24,
speed520mmps,26,
speed560mmps,28,
speed600mmps,30,
speed640mmps,32,
speed680mmps,34,
speed720mmps,36,
speed760mmps,38,
speed800mmps,40,
};
unsigned short xIndexNum;
unsigned char xDir3rd;
unsigned short xMoveCurve[41][2];
void xTCurveCal(short targetPosition,unsigned char speedLevel)
{
unsigned char i;
unsigned short pulseNum;
unsigned short pulseNumTemp;
unsigned short pulseNumTempLast;
unsigned short pulseNumHalf;
unsigned char accelPulseIndexNum;
unsigned char uniformPulseIndexNum;
unsigned char decelPulseIndexNum;
unsigned char totalPulseIndexNum;
if(targetPosition < 0)
{
xDir3rd = 0;
pulseNum = -targetPosition;
}
else
{
xDir3rd = 1;
pulseNum = targetPosition;
}
pulseNumHalf = pulseNum/2;
pulseNumTemp = 0;
pulseNumTempLast = 0;
for(i=0;i<41;i++)
{
xMoveCurve[i][0] = 0;
xMoveCurve[i][1] = 0;
}
if(speedLevel > 19)
{
xIndexNum = 0;
return ;
}
if(pulseNum == 0)
{
xIndexNum = 0;
return ;
}
else if(pulseNum == 1)
{
xMoveCurve[0][0] = xCurve[0][0];
xMoveCurve[0][1] = pulseNum;
xIndexNum = 1;
return;
}
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;
}
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;
}
unsigned short yIndexNum;
unsigned char yDir3rd;
unsigned short yMoveCurve[41][2];
void yTCurveCal(short targetPosition,unsigned char speedLevel)
{
unsigned char i;
unsigned short pulseNum;
unsigned short pulseNumTemp;
unsigned short pulseNumTempLast;
unsigned short pulseNumHalf;
unsigned char accelPulseIndexNum;
unsigned char uniformPulseIndexNum;
unsigned char decelPulseIndexNum;
unsigned char totalPulseIndexNum;
if(targetPosition < 0)
{
yDir3rd = 0;
pulseNum = -targetPosition;
}
else
{
yDir3rd = 1;
pulseNum = targetPosition;
}
pulseNumHalf = pulseNum / 2;
pulseNumTemp = 0;
pulseNumTempLast = 0;
for(i=0;i<41;i++)
{
yMoveCurve[i][0] = 0;
yMoveCurve[i][1] = 0;
}
if (speedLevel > 19)
{
yIndexNum = 0;
return;
}
if (pulseNum == 0)
{
yIndexNum = 0;
return;
}
else if (pulseNum == 1)
{
yMoveCurve[0][0] = yCurve[0][0];
yMoveCurve[0][1] = pulseNum;
yIndexNum = 1;
return;
}
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;
}
#include <stdio.h>
void xyTCurveSync()
{
unsigned char i;
int xTime = 0;
int yTime = 0;
float ratio;
unsigned int temp;
printf("temp: %d\n", temp);
for(i=0;i<41;i++)
{
xTime += xMoveCurve[i][0]*xMoveCurve[i][1];
yTime += yMoveCurve[i][0]*yMoveCurve[i][1];
}
printf("xtime: %d, ytime: %d\n", xTime, yTime);
if(xTime > yTime)
{
if(yTime != 0)
{
ratio = (float)xTime / yTime;
for(i=0;i<41;i++)
{
temp = yMoveCurve[i][0] * ratio;
printf("temp: %d\n", temp);
yMoveCurve[i][0] = (temp > 65535) ? 65535 : temp;
}
}
}
else if(yTime > xTime)
{
if(xTime != 0)
{
for(i=0;i<41;i++)
{
ratio = (float)yTime / xTime;
for(i=0;i<41;i++)
{
temp = xMoveCurve[i][0] * ratio;
printf("temp: %d\n", temp);
xMoveCurve[i][0] = (temp > 65535) ? 65535 : temp;
}
}
}
}
}
int main() {
short targetPositionX = 1;
unsigned char speedLevelX = 10;
xTCurveCal(targetPositionX, speedLevelX);
printf("xMoveCurve:\n");
for (unsigned char i = 0; i < xIndexNum; i++) {
printf("Speed: %d, Pulse: %d\n", xMoveCurve[i][0], xMoveCurve[i][1]);
}
short targetPositionY = 30000;
unsigned char speedLevelY = 15;
yTCurveCal(targetPositionY, speedLevelY);
printf("yMoveCurve:\n");
for (unsigned char i = 0; i < yIndexNum; i++) {
printf("Speed: %d, Pulse: %d\n", yMoveCurve[i][0], yMoveCurve[i][1]);
}
xyTCurveSync();
printf("Synchronized xMoveCurve:\n");
for (unsigned char i = 0; i < xIndexNum; i++) {
printf("Speed: %d, Pulse: %d\n", xMoveCurve[i][0], xMoveCurve[i][1]);
}
printf("Synchronized yMoveCurve:\n");
for (unsigned char i = 0; i < yIndexNum; i++) {
printf("Speed: %d, Pulse: %d\n", yMoveCurve[i][0], yMoveCurve[i][1]);
}
xyTCurveSync();
return 0;
}