#алгоритм #любой_язык
Программа получает данные с датчика, измеряющего напряжение в вольтах. Приходят целые значения в вольтах. Т.е. если на вход подать 1.9в, на выходе получаем значение 1. А если на вход подать 2в, то получаем уже два. Датчик имеет собственный шум (+/- 0.1 вольт) который складывается с измеряемым значением. Это создает проблемы при входном напряжении, которое находится рядом с целыми значениями. К примеру, если входное напряжение равно 2в, то в реальности будут замерены напряжения 1.9..2.1 (добавляются шумы), и показания будут скакать между 1 и 2. (хотя и ожидается постоянное 2). На рисунке синяя линия - вариант, когда входной сигнал далеко от границ целых значений, и шум (неровность линии), не меняет результат. Красная линия - вариант, когда входной сигнал на границе. Конечному пользователю необходимо показать постоянное, не меняющееся значение. Что было сделано: усреднение значения за несколько замеров, не помогает, т.к. усредненное значение также пляшет то в одну то в другую сторону изменение конечного показания только при изменении входного больше чем на единицу, помогает, то теряется точность и добавляется "люфт" Какие ещё есть варианты решения, как вообще называются подобные проблемы перевода аналоговых значений в цифровые (чтобы погуглить). (Цифры упрощены, в реальности немного другие, суть не меняется)
Ответы
Ответ 1
Боюсь что тут вы ничего не поделаете, если у вас точность округления в единицу, то понятно, что при скачке на границе точности будет скакать и результат... Правда даже несмотря на то что датчик считает в целых числах, то среднее вы можете выдавать в дробных, тогда больших скачков уже не будет.Ответ 2
В итоге сделал так. Делается некоторое кол-во замеров, получаем общее значение (дробное). Это позволяет убрать шум до какой-то степени, но пока еще просто округлять результат рано, т.к. на границе целых чисел будет все равно скакать итоговое значение. Далее, к полученному среднему значению (дробному) добавляется смещение в 0.2, в сторону, зависящую от предыдущего, конечного показания. После чего, сумма округляется и выдается конечному пользователю. Таким образом, чтобы "переключиться" в следующее, целое значение, нужно чтобы сигнал на входе изменился минимум на 0.2в, что больше чем шумы. Гуглил по "гистерезис". Так, примерно, работает терморегулятор на утюге (не постоянно щелкает, а переключается только при изменении температуры на значимое кол-во градусов).Ответ 3
Почему бы не округлить? Например при диапазоне от нуля до единицы всё, что выше 0.707 округляется до единицы, а всё что меньше до нуля. У вас диапазон больше, и числа будут немного другие, но не суть важно.
Комментариев нет:
Отправить комментарий