Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Дискретизация аналоговых значений

#алгоритм #любой_язык


Программа получает данные с датчика, измеряющего напряжение в вольтах.
Приходят целые значения в вольтах. Т.е. если на вход подать 1.9в, на выходе получаем
значение 1. А если на вход подать 2в, то получаем уже два.

Датчик имеет собственный шум (+/- 0.1 вольт) который складывается с измеряемым значением.

Это создает проблемы при входном напряжении, которое находится рядом с целыми значениями.
К примеру, если входное напряжение равно 2в, то в реальности будут замерены напряжения
1.9..2.1 (добавляются шумы), и показания будут скакать между 1 и 2. (хотя и ожидается
постоянное 2).

На рисунке синяя линия - вариант, когда входной сигнал далеко от границ целых значений,
и шум (неровность линии), не меняет результат. Красная линия - вариант, когда входной
сигнал на границе.

Конечному пользователю необходимо показать постоянное, не меняющееся значение.

Что было сделано:


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




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

(Цифры упрощены, в реальности немного другие, суть не меняется)
    


Ответы

Ответ 1



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

Ответ 2



В итоге сделал так. Делается некоторое кол-во замеров, получаем общее значение (дробное). Это позволяет убрать шум до какой-то степени, но пока еще просто округлять результат рано, т.к. на границе целых чисел будет все равно скакать итоговое значение. Далее, к полученному среднему значению (дробному) добавляется смещение в 0.2, в сторону, зависящую от предыдущего, конечного показания. После чего, сумма округляется и выдается конечному пользователю. Таким образом, чтобы "переключиться" в следующее, целое значение, нужно чтобы сигнал на входе изменился минимум на 0.2в, что больше чем шумы. Гуглил по "гистерезис". Так, примерно, работает терморегулятор на утюге (не постоянно щелкает, а переключается только при изменении температуры на значимое кол-во градусов).

Ответ 3



Почему бы не округлить? Например при диапазоне от нуля до единицы всё, что выше 0.707 округляется до единицы, а всё что меньше до нуля. У вас диапазон больше, и числа будут немного другие, но не суть важно.

Комментариев нет:

Отправить комментарий