Как правильно интерпретировать вывод встроенного аналого-цифрового преобразователя?

При использовании встроенного аналого-цифрового преобразователя Atmega328P Arduino Uno Rev 3 с опорным напряжением 5 В, какая функция подходит для интерпретации выходных данных? На веб-сайте Arduino и в техническом описании Atmega328P (чипсет Arduino Uno Rev 3) содержится противоречивая информация.

Во многих примерах кода в Интернете указано, что соответствующий коэффициент преобразования составляет 5 В/1023 (включая веб-сайт Arduino: float voltage= sensorValue * (5.0 / 1023.0);).

Согласно справочному листу данных Atmega328P, это указывает на преобразование коэффициент 5V/1024:

Если Vin и Vref равны 5 В, то показания АЦП должны быть равны 1024, чтобы иметь истинное значение 5 В, что невозможно, поскольку 1023 — это максимальный выходной сигнал АЦП. Ближайшее к 5 В значение, которое мы можем получить из этого уравнения, составляет ~4,9951 (5 В * 1023/1024).

С коэффициентом преобразования примера Arduino, равным 5 В/1023, мы получаем 5 В для выхода АЦП, равного 1023.

Кроме того, поскольку информация из обоих источников конфликтует, это заставило меня задуматься: АЦП по своей природе выполняет выборку, и я не уверен, округляет ли АЦП вверх/вниз до ближайшего значения, поэтому, возможно, самое близкое аппроксимация Vin — это уравнение, подобное следующему, которое разделяет разность:

Vin = (ADC+(ADC+1))/2 * 1024/Vref

Используя приведенное выше уравнение, показание АЦП, равное 0, при Vref=5 В дает Vin = (0 + (0+1))/2 * 1024/5 В = ~0,00244. Это уравнение никогда не дает показание 5 В или 0 В, а скорее значение, которое разделяет разницу между выборками.

Возможно, я лукавлю, поскольку абсолютная точность АЦП "Абсолютная точность ±2 LSB", но мне все же хотелось бы знать, какое уравнение является лучшим для преобразования выходного сигнала АЦП в измерение напряжения.

, 👍3

Обсуждение

Вы слишком много думаете о вещах здесь. На самом деле не имеет значения, используете ли вы 1024 или 1023 — в любом случае АЦП не такой точный., @Majenko

Кроме того, вы делите на *максимальное значение*, а не на *количество шагов*, так что 1023 будет правильным. Два были бы одинаковыми, если бы отсчет начинался с 1, но это не так — он начинается с 0., @Majenko

@Majenko Даже если АЦП не такой точный, я все равно хотел бы, чтобы мои показания с него были максимально точными и не вносили ненужную ошибку из-за использования неправильного уравнения. Кроме того, если вы уверены, что 1023 является правильным значением, то вы уверены, что это просто постоянная опечатка, которая появляется в описаниях нескольких наборов микросхем AVR (включая ATmega2560, ATtiny85, ATmega1284)?, @statueuphemism

Это спор, который бушует уже много лет. Разница между ними настолько незначительна, что ее затмевает неточность АЦП. Это действительно бессмысленно. Используйте то, что вам больше нравится., @Majenko

@Majenko К сожалению, мои исследования до того, как задать этот вопрос, не выявили таких аргументов. Можете ли вы дать некоторое представление об аргументах в качестве ответа? Microchip заявляет о точности ±2 LSB, а разница между ±2 LSB и +1 LSB/-3LSB (или +3LSB/-1LSB) достаточно важна для меня в моем приложении, чтобы понимать ее как часть стека допусков. Поэтому важно выбрать правильное уравнение. Я использую ADC в качестве общей проверки значения, но я хотел бы понять все источники набора допусков, чтобы я мог максимально сократить ожидаемые границы ошибки., @statueuphemism

Что ж, можно также утверждать, что оба результата совершенно достоверны и правильны. Поскольку каждый LSB охватывает * диапазон * напряжений, возникает вопрос: вас волнует верхняя или нижняя граница квантования? Либо так же точно или неточно, как и другие., @Majenko

Я не уверен, что понимаю, размер шага квантования в этом случае не одинаков между двумя методами, 5/1023! = 5/1024. Что касается вопроса «вас волнует верхняя или нижняя граница квантования?», я забочусь о минимизации ошибки в моем измерении для достижения заявленной абсолютной точности ±2 LSB., @statueuphemism

Вот одна нить спора. Как я уже сказал, это бушует уже много лет. https://forum.arduino.cc/index.php?topic=303189.0, @Majenko


3 ответа


Лучший ответ:

3

в техническом описании Atmega328P указано, что коэффициент преобразования 5В/1024 [...]

Действительно. Техническое описание — это единственный авторитетный источник. Все другие источники сомневаются.

Если Vin и Vref равны 5 В, то показания АЦП должны быть равны 1024 в чтобы иметь истинное значение 5В

Вы не можете получить истинное значение 5 V. Согласно техпаспорту (выделено мой): «0x000 представляет аналоговую землю, а 0x3FF представляет выбранное опорное напряжение минус один младший бит».

Любое входное напряжение, превышающее максимальное отображаемое напряжение, будет читается как 0x3ff (т.е. 1023), как и любое отрицательное напряжение (в пределах прямое напряжение защитного диода) будет считываться как ноль. Таким образом, значение либо 0, либо 1023 следует интерпретировать как насыщение АЦП, что означает, что фактическое напряжение неизвестно.

АЦП по своей сути выполняет выборку, и я не уверен, округляет ли он вверх/вниз до ближайшего значения

В принципе, оно должно округляться до ближайшего значения. Переход в чтение от 0 до 1 должно в идеале происходить в Vref/2048. См. опять же техпаспорт, подраздел «АЦП Определения точности»: «Смещение: отклонение первого перехода (от 0x000 до 0x001) по сравнению с идеальным переходом (при 0,5 LSB).

Немного дальше на странице указано, что идеальное положение последний переход (с 1022 по 1023) — «на 1,5 LSB ниже максимума».

Возможно, я лукавлю, поскольку абсолютная точность АЦП "Абсолютная точность ±2 LSB"

Действительно. Если вы действительно заботитесь, вам, вероятно, следует откалибровать ваш АЦП. Видеть Ответ АЦП Arduino.

Обновление: в комментарии вы упомянули, что фактор 1024 может предположительно быть «постоянной опечаткой, которая появляется в нескольких AVR спецификации чипсета». Это может быть ошибка, но точно не опечатка, т.к. техническое описание содержит несколько независимых утверждений, подтверждающих фактор 1024.

,

Калибровочные кривые интересны - выглядят довольно прямыми, но наклоны разные. Он мог бы выполнить большую часть калибровки, найдя отношение, которое дает ADC == 1 и ADC == 1022, и подгоняя только эти точки., @Dave X


3

Как уже говорили другие, разница между 1023 и 1024 довольно мала.

Однако дело в том, что ваш входной диапазон для АЦП составляет от 0 до 1023. (Это 1024 шага, но, поскольку он начинается с 0, он не дойдет до 1024)

Вы получите 0 при минимальном вводе и 1023 при максимальном значении.

Если вы используете опорное напряжение 5,0 В и не используете делители напряжения, это означает, что вы получите 1023 при 5 В (игнорируя погрешность измерения). Вин/1023.0*5.0. Это даст вам значение 5,0 при максимальном входе 1023 (что соответствует 5,0 вольт) и 0 при входе 0 вольт.

Изменить:

После публикации я прочитал темы на эту тему, и по этому поводу ведутся бурные дебаты. Теперь мне менее ясно, что есть "правильно" способ сделать это.

Проблема в том, что значение ADC не дает вам определенного показания, оно указывает диапазон. Когда вы получаете значение 1024, АЦП сообщает вам, что измеренное напряжение находится в верхней части 1/1024 напряжения, примерно от 4,995 В до 5 В (или выше, если на то пошло).

Шаги на самом деле в 1024-х. Это говорит о том, что вы должны разделить измеренное значение на 1024, а затем вернуть диапазон возможных напряжений:

value = analoglRead(pin);
float lower_value = value / 1024.0 * 5.0;
float upper_value = (value + 1) / 1024.0 * 5.0;

Для аналогового показания 0 это даст вам диапазон 0,0 В. до 0,0048828125v.

Для аналогового значения 1023 это даст вам диапазон от 4,9951171875В до 5,0В

,

0

После прочтения различных аргументов в пользу использования различных передаточных функций, вот мое резюме:

Чтобы достичь заявленной производителем абсолютной точности ±2 LSB, вы должны использовать уравнения производителя и опубликованные рекомендации по использованию для обеспечения этой точности (например, обеспечить соответствующую тактовую частоту/время выборки АЦП и применить методы шумоподавления).

Возможно, можно добиться лучших результатов, используя другую передаточную функцию путем калибровки для каждого отдельного контура. Если вы пойдете по этому пути, вся ответственность за обеспечение точной калибровки в диапазоне ожидаемых рабочих условий (включая дрейф смещения/усиления из-за факторов окружающей среды) лежит на вашей ответственности за характеристику и учет при разработке передаточной функции. Вот здесь и подходит передаточная функция Vin = 5V/1023 * ADC. Эта передаточная функция может фактически быть лучшим представлением фактических выходов для конкретного чипа. Однако использование этой передаточной функции возлагает на пользователя ответственность за проверку того, действительно ли она дает лучшие результаты.

Несколько важных замечаний:

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