Параллельное соединение цифровых потенциометров


Привет всем!

Сидел как-то я и обдумывал схему. Надо было мне управлять коэффициентом усиления (Kус) ОУ. В схеме присутствует МК, так что первая мысль, которая меня посетила — поставить цифровой потенциометр (ЦП). Никогда с ними не работал и жуть как интересно. Тем более, что недавно один семпл я получил по халяве. Это AS1507 – сдвоенный ЦП на 256 шагов с SPI и EEPROM. Но речь не о нем.

Мне пришел в голову вопрос. Поскольку шагов всего 256, то какие ближайшие номиналы сопротивлений мне надо выставить и с какой точностью я могу получить Kус?

Давайте подсчитаем. Коэффициент усиления в схеме должен быть равен 10. Инвертирующий усилитель. Кус задается соотношением сопротивлений R2 и R1. ЦП у меня на 10кОм.

По подсчетам, чтобы получить Кус = 10, нужно на одном плече выставить 9090,9 Ом. На втором плече будет 909,09 Ом. А какие ближайшие сопротивления нам может предложить ЦП? В MS Excel’e по-быстрому была построена табличка возможных значений сопротивлений ЦП. Ближайшими оказались 9101,56 или 976,56. Тогда в первом случае

Кус = 9101,56/(10000-9101,56)= 10,13,

а во втором:

Кус = (10000-976,56)/976,56=9,24.

В первом случае получается очень даже не плохо. Но что, если нужно точнее?

Тут меня посещает идея. Наверняка она посещала кого-то еще. И вполне вероятно, что уже где-то реализована. Но, что если два потенциометра, находящихся в одном корпусе микросхемы, соединить параллельно? Тогда, задавая на каждом из них различные значения сопротивлений, по идее, можно добиться бОльшей точности.

Ну что ж. Вопрос задан. Хочется идею проверить.
Рассматриваем ЦП с линейно изменяемым сопротивлением.
Все мы помним, что при параллельном соединении, общее сопротивление двух проводников находится по формуле: R1*R2/(R1+R2).

Уже в матлабе строим таблицу вида:



где шаг значений R1 и R2 равен общему сопротивлению, деленному на количество шагов, т.е. в моем случае
10000/256 = 39,0625Ом.
Ячейки таблицы имеют значение параллельного сопротивления соответствующих значений R1 и R2. Ниже главной диагонали значения повторяются.

Итак. Все возможные варианты эквивалентного сопротивления мы получили. Не понятно только с каким шагом сопротивление меняется, какова линейность и какие коды в ЦП нужно загрузить, что бы получить желаемый результат.

Самый простой вариант — это отсортировать таблицу по значениям общего сопротивления. В итоге получаем итоговую таблицу:



Всего получилось 31869 уникальных значений (примерно 2^15 значений), т.е. как если бы у нас был 15 битный ЦП.
Если построить график всех значений сопротивлений, то получится следующее:



Тут по вертикали эквивалентное сопротивление, а по горизонтали позиция данного значения в отсортированном массиве.

Первое, что бросается в глаза — это крутой «хвост». Значит это, что начиная с, примерно, 4500 Ом выставить сопротивление получится уже с меньшей точностью, чем в середине графика.

Есть у него еще одна особенность, помимо крутого «хвоста». Если присмотреться, то вначале график колеблется. Вам тут конечно же не видно, щас покажу поближе:



О линейности и равномерности говорить не приходится.

И немного статистики. Как видно из графиков прирост эквивалентного сопротивления не линеен. Построим гистограмму, показывающую как часто встречается прирост в то или иное значение сопротивления:



По гистограмме можно сказать, что в подавляющем большинстве случаев прирост эквивалентного сопротивления составляет не более 0,4 Ом, Прирост выше 0,5 Ом встречается редко.

Выводы:
Таким вот образом точность повысить можно. Причем если взять ЦП на 1000 положений, при параллельном соединении в итоге получится чуть меньше полумилиона уникальных значений (все равно, что 18-19 битный ЦП). Другой вопрос «и че с этим делать?». Ну… в память того же МК как есть всю таблицу засунуть сложно. Памяти STM32 точно не хватит. Это значит использовать внешнюю память. Тем более, сложно делать запрос на то или иное значение. Да и надо ли?
Лучше таблицу прорядить и выбрать желаемые, но уже более точные значения сопротивлений.

P.S. Это моя первая статья. В русском ни разу не грамотный. Так что, не пинайте строго) Критика приветствуется.
  • +12
  • 12 августа 2012, 02:54
  • eddytep

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

RSS свернуть / развернуть
Ближайшими оказались 9101,56 или 976,56.
эээ… ближайшими откуда? неужели из стандартного ряда?..
0
Ближайший из значений, который может выдать цифровой потенциометр. В случае, когда шкала у ЦП линейная, с каждым шагом сопротивление у него будет изменяться на одно и то же значение. В моем случае на 10кОм/256шагов = 39,0625Ом. Если записать все возможные значения сопротивления ЦП, то ближайшим (в идеале конечно) будет 9101,56 Ом.
0
А если не извращаться, а последовательно поставить еще один резистор с меньшим полным сопротивлением (например 1к или меньше, если есть)?
0
Вот, например DS1845E-010 Maxim'овский — 250 Ом. С его помощью можно точность повысить раз в 40… Благо стоит недорого.
0
Многое зависит от того, надо вам использовать весь диапазон изменения сопротивления в схеме, или только его малую часть.

К примеру, если вам нужно всего лишь, например, 9 ком +-10% регулировки, но с высокой точностью — то достаточно простой схемы, используемой чуть ли не сотню лет. Ставится постоянный резистор с сопротивлением немного больше требуемого, (например, 10-12 ком), параллельно ему — переменный резистор включенный реостатом (2 выводами), с дополнительным постоянным резистором, который совместно с основным определит предел регулировки при нулевом значении переменного. Номинал переменного при своем максимальном значении, совместно с постоянными определит верхний предел регулировки.
Так можно растянуть на всю шкалу регулирови переменного резистора хоть 1% эквивалентного сопротивления всей цепочки.
0
  • avatar
  • SWG
  • 12 августа 2012, 10:35
0.5 Ом это конечно здорово, но надо добавить сюда дифференциальную нелинейность в +-1 lsb и пересчитать картинки, особенно гистограмму
0
  • avatar
  • _pv
  • 12 августа 2012, 13:21
и можно без многомегабайтных таблиц обойтись.
r = r1*r2/(r1+r2) => r1 = r*r2/(r2-r)
при заданном r пробежаться по всем значениям r2 все-то 256 или 1024, и выбрать наиболее подходящее.
но из-за диффнелинейности от соединения двух таких резисторов точность вырастет не 256 раз, а всего лишь в корень из 2. так что про 18-19 разрядов можно забыть.
0
  • avatar
  • _pv
  • 12 августа 2012, 13:36
а может посоветуете что по теме почитать? В частности про дифференциальную нелинейность. В общем виде я понимаю что и как, но вот что дает ваша гистограмма не очень улавливаю… В смысле понятно что разброс больше, но хотелось бы теории…
0
производитель не гарантирует что размер каждого бита (разницы между двумя соседними значениями сопротивления) из возможных 256 положений будет одинаковый.
соответственно если мы хотим получить например 2кОма сделав 4к || 4к, или же 3к || 6к, что должно дать те же самые 2к
то значение соответствующее 4К согласно даташиту имеет право на самом деле отличаться от него на +- 40 Ом.
при этом значение 6К может отличаться в другую сторону на те же 40Ом, в результате при разных установках соответствующих одному и тому же сопротивлению получим: 4.04 || 4.04 = 2020Ом, либо 3 || 5.96 = 1995Ом, то есть разброс в 25Ом, что несколько выше насчитанных автором 0.5 Ом.
и 18-19 разрядов абсолютной точности из двух 10битных резисторов по той же причине не получить никак.
0
Ух вот оно как… понял… спасибо.
0
Идея очень интересная. Плюсую.

В русском ни разу не грамотный.

Да ну. Вы даже «не» и «ни» различаете! И "-тся"/"-ться" правильно пишете… Это в наши дни почти невероятно, особенно, если Вам меньше тридцати. :D

Вообще статья очень приятно читается. В первом приближении ничего не режет глаз.
+4
  • avatar
  • _YS_
  • 12 августа 2012, 14:42
Это в наши дни почти невероятно, особенно, если Вам меньше тридцати
Эт точно…
0
Спасибо за отзывы! :)
Да, действительно, в этой статье многое не учтено. Диф. нелинейность, как заметил _pv . Не самое рациональное схемотехническое решение, как заметили SergRuan и SWG . Более того во многих проектах такая точность не нужна. В моем случае, перед тем как проверять идею и писать статью я уже знал, что в своем проекте ЦП использовать не буду. Мне проще и дешевле погрешность усиления корректировать математически средствами того же МК. Но идея заразна)
0
Добавлю пару копеек.
1. Разброс величины ЦП +/-25% от образца к образцу (см. End-to-End Resistance). И такой разброс у всех ЦП, за исключением одного семейства ЦП Intersil, где разброс определяется внешним к ЦП постоянным резистором. Но эти ЦП имеют сильно ограниченную полосу рабочих частот.
2. В нижнем пределе установки ЦП надо учитывать сопротивление переключателя. Для данного ЦП это 200 Ом (смю Wiper Resistance).
3. Практически есть 2 метода увеличения точности подстройки при серийных изделиях:
— Сужение диапазона подстройки последовательным включением постоянного резистора. Если, например, последовательный резистор в 9 раз больше, то результирующая точность подстройки от образца к образцу будет +/-2,5% при сокращении диапазона регулирования до 10%. Следует учитывать также разброс последовательного резистора. Но 1%-ые резисторы распространены широко.
— Параллельное подключение к ЦП постоянного резистора с меньшей величиной, чем ЦП. Например, если параллельный резистор в 11 раз меньше и имеет 1% точности, то общий разброс будет примерно 2,5%.
0
  • avatar
  • Myron
  • 13 августа 2012, 06:28
Вот это да! Как раз интересующая тема, вот прям как под заказ:)

Я тоже рассматривал три варианта повышения разрядности ЦП: последовательное включение, параллельное включение, и послед., но разных номиналов. Навскидку прикинул (в уме), что посл. соед. 2-х одинаковых резюков это +1 разряд и такое дело не годится если нужно, например, 14-16 разрядов, про параллельное соединение тоже думал и тоже интуитивно догадался о нелинейности, а с разными номиналами также есть проблемка: маленькие номиналы — относительная редкость.

Тут надо считать и выбирать самый оптимальный результат. Либо как-то умудряться прикручивать ЦАП.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.