Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 12:37:42

1. Точность измерения напряжения с помощью АЦП зависит от:

- ошибок АЦП: offset error, gain error;
- интегральной нелинейности АЦП;
- точности и стабильности опорного напряжения;
- и только потом от вычислений.

2. Компенсировать имеет смысл offset error и gain error. Интегральную нелинейность компенсировать, конечно, можно, но в случаях, когда это реально проблема, по-моему проще поставить другой АЦП.

3. Кроме того, реальные АЦП шумят. Чтобы избавиться от этого, можно применять цифровую фильтрацию. Но цифровая фильтрация не отменяет физического антиэлайзингового фильтра, который нужен, чтобы исключить компоненты выше частоты Котельникова-Найквиста, которые в цифре уже не отделить от полезного сигнала.

Об ошибках. Теоретически передаточная функция АЦП должна бы представлять собой ровную прямую y = K*x + B, где K, разумеется, должен быть равен отношению максимального кода к опорному напряжению, а B должен быть тождественно равен нулю.

Однако на практике K отклоняется от теоретического значения - это называется gain error. А еще B как правило не равен нулю, и это называется offset error.

Интегральная нелинейность выражается в том, что обсуждаемая прямая - не совсем прямая, но в современных АЦП этот эффект достаточно мал и им можно пренебрегать.

Соответственно, имеет смысл устроить линейную коррекцию. Коэффициент B можно понять, считав значение с АЦП, когда его вход подключен к земле. С коррекцией K чуть сложнее, но и там нет ничего выходящего за рамки школьной математики (провести прямую по двум точкам).

Что касается использования float, то тут надо думать. Если делается вольтметр, который кроме этого самого напряжения ничего не будет показывать - то и ладно. Я бы не задумываясь считал во float, тем более что поправочный коэффициент для коррекции K скорее всего получится очень маленьким, так что есть перспектива вылететь даже за int32. Если измерение - вспомогательная функция в каком-то большом и красивом проекте, то имеет смысл заморочиться с целочисленной арифметикой.

Что до сбора кучи данных и последующего деления, то такой подход называется передискретизация (oversampling). Действительно, таким образом можно виртуально увеличить разрядность АЦП. Чтобы получить дополнительные n бит разрешения, нужно увеличить частоту дискретизации в 2^(2*n) раз.
Ответить