Расчет точности АЦП в знаках после запятой (13.06.2017). Печать
2017 - Июнь
13.06.2017 10:28
Save & Share
Все время требовалась точность не более 2 знаков после запятой при работе с платами аналогового ввода. Однако все хорошее когда-нибудь кончается - потребовалась точность 4, 8, 16 знаков. Поэтому пришлось изучить алгоритм расчета точности для АЦП в составе плат аналогового ввода и микроконтроллеров.

Традиционно, когда возникает сложный вопрос, на него оказывается не в состоянии ответить ни 1 человек на неспециализированных форумах, а на специализированных начинается война. Даже там есть люди, не понимающие работу определенных агрегатов, - и при этом активно продвигающие свою неверную точку зрения.

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

Не буду писать остальные варианты, просто лень плодить бред. Когда со всех сторон атакуют различные мнения, единственный способ защититься - задать простой вопрос: "формулы в студию". При этом 70% собеседников сливаются сразу или сваливаются в демагогию. Остальные худо-бедно предоставляют формулы, и среди них приходится выбирать посылом следующего вопроса: "распишите". Тут отваливается еще 10-20%. В итоге в споре с оставшейся частью, удалось вывести корректные формулы расчета точности АЦП как количества знаков после запятой в десятичной системе счисления. Попутно икая от количества вредителей уже на и спецфорумах.

АЦП имеет четкую разрядность в битах. Чем меньшее максимальное напряжение можно записать в эти биты - тем выше точность. Для этого придумали параметр "опорное напряжение", равное диапазону измерения напряжения, выставленного в плате на текущий момент: Uопор = Umax - Umin. Диапазонов измерения у АЦП может быть несколько, это определяет ТТХ платы. На примере PCI-1713U: максимальное Uопор=20В соответствует диапазону ±10В, минимальное Uопор=1.25В соответствует диапазонам ±0.625В и [0;1.25]В.

Сигмой обозначается относительная погрешность, дельтой - абсолютная; а вот точность в знаках после запятой никак не обозначается. Поэтому отметим ее значком дифференциальной нелинейности, похожей по смыслу: δ∆макс = log10(2N), где N - число разрядов АЦП, основание 10 - приведение к десятичной системе счисления. δ∆макс PCI-1713U = log10(216) = 3.6 ≈ 3. Больше 3 знаков (с ложным 4-м знаком, который нельзя учитывать) из этой платы аналогового ввода не выжать - абсолютная погрешность будет более 0.0001В. Неужели эта плата, стоящая после кризиса 40000, а до кризиса 24000, оправдывает свою цену именно частотой съема данных? Там даже фильтров нормальных нет - но это уже другие вопросы. Минимальная абсолютная погрешность данной платы аналогового ввода такая же, как у дешевенькой платы Arduino/Freeduino на основе Atmel2560-16AU за 400руб на алиэкспрессе: δ∆макс = log10(210) = 3.01 ≈ 3.

Однако в предыдущем абзаце описана лишь теоретическая именно максимальная точность. В реальности нужно использовать цену младшего разряда (младшего бита) АЦП в вольтах. Uразряда = Uопор / 2N. Uразряда 20В = 20 / 4096 = 0.0048828125В. Так как используется двоичная система счисления, нужно переделать число к десятичному виду. ∆U20В = Uразряда / 2 = 0.00244140625. Имеем 2 знака после запятой, являющиеся нулями (истинные разряды) и 1 ненулевой больше 1 (ложный разряд). Итого: точность АЦП платы PCI-1713U при опорном напряжении 20В будет всего 2 знака после запятой.

Расчет для Uопор = 1.25В: ∆U1.25В = 1.25 / (4096 · 2) = 0.000152587890625В. 3 знака после запятой, максимальное значение точности.

Подтверждающих формулы книг почти нет, но есть одна, частично охватывающая представленные здесь: Соммер У. Программирование микроконтроллерных плат Arduino/Freeduino. 2-е издание / Санкт-Петербург, БВХ-Петербург, 2016 г, стр. 113.

Теперь о практике. Вот число, полученное при снятии стабилизированного напряжения платой PCI-1713U, с использованием опорного напряжения 10В, что соответствует точности 2 знакам после запятой.



Какого черта 6 знаков после запятой? Оказывается, это глюк драйвера: он отсекает только 3 последних знака из 9, а нужно больше (не рассчитывает точность - это нужно делать вручную). Даже при стабилизированном напряжении наблюдаются скачки его номинала. Если сделать 16 замеров и вычислить среднее арифметическое - только тогда будет получено реальное значение, но только с отрезанием числа до 2 знаков после запятой. Предварительный правильный результат числа с картинки - 7.51В при поданном напряжении 7.5В.

Кстати, точность порой указывается в даташите. На PCI-1713U имеем "0.1% of FSR ± 1LSB". Где LSB - least significant bit (младший разряд, вольты), FSR - full-scale range (напряжение полной шкалы - диапазон измеряемого напряжения, вольты) - и от обоих берется 0.1%. И вот беда: не получается получить точность в 3 знака по даташиту, потому что 3 знака выше - тоже расчетные, теоретические. А напряжение полной шкалы не может быть меньше 1.25В.

Дополнительно: не только ошибка квантования 1LSB мешает получению истинного значения, но и ошибка усилителя (gain). Они - дополнительные погрешности, которые не дают возможности получить с платы АЦП PCI-1713U 3 знака после запятой - именно на практике. Финиш! АЦП данной платы ничем не лучше 10-битового Atmel2560-16AU за 40 рублей.

(добавлено 14.06.2017) Пусть есть точность 2.2 знака: 2 истинных и 1 ложный. Можно ли, сделав 10/100/1000 измерений, корректно посчитать ложный знак за истинный? Вот это пока непонятно.

(добавлено 15.06.2017) Если говорить строго, множественность измерений уменьшает только случайную ошибку. Ошибки в виде смещения, неточности коэффициента усиления, нелинейности и т.п. - сохраняются. Уменьшить их можно только путем калибровки или юстировки АЦП.

Однако остается вопрос: как правильно убивать случайную ошибку. Для этого обратимся к книге: Попов Е.А., Успенская Г.И. Статистическая обработка результатов измерений в лабораторном практикуме / Нижний Новгород: Нижегородский Государственный Технический университет имени Р.Е. Алексеева, 2015 г. Формируется первый вывод: количество измерений должно быть 60-120 в случае чрезвычайно важных измерений, 10-16 для обычных и 7-10 для бросовых.

От тошноты при виде формул спасает параграф 3 главы "Обработка результатов вычислений" книги: Бессонов А.А., Дергобузов К.А. Введение в лабораторный практикум по физике / Челябинск: ЧелГУ, 2003 г. В ней есть конкретный пример, как вычислять абсолютную погрешность множественного измерения:
- пусть известна текущая точность измерения 2 знака. На ее основе формируется систематическая ошибка измерения δ, равная половине следующего знака: 0.005В;
- делается n измерений, вычисляется среднее арифметическое. От среднего арифметического отнимаются по очереди каждое из измерений - получаются значения "xi - <xn>". Возведя в квадрат, получаем числитель формулы Sn. Знаменатель формулы Sn рассчитывается просто - то есть, уже известно само Sn в вольтах, выборочное среднеквадратичное отклонение;
- лично выбирается надежность P, в соответствии с важностью измерения. По таблице коэффициентов Стьюдента выбирается коэффициент t, соответствующий количеству измерений n и выбранной надежности P;
- абсолютная ошибка ∆U2 = (Sn · t)2 + δ2;
- конечный ответ: среднее арифметическое ± абсолютная ошибка, абсолютная погрешность. Относительная ошибка вычисляется легко;
- если результаты не устраивают - повторить весь расчет с увеличенным количеством измерений. Желаемый результат может быть и недостижимым.
Обновлено ( 18.06.2017 16:40 )