?

Log in

No account? Create an account

Previous Entry | Next Entry

Демоны в АЦП STM32

DSC_9526_s

Немного освоившись с ЦАП 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». Это подтолкнуло к написанию данного поста (updated).



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

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

ch1_min

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

ch1_mid

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

ch1_max

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

Чтобы не появлялась погрешность измерения, за время выборки конденсатор УВХ должен успевать заряжаться до входного напряжения с точностью не хуже 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.

ch1_min_ch2_max

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

ch1_min_ch2_mid

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

ch1_max_ch2_mid

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

ch1_max_ch2_min

АЦП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-цепочки учитывается внутренняя емкость УВХ и сопротивление ключа.

adc_model

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

adc_vin

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

adc_vin_4n7

Чтобы не прибегать к моделированию, номиналы 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 мкс/дел.):

100R

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

1K

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

1K_100PF

Поэтому совет "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-цепочка еще не ограничивает спектр полезного сигнала, но уже приводит к появлению ошибки по DC. Средний входной ток иногда рассматривается при описании сигма-дельта АЦП, для них оцифровка более медленных сигналов, чем позволяет сам АЦП, является типичной ситуацией.

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

Comments

leoniv
Feb. 21st, 2014 05:27 pm (UTC)
В AVR такие же грабли, только они намного менее заметные, так как скорость и разрядность АЦП ниже.

В datasheet ничего нет про внешний конденсатор на входе АЦП, поэтому про эти 300 Ом там ничего быть не может.
Viktor Gorbunov
Feb. 22nd, 2014 07:31 am (UTC)
Да, в AVR тоже приходилось осциллографом смотреть выбросы на входе АЦП. Но там это пришлось делать при оцифровке очень коротких, 50мкс, импульсов, и частоты АЦП были запредельными.

CD00211314.pdf полезный документ. 1.2.6 Effect of the source capacitance and parasitic capacitance of the PCB. Впрочем, есть серьезные подозрения, что вы его уже читали.

Не могу точно найти, откуда этот резистор взялся. Помню несколько дней непоняток, почему такой хреновый АЦП, и решение в виде 330 Ом на входах. Ошибки возрастали при меньшем, и большем сопротивлении, это проверяли. В памяти отложилось "Do not place any external capacitor" но из какой оперы... Теперь во всех схемах RC и после него 330 Ом. Или внешний АЦП. У меня до сих пор стойкое ощущение, что в AVR АЦП как минимум, не хуже, хоть и меньшей разрядности.
leoniv
Feb. 22nd, 2014 07:45 am (UTC)
Этот документ - это AN2834, который я упоминал несколько раз. В нем местами даются вредные советы.

Если Вы ставите RC, то непонятно, затем тогда 330 Ом. На выходе RC получите погрешность, которую никакой резистор потом не исправит. Поэтому в самой RC-цепочке номинал R не должен превышать определенного значения. Причем 330 Ом - это только для частоты выборок 100 кГц.

АЦП в AVR отличный для своей скорости и разрядности. Те, кто его ругают, просто не умеют его использовать.
Viktor Gorbunov
Feb. 22nd, 2014 09:57 am (UTC)
RC для среза ВЧ перед АЦП. В моем конкретном применении частота дискретизации низкая, поэтому R может быть большим, а вот шум доставал изрядно, RCR получено экспериментальным путем. Нечто вроде 2к-0.47мкФ пленка-330Е.
leoniv
Feb. 22nd, 2014 01:11 pm (UTC)
Резистор 330 Ом в таком включении никаких функций не выполняет, это лишний элемент. Цепочка 2к-0.47мкФ накладывает ограничение на максимальную частоту выборок, если ее сделать больше 16 кГц, то станут заметными ошибки, описанные в этом посте. Кроме аппаратной фильтрации, шум можно фильтровать программно.
Viktor Gorbunov
Feb. 22nd, 2014 02:21 pm (UTC)
Выполняет, именно в нем и оказалась вся хитрость. Отвязывает вход АЦП от RC фильтра, без него шум возрастает раз в 5 по мощности. Фильтр нужен, а конденсатор нельзя подключать ко входу. Железка приемная, особой точности не требуется, и полоса до 500Гц.
Не могу утверждать, что это единственно верное решение, но получено экспериментально. Думаю, если бы все заработало сразу, как в книжке, то и смысла в топике бы не было.
Документацию бы ST научиться более однозначно писать...
leoniv
Feb. 22nd, 2014 02:53 pm (UTC)
Мистика. Сопротивление ключей мультиплексора АЦП порядка 1 кОм. Лишние 330 Ом погоды не делают. Почему возрастает мощность шума? Почему нельзя подключать конденсатор ко входу? Какова физика явления?
Viktor Gorbunov
Feb. 22nd, 2014 03:12 pm (UTC)
Может, ключи нестабильные, или очень нелинейные. Или возбуждаются на ВЧ, по типу, как параллельно включенные полевики.
Естественно, начали с того, что подали через делитель опору на вход, с конденсатором, и получили 4 бита шума. На АВР в тех же условиях вполне получалось 1LSB. Резистор уменьшил их до 2 бит, 4LSB что хреново, но терпимо. Не вспомню точно, что именно еще делали.
Еще у нас 2 квадратурных канала, меряются одним АЦП, разными каналами, и смешивать их через перезаряд входной емкости нехорошо, потом компенсировать проникновение нужно.
В продвинутой версии железки подключили SPI ADC c 4 диф входами, и о проблеме забыли.
Вообще, единого рецепта не получится, надо на конкретной плате пробовать. Если честно, мне бы хотелось узнать, что у вас с этим резистором экспериментально получится, потому что не любитель мистики :)
leoniv
Feb. 22nd, 2014 04:45 pm (UTC)
По порядку:
- стабильность сопротивления ключей не играет роли, в конце зарядки емкости УВХ ток равен нулю, сопротивление не влияет. Лишь бы оно было не больше какого-то предела.
- линейность ключей тоже не играет роли. Нелинейность приведет лишь к отклонению формы напряжения при зарядке от экспоненты. Но это не имеет значения.
- возбуждение ключей на ВЧ вряд ли возможно.
- внешний АЦП принципиально ничем не отличается от встроенного, если конечно в нем нет входного буфера. Со входным током будут сходные проблемы, я недавно убедился в этом на практике, когда подключал ADS8328 к STM32F407. И методы борьбы - те же. Основной недостаток встроенного АЦП - это то, что он находится рядом с шумящей цифровой схемой. Здесь очень важно правильно развести печатную плату, особенно в части аналоговой земли. Раз у Вас проблемы не с ошибкой среднего значения напряжения, а с шумами, то к теме этого поста проблема не имеет никакого отношения. Скорее всего, проблема в разводке платы.
- на своей плате я вижу шум АЦП примерно 1LSB, изредка может дергаться второй бит (на вход АЦП подан выход встроенного ЦАП). Разницы при добавлении резистора 330 Ом последовательно со входом АЦП после цепочки 1 кОм 100 нФ заметить не смог.

Latest Month

June 2018
S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930

Tags

Page Summary

Powered by LiveJournal.com
Designed by Jamison Wieser