Перейти к содержанию

Как подать звуковой сигнал на АЦП Arduino?

Обновлено Редакция GAW

АЦП Arduino UNO измеряет напряжение только от 0 до опорного, обычно 5 В, а звуковой сигнал переменный — он в равной мере уходит выше и ниже нуля. Поэтому его сдвигают на середину диапазона: постоянную составляющую отсекает конденсатор, а уровень 2,5 В задаёт делитель.

Пассивная схема

Сигнал через конденсатор C подают на точку между двумя резисторами по 10 кОм, включёнными от 5 В на общий провод. Делитель держит вход на 2,5 В, а для конденсатора оба резистора работают параллельно — 5 кОм. Это заодно укладывается в рекомендацию даташита: источник для АЦП — не больше 10 кОм. Конденсатор и резисторы образуют фильтр верхних частот:

fc=12π⋅R⋅C.f_c = \frac{1}{2\pi \cdot R \cdot C}.

TI советует ставить эту частоту на две декады ниже самой низкой частоты сигнала.

C при R = 5 кОмЧастота срезаПодходит для сигнала от
1 мкФ32 Гц3,2 кГц
10 мкФ3,2 Гц320 Гц
100 мкФ0,32 Гц32 Гц

Посчитать другие сочетания поможет калькулятор RC-фильтра.

Когда нужен усилитель

Шаг 10-битного АЦП при опорном 5 В — около 4,9 мВ. Сигнал с амплитудой 50 мВ займёт всего десяток шагов в каждую сторону, и форма потеряется. Тогда сигнал усиливают операционным усилителем с однополярным питанием: делитель задаёт половину питания на неинвертирующем входе, и выход в покое стоит на середине — как в прил. A.3.18 справочника TI. При питании 5 В берут ОУ с выходом rail-to-rail: у LM358 выход не доходит до плюса питания примерно на 1,5 В, и верх волны срежется. Готовая схема с расчётом — усилитель на ОУ для АЦП, а основы — в статье «Операционный усилитель».

Частота выборки

Сам АЦП ATmega328P делает до 15 тыс. выборок в секунду, но для полных 10 бит его тактовая частота должна быть 50–200 кГц. На 16 МГц ближайший подходящий предделитель — 128: 16 МГц / 128 / 13 тактов ≈ 9,6 тыс. выборок в секунду, как у analogRead(), и звук до 4,8 кГц. Всё, что выше половины частоты выборки, превратится в ложные низкие частоты, поэтому перед входом ставят фильтр нижних частот. Как АЦП выбирает и измеряет — в статье «АЦП».

Похожие вопросы

Можно ли подать сигнал с линейного выхода прямо на аналоговый вход?

Только через конденсатор и смещение. Звуковой сигнал переменный и уходит ниже нуля, а ATmega328P по даташиту допускает на выводе не меньше −0,5 В. Без смещения отрицательная половина волны не измеряется и может повредить вход.

Какую частоту звука может оцифровать Arduino UNO?

С analogRead() — около 9,6 тыс. выборок в секунду, то есть звук до 4,8 кГц: на 16 МГц предделитель 128 даёт АЦП 125 кГц, а преобразование длится 13 тактов. Предделитель 64 даёт 250 кГц и больше выборок, но выше 200 кГц Microchip не гарантирует полное разрешение 10 бит.

Какое опорное напряжение выбрать для слабого звукового сигнала?

Внутреннее опорное ATmega328P 1,1 В: шаг АЦП станет около 1,07 мВ вместо 4,9 мВ при 5 В. Смещение входа тогда ставят на середину этого диапазона — около 0,55 В, а амплитуда сигнала не должна превышать 0,55 В.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 24.1 — до 15 тыс. выборок в секунду при полном разрешении 10 бит; 24.4 — для полного разрешения тактовая частота АЦП 50–200 кГц, преобразование 13 тактов АЦП; 24.6.1 — источник с выходным сопротивлением до 10 кОм, составляющие выше половины частоты выборки убирают фильтром нижних частот; 24.7 — код 0x000 соответствует общему проводу, 0x3FF — опорному напряжению минус шаг; 24.2 — внутреннее опорное 1,1 В; 29.1 — напряжение на выводе от −0,5 В до VCC + 0,5 В
  2. Mancini R. (ed.). Op Amps For Everyone. Texas Instruments, SLOD006B, 2002 — прил. A.3.18 — инвертирующий усилитель переменного тока с однополярным питанием: делитель задаёт VCC/2, выход в покое на середине питания; уравнение A-26 — частота среза разделительной RC-цепи; её ставят на две декады ниже самой низкой частоты сигнала
  3. Texas Instruments. LM358, LM358A, LM358B, LM358BA, LM2904x Industry-Standard Dual Operational Amplifiers (SLOS068AB, October 2024) — разд. 5.7 — у LM358 выход при питании 5 В не доходит до V+ примерно на 1,5 В

Нашли ошибку?