我正在研究运动控制器的原型,它将电机加速到最大速度,以最大速度滑行,然后在正确的位置开始减速,使电机停在目标位置。 / p>
每个时间步的理论位置将与来自正交编码器的反馈进行比较,产生的误差将受到PID回路的影响,其结果将使用PWM表示。
我目前有以下代码来确定每个时间步的理论位置:
Pos:=0;
Vel:=0;
Acc:=3;
Demand:=300;
Max_Vel:=19;
AccDist := (Max_vel/Acc * Max_vel) / 2;
DecelPoint := Demand - AccDist;
Writeln(AccDist:5:2);
Writeln(DecelPoint:5:2);
Writeln('ACCEL');
While Vel <> Max_vel
Do Begin
Pos := Pos + Vel + Acc/2;
Vel := Vel + Acc;
If Vel >= Max_Vel
Then Begin
Vel := Max_Vel;
Pos := AccDist
End;
Writeln('Position:',Pos:5:2);
End;
Writeln('FLAT');
While Pos < DecelPoint
Do Begin
Pos := Pos + Vel;
Writeln('Position:',Pos:5:2);
End;
Error := Pos - DecelPoint;
Writeln('DECEL');
While Vel > 0
Do Begin
If Error > 0
Then Begin
Pos := Pos - Error;
Error := 0;
End;
Pos := Pos + Vel - Acc/2;
Vel := Vel - Acc;
If Vel <= 0
Then Pos := Demand;
Writeln('Position:',Pos:5:2);
End;
end.
此代码似乎给出了近似结果,但我确实需要确切的结果。加速和平坦部分似乎产生了精确的结果,但是当我们来到减速区时,事情开始表现得很奇怪。
我哪里出错?
答案 0 :(得分:3)
我认为有两个问题。
问题1:您正在显示位置列表,但不显示车辆到达这些位置的时间。如果假设加速度,速度,位置等都是m / s ^ 2,m / s和m,那么当车辆在加速度之间转换时,数据与1秒间隔除外一致滑行(或滑行和减速)。如果我为速度和时间添加列,那么输出数据将如下所示:
60,17
239.83
ACCEL
Position: 1.50 Velocity: 3.00 Time:1.00
Position: 6.00 Velocity: 6.00 Time:2.00
Position:13.50 Velocity: 9.00 Time:3.00
Position:24.00 Velocity:12.00 Time:4.00
Position:37.50 Velocity:15.00 Time:5.00
Position:54.00 Velocity:18.00 Time:6.00
Position:60.17 Velocity:19.00 Time:6.33 ...vehicle stops accelerating at this point
FLAT
Position:79.17 Velocity:19.00 Time:7.33
Position:98.17 Velocity:19.00 Time:8.33
...
你可以看到,在54.00米处的6秒测量点之后,车辆停止加速的实际时间仅为0.33秒(而不是一整秒)。
当车辆到达减速点时会出现同样的问题(我估计应该在大约T = 15.79秒(即停止加速后的9.46秒)发生。
问题2 第二个问题是你在FLAT期间之前写了位置你检查车辆是否应该开始减速。
While Pos < DecelPoint
Do Begin
Pos := Pos + Vel;
Writeln('Position:',Pos:5:2);
End;
上面的代码可以增加超过减速点的位置,并输出一个错误的数据点,然后再纠正&#39;它以后。你的程序会输出:
...
Position:231.17
Position:250.17
DECEL
Position:257.33
...
但DECEL之前的最后位置不正确,因为车辆在达到239.83米时已经开始减速。