天天看点

梯形运动曲线

把运动分成加速、恒速、减速三部分,当输入运动的总脉冲数N,初速度V0,末速度V1,加速度a,目标速度V,

求出加减速过程中的最大速度:

N>=(2V_Max2-(V12-V0^2))/2a

转换得:

V_Max=sqrt(((V12+V02)-2a*N)/2)

然后比较目标速度V和系统能达到的最大速度V_Max的大小,若目标速度V大于最大速度,则目标速度V只能按最大速度V_Max运行,是^型运动,反之梯形运动

if(V<V_Max)

Vlim=V;

else

Vlim=V_Max;

分别计算匀加速、匀速、匀减速的时间和位移:

匀加速运动时间T1=(Vlim-V0)/a

匀加速位移量S1=V0T1+(a1T1^2)/2

恒速运动时间T2=(N-(Vlim2-V_Start2)/(2A_Max)-(V_End2-Vlim2)/2-A_Max)/Vlim; //(总脉冲数-加速量-减速量)/速度=t

恒速运动位移S2=Vlim*T2;

匀减速运动时间T3=(V1-Vlim)/-a;

匀减速运动位移量S3=V0T3+(a1T3^2)/2

总运动时间T=T1+T2+T3

于是求出各匀加速、匀减速、恒速阶段的瞬时的路程S,速度V,加速度A

for(t=0;t<=T; t++)//t表示某一时刻

{

if(t>=0&&t<T1)//加速阶段

{

S=V_Startt+A_Maxt^2/2;

V=V_Start+A_Maxt;

A=A_Max;

printf(“V=%d\r\n”,V);

fprintf(fpy,"%d",V);

fprintf(fpy,"\n");

}

else if(t>=T1&&t<T1+T2)//恒速阶段

{

S=S1+Vlim(t-T1);

V=Vlim;

A=0;

printf(“V=%d\r\n”,V);

fprintf(fpy,"%d",V);
fprintf(fpy,"\n");
  }
  else if(t>T1+T2&&t<=T)//减速速阶段
  {
	  S=S1+S2+Vlim*(t-T1-T2)-A_Max*pow(t-T1-T2,2)/2;
      V=Vlim-A_Max*(t-T1-T2);
	  A=-A_Max;
	  	printf("V=%d\r\n",V);
  	fprintf(fpy,"%d",V);
fprintf(fpy,"\n");
  }
           

下载源码请加嵌入式+C#上位机学习资源QQ群:257536638

继续阅读