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 分配一个值,该值将由输入包含在哪个间隔中确定。

我的问题是什么是最有效、最节省时间和最节省资源的方式?

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

4

4 回答 4

3

如果 7 对应于 7000,-7 对应于 0,并且不同 epsilon 值之间的间隔相等(500),那么您可以编写eps = static_cast<int>(input/500.0) - 7. 不确定 Arduino 中的静态转换 - 您只需将值四舍五入到较低的整数(下限)。

如果您有其他确定 eps 的算法,请更清楚地说明,我们将尝试为此产生数学;)

于 2012-04-22T14:10:15.347 回答
3

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

所以你需要这样的东西;每股收益 = 地图(输入,0、7000、-7、+7);

于 2012-04-22T17:36:41.367 回答
2

我会说最快的方法是:

switch (int(input) /  500)
{
case 0: ... // 0..500
case 1: ... // 500..1000
case 2: ... // 1000..1500
etc
}
于 2012-04-22T17:40:31.050 回答
2

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

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

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

但是,使用此函数会生成以下映射,这使得eps7 的值比其他所有值都少得多:

         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;
}
于 2012-04-22T17:44:06.697 回答