Разрядность АЦП и шаг квантования
Урок про то, на сколько уровней АЦП режет напряжение и какой шаг при этом получается.
Разрядность $N$ — число бит АЦП; он делит диапазон на $2^N$ уровней, шаг между ними называется LSB (младший значащий разряд).
АЦП не может выдать любое число — только один из конечного набора уровней. Чем больше бит, тем мельче шаг и точнее представлен сигнал. Понимание шага квантования помогает выбрать АЦП под нужное разрешение.
Число уровней и шаг
$N$-битный АЦП с опорным напряжением $V_{ref}$ даёт $2^N$ уровней. Шаг квантования:
$$ \text{LSB} = \frac{V_{ref}}{2^N} $$
def lsb(vref, bits):
return vref / 2**bits
for bits in (8, 10, 12, 16):
step_mv = lsb(5.0, bits) * 1000
levels = 2**bits
print(bits, "бит:", levels, "уровней, шаг", round(step_mv, 4), "мВ")Вывод:
8 бит: 256 уровней, шаг 19.5312 мВ 10 бит: 1024 уровней, шаг 4.8828 мВ 12 бит: 4096 уровней, шаг 1.2207 мВ 16 бит: 65536 уровней, шаг 0.0763 мВ
Код в напряжение и обратно
АЦП выдаёт целый код $D$ от 0 до $2^N - 1$. Перевод в напряжение:
$$ V = \frac{D}{2^N - 1}\,V_{ref} $$
def code_to_volt(D, vref=3.3, bits=10):
return D * vref / (2**bits - 1)
print(round(code_to_volt(0), 4), "В")
print(round(code_to_volt(512), 4), "В")
print(round(code_to_volt(1023), 4), "В")Вывод:
0.0 В 1.6516 В 3.3 В
Как работает под капотом
Каждый дополнительный бит вдвое уменьшает шаг и вдвое увеличивает число уровней. Но реальная точность ограничена не только разрядностью: шум, нелинейность самого АЦП и качество опорного напряжения часто «съедают» младшие биты. Поэтому 16-битный АЦП может давать эффективных, скажем, 13–14 «честных» бит. Опорное напряжение $V_{ref}$ — критичный элемент: если оно плавает, плавает и весь пересчёт кода в вольты.
Частые ошибки
- Делить на $2^N$ вместо $2^N - 1$ при переводе кода в напряжение — край шкалы не достигнет $V_{ref}$.
- Считать, что 16 бит дают 16 честных бит точности — шум урезает разрешение.
- Игнорировать нестабильность $V_{ref}$ — она сдвигает все показания.
Итог
- $N$-битный АЦП даёт $2^N$ уровней с шагом $\text{LSB} = V_{ref}/2^N$.
- Код переводится в напряжение через $V = D\,V_{ref}/(2^N - 1)$.
- Реальная точность ограничена шумом и качеством $V_{ref}$, а не только числом бит.