如何通过另一个变量的相对值确定一个变量?

时间:2012-04-22 14:02:14

标签: c++ arduino epsilon

我正在使用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分配一个值,该值将由输入所包含的间隔确定。

我的问题是,这样做最有效,省时省力的方法是什么?

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

4 个答案:

答案 0 :(得分:3)

如果7对应于7000且-7对应于0,并且epsilon的不同值之间的间隔相等(500),则可以写eps = static_cast<int>(input/500.0) - 7。不确定Arduino中的静态强制转换 - 你只需要将值舍入到较低的整数(floor)。

如果您有其他确定eps的算法,请说清楚,我们会尝试为此制作数学;)

答案 1 :(得分:3)

arduino有一个地图功能。 http://arduino.cc/en/Reference/map

所以你需要这样的东西; eps = map(输入,0,7000,-7,+ 7);

答案 2 :(得分:2)

我想说最快的方法是:

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

答案 3 :(得分:2)

您的代码示例中并未完全清楚您要实现的目标,但假设您希望将(0到7000)input均匀分布到(-7到7)eps为了使所有间隔均等,您不能使用500的倍数。使用500将导致极值之一(-7或7)仅由非常小范围的input值产生。

例如,您可以使用以下函数从eps计算input

int eps(double input) {
  return ((int)(input/500.0)) - 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;
}