我正在製作一個運動控制器的原型,它將電機加速到最大速度,以最大速度滑行,然後在正確的位置開始減速以停止電機在目標位置。生成梯形運動輪廓的位置設定點
每個時間步的理論位置將與正交編碼器的反饋進行比較,得到的誤差將經歷一個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.
此代碼似乎給出近似的結果,但我真的需要確切的結果。加速和平坦部分看起來能夠產生確切的結果,但是當我們來到減速部分時,事情開始出現奇怪的表現。
我哪裏出錯了?
奇怪的表現方式是什麼?你有一個例子嗎?你使用什麼編譯器? – nepb
我正在使用在線Pascal編譯器。不是很好,我知道。這裏是該項目的鏈接:https://ideone.com/QGJH0F 嘗試運行它並查看輸出。你會看到他們不是他們應該的。 –