Как работает АЦП: напряжение ↔ код
Аналого-цифровой преобразователь (АЦП) переводит непрерывное входное напряжение в целое двоичное число — код. Он делит рабочий диапазон 0…Vref на равные ступени и сообщает, в какую из них попал вход. Именно так микроконтроллер «видит» сигнал с датчика температуры, потенциометра, микрофона или токового шунта: любое измерение внутри цифровой системы начинается с этого шага. Обратная задача — восстановить напряжение по известному коду — нужна при отладке, калибровке и при пересчёте показаний в физические единицы. Опорное напряжение Vref задаёт верхнюю границу диапазона: вход выше Vref упирается в максимальный код и обрезается, поэтому сигнал заранее масштабируют, например резистивным делителем напряжения или буферным усилителем на ОУ.
LSB = Vref / 2ᴺ код = round(Vin / LSB) Vin = код · LSB
число уровней = 2ᴺ макс. код = 2ᴺ − 1 (при Vin ≈ Vref)
Ключевая величина — разрядность N. Число различимых уровней равно 2ᴺ, а код прямо пропорционален входу: во сколько LSB укладывается напряжение, такой и код. При переводе назад напряжение равно коду, умноженному на LSB. Округление до ближайшего уровня (round) означает, что один и тот же код соответствует целому «окошку» напряжений шириной в один LSB, и точное значение внутри окошка теряется — это и есть квантование.
Вес младшего разряда (LSB) и ошибка квантования
Вес младшего разряда LSB = Vref/2ᴺ — это шаг квантования, минимальное изменение напряжения, которое сдвигает код на единицу. Он же задаёт предельную точность идеального АЦП: результат восстанавливается с погрешностью не более ±½ LSB. Эта неустранимая ошибка квантования эквивалентна собственному шуму преобразователя и ограничивает отношение сигнал/шум примерно как 6,02·N + 1,76 дБ — детальнее это считает калькулятор SNR и ENOB. Отсюда правило: если датчик даёт, скажем, 1 мВ полезного изменения, а один LSB равен 13 мВ, восьми разрядов не хватит — сигнал утонет между уровнями. Помогают либо большая разрядность, либо предварительное усиление, либо сужение Vref под реальный размах сигнала.
Точность самого Vref не менее важна, чем разрядность: код зависит от отношения Vin/Vref, поэтому дрейф или шум опоры напрямую переносятся в результат. Для 16-битного преобразователя один LSB при 3,3 В — это уже около 50 мкВ, и на этом уровне значимы наводки, пульсации питания и температурный уход опорного источника. Встроенный в микроконтроллер источник опоры обычно имеет разброс в проценты и заметный температурный коэффициент; там, где важна абсолютная точность, ставят отдельную прецизионную микросхему опоры и разводят её отдельной аналоговой землёй.
Важно различать разрешение и точность: разрешение задаётся числом бит и говорит, насколько мелко дробится шкала, а точность определяется реальными погрешностями — нелинейностью, смещением нуля, ошибкой усиления и шумом. У недорогих АЦП несколько младших разрядов могут «дребезжать» от шума, так что эффективная разрядность (ENOB) оказывается ниже паспортной. Поэтому по одному числу бит нельзя судить о качестве измерения: 12-битный преобразователь с чистой опорой и грамотной разводкой легко переигрывает 16-битный на зашумлённой плате.
Как выбрать разрядность — и почему больше не всегда лучше
Разрядность выбирают под нужное разрешение по напряжению, а не «с запасом на всякий случай». Каждый дополнительный бит уменьшает LSB вдвое, но одновременно удваивает требования к шумам тракта: у 12–16-битного АЦП младшие биты легко тонут в помехах платы, если разводка, фильтрация питания и заземление сделаны небрежно. Часто выгоднее взять умеренную разрядность и грамотно масштабировать сигнал, чем гнаться за числом бит. Второй параметр — частота дискретизации: она определяется теоремой отсчётов, её удобно проверить в калькуляторе Найквиста, а спектральные повторы и зеркальные частоты подавляют антиалиасинговым RC-фильтром перед входом. Разрядность отвечает за точность по амплитуде, частота отсчётов — за верность по времени; это независимые оси, и экономить нельзя ни на одной.
Есть и приём, позволяющий выжать дополнительные биты из имеющегося АЦП, — передискретизация с усреднением (оверсэмплинг). Если частота отсчётов заметно выше необходимой, а в сигнале присутствует небольшой шум, усреднение нескольких выборок сглаживает дрожание кода и повышает эффективное разрешение примерно на один бит при каждом учетверении числа отсчётов. Метод работает только тогда, когда шум сравним с одним LSB: если сигнал абсолютно «чистый» и всегда даёт один и тот же код, усреднять нечего. Поэтому иногда в аналоговый тракт намеренно добавляют слабый шум (дизеринг), чтобы усреднение имело смысл и код перестал залипать на одной ступени.
Разрешение и LSB по разрядности (при Vref = 3,3 В)
Таблица показывает, как дробится шкала 0…3,3 В с ростом N: число уровней и вес одного младшего разряда. Для другого Vref значения LSB масштабируются линейно (LSB = Vref/2ᴺ).
| Разрядность N | Уровней 2ᴺ | LSB при 3,3 В |
| 8 бит | 256 | 12,89 мВ |
| 10 бит | 1 024 | 3,223 мВ |
| 12 бит | 4 096 | 0,806 мВ |
| 14 бит | 16 384 | 0,201 мВ |
| 16 бит | 65 536 | 50,35 мкВ |
| 24 бита | 16 777 216 | 0,197 мкВ |
Где применяют — и где не годится
АЦП стоит на входе почти любой измерительной цепи: снятие показаний с термопар и терморезисторов, оцифровка звука, измерение тока через шунт, чтение положения потенциометра или джойстика, регистрация данных, обратная связь в источниках питания и приводах. По архитектуре чаще всего встречаются АЦП последовательного приближения (SAR) — быстрые и универсальные, и сигма-дельта — медленнее, но с высокой разрядностью для точных измерений постоянных и низкочастотных сигналов. Обратное преобразование кода в напряжение — задача цифро-аналоговых узлов; родственные калькуляторы помогут собрать ЦАП на матрице R-2R или на сглаженной ШИМ (ШИМ-ЦАП). Прямое подключение не годится, если сигнал выходит за 0…Vref, если он высокочастотный и не отфильтрован от алиасинга, или если источник высокоомный — тогда нужен буфер, иначе устройство выборки-хранения не успеет зарядиться и код «поплывёт». Разрядность и точность опоры выбирают под реальный уровень полезного сигнала, а не под красивое число уровней.
Пример
На значениях по умолчанию (Vref = 3,3 В, N = 12 бит, Vin = 1,65 В): число уровней 2¹² = 4096, вес разряда LSB = 3,3/4096 ≈ 0,806 мВ. Код = round(1,65 / 0,000806) = 2048 (в шестнадцатеричном виде 0x800). Напряжение 1,65 В — ровно половина диапазона, поэтому доля шкалы = 50 %, а обратный пересчёт даёт 2048 · 0,806 мВ ≈ 1,65 В. Смените разрядность на 16 бит — и тот же вход даст код 32 768 при LSB ≈ 50,35 мкВ.
См. также: ADC SNR / ENOB · Найквист · делитель напряжения · R-2R ЦАП · ШИМ-ЦАП · все калькуляторы
|