2012-04-22 81 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; 
} 
相关问题