leoniv.diod.club
Демоны в АЦП STM32

Современные АЦП обычно внутри содержат УВХ. В последнее время АЦП часто строятся по схеме уравновешивания заряда, а не уравновешивания токов, как это было в АЦП на основе резисторной матрицы R-2R. В случае АЦП с уравновешиванием заряда роль емкости УВХ выполняет внутренняя матрица конденсаторов. Конденсаторы матрицы в процессе преобразования перезаряжаются. Поэтому вход такого АЦП ведет себя достаточно нетривиально. Именно к такому типу АЦП относится и внутренний АЦП микроконтроллеров STM32. Довольно много информации по этому поводу содержится в документе AN2834. Но там полезные рекомендации, как на стр. 37: «Do not add any external capacitor (Cext) to the input pin when applying this above workaround» чередуются с весьма спорными, как на стр. 39: «An extra large Cext enables sampling more often». Это подтолкнуло к написанию этой статьи.

УВХ внутреннего АЦП STM32 подключено к входному пину через аналоговый мультиплексор без всяких буферов, поскольку при однополярном питании сделать буфер проблематично. В некоторых сигма-дельта АЦП такой буфер есть, но он обычно отключаемый, так как при его использовании накладываются ограничения на допустимый диапазон входного напряжения. В STM32 входного буфера нет. Во время выборки к входному пину через ключ подключается емкость УВХ. Но что происходит с этой емкостью дальше? К моменту следующей выборки на ней будет прежний заряд? Вряд ли. Современные интегральные АЦП подобного класса обычно строятся на базе емкостного ЦАП. Во время преобразования методом последовательного приближения производится балансировка зарядов (а не токов, как было в АЦП на основе R-2R ЦАПа). Поэтому заряд входного конденсатора «расходуется» во время преобразования. Да и вообще, во многих АЦП конденсатор УВХ — это не какой-то отдельный элемент, а вся матрица конденсаторов емкостного ЦАП. Так что же будет с конденсатором в конце преобразования, он разрядится до нуля, или будет заряжен каким-то другим зарядом? Это зависит от конкретной схемы АЦП. Документация внятного ответа на этот вопрос не дает, придется прибегнуть к измерениям.

Последовательно со входом АЦП подключим резистор 10 кОм, падение напряжения на котором можно контролировать осциллографом. Это падение будет пропорционально входному току АЦП. На всех осциллограммах масштаб по горизонтали составляет 2 мкс/дел., по вертикали 100 мВ/дел. (что с учетом резистора 10 кОм соответствует току 10 мка/дел.). АЦП работает с частотой дискретизации 100 кГц. Измерения, конечно, не совсем достоверны в плане формы выброса, так как ко входу АЦП добавляется небольшая дополнительная емкость (щуп 1:10 имеет емкость около 18 пФ). Но качественно картина при этом не меняется.

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

Рис. 1. Положительные выбросы входного тока АЦП при Vin = 0.

Если на вход АЦП подать напряжение, равное 1/2*Vref (половина полной шкалы), выбросы входного тока исчезают.

Рис. 2. Выбросы входного тока АЦП при Vin = 1/2*Vref отсутствуют.

Если на вход АЦП подать напряжение Vref, что соответствует полной шкале, выбросы тока меняют знак. Теперь во время выборки конденсатор заряжается от источника сигнала, имеем некоторый втекающий входной ток.

Рис. 3. Отрицательные выбросы входного тока АЦП при Vin = Vref.

Чтобы не появлялась погрешность измерения, за время выборки конденсатор УВХ должен успеть зарядиться до входного напряжения с точностью не хуже 1 LSB. Получить это несложно, так как емкость конденсатора маленькая, около 8 пФ. В datasheet приведена соответствующая таблица, судя по которой величина сопротивления на входе АЦП может достигать десятков кОм. Максимальное значение сопротивления зависит от времени выбрки АЦП. Для источников сигнала с высоким выходным сопротивлением это время можно увеличить, в STM32 такая возможность есть.

Но что будет происходить, если вход АЦП зашунтировать емкостью? Это типичный прием, рекомендуемый почти везде. Вместе с входным резистором этот конденсатор образует anti-alias фильтр, который необходим всегда. Дополнительно есть еще один положительный эффект - образуется ФНЧ, подавляющий сигнал помех. Если включить на входе АЦП емкость, то выбросы падения напряжения на внутреннем сопротивлении источника «размажутся» во времени и к концу выборки напряжение может не успеть достичь своего номинального значения с точностью 1 LSB. Придется увеличивать время выборки, чтобы все стало на свои места. Но такое увеличение возможно только для небольших емкостей порядка десятков пФ. Однако обычно речь идет о емкостях порядка 10 – 100 нФ. Тут никакое увеличение времени выборки не поможет. На входе АЦП выбросы исчезнут, мы будем видеть некоторое среднее значение напряжения. Но это значение не будет равно измеряемому напряжению. При увеличении емкости ошибка АЦП стремится к своему теоретическому максимуму. Хотя, казалось бы, какой может быть вред от емкости на входе АЦП, кроме сужения полосы сигнала?

Этот вывод легко проверить на практике. Пусть АЦП работает с частотой выборок 100 кГц, а на входе включен резистор 10 кОм, имитирующий выходное сопротивление источника сигнала. Подадим на вход АЦП напряжение, близкое к полной шкале. Показания АЦП равны 4001, что вполне соответствует поданному входному напряжению. После подключения на вход АЦП емкости 10 нФ показания становятся 3987, т.е. появляется ошибка АЦП на 14 единиц вниз. Теперь отключим емкость и подадим на вход небольшое напряжение, близкое к началу шкалы. Показания АЦП стали равны 101, что соответствует новому входному напряжению. Снова подключаем емкость 10 нФ. Показания становятся 116, т.е. появляется ошибка АЦП на 15 единиц вверх. Емкость на входе АЦП приводит к погрешности измерения постоянного напряжения!

Рассмотренные эффекты легко рассчитать, оперируя средним входным током АЦП. Этот ток легко измерить, тестер на основе АЦП двойного интегрирования покажет именно средний входной ток. При нулевом входном напряжении ток оказался равным -1.13 мкА, на середине шкалы он равен нулю, при максимальном входном напряжении он равен +1.09 мкА. Что хорошо согласуется с расчетами. Согласно datasheet, конденсатор УВХ имеет емкость 8 пФ. Перезаряжается он максимум на 1/2 шкалы, что при опорном напряжении 3.3 В составляет 1.65 В. Заряд будет равен Q = V * C. Средний ток при частоте дискретизации Fs будет равен Iavg = V * C * Fs = 1.65 * 8E-12 * 1E5 = 1.32 мкА. Что практически совпадает с измеренным значением. Входной ток пропорционален частоте дискретизации, измерение при нулевом входном напряжении и частоте дискретизации 50 кГц дало значение -0.56 мкА, что тоже соответствует теории.

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

Рис. 4. Код ADC1 =0, код ADC2 = 4000. Средний входной тока канала ADC1 Iadc1_avg = -2.45 мкА.

Рис. 5. Код ADC1 =0, код ADC2 = 2048. Средний входной тока канала ADC1 Iadc1_avg = -1.64 мкА.

Рис. 6. Код ADC1 =4000, код ADC2 = 2048. Средний входной тока канала ADC1 Iadc1_avg = +1.99 мкА.

Рис. 7. Код ADC1 =4000, код ADC2 = 0. Средний входной тока канала ADC1 Iadc1_avg = +2.51 мкА.

Как видим, напряжение на входе канала 2 непосредственно влияет на входной ток канала 1. Причем при совместной работе каналов входной ток может быть вдвое выше, чем при работе одного канала. На показания это тоже влияет, при наличии на входе RC-цепочки показания канала 1 менялись при изменении напряжения на входе канала 2, ошибка достигала 30 единиц. Ответ на вопрос «Что с конденсатором УВХ происходит потом?» для худшего случая можно дать следующим образом: во время каждой выборки конденсатор УВХ нужно перезаряжать на величину Vref. Средний входной ток АЦП для худшего случая нужно принимать Iavg = Vref * Csh * Fs.

В результате возможны два разных случая.

Случай первый: резистор Rin выбирается не больше некоторого критического значения, когда средний входной ток АЦП создает на нем падение напряжения не более 1/2 LSB. В этом случае на вход может быть подключена сколь угодно большая емкость Cin, ошибка при этом не возникнет. Сопротивление резистора на входе АЦП (вместе с внутренним сопротивлением источника сигнала) не должно превышать следующего значения: Rin < 1 / (2^(N+1) * Csh * Fs), где N — разрядность АЦП, Csh — емкость внутреннего УВХ, Fs — частота дискретизации. Например, для встроенного АЦП STM32 при Fs = 100 кГц сопротивление должно быть не более 153 Ом. При понижении частоты дискретизации сопротивление можно пропорционально увеличить. Время выборки в этом случае на ошибку не влияет.

Случай второй: если по каким-то причинам резистор на входе АЦП не может быть таким маленьким (например, источник сигнала обладает высоким выходным сопротивлением), тогда постоянная времени цепочки на входе АЦП не должна превышать некоторого критического значения, чтобы за время выборки напряжение на емкости Cin успевало установиться с точностью 1/2 LSB. Чем больше время выборки, тем постоянная времени входной цепи может быть больше. Но сколь угодно большую емкость подключать нельзя. Частота выборок в этом случае на ошибку не влияет.

Для второго случая расчет номиналов сделать значительно труднее. Можно, наверное, составить какую-то формулу для расчета постоянной времени входной цепочки, но я вместо этого составил модель входной части АЦП. Кроме внешней RC-цепочки учитывается внутренняя емкость УВХ и сопротивление ключа.

Рис. 8. Схема модели входной части АЦП STM32.

Для частоты выборок Fs = 100 кГц и времени выборки 2 мкс для получения ошибки не более 1/2 LSB при сопротивлении резистора 100 Ом емкость не должна превышать 10 нФ, а при сопротивлении 1 кОм емкость не должна превышать 330 пФ.

На графике показано входное напряжение АЦП (синий график) при измерении нулевого напряжения. Из-за заряда на емкости УВХ на входе АЦП образуется выброс, затем напряжение медленно спадает, скорость спада определяется постоянной времени цепочки на входе АЦП. Чтобы не появилась ошибка преобразования, к концу интервала выборки напряжение не должно отличаться от измеряемого более чем на 1/2 LSB (красная линия награфике). В данном случае процесс выборки начинается на отметке 18 мкс и заканчивается на отметке 20 мкс. Как видно, к этому времени график успевает приблизиться к измеряемому напряжению 0 В на 1/2 LSB. Он пересекает красную линию раньше момента окончания выборки. Поэтому ошибки преобразования не будет.

Рис. 9. Входное напряжение АЦП при Rin = 100 Ом, Cin = 10 нФ.

Но если постоянная времени входной цепочки будет больше некоторго предела, к концу интервала выборки ошибка будет превышать 1/2 LSB. Следующий график снят для резистора 1 кОм и емкости 4.7 нФ. Видно, что напряжение на входе АЦП никогда не достигает входного с точностью 1/2 LSB, поэтому будет присутствовать ошибка.

Рис. 10. Входное напряжение АЦП при Rin = 1 кОм, Cin = 4.7 нФ.

При еще большем увеличении емкости пульсации на входе АЦП уменьшаются, но эти пульсации происходят не вокруг входного измеряемого напряжения, а вокруг некого среднего входного напряжения АЦП, которое отличается от измеряемого напряжения на величину падения на входном резисторе. При большом значении емкости эта ошибка зависит только от номинала резистора и среднего входного тока. Сколь угодно большим увеличением емкости нельзя устранить эту ошибку. Даже при таком большом значении емкости, как 200 мкФ, пульсации практически исчезают, но среднее значение остается тем же, остается и ошибка.

Рис. 11. Ошибка входного напряжения АЦП при Rin = 20 кОм, Cin = 1 мкФ и 2 мкФ.

Рис. 12. Ошибка входного напряжения АЦП при Rin = 20 кОм, Cin = 200 мкФ.

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

Можно не прибегая к моделированию рассчитать допустимые номиналы RC-цепочки, пользуясь упрощенными эмпирическими формулами. В [1] рекомендуют выбирать внешнюю емкость примерно в 20..50 раз больше емкости УВХ. Для STM32F100 это около 220..470 пФ. Резистор выбирается из соображения времени установления напряжения на емкости с точностью 1/2 LSB за интервал выборки. При этом можно ввести некий коэффициент k = ln(2^(N+1)), который для данной разрядности АЦП N показывает, во сколько раз постоянная времени RC-цепочки должна быть меньше времени выборки. Для 10 бит k = 8, для 12 бит k = 9, для 14 бит k = 11, для 16 бит k = 12. Надо сказать, что значения этого коэффициента приблизительные, так как не учитывается отношение внешней емкости к емкости УВХ. Но этими значениями вполне можно пользоваться, взяв постоянную времени с некоторым запасом меньше расчетной. Для приведенного выше примера расчет для 12 бит, ts = 2 мкс, Cin = 330 пФ дает Rin примерно 700 Ом. А по результатам моделирования получается Rin = 1000 Ом. Вполне хорошее соответствие.

RC-цепочка на входе АЦП несет еще одну функцию. Она изолирует выход буферного ОУ от входа АЦП и предотвращает паразитные колебания. Если источником сигнала служит ОУ, то при резком изменении тока нагрузки (что происходит в момент начала выборки) на его выходе может начаться затухающий колебательный процесс. В этом случае при малых временах выборки можно получить непредсказуемую величину погрешности. На рисунке ниже показано, как ведет себя встроенный буферный ОУ ЦАП STM32, нагруженный на вход АЦП через резистор 100 Ом (масштаб — 100 мв/дел. и 1 мкс/дел.). Затухающие колебания длятся почти 2 мкс.

Рис. 13. Колебательный процесс на выходе ОУ, нагруженного на вход АЦП, Rin = 100 Ом, Cin = 0.

Увеличение резистора до 1 кОм увеличивает выброс на входе АЦП и немного укорачивает колебательный процесс. Но полностью его не устраняет.

Рис. 14. Колебательный процесс на выходе ОУ, нагруженного на вход АЦП, Rin = 1 кОм, Cin = 0.

Но при подключении после резистора 1 кОм даже небольшой емкости, такой как 100 пФ, колебания исчезают.

Рис. 15. Колебательный процесс на выходе ОУ исчезает при Rin = 1 кОм, Cin = 100 пФ.

Поэтому совету «Do not add any external capacitor» тоже нельзя безоговорочно следовать. В datasheets на большинство подобных АЦП рекомендуется на входе включать RC-цепочку. Главное — правильно выбрать номиналы. Подключая RC-цепочку на выход ОУ, нужно убедиться в его устойчивости при работе на такую нагрузку. Разные типы ОУ имеют разные способности по работе на емкостную нагрузку, определяющим параметром здесь является выходное сопротивление ОУ с разомкнутой петлей ОС. Обычно соответствующие данные есть в datasheet на ОУ.

Озвученный выше выбор емкости Cin «в 20..50 раз больше емкости УВХ» является во многом произвольным, никакого физического смысла этот коэффициент не несет. Внешнюю емкость часто называют «резервуаром заряда» для емкости УВХ. В идеале величина этой емкости должна быть такой, чтобы при зарядке емкости УВХ напряжение на ней упало не более, чем на 1/2 LSB. Т.е. величина внешней емкости должна быть Cin > Csh * 2^(N+1). Для 12-разрядного АЦП входная емкость Cin должна быть больше емкости УВХ Csh в 8192 раза. Для АЦП STM32F100 получается Cext > 68 нФ. Допустимый номинал Rin при высокой частоте выборок тогда будет очень малым, реальные ОУ вряд ли смогут работать на такую нагрузку. Поэтому обычно используют менее жесткий критерий выбора емкости. Тогда часть заряда емкость УВХ получает от емкости Cin, а часть — за счет выходного тока ОУ.

АЦП STM32 имеет возможность задавать время выборки ts. Увеличение времени выборки ts может потребоваться в том случае, если источник сигнала имеет высокое внутреннее сопротивление. Тогда для зарядки емкости УВХ с точностью 1/2 LSB нужно значительное время, которое и достигается увеличением ts. Наличие дополнительной емкости на входе АЦП требует еще большего увеличения ts. Однако возможности по увеличению ts сильно ограничены. Если по каким-то причинам постоянная времени входной цепи большая и ее нельзя уменьшить (например, имеем высокоомный источник сигнала), то времени выборки может не хватить. Тогда для устранения погрешности требуется снижать частоту выборок.

Допустим, имеется высокоомный источник сигнала, когда емкость УВХ не будет успевать заряжаться с точностью 1/2 LSB даже при максимально возможном времени выборки ts. Тогда можно установить на вход АЦП большую емкость, удовлетворяющую критерию Cin > Csh * 2^(N+1). Как было сказано выше, чтобы избежать появления ошибки, падение напряжения на Rin не должно превышать 1/2 LSB. В данном случае уменьшить Rin нет возможности, зато можно уменьшить средний входной ток, уменьшив частоту выборок. Она должна быть не более предельного значения Fs < 1 / (2^(N+1) * Csh * Rin). Для АЦП STM32F100 получаем Fs < 15*10^6 / Rin. Например, для Rin = 100 кОм частота выборок не должна превышать 150 Гц. Выполнив это условие и подключив ко входу АЦП большую емкость (Cin > Csh * 2^(N+1)), можно оцифровать сигнал высокоомного источника без появления ошибки.

Таким образом, имеем два случая, когда ошибка будет отсутствовать: это или маленькая емкость Cin (в пределе - только емкость УВХ), которая успевает заряжаться с точностью лучше 1/2 LSB за время выборки, или большая емкость Cin, которая за время выборки не успевает разряжается более чем на 1/2 LSB. Оба этих случая накладывают определенные ограничения на величину Rin. В первом случае на величину ошибки влияет значение постоянной времени RC входной цепи и время выборки, а период выборок значения не имеет. Во втором случае на величину ошибки влияет период выборок и величина Rin, а время выборки значения не имеет. Добавление Cin в первом случае может оказаться вредным и повлечь за собой появление заметной ошибки.

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

И еще один аспект: если аналоговый сигнал, который поступает на вход АЦП, используется еще для каких-то других целей, то вход АЦП может явиться дополнительным источником помех — «иголок» с частотой сэмплирования. Лучший вариант — развязать вход АЦП от остальной аналоговой схемы отдельным буфером на ОУ. Тогда и необходимую фильтрацию можно выполнить на входе буфера, не ограничивая себя рамками допустимого сопротивления на входе АЦП.

Иногда для повышения эффективной разрядности АЦП используют оверсемплинг. В этом случае частота выборок выбирается большой, что влечет за собой увеличение среднего входного тока. К тому же, в расчетах для этого случая надо брать ошибку 1/2 LSB не для исходного АЦП, а для выходного кода повышенной разрядности. Это еще больше ограничит значения номиналов R и C сверху.

При увеличении эффективной разрядности путем добавления на вход АЦП треугольного сигнала (подобно Figure 22 из документа AN2834) номиналы нужно выбирать с учетом среднего входного тока АЦП. Если в такой схеме применяется емкостной делитель с относительно большой емкостью со входа АЦП на землю, то входной резистор должен выбираться малым, как было показано для первого случая.

Ниже приведены ссылки на документы, где обсуждаются подобные вопросы. Надо отметить, что нигде не рассмотрен момент, касающийся погрешности, связанной со средним входным током АЦП. Вероятно, это связано с тем, что обычно рассматривают относительно быстрые внешние АЦП, а там постоянную времени входной RC-цепочки выбирают малой, чтобы не потерять полосу входного сигнала. В тех случаях, когда требуется оцифровка медленных сигналов, выбирают более медленный АЦП, а у него за счет меньшей частоты сэмплирования будет меньше и средний входной ток. Особенность встроенного АЦП STM32 состоит в том, что он обладает довольно высокой скоростью, но в ряде задач может использоваться для оцифровки медленных сигналов. В этом случае легко столкнуться с ситуацией, когда RC-цепочка еще не ограничивает спектр полезного сигнала, но уже приводит к появлению ошибки по постоянному току. Особенно вероятно это при использовании оверсемплинга. Средний входной ток иногда рассматривается при описании сигма-дельта АЦП, для которых оцифровка медленных сигналов является типичной задачей.

References:
  1. Optimize Your SAR ADC Design
  2. External components improve SAR-ADC accuracy
  3. Using a SAR ADC for Current Measurement in Motor Control Applications
  4. The operation of the SAR-ADC based on charge redistribution
  5. Start with the right op amp when driving SAR ADCs
  6. ADS8342 SAR ADC Inputs
  7. Front-End Amplifier and RC Filter Design for a Precision SAR Analog-to-Digital Converter
Ридико Леонид Иванович www.leoniv.diod.club e-mail: wubblick@yahoo.com