Как определить одну переменную по относительным значениям другой?

Я реализую алгоритм PID-контроля для робота, который я сейчас создаю с использованием Arduino.

Мой вопрос больше связан с логикой программирования.

Я должен вычислить переменную, ошибку, 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 ответа

Решение

Если 7 соответствует 7000 и -7 соответствует 0, а интервалы между различными значениями эпсилона равны (500), то вы можете написать eps = static_cast<int>(input/500.0) - 7, Не уверен насчет статических приведений в Arduino - вам просто нужно округлить значение до нижнего целого (этажа).

Если у вас есть какой-то другой алгоритм определения eps, изложите его более четко, мы постараемся подготовить для этого математику;)

Arduino имеет функцию карты. http://arduino.cc/en/Reference/map

Итак, вам нужно что-то вроде этого; eps = карта (ввод, 0, 7000, -7, +7);

Из вашего примера кода не совсем ясно, чего вы пытаетесь достичь, но при условии, что вы хотите равномерно распределить свои (от 0 до 7000) input до (от -7 до 7) eps значения, чтобы все интервалы были представлены одинаково, вы не можете использовать кратные 500. Использование 500 с приведет к тому, что одно из крайних значений (-7 или 7) будет получено только из очень небольшого диапазона input ценности.

Вы можете, например, использовать следующую функцию для расчета eps от input:

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

Тем не менее, использование этой функции производит следующее отображение, которое делает eps значение 7 намного реже всех остальных:

         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;
}

Я бы сказал, что самый быстрый способ это:

switch (int(input) /  500)
{
case 0: ... // 0..500
case 1: ... // 500..1000
case 2: ... // 1000..1500
etc
}
Другие вопросы по тегам