Краткое описание:
Я ищу алгоритм для отображения четырехзначного сигнала скорости таким образом, чтобы минимальное количество (десятичных) цифр менялось при каждом обновлении дисплея.
Например:
Filtered
Signal Display
--------------------
0000 0000
2345 2000
2345 2300
2345 2340
0190 0340
0190 0190
0190 0190
Подробности:
Я работаю над проектом, в котором мне нужно отобразить сигнал скорости (от 0 до 3000 об / мин) на четырехзначном ЖК-дисплее. Идеальным решением для дисплея был бы аналоговый датчик, но я застрял с цифровым дисплеем. Оператор станка будет читать дисплей, и мне бы хотелось, чтобы он был как можно более приятным для чтения.
Оператор на самом деле не заботится о точном значении сигнала. Он захочет узнать, каково значение (с точностью до 10 оборотов в минуту), и он захочет, чтобы оно увеличивалось и уменьшалось в ответ на изменения в работе машины. Он не захочет увидеть, как он прыгает повсюду.
Вот что я сделал до сих пор:
- Округлите число до ближайших 10 об / мин, чтобы последняя цифра всегда читалась как 0
- Отфильтруйте сигнал так, чтобы электрический шум и нормальные колебания датчика не вызывали скачок показаний более чем на 10 об / мин за раз.
- Добавлен гистерезис +/- 10 об / мин к сигналу, чтобы избежать случаев, когда он будет колебаться при одном и том же значении (например: 990 - 1000)
Это хорошо очистило, когда сигнал устойчивый (около 75% времени), но Я все еще вижу много ненужных изменений в сигнале, когда он движется из одного устойчивого состояния в другое . Когда сигнал изменяется от 100 об / мин до 1000 об / мин (например), он проходит через множество цифр по пути. Поскольку для того, чтобы действительно прочитать и понять число, требуется время, кажется, что нет смысла попадать во все эти промежуточные состояния. Я попытался просто уменьшить частоту обновления дисплея, но это не дало удовлетворительных результатов. Это заставляло дисплей «чувствовать себя» вялым и взволнованным одновременно. Перед изменениями чисел произойдет заметная задержка, а затем они начнут совершать большие скачки (100, 340, 620, 980, 1000).
Предложение:
Я бы хотел, чтобы дисплей работал так, как показано в примере:
- Отображение обновляется дважды в секунду
- Переход из одного устойчивого состояния в другое не должен занимать более 2 секунд.
- Если входной сигнал выше отображаемого в данный момент значения, отображаемый сигнал должен увеличиться, но он никогда не должен превышать значение входного сигнала.
- Если входной сигнал ниже текущего отображаемого значения, отображаемый сигнал должен уменьшиться, но он никогда не должен опускаться ниже значения входного сигнала.
- Минимальное количество цифр должно быть изменено за обновление (желательно только одна цифра)
- Сначала необходимо изменить цифры старшего разряда, чтобы как можно быстрее уменьшить разницу между сигналом дисплея и входным сигналом.
Можете ли вы придумать или вам известен алгоритм, который будет выводить «правильное» четырехзначное десятичное число в соответствии с вышеуказанными правилами?
Прототип функции в псевдокоде будет выглядеть примерно так:
int GetDisplayValue(int currentDisplayValue, int inputSignal)
{
//..
}
Извините за стену текста. Я хотел задокументировать мои успехи на сегодняшний день, чтобы любой, отвечающий на этот вопрос, избегал того, что я уже прошел.