Алгоритм для числового отображения Base-10 - минимальные изменения за обновление - PullRequest
1 голос
/ 13 мая 2009

Краткое описание:

Я ищу алгоритм для отображения четырехзначного сигнала скорости таким образом, чтобы минимальное количество (десятичных) цифр менялось при каждом обновлении дисплея.

Например:

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).


Предложение:

Я бы хотел, чтобы дисплей работал так, как показано в примере:

  1. Отображение обновляется дважды в секунду
  2. Переход из одного устойчивого состояния в другое не должен занимать более 2 секунд.
  3. Если входной сигнал выше отображаемого в данный момент значения, отображаемый сигнал должен увеличиться, но он никогда не должен превышать значение входного сигнала.
  4. Если входной сигнал ниже текущего отображаемого значения, отображаемый сигнал должен уменьшиться, но он никогда не должен опускаться ниже значения входного сигнала.
  5. Минимальное количество цифр должно быть изменено за обновление (желательно только одна цифра)
  6. Сначала необходимо изменить цифры старшего разряда, чтобы как можно быстрее уменьшить разницу между сигналом дисплея и входным сигналом.

Можете ли вы придумать или вам известен алгоритм, который будет выводить «правильное» четырехзначное десятичное число в соответствии с вышеуказанными правилами?

Прототип функции в псевдокоде будет выглядеть примерно так:

int GetDisplayValue(int currentDisplayValue, int inputSignal)
{
    //..
}

Извините за стену текста. Я хотел задокументировать мои успехи на сегодняшний день, чтобы любой, отвечающий на этот вопрос, избегал того, что я уже прошел.

Ответы [ 4 ]

1 голос
/ 15 мая 2009

Если вам не нужны данные, выраженные 4-й цифрой, и строго привязаны к 4-значному дисплею, рассматривали ли вы вопрос об использовании 4-й цифры в качестве индикатора увеличения / уменьшения? Вспышка некоторой части вершины или нижней части нуля при 2 Гц *, чтобы указать, что следующее изменение датчика будет увеличение или уменьшение.

Я думаю, вы могли бы также сделать хорошую модель реакции вашего устройства, какой бы она ни была, на настройки и использовать эту модель для экстраполяции целевого числа на основе первой половины секунды двухсекундного процесса стабилизации .

* это предполагает, что у вас есть два обновления в секунду, которые вы установили. Большинство 4-разрядных дисплеев мультиплексированы, так что вы, вероятно, могли бы мигать на гораздо более высокой частоте с небольшой настройкой драйвера.

0 голосов
/ 14 мая 2009

Это деликатный вопрос, и мой ответ не охватывает алгоритмический аспект.

Я считаю, что поведение, которое вы представляете в таблице в начале публикации, является очень плохой идеей. Строки 2 и 5 отображают точки данных, которые есть и никогда не были в данных, то есть неверные данные, для удобства пользователей. Это может быть плохим выбором в области работы машины.

Более низкая частота обновления может «ощущаться вялой», но она четко определена (только «реальные» данные и не более n миллисекунд). Более высокая частота обновления будет отображать много промежуточных значений, но наиболее значимые цифры не должны быстро меняться. И то, и другое проще проверить, чем любое довольно ложное генерирование значения.

0 голосов
/ 14 мая 2009

Это будет более или менее медленно включать значение датчика в отображаемое значение:

display = ( K * sensor + (256 - K) * display ) >> 8

Выберите K между 0 (отображение никогда не обновляется) и 256 (отображение всегда равно датчику).

0 голосов
/ 14 мая 2009

Я думаю, что ваше предложение изменить одну цифру за раз странно, потому что оно фактически предоставляет пользователю дезинформацию ... что я бы посоветовал на самом деле добавить БОЛЬШЕ БОЛЬШЕ изменений состояния и реализовать его так, чтобы всякий раз, когда сигнал изменения, они измеряют движение к новому значению с шагом в один. Это обеспечило бы аналоговую шкалу опыта и «анимацию» изменений; оператор очень скоро осознает, что цифры, вращающиеся в последовательности 0,1,2 ... означают увеличение скорости и 9,8,7, ... уменьшение скорости.

например:.

Filtered signal      Display
0000                 0000
2345                 0001
                     0002
                     ...
                     2345

Гистерезис, который вы реализовали, конечно, очень хорош для стабильного состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...