我正在使用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。
答案 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;
}