Основы · 18 мин чтения

Что такое операционный усилитель? Формулы усиления, LM358 и схемы с Arduino

Что такое операционный усилитель и как он работает? Формулы усиления инвертирующего и неинвертирующего усилителя, повторитель, компаратор, распиновка LM358 и LM741, однополярное питание и АЦП Arduino.

Операционный усилитель (ОУ, op-amp) — это небольшая микросхема, обычно с восемью выводами, которая умножает крошечную разность напряжений между двумя своими входами в сотни тысяч раз. Это короткий ответ на вопрос что такое операционный усилитель, но само по себе такое огромное усиление не очень полезно. Магия начинается, когда несколько резисторов подают часть выходного сигнала обратно на вход: тогда ОУ превращается в точный усилитель, коэффициент усиления которого задаёт отношение резисторов, в буфер, компаратор или фильтр. От микрофонных предусилителей до датчиков пульса, от модулей весов до звуковых карт — ОУ есть почти в каждом уголке аналоговой электроники.

При работе с Arduino ОУ нужен прежде всего вот почему: многие датчики выдают сигналы уровня милливольт, а АЦП Arduino Uno различает только шаги по 4,88 mV. Термопара типа K при 100 °C выдаёт всего 4,1 mV; если подключить её напрямую, Arduino эту температуру почти не заметит. В этом руководстве разберём правила идеального ОУ, формулы усиления инвертирующего и неинвертирующего усилителя, повторитель напряжения, компаратор, распиновку LM358 и LM741, работу от однополярного питания и согласование сигналов микрофона и термопары с АЦП Arduino, ESP32 и Raspberry Pi Pico — всё на реальных значениях.

Что такое операционный усилитель и как он работает?

У ОУ пять основных выводов: неинвертирующий вход (+), инвертирующий вход (−), выход и два вывода питания (V+ и V−). Он смотрит только на разность между двумя входами и умножает её на коэффициент усиления без обратной связи (A): Vвых = A × (V+ − V−). У LM358 A обычно равен 100 000 (100 dB). Это значит, что разность всего 0,1 mV между входами требует на выходе 10 V; но выход не может выйти за пределы питания, поэтому выход ОУ без обратной связи почти всегда «прилипает» к одной из шин питания, то есть уходит в насыщение. Такое поведение полезно в схемах компараторов. Чтобы получить усилитель, часть выходного сигнала через резисторы подают обратно на инвертирующий вход; это называется отрицательной обратной связью, и с этого момента усиление задают резисторы, а не ОУ.

ПараметрИдеальный ОУLM358 (типично)LM741 (типично)
Коэффициент усиления без обратной связиБесконечный100 000 (100 dB)200 000 (106 dB)
Входной ток (ток смещения)020 nA80 nA
Напряжение смещения нуля03 mV (макс. 7 mV)1 mV (макс. 5 mV)
Произведение усиления на полосу (GBW)Бесконечное0,7 MHzОколо 1 MHz
Скорость нарастания (slew rate)Бесконечная0,3 V/µs0,5 V/µs
Размах выходного напряженияДо шин питанияПочти до 0 V, сверху V+ − 1,5 VНа 1–3 V не доходит до каждой шины
ПитаниеБез ограничений3–30 V однополярное или ±1,5–±15 VРекомендуется ±10–±18 V (LM741C)

Правила идеального ОУ: виртуальное замыкание и нулевой входной ток

  • Правило 1 — входы не потребляют ток: у идеального ОУ бесконечное входное сопротивление, поэтому в выводы + и − ток не течёт. В реальности LM358 потребляет около 20 nA, что даже на резисторе 100 kΩ даёт ошибку всего 2 mV.
  • Правило 2 — виртуальное замыкание: при отрицательной обратной связи выход делает всё, чтобы напряжения на обоих входах сравнялись, поэтому V+ = V−. Входы не соединены между собой, но находятся под одним и тем же напряжением.
  • Практическое правило — выход не может превысить питание: даже если формула требует 12 V, ОУ с питанием 5 V поднимется не выше питания, а LM358 — лишь примерно до 3,5 V. Выход, упёршийся в этот предел, называют ограничением (клиппингом) или насыщением.

С этими правилами почти любую схему на ОУ можно решить на бумаге в несколько строк: сначала найди напряжение на входе +, прими, что вход − находится под тем же напряжением, а затем запиши токи через резисторы по закону Ома. Поскольку ток не может войти во вход, он обязан пройти через резистор обратной связи, и отсюда получается выходное напряжение. Помни: второе правило выполняется только при отрицательной обратной связи. В схемах без обратной связи, например в компараторе, напряжения на входах разные, а выход находится у одной из шин питания. Если хочется освежить расчёты токов и напряжений, загляни в руководство по закону Ома.

Неинвертирующий усилитель: формула усиления и пример

В неинвертирующем усилителе сигнал идёт прямо на вход +. Резистор обратной связи (Rf) включён между выходом и входом −, а резистор на землю (Rg) — между входом − и GND. Эти два резистора образуют делитель напряжения: напряжение на входе − равно Vвых × Rg / (Rf + Rg). По правилу виртуального замыкания оно равно входному, откуда получается формула Vвых = Vвх × (1 + Rf / Rg). При Rf = 10 kΩ и Rg = 1 kΩ усиление равно 11, так что сигнал 100 mV превращается в 1,1 V. Выход меняется в ту же сторону, что и вход, усиление никогда не опускается ниже 1, а входное сопротивление схемы очень высокое, поэтому она не нагружает датчик.

RfRg (Rin в инвертирующей схеме)Неинвертирующее усилениеИнвертирующее усиление
10 kΩ10 kΩ2 (6,0 dB)−1 (0 dB)
47 kΩ10 kΩ5,7 (15,1 dB)−4,7 (13,4 dB)
10 kΩ1 kΩ11 (20,8 dB)−10 (20 dB)
100 kΩ4,7 kΩ22,3 (27,0 dB)−21,3 (26,6 dB)
100 kΩ1 kΩ101 (40,1 dB)−100 (40 dB)
Усиление, его значение в dB и выходное напряжение для своих номиналов резисторов можно посчитать в калькуляторе усиления ОУ; он также заранее предупреждает, когда выход упрётся в предел питания и начнётся ограничение. Чтобы найти ближайший реальный резистор к рассчитанному значению, используй утилиту стандартных номиналов.

Инвертирующий усилитель и виртуальная земля

В инвертирующем усилителе вход + соединён с GND, а сигнал приходит на вход − через резистор Rin; Rf снова стоит между выходом и входом −. По правилу виртуального замыкания на входе − тоже 0 V, хотя с GND он не соединён; это называется виртуальной землёй. Ток Vвх / Rin через Rin не может войти во вход, поэтому обязан пройти через Rf, и выход становится равен Vвых = −(Rf / Rin) × Vвх. При Rin = 10 kΩ и Rf = 47 kΩ усиление равно −4,7: вход 0,5 V даёт на выходе −2,35 V. Знак минус означает, что сигнал инвертируется. Входное сопротивление схемы примерно равно Rin, поэтому она может нагружать датчик с высоким внутренним сопротивлением.

Удачное применение инвертирующей схемы — сумматор (микшер): если подать на вход − несколько сигналов, каждый через свой резистор, выход станет инвертированной взвешенной суммой этих сигналов. Но в схеме на Arduino с однополярным питанием вход + инвертирующего усилителя нужно подключать не к GND, а к опорному напряжению, например к половине питания; иначе положительные входные сигналы требуют отрицательного выхода, и выход «прилипает» к 0 V. В этом случае формула принимает вид Vвых = Vref − (Rf / Rin) × (Vвх − Vref).

Повторитель напряжения (буфер): самая полезная схема с усилением 1

Если соединить выход прямо с входом −, а сигнал подать на вход +, получится повторитель напряжения (буфер). Поскольку Rf равен нулю, а Rg бесконечен, усиление ровно 1 и Vвых = Vвх. Зачем нужна схема, которая ничего не усиливает? Затем, что от входа она почти не потребляет ток, а на выходе может отдавать миллиамперы; то есть превращает источник с высоким импедансом в источник с низким. В даташите ATmega328P сказано, что АЦП лучше всего работает с импедансом источника 10 kΩ или меньше. Делитель напряжения из 100 kΩ + 100 kΩ ведёт себя как источник 50 kΩ, и когда Arduino переключается между каналами, показание может уплыть на несколько шагов. Поставь после делителя повторитель — и проблема исчезнет.

Другие классические применения повторителя: сгладить сигнал ШИМ RC-фильтром и буферизовать его, чтобы получить простой ЦАП; раздать опорное напряжение, снятое с потенциометра, нескольким схемам; вести длинный кабель от выхода ОУ, а не от слабого выхода датчика. При однополярном питании LM358 может повторять сигнал до 0 V, но при питании 5 V не поднимается выше примерно 3,5 V; чтобы буферизовать весь диапазон 0–5 V, выбирай ОУ класса rail-to-rail.

ОУ в роли компаратора

Без обратной связи ОУ становится переключателем, который сравнивает два напряжения: если на входе + напряжение хотя бы на несколько милливольт выше, чем на входе −, выход уходит к верхнему пределу, а если ниже — к 0 V. Хороший пример — ночник без микроконтроллера. Подключи среднюю точку делителя, собранного в порядке 5V, 10 kΩ, LDR, GND, ко входу +, а средний вывод потенциометра — ко входу −. В темноте сопротивление LDR растёт, напряжение средней точки переходит порог, выставленный потенциометром, и светодиод, подключённый к выходу через 330 Ω, загорается. Для этой задачи LM358 подходит, но он медленный: при скорости нарастания 0,3 V/µs выходу нужно больше 10 µs, чтобы подняться от 0 до 3,5 V.

Там, где нужны быстрые и чистые переключения, используют настоящий компаратор, например LM393. У LM393 та же распиновка, что у LM358, но выход у него с открытым коллектором: он может только притягивать выход к GND, а чтобы выход стал высоким, между выходом и питанием нужен подтягивающий резистор (pull-up), например 10 kΩ. Благодаря этому подтяжку можно подключить к 3,3 V и безопасно подавать выход компаратора с питанием 5 V на ESP32 или Pico. Маленькая микросхема рядом с синим подстроечным резистором на датчике звука KY-038, а также на модулях влажности почвы, дождя, пламени и газа — почти всегда LM393.

Модуль датчика звука KY-038 с компаратором LM393
Датчик звука KY-038: сигнал микрофона сравнивается встроенным компаратором LM393 с порогом, заданным подстроечным резистором, и превращается в цифровой выход.

При медленно меняющихся или зашумлённых сигналах около порога выход компаратора может «дребезжать» сотни раз в секунду; ночник в сумерках мерцает. Решение — гистерезис, то есть триггер Шмитта. Подай сигнал на вход + через резистор R1 на 10 kΩ и подключи резистор R2 на 1 MΩ от выхода обратно ко входу +. При каждом переключении выхода эта положительная обратная связь немного сдвигает порог; разница между порогами срабатывания при нарастании и спаде составляет примерно размах выхода × R1 / R2. При выходе с размахом 0–5 V получается 5 × 10k / 1M = гистерезис 50 mV, и обычно этого хватает, чтобы «проглотить» шум. Ту же идею можно реализовать программно с двумя отдельными порогами; пример для ESP32 ниже делает именно это.

LM393 — не ОУ: у него нет внутренней частотной коррекции, поэтому в усилительной схеме с отрицательной обратной связью он возбуждается, а без подтягивающего резистора его выход никогда не становится высоким. И наоборот, ОУ можно использовать как компаратор, но на быстрых сигналах он не успевает. Коротко: для усиления выбирай ОУ, для обнаружения порога — компаратор.

Распиновка LM358 и LM741

Два ОУ, которые чаще всего встречаются в любительской электронике, — двухканальный LM358 и классический одноканальный LM741. Оба выпускаются в 8-выводном корпусе DIP. Если держать микросхему так, чтобы маркировка читалась, а ключ (выемка) смотрел влево, вывод 1 окажется слева внизу, а номера растут против часовой стрелки. Распиновки разные, поэтому просто вставить одну микросхему вместо другой нельзя:

ВыводLM358 (сдвоенный ОУ)LM741 (одиночный ОУ)
11OUT — выход AOffset null (балансировка нуля)
21IN− — инвертирующий вход AИнвертирующий вход (−)
31IN+ — неинвертирующий вход AНеинвертирующий вход (+)
4GND (V−)V− (отрицательное питание)
52IN+ — неинвертирующий вход BOffset null (балансировка нуля)
62IN− — инвертирующий вход BВыход
72OUT — выход BV+ (положительное питание)
8VCC (V+)NC (не подключён)
ПараметрLM358LM741MCP6002
Каналов212
Питание3–30 V, однополярноеРекомендуется двуполярное ±10–±18 V1,8–6 V, однополярное
При однополярном питании 5 VРаботаетПрактически не работаетРаботает
При 3,3 VПлохо (на выходе не более ~1,8 V)Не работаетОчень хорошо
Входной диапазонОт 0 V до V+ − 1,5 VНа ~3 V не доходит до шинДо 0,3 V за пределы шин
Выходной диапазон (при 5 V)~0,02–3,5 VНепригоден0,025–4,975 V (rail-to-rail)
GBW / скорость нарастания0,7 MHz / 0,3 V/µs~1 MHz / 0,5 V/µs1 MHz / 0,6 V/µs
Ток потребления0,35 mA на канал1,7 mA0,1 mA на канал

LM741 — звезда учебников с 1968 года, но он рассчитан на симметричное питание, например ±15 V: напряжение на его входах должно отстоять от шин питания примерно на 3 V, а на выходе — на 1–3 V. При однополярном питании 5 V после вычета этих запасов полезного диапазона не остаётся; если схема на LM741 не работает от пина 5V платы Arduino, причина именно в этом. LM358, напротив, создавался для однополярного питания: его входной диапазон включает 0 V, выход может подойти к 0 V на несколько милливольт, и единственный недостаток — сверху он упирается в V+ − 1,5 V. На платах с 3,3 V, таких как ESP32 и Pico, используй ОУ класса rail-to-rail, например MCP6002; распиновка у него та же, что у LM358, поэтому он просто встаёт в схему на его место. Если нужны четыре канала, 14-выводной LM324 — четырёхканальный «родственник» LM358.

Если вставить микросхему задом наперёд или перепутать выводы питания, ОУ нагреется и выйдет из строя за считаные секунды. Перед установкой проверь ключ и запомни: у LM358 8 = VCC, 4 = GND, а у LM741 7 = V+, 4 = V−. Между выводами питания каждого ОУ, как можно ближе к микросхеме, ставь керамический конденсатор на 100 nF.

Однополярное питание: виртуальная земля и rail-to-rail

Большинство схем на ОУ в учебниках используют симметричное питание вроде ±15 V, и сигнал колеблется по обе стороны от 0 V. В мире Arduino обычно есть только 5 V или 3,3 V. Для сигналов постоянного тока, которые всегда остаются положительными, например от термопары, шунта или LM35, это не проблема: их можно усиливать напрямую ОУ, входной диапазон которого включает 0 V. А вот переменные сигналы, которые уходят и в плюс, и в минус, как сигнал микрофона, сначала нужно поднять к середине питания. Для этого двумя резисторами создают напряжение средней точки и ставят рядом конденсатор 10 µF, чтобы уменьшить шум. Эту точку называют виртуальной землёй или опорной; сигнал накладывается на неё через разделительный конденсатор.

  • Выбери подходящий ОУ: модели, входной диапазон которых не включает 0 V, например LM741 или TL072, при однополярном питании неожиданно ограничивают сигнал; используй LM358, LM324 или MCP6002.
  • Учитывай пределы выхода: выход LM358 при 5 V охватывает примерно 0,02–3,5 V, поэтому для переменных сигналов средняя точка около 1,8 V сбалансированнее, чем 2,5 V. MCP6002 подходит к обеим шинам примерно на 25 mV, так что его средняя точка может быть ровно VCC/2.
  • Питай ОУ от того же напряжения, что и плату: ОУ с питанием 12 V при неправильном усилении может подать на пин ESP32 или Pico больше 10 V.
  • Используй общую GND: земли датчика, ОУ и платы должны быть соединены; почему — объясняет руководство про общую землю.
  • Не оставляй неиспользуемый канал «висеть»: включи свободную половину LM358 повторителем (выход на вход −), а её вход + подключи к GND или к средней точке; «висящие» входы могут вызвать самовозбуждение и лишнее потребление тока.

Усиление сигнала микрофона: предусилитель для электретного микрофона

Чувствительность электретных микрофонов обычно около −44 dBV/Pa, то есть даже при громком звуковом давлении 94 dB они выдают всего около 6 mV. Обычная речь с расстояния в метр даёт около 0,1 mV, а хлопок прямо возле микрофона может дойти до нескольких десятков милливольт. При шаге Arduino в 4,88 mV такой сигнал либо вообще не виден, либо меняется лишь на несколько шагов; этим же объясняется, почему аналоговый выход модулей вроде датчика звука KY-038 такой слабый. Решение — неинвертирующий усилитель переменного сигнала с усилением около 100. В схеме ниже используется канал A микросхемы LM358:

ЭлементНоминалПодключение
Резистор питания микрофона2,2 kΩМежду 5V и выводом + микрофона (вывод − микрофона на GND)
Разделительный конденсатор C11 µFОт вывода + микрофона к выводу 3 LM358 (1IN+)
Резисторы средней точки100 kΩ и 56 kΩ100 kΩ от вывода 3 к 5V, 56 kΩ от вывода 3 к GND (около 1,8 V)
Обратная связь Rf100 kΩМежду выводом 1 (1OUT) и выводом 2 (1IN−)
Rg и C21 kΩ + 10 µFПоследовательно от вывода 2 к GND (вывод − конденсатора C2 на GND)
ПитаниеВыводы 8 и 4Вывод 8 к 5V, вывод 4 к GND, между ними 100 nF
ВыходВывод 1Arduino Uno A0 (ESP32 GPIO 34, Pico GP26: с MCP6002 и питанием 3,3 V)

Благодаря конденсатору C2 на постоянном токе схема — повторитель с усилением 1; в тишине выход стоит в средней точке, около 1,8 V. А на звуковых частотах C2 ведёт себя как короткое замыкание, и усиление становится 1 + 100k / 1k = 101 (40 dB). Нижнюю частоту среза задают Rg и C2: 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. Верхнюю границу определяет произведение усиления на полосу ОУ: у LM358 0,7 MHz / 101 ≈ 7 kHz, для речи этого достаточно. Если нужно больше усиления, помни, что полоса сужается во столько же раз; если требуется усиление 1000, лучше разделить его на два каскада примерно по 32.

C++ (Arduino IDE)
1// LM358 mikrofon ön yükselteci ile ses seviyesi / Sound level with an LM358 mic preamp
2const int MIC_PIN = A0;                // LM358 pin 1 (1OUT)
3const float GAIN = 101.0;              // 1 + 100k / 1k
4const unsigned long WINDOW_MS = 50;    // ölçüm penceresi / sampling window
5
6void setup() {
7  Serial.begin(115200);
8}
9
10void loop() {
11  int minV = 1023, maxV = 0;
12  unsigned long start = millis();
13  while (millis() - start < WINDOW_MS) {   // 50 ms boyunca örnekle / sample for 50 ms
14    int v = analogRead(MIC_PIN);
15    if (v < minV) minV = v;
16    if (v > maxV) maxV = v;
17  }
18  float ppVolt = (maxV - minV) * 5.0 / 1023.0;   // tepe-tepe çıkış / peak-to-peak output
19  float micMv = ppVolt * 1000.0 / GAIN;          // mikrofonun kendi sinyali / the mic's own signal
20
21  Serial.print("Çıkış / output: ");
22  Serial.print(ppVolt, 3);
23  Serial.print(" V p-p   Mikrofon / mic: ");
24  Serial.print(micMv, 2);
25  Serial.println(" mV p-p");
26}

Код в течение 50 мс набирает столько отсчётов, сколько успевает, находит минимальное и максимальное значения и переводит разность в вольты; это размах звукового сигнала (от пика до пика). Если разделить результат на 101, получится напряжение, которое выдаёт сам микрофон. В тихой комнате выход меняется лишь на несколько шагов АЦП (0,01–0,02 V), а хлопок рядом легко превышает 1 V. Если сигнал ограничивается, то есть выход упирается в 0 V или 3,5 V, уменьши Rf до 47 kΩ. Как сделать измерение стабильнее, рассказано в руководстве по фильтрации данных датчиков.

Усиление сигнала термопары: термопара типа K и LM358

Термопара типа K вырабатывает небольшое напряжение, пропорциональное разности температур на спае, где соединены два разных металла: примерно 41 µV/°C. При 100 °C получается 4,1 mV, при 500 °C — 20,6 mV, при 1000 °C — 41,3 mV. При прямом подключении к Arduino один шаг АЦП (4,88 mV) соответствует примерно 119 °C; это не измерение. Неинвертирующий усилитель с усилением 101 на канале B микросхемы LM358 поднимает сигнал до 4,14 mV/°C: теперь один шаг — около 1,2 °C, а выходной предел LM358 в 3,5 V позволяет измерять примерно до 700–800 °C в зависимости от смещения. Подключение: вывод + термопары к выводу 5 (2IN+), вывод − к GND; Rf = 100 kΩ между выводами 7 и 6, Rg = 1 kΩ между выводом 6 и GND; вывод 7 идёт на A1 платы Arduino. У термопары типа K алюмелевый провод, то есть вывод −, слегка магнитится — удобный способ различить выводы.

На самом деле термопара измеряет разность между горячим спаем и холодным спаем, где её провода соединяются с медными проводниками. Чтобы получить реальную температуру, температуру холодного спая нужно измерить отдельно и прибавить; это называется компенсацией холодного спая. В коде ниже для этого используется LM35, установленный прямо рядом с клеммами подключения (выход на A2). Кроме того, входное смещение LM358 в 3–7 mV тоже умножается на 101 и создаёт на выходе ошибку 0,3–0,7 V, то есть 70–170 °C. Код измеряет это смещение при запуске и вычитает его из последующих показаний, поэтому включай плату, когда щуп находится при комнатной температуре.

C++ (Arduino IDE)
1// K tipi termokupl + LM358 (kazanç 101) + LM35 soğuk uç / K-type thermocouple + LM358 (gain 101) + LM35 cold junction
2const int TC_PIN = A1;           // LM358 pin 7 (2OUT)
3const int LM35_PIN = A2;         // LM35 çıkışı / LM35 output
4const float GAIN = 101.0;        // 1 + 100k / 1k
5const float MV_PER_C = 0.041;    // K tipi: yaklaşık 41 µV/°C / K-type: about 41 µV/°C
6float zeroMv = 0;                // açılışta ölçülen ofset / offset measured at power-up
7
8float readMv(int pin) {
9  long sum = 0;
10  for (int i = 0; i < 64; i++) sum += analogRead(pin);   // 64 okumanın ortalaması / average of 64 readings
11  return sum / 64.0 * 5000.0 / 1023.0;
12}
13
14void setup() {
15  Serial.begin(115200);
16  delay(500);
17  zeroMv = readMv(TC_PIN);       // prob oda sıcaklığında olmalı / probe must be at room temperature
18  Serial.print("Ofset / offset: ");
19  Serial.print(zeroMv, 1);
20  Serial.println(" mV");
21}
22
23void loop() {
24  float coldC = readMv(LM35_PIN) / 10.0;           // LM35: 10 mV/°C
25  float tcMv = (readMv(TC_PIN) - zeroMv) / GAIN;   // termokupl gerilimi / thermocouple voltage
26  float hotC = coldC + tcMv / MV_PER_C;            // soğuk uç telafisi / cold-junction compensation
27
28  Serial.print("Ortam / ambient: ");
29  Serial.print(coldC, 1);
30  Serial.print(" °C   Prob / probe: ");
31  Serial.print(hotC, 1);
32  Serial.println(" °C");
33  delay(500);
34}
Если смещение отрицательное, выход «прилипает» к 0 V, и схема ничего не показывает, пока напряжение термопары не превысит это смещение; если при запуске с A1 читается смещение очень близкое к нулю, происходит именно это. Смещение LM358 к тому же дрейфует с температурой, а приближение 41 µV/°C точно лишь в пределах нескольких градусов в диапазоне от 0 до 500 °C. Для задач, где нужна точность, например для печей, 3D-принтеров или термообработки, используй модуль MAX6675 или MAX31855 со встроенной компенсацией холодного спая и цифровым выходом либо прецизионный ОУ с нулевым дрейфом (zero-drift).

Согласование с АЦП Arduino: как уложить сигнал в нужный диапазон

Настоящая задача ОУ в проектах на Arduino — перенести сигнал датчика в тот диапазон, где АЦП использует его эффективнее всего. Правило простое: максимум сигнала должен приближаться к верху диапазона АЦП, но не заходить в края, где ОУ и АЦП работают нелинейно. Например, LM35 в диапазоне 0–50 °C выдаёт 0–500 mV; при прямом чтении на Uno разрешение получается 0,49 °C на шаг. Если усилить тот же сигнал в 6,6 раза до 0–3,3 V, разрешение уменьшится до 0,074 °C. Вот расчёт по шагам:

  1. Определи выходной диапазон датчика: выпиши из даташита минимальное и максимальное выходное напряжение (LM35, 0–50 °C: 0–0,5 V).
  2. Выбери целевой диапазон: безопасная зона — примерно 0,02–3,5 V для Uno с LM358, 0,15–2,5 V для ESP32 и 0,03–3,25 V для Pico с MCP6002.
  3. Рассчитай усиление: G = целевой максимум / максимум датчика = 3,3 / 0,5 = 6,6. Чтобы в неинвертирующем усилителе 1 + Rf / Rg = 6,6, выбери Rf = 56 kΩ и Rg = 10 kΩ.
  4. Убери смещение: если датчик работает в диапазоне, который начинается не с нуля, например 1–2 V, сначала вычти опорное напряжение (Vref в инвертирующем усилителе или дифференциальный усилитель), а потом усиливай.
  5. Защити и отфильтруй: поставь последовательный резистор 1 kΩ между выходом ОУ и пином АЦП и 100 nF между пином и GND. Такой RC-фильтр подавляет шум выше примерно 1,6 kHz и ограничивает аварийный ток в пин.
  6. Пересчитай в программе: раздели измеренное напряжение на усиление, чтобы получить реальное напряжение датчика (Vдатчика = Vadc / G); чтобы точно знать усиление, измерь резисторы мультиметром.
ПлатаАЦПРекомендуемый входной диапазонШагАналоговые пины
Arduino Uno10 бит0–5 V (0–1,1 V с внутренним опорным напряжением)4,88 mV (1,07 mV)A0–A5
ESP3212 битОколо 0,15–2,5 V (ослабление 11 dB по умолчанию)~0,8 mVGPIO 32–39 (ADC1, работают и при включённом Wi-Fi)
Raspberry Pi Pico12 бит0–3,3 V0,81 mVGP26, GP27, GP28
Для очень маленьких сигналов на Uno команда analogReference(INTERNAL) снижает опорное напряжение АЦП до 1,1 V и уменьшает шаг до 1,07 mV; иногда дополнительный каскад на ОУ вообще не нужен. Но в этом режиме вход выше 1,1 V приводит к насыщению показаний. Подробнее об АЦП — в руководстве АЦП и аналого-цифровое преобразование.

Чтение выхода ОУ на ESP32: включение хлопком

ESP32 работает от 3,3 V, поэтому ту же схему микрофона собери на MCP6002 и питай от пина 3V3; для средней точки возьми два резистора по 100 kΩ (1,65 V). Если питать LM358 от 5 V, его выход может дойти до 3,5 V и перегрузить пин ESP32. Подключи выход ОУ к GPIO 34 — одному из каналов ADC1, которые работают и при включённом Wi-Fi. Код ниже измеряет размах сигнала в окнах по 20 мс, использует откалиброванные значения в милливольтах из analogReadMilliVolts() и программно реализует гистерезис с двумя отдельными порогами: каждый хлопок переключает встроенный светодиод. Если плата используется впервые, начни с шагов настройки из руководства Что такое ESP32.

C++ (Arduino IDE)
1// ESP32: MCP6002 mikrofon yükselteci ile el çırpma anahtarı / ESP32: clap switch with an MCP6002 mic preamp
2const int MIC_PIN = 34;      // MCP6002 çıkışı, ADC1 kanalı / MCP6002 output, ADC1 channel
3const int LED_PIN = 2;       // dahili LED / onboard LED
4const int ON_MV = 800;       // üst eşik, mV tepe-tepe / upper threshold, mV peak-to-peak
5const int OFF_MV = 300;      // alt eşik: histerezis / lower threshold: hysteresis
6
7bool loud = false;
8bool ledOn = false;
9
10void setup() {
11  Serial.begin(115200);
12  pinMode(LED_PIN, OUTPUT);
13}
14
15void loop() {
16  int minMv = 3300, maxMv = 0;
17  unsigned long start = millis();
18  while (millis() - start < 20) {                // 20 ms pencere / 20 ms window
19    int mv = analogReadMilliVolts(MIC_PIN);      // kalibre edilmiş mV / calibrated mV
20    if (mv < minMv) minMv = mv;
21    if (mv > maxMv) maxMv = mv;
22  }
23  int pp = maxMv - minMv;
24
25  if (!loud && pp > ON_MV) {                     // üst eşik aşıldı: alkış / upper threshold crossed: a clap
26    loud = true;
27    ledOn = !ledOn;
28    digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
29    Serial.printf("Alkış / clap: %d mV p-p\n", pp);
30    delay(250);                                  // yankıları yok say / ignore echoes
31  } else if (loud && pp < OFF_MV) {              // ses alt eşiğin altına indi / sound fell below the lower threshold
32    loud = false;
33  }
34}

Raspberry Pi Pico и MicroPython: измерение тока с помощью шунта

Ещё одна практическая задача для ОУ — измерение тока. Если поставить шунт 0,1 Ω между минусовым проводом мотора или светодиодной ленты и GND, ток 1 A создаст на нём падение всего 100 mV. Неинвертирующий усилитель на MCP6002 (Rf = 100 kΩ, Rg = 4,7 kΩ) умножает это напряжение на 22,3: теперь 1 A превращается в 2,23 V, и при диапазоне Pico в 3,3 V можно измерять примерно до 1,45 A. Верхний вывод шунта идёт на вывод 3 MCP6002, а выход ОУ (вывод 1) — на пин GP26 (ADC0) платы Pico; ОУ питается от пина 3V3(OUT), а GND источника питания нагрузки соединяется с GND Pico. При 1,5 A на шунте рассеивается 0,225 W, поэтому бери резистор мощностью не менее 0,5 W.

MicroPython
1# Pico: 0,1 Ω şönt + MCP6002 (kazanç 22,3) ile akım ölçümü / current sensing with a 0.1 Ω shunt + MCP6002 (gain 22.3)
2from machine import ADC
3import time
4
5adc = ADC(26)                 # GP26 = ADC0, MCP6002 pin 1
6VREF = 3.3
7GAIN = 1 + 100000 / 4700      # Rf = 100k, Rg = 4.7k -> 22.3
8SHUNT = 0.1                   # şönt direnci, ohm / shunt resistance, ohms
9
10def read_volts(n=100):
11    total = 0
12    for _ in range(n):        # 100 okumanın ortalaması / average of 100 readings
13        total += adc.read_u16()
14    return total / n * VREF / 65535
15
16zero = read_volts()           # yük kapalıyken ofset / offset with the load off
17print("Sıfır / zero: {:.3f} V".format(zero))
18
19while True:
20    v_out = read_volts() - zero
21    amps = v_out / GAIN / SHUNT           # I = V / R
22    print("Akım / current: {:.3f} A".format(max(amps, 0)))
23    time.sleep(0.5)

При запуске, когда нагрузка выключена, код измеряет смещение ОУ и вычитает его из последующих показаний; усреднение 100 измерений подавляет шум АЦП. Для больших токов уменьши сопротивление шунта или усиление; падение напряжения на шунте и рассеиваемую мощность проверь в калькуляторе закона Ома. Если нужно готовое решение, датчик тока ACS712 на эффекте Холла измеряет ток, сохраняя нагрузку гальванически изолированной от твоей схемы. Если Pico настраивается впервые, установка MicroPython описана в руководстве Что такое Raspberry Pi Pico.

Другие схемы на ОУ

СхемаФормула / поведениеГде применяется?
Сумматор (микшер)Vвых = −Rf × (V1/R1 + V2/R2 + …)Аудиомикшер, объединение нескольких сигналов
Дифференциальный усилительVвых = (R2 / R1) × (V2 − V1)Удаление смещения, измерение разности между двумя точками
Инструментальный усилительБольшое усиление, задаваемое одним резистором, отличное подавление синфазного сигналаТензодатчики, мосты Уитстона, биомедицинские сигналы
ИнтеграторКонденсатор в цепи обратной связи; выход — интеграл входного сигнала по времениГенератор треугольного сигнала, ПИ-регулирование
Активный фильтр (Sallen-Key)Фильтрация 2-го порядка на двух резисторах и двух конденсаторахЗвуковые фильтры, фильтр против наложения спектров (anti-aliasing) перед АЦП
Триггер ШмиттаКомпаратор с положительной обратной связью, два отдельных порогаЧистый цифровой выход из зашумлённого сигнала

Для мостовых датчиков вроде тензодатчиков, у которых оба выхода находятся на середине питания, а разница между ними — всего несколько милливольт, практичнее готовые микросхемы: HX711 содержит усилитель с усилением до 128 и 24-битный АЦП. А ОУ на плате датчика пульса и усиливает, и фильтрует слабый сигнал светочувствительного элемента, поэтому Arduino с первой попытки видит чёткую пульсовую волну.

Датчик пульса Pulse Sensor
Pulse Sensor: ОУ на плате усиливает и фильтрует крошечное изменение света, отражённого от пальца; в покое выход находится на половине напряжения питания.

Идеи проектов с ОУ

  • Лампа, включаемая хлопком: управляй модулем реле с помощью микрофонного предусилителя и кода для ESP32 с гистерезисом.
  • VU-метр: преврати размах сигнала в столбик на светодиодной ленте WS2812B, который поднимается в такт музыке.
  • Термометр для духовки: измеряй температуру до 500 °C с усилителем термопары и выводи значение на OLED-дисплей.
  • Ночник без кода: сделай светодиод, который загорается в темноте, на LDR и компараторе на LM358, без всякого микроконтроллера.
  • Электронные весы: считывай тензодатчик через HX711 и собери кухонные весы с точностью до грамма.
  • Монитор тока мотора: измеряй ток мотора робота-машинки шунтом и ОУ и останавливай мотор, когда ток растёт из-за заклинивания.

Частые ошибки и как их исправить

СимптомВероятная причинаРешение
Выход всё время на 0 V или на максимумеНет обратной связи или она подключена не к тому входу; слишком большое усиление; входной сигнал вне входного диапазонаПроверь, что Rf идёт на вход −, уменьши усиление, убедись, что вход находится между 0 и V+ − 1,5 V
Схема на LM741 не работает при 5 VLM741 нужно симметричное и более высокое питаниеИспользуй LM358 или MCP6002
Выход не поднимается выше 3,5 VВыход LM358 останавливается на V+ − 1,5 VПодбери усиление с учётом этого или используй ОУ класса rail-to-rail
Шумные, скачущие показанияНет блокировочного конденсатора по питанию, длинные провода, неоправданно большое усиление100 nF на выводах питания, короткие провода, RC-фильтр на выходе, усреднение в программе
Схема самовозбуждаетсяОУ напрямую нагружен длинным кабелем или большой ёмкостной нагрузкойПоставь на выходе последовательный резистор 100–470 Ω
Выход компаратора никогда не становится высокимУ LM393 открытый коллектор, а подтяжки нетПодключи 4,7–10 kΩ между выходом и питанием
Повреждён пин ESP32 или PicoОУ питался от 5 V или 12 V, и выход превысил 3,3 VПитай ОУ от 3,3 V или добавь на выходе делитель и ограничительный диод
При малых сигналах выход застрял на 0 VОтрицательное входное смещение при однополярном питании прижимает выход к нулюИспользуй прецизионный ОУ или подай на вход небольшое напряжение смещения
При поиске неисправности в схеме на ОУ сначала измерь мультиметром напряжение на обоих входах. В исправно работающем усилителе с отрицательной обратной связью разница между входами + и − не превышает нескольких милливольт. Если разница большая, ОУ в насыщении: выход упёрся в одну из шин питания, а причина — в усилении, входном диапазоне или оборванной цепи обратной связи. Как проводить само измерение, рассказано в руководстве как пользоваться мультиметром.

ОУ — это переводчик, который переводит аналоговый мир на язык, понятный микроконтроллеру: зная два правила и две формулы усиления, можно подготовить для АЦП любой сигнал, будь то микрофон, термопара, шунт или мостовой датчик. Чтобы попробовать разные значения, воспользуйся калькулятором усиления ОУ; в приложении BlueGrays есть аналоговые проекты — измерение освещённости с LDR, ночник, цифровой вольтметр, измерение температуры с NTC, датчики пламени и газа — шаг за шагом, со схемами и кодом.

Частые вопросы

Для чего нужен операционный усилитель?

ОУ используют, чтобы усиливать слабые сигналы, сравнивать два напряжения, складывать или вычитать сигналы, фильтровать их и буферизовать источники с высоким импедансом. В проектах на Arduino его чаще всего применяют, чтобы поднять сигналы уровня милливольт от микрофона, термопары или шунта до уровня, который может прочитать АЦП.

Как рассчитать усиление ОУ?

У неинвертирующего усилителя усиление равно 1 + Rf / Rg, у инвертирующего — −Rf / Rin. Например, при Rf = 100 kΩ и Rg = 1 kΩ неинвертирующее усиление равно 101, а инвертирующее — −100. В децибелах это 20 × log10(усиление).

Чем LM358 отличается от LM741?

В LM358 два ОУ в одном корпусе, он работает от однополярного питания 3–30 V, а его входной диапазон включает 0 V, поэтому его можно напрямую использовать с 5 V от Arduino. LM741 — одиночный ОУ, рассчитанный на симметричное питание вроде ±15 V, и при однополярном питании 5 V он практически не работает. Распиновка у них тоже разная.

Может ли ОУ работать от однополярного питания 5 V?

Да, модели, рассчитанные на однополярное питание, например LM358, LM324 и MCP6002, работают. Для переменных сигналов вход нужно поднять к середине питания и учитывать пределы выхода; выход LM358 при питании 5 V поднимается только примерно до 3,5 V.

Чем ОУ отличается от компаратора?

В ОУ есть частотная коррекция, чтобы он стабильно работал с отрицательной обратной связью, а его выход может и отдавать, и принимать ток. Компараторы вроде LM393 рассчитаны на быстрое переключение без обратной связи, и у большинства из них выход с открытым коллектором, которому нужен подтягивающий резистор. ОУ можно использовать как медленный компаратор, но компаратор не стоит использовать как усилитель.

Что такое ОУ класса rail-to-rail?

У ОУ класса rail-to-rail вход или выход может приблизиться к напряжениям питания на несколько десятков милливольт. Например, MCP6002 при питании 5 V выдаёт на выходе 0,025–4,975 V, а LM358 поднимается только примерно до 3,5 V. На платах с 3,3 V, таких как ESP32 и Raspberry Pi Pico, чтобы использовать весь диапазон АЦП, нужен ОУ класса rail-to-rail.

Все проекты
Измерение освещённости с LDR
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
139
Ночник на LDR
#12Новичок

Ночник на LDR

Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

4.8(102)
205
Измерение освещённости модулем LDR на ESP32
#113Новичок

Измерение освещённости модулем LDR на ESP32

Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

4.6(36)
55
Цифровой вольтметр с LCD-дисплеем
#56Средний
Premium

Цифровой вольтметр с LCD-дисплеем

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

4.5(27)
36
Измерение температуры с NTC и LCD-дисплеем 2x16
#44Новичок
Premium

Измерение температуры с NTC и LCD-дисплеем 2x16

Измерь температуру вокруг с помощью датчика, похожего на крошечную бусинку. Эта деталь, NTC, при нагреве легче пропускает электричество; Arduino читает это изменение, по формуле переводит его в градус

4.5(33)
44
Работа с датчиком пламени
#50Средний
Premium

Работа с датчиком пламени

Маленький страж, который замечает огонь на кухне или в мастерской раньше тебя. Датчик пламени улавливает невидимый свет, который испускает огонь; пока всё в порядке, горит зелёный светодиод, а когда о

4.6(33)
44
Работа с датчиком газа
#51Новичок
Premium

Работа с датчиком газа

Маленький страж, который замечает утечку газа на кухне раньше тебя. Датчик газа всё время «принюхивается» к воздуху; пока всё в порядке, горит зелёный светодиод, а когда газа в воздухе становится боль

4.6(37)
50
Регулировка яркости светодиода потенциометром на ESP32 (аналог → PWM)
#115Средний
Premium

Регулировка яркости светодиода потенциометром на ESP32 (аналог → PWM)

В этом проекте яркость светодиода плавно регулируется потенциометром. Пин АЦП ESP32 читает напряжение 0–3,3V с потенциометра, затем это значение превращается в сигнал PWM (широтно-импульсная модуляция) и подаётся на светодиод. В результате при повороте потенциометра светодиод постепенно становится ярче или тусклее. В Arduino Core 3.0+ можно сразу использовать analogWrite(); на ESP32-S2/S3 разрешение АЦП фиксировано — 12 бит.

4.5(19)
32