把运动分成加速、恒速、减速三部分,当输入运动的总脉冲数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