2012-04-22 108 views
1

我正在爲我目前使用Arduino構建的機器人實施PID控制算法。如何通過另一個變量的相對值來確定一個變量?

我的問題更多地涉及到編程邏輯。

我必須計算一個變量,一個錯誤,int eps。這個eps會在-7到+7之間。

從機器人我獲得0〜7000

我的算法之間的雙重形式與值的輸入必須工作是這樣的:

if(input >= 500){ 
    if(input >= 1000){ 
      if(input >= 1500){ 
      .......... 
      } 
    }else{ 
      eps = 6; 
    } 
}else{ 
    eps = 7; 
} 

等等...

換句話說,我有一個值分配給由間隔輸入包括在將要確定的EPS。

我的問題是什麼將是MOS高效,節省時間和節約資源的方式?

我使用Arduino和他們自己的IDE,而不是Eclipse。

回答

3

如果7對應7000並且-7對應於0,並且epsilon的不同值之間的間隔相等(500),那麼您可以編寫eps = static_cast<int>(input/500.0) - 7。不確定Arduino中的靜態轉換 - 你只需要將值轉換爲較低的整數(floor)。

如果你有確定EPS的其他一些算法,請更清楚地說明它,我們將嘗試生產數學這個;)

+0

在Arduino中使用'static_cast'可以正常工作。 – 2012-04-22 17:54:43

+0

非常感謝您花時間回答!我會嘗試所有這些,看看哪個最好。我使用的是16MHz的Arduino,我需要從傳感器中取得非常快的樣本,所以每一位都有幫助 – Eugen 2012-04-22 18:09:41

+0

非常感謝!像魅力一樣工作! :D – Eugen 2012-04-23 17:57:53

3

Arduino的有一個地圖功能。 http://arduino.cc/en/Reference/map

所以你需要這樣的東西; eps = map(input,0,7000,-7,+7);

+0

'map'似乎表現出與明顯的手動映射相同的「問題」(即它不會將輸入值均勻分配到輸出)。當然,這可能是必需的功能,所以它不一定是一個bug ... – 2012-04-22 17:56:37

2

我想說的最快方法是:

switch (int(input)/500) 
{ 
case 0: ... // 0..500 
case 1: ... // 500..1000 
case 2: ... // 1000..1500 
etc 
} 
2

這不是從你的代碼示例你正在努力實現完全清楚,但假設你想均勻分佈的(0至7000)input到(-7到7)eps值,以便所有間隔均等表示,不能使用500的倍數。使用500將導致極值(-7或7)中的一個僅由input值的極小範圍。

你可以,例如,使用下面的函數來計算epsinput

int eps(double input) { 
    return ((int)(input/500.0)) - 7; 
} 

但是,使用此功能將產生以下映射這使得7的eps值比其他的少得多:

  input   | eps 
>= 0.0 and < 500.0 | -7 
>= 500.0 and < 1000.0 | -6 
>= 1000.0 and < 1500.0 | -5 
>= 1500.0 and < 2000.0 | -4 
>= 2000.0 and < 2500.0 | -3 
>= 2500.0 and < 3000.0 | -2 
>= 3000.0 and < 3500.0 | -1 
>= 3500.0 and < 4000.0 | 0 
>= 4000.0 and < 4500.0 | 1 
>= 4500.0 and < 5000.0 | 2 
>= 5000.0 and < 5500.0 | 3 
>= 5500.0 and < 6000.0 | 4 
>= 6000.0 and < 6500.0 | 5 
>= 6500.0 and < 7000.0 | 6 
>= 7000.0    | 7 

相反,如果你想均勻分佈,則需要使用下面的代碼:

int eps(double input) { 
    return ((int)(input/466.733333))-7; 
} 
相關問題