Демоны в АЦП 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 мВ/дел. АЦП работает с частотой дискретизации 100 кГц. Измерения, конечно, не совсем достоверны в плане формы выброса, так как ко входу АЦП я подключил небольшую дополнительную емкость (щуп 1:10 имеет емкость около 18 пФ). Но качественно картина не меняется.



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



При напряжении, равном половине шкалы, выбросы исчезают.



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

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

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



АЦП1 = 0, АЦП2 = 4000. Iavg(АЦП1) = -2.45 мкА.



АЦП1 = 0, АЦП2 = 2048. Iavg(АЦП1) = -1.64 мкА.



АЦП1 = 4000, АЦП2 = 2048. Iavg(АЦП1) = +1.99 мкА.



АЦП1 = 4000, АЦП2 = 0. Iavg(АЦП1) = +2.51 мкА.

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

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

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



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



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



Чтобы не прибегать к моделированию, номиналы RC-цепочки можно рассчитать, пользуясь упрощенными эмпирическими формулами. В [1] рекомендуют выбирать внешнюю емкость примерно в 20 раз больше емкости УВХ. Резистор выбирается из соображений времени установления напряжения на емкости с точностью 1/2 LSB. При этом можно ввести некий коэффициент k, который для выбранной разрядности АЦП показывает, во сколько раз постоянная времени цепочки должна быть меньше времени выборки. Для 10 бит k = 8, для 12 бит k = 9, для 14 бит k = 11, для 16 бит k = 12. Надо сказать, что значения этого коэффициента приблизительные, так как не учитывается отношение внешней емкости к емкости УВХ. Но этими значениями вполне можно пользоваться, взяв постоянную времени с некоторым запасом меньше расчетной. Для приведенного выше примера расчет для 12 бит, Tвыборки = 2 мкс, C = 330 пФ дает R примерно 700 Ом. По результатам моделирования R = 1000 Ом. Вполне хорошее соответствие.

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



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



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



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

Озвученный выше выбор емкости «в 20 раз больше емкости УВХ» является во многом произвольным, никакого физического смысла этот коэффициент не несет. Внешнюю емкость часто называют «резервуаром заряда» для емкости УВХ. В идеале величина этой емкости должна быть такой, чтобы при зарядке емкости УВХ напряжение на ней упало не более, чем на 1/2 LSB. Т.е. величина внешней емкости для 12-разрядного АЦП должна быть больше емкости УВХ в 8192 раза. Соответствующий номинал R тогда будет очень малым, реальные ОУ вряд ли смогут работать на такую нагрузку. Поэтому используют менее жесткий критерий выбора емкости. Тогда часть заряда емкость УВХ получает от внешней емкости, а часть — за счет выходного тока ОУ.

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

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

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

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

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

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
  • +28
  • 12 июля 2015, 23:21
  • Leoniv

Комментарии (22)

RSS свернуть / развернуть
Очень полезно. Сталкивался с ситуацией, когда подключенный к АЦП операционник с полосой пропускания 5 МГц начинал звенеть с амплитудой напряжения питания при частоте выборок в 1 МГц. Одним лишь RC-фильтром на входе АЦП отделаться не получилось, пришлось еще емкость в обратную связь операционника вводить.
0
А как себя в этом плане ведут АЦП с уравновешиванием токов? И где они применяются, например, среди МК?
0
  • avatar
  • Vga
  • 13 июля 2015, 01:05
Производители не всегда указывают, какой именно тип АЦП используется в микроконтроллере. Но это и не так важно. Любой современный АЦП (хоть встроенный, хоть внешний) имеет УВХ, значит поведение его входа будет аналогичным описанному здесь. Разница может состоять только в величине входной емкости и в разном характере ее перезарядки в процессе преобразования. Для худшего случая достаточно принять, что за время выборки емкость должна перезаряжаться на величину полной шкалы АЦП.
0
Да, логично. Правда, я раньше думал, что большая емкость на входе АЦП как раз обеспечит быструю зарядку S&H-емкости.
Хотя я, в принципе, и не ошибся — сгладит. Я только забыл про то, что тогда входной ток АЦП будет давать падение на сопротивлении источника, и он не пренебрежимо мал.
0
Средний входной ток растет пропорционально частоте выборок, поэтому для редких преобразований этим током можно пренебречь. А вот если, скажем, применяем оверсемплинг и частота выборок выбрана относительно большой, тогда входной ток надо учитывать.
0
Вот черт, хотел плюсануть, а мышка предательски соскочила ни минус. И никак голос назад не забрать… Мож модератор поможет?
0
Так какая в итоге получается схема? Повторитель->RC-цепочка->вход АЦП?
0
Ага, понял. Бони Бейкер, читал её «Что надо знать цифровому разработчику». Тогда она на Микрочип работала, а сейчас уже на Ti…
0
тоже много бился с этой темой -STM32 и имел массу граблей :)
т.е. получается если мы ставим большой конденсатор и резистор в наш вход то со стороны АЦП идет его перезаряд, а вход не успевает его корректировать?
0
Если ставим большой конденсатор, то он усреднит импульсный входной ток АЦП до какого-то среднего значения. Этот ток создаст на резисторе падение напряжения, которое приведет к ошибке измерения даже на постоянном токе.
0
Честно говоря не совсем въехал про средний ток — у меня похожая картина была как раз без конденсатора
we.easyelectronics.ru/GYUR22/vybrosy-na-nozhkah-acp-v-stm32.html
0
Выбросы на входном пине АЦП будут и без конденсатора, в этом нет ничего удивительного. Наоборот, внешний конденсатор эти выбросы сглаживает.
0
A side effect of this hardware workaround is the cyclical charging of Cext which must be
taken into account. Each ADC conversion transfers charge from Csh to Cext. One transfer
charges the Cext below 0.5 lsb, as described above, but more transfers can charge Cext to
larger values if it is not discharged between two conversions. Figure 36 shows an example
of this scenario where the ADC measurement is performed faster

стр.32 AN2834
про что я говорю
0
Да, здесь речь идет о том же. Но количественная оценка дается сложным способом. Я предлагаю намного более понятную формализацию: для случая большой входной емкости вычисляем средний входной ток АЦП, затем находим падение напряжения на входном резисторе (плюс внутреннее сопротивление источника сигнала). Это напряжение и будет равно искомой ошибке.
0
Ссылка №5 битая. Учитывая ее свежесть — полагаю, что тот сайт не дает скачать без регистрации. Переложи в более доступное место — можно приаттачить прямо к статье.
0
  • avatar
  • Vga
  • 13 июля 2015, 12:44
Ссылку исправил.
0
а к какому именно входу вы подключали сигнал? yt PA0?
В Errata на STM пишется об этом, что именно на этом входе АЦП происходят эти грабли, поэтому я никогда его не использую для оцифровки. Вот здесь на 13-й странице написано следующее:
Voltage glitch on ADC input 0
Description
A low-amplitude voltage glitch may be generated (on ADC input 0) on the PA0 pin, when the
ADC is converting with injection trigger. It is generated by internal coupling and
synchronized to the beginning and the end of the injection sequence, whatever the
channel(s) to be converted.
The glitch amplitude is less than 150 mV with a typical duration of 10 ns (measured with the
I/O configured as high-impedance input and left unconnected). If PA0 is used as a digital
output, this has no influence on the signal. If PA0 is used has a digital input, it will not be
detected as a spurious transition, providing that PA0 is driven with an impedance lower than
5 kΩ. This glitch does not have any influence on the remaining port A pin or on the ADC
conversion injection results, in single ADC configuration.
When using the ADC in dual mode with injection trigger, and in order to avoid any side
effect, it is advised to distribute the analog channels so that Channel 0 is configured as an
injected channel.
Workaround
None.
0
Выбросы есть на любом входе АЦП. И связаны они не с ошибкой в кристалле, а с физическим принципом работы УВХ. Аналогичное поведение наблюдается и у внешних АЦП со встроенным УВХ. Именно такие АЦП рассматриваются в литературе по приведенным здесь ссылкам.

Приведенная цитата из эрраты говорит о другом глитче, который появляется только при использовании канала ADC0 как инжектированного канала.
0
А как в таком случае правильно подключать сразу два одновременно работающих АЦП (Dual interleaved mode в STM32) к операционному усилителю?
0
Все точно так же. Входы объединить и считать, что это один АЦП, работающий на удвоенной частоте дискретизации.
+1
Огромное спасибо за статью — побольше бы таких работ!

П.С. Помойму ошибочка вот тут: R < 1 / (2^(N+1) * Cувх * Fs), должно быть 2^(N-1)
0
Вроде, всё так. 1/2 LSB — это 1/(2^(N+1)).
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.