Как определить одну переменную по относительным значениям другой?
Я реализую алгоритм 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
}