2015-07-21 51 views
1

我正在製作一個運動控制器的原型,它將電機加速到最大速度,以最大速度滑行,然後在正確的位置開始減速以停止電機在目標位置。生成梯形運動輪廓的位置設定點

每個時間步的理論位置將與正交編碼器的反饋進行比較,得到的誤差將經歷一個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

奇怪的表現方式是什麼?你有一個例子嗎?你使用什麼編譯器? – nepb

+0

我正在使用在線Pascal編譯器。不是很好,我知道。這裏是該項目的鏈接:https://ideone.com/QGJH0F 嘗試運行它並查看輸出。你會看到他們不是他們應該的。 –

回答

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 

...

你可以看到,當車輛停止加速的實際時間只有0.33秒(而不是在位置54.00米處的6秒測量點之後)。當車輛到達減速點(我估計應該發生在大約T =15.79秒將發生

同樣的問題(即9.46秒它停止加速之後)。

問題2第二個問題是,你在平淡期您檢查之前,如果車輛已經開始減速寫的位置。

While Pos < DecelPoint 
    Do Begin 
    Pos := Pos + Vel; 
    Writeln('Position:',Pos:5:2); 
    End; 

你上面的代碼可以增加近減速點輸出的位置一個錯誤的數據點在它稍後「糾正」之前。你的程序將輸出:

... 
Position:231.17 
Position:250.17 
DECEL 
Position:257.33 
... 

但DECEL之前的最後一個位置是不正確的車輛就已經開始,當它到達239.83米減速。

+0

關於「問題1」,我相信這是通過在Pos時間開始FLAT部分時將AccDist分配給Pos來糾正的。即當速度> = Max_Vel –

+0

有什麼機會可以對代碼進行必要的修改?我真的很努力... –

+0

對不起現在工作壓力太大。 – Penguino