Что такое операционный усилитель? Формулы усиления, 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) |
| Входной ток (ток смещения) | 0 | 20 nA | 80 nA |
| Напряжение смещения нуля | 0 | 3 mV (макс. 7 mV) | 1 mV (макс. 5 mV) |
| Произведение усиления на полосу (GBW) | Бесконечное | 0,7 MHz | Около 1 MHz |
| Скорость нарастания (slew rate) | Бесконечная | 0,3 V/µs | 0,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, а входное сопротивление схемы очень высокое, поэтому она не нагружает датчик.
| Rf | Rg (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) |
Инвертирующий усилитель и виртуальная земля
В инвертирующем усилителе вход + соединён с 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.

При медленно меняющихся или зашумлённых сигналах около порога выход компаратора может «дребезжать» сотни раз в секунду; ночник в сумерках мерцает. Решение — гистерезис, то есть триггер Шмитта. Подай сигнал на вход + через резистор R1 на 10 kΩ и подключи резистор R2 на 1 MΩ от выхода обратно ко входу +. При каждом переключении выхода эта положительная обратная связь немного сдвигает порог; разница между порогами срабатывания при нарастании и спаде составляет примерно размах выхода × R1 / R2. При выходе с размахом 0–5 V получается 5 × 10k / 1M = гистерезис 50 mV, и обычно этого хватает, чтобы «проглотить» шум. Ту же идею можно реализовать программно с двумя отдельными порогами; пример для ESP32 ниже делает именно это.
Распиновка LM358 и LM741
Два ОУ, которые чаще всего встречаются в любительской электронике, — двухканальный LM358 и классический одноканальный LM741. Оба выпускаются в 8-выводном корпусе DIP. Если держать микросхему так, чтобы маркировка читалась, а ключ (выемка) смотрел влево, вывод 1 окажется слева внизу, а номера растут против часовой стрелки. Распиновки разные, поэтому просто вставить одну микросхему вместо другой нельзя:
| Вывод | LM358 (сдвоенный ОУ) | LM741 (одиночный ОУ) |
|---|---|---|
| 1 | 1OUT — выход A | Offset null (балансировка нуля) |
| 2 | 1IN− — инвертирующий вход A | Инвертирующий вход (−) |
| 3 | 1IN+ — неинвертирующий вход A | Неинвертирующий вход (+) |
| 4 | GND (V−) | V− (отрицательное питание) |
| 5 | 2IN+ — неинвертирующий вход B | Offset null (балансировка нуля) |
| 6 | 2IN− — инвертирующий вход B | Выход |
| 7 | 2OUT — выход B | V+ (положительное питание) |
| 8 | VCC (V+) | NC (не подключён) |
| Параметр | LM358 | LM741 | MCP6002 |
|---|---|---|---|
| Каналов | 2 | 1 | 2 |
| Питание | 3–30 V, однополярное | Рекомендуется двуполярное ±10–±18 V | 1,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/µs | 1 MHz / 0,6 V/µs |
| Ток потребления | 0,35 mA на канал | 1,7 mA | 0,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.
Однополярное питание: виртуальная земля и 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) |
| Разделительный конденсатор C1 | 1 µF | От вывода + микрофона к выводу 3 LM358 (1IN+) |
| Резисторы средней точки | 100 kΩ и 56 kΩ | 100 kΩ от вывода 3 к 5V, 56 kΩ от вывода 3 к GND (около 1,8 V) |
| Обратная связь Rf | 100 kΩ | Между выводом 1 (1OUT) и выводом 2 (1IN−) |
| Rg и C2 | 1 kΩ + 10 µF | Последовательно от вывода 2 к GND (вывод − конденсатора C2 на GND) |
| Питание | Выводы 8 и 4 | Вывод 8 к 5V, вывод 4 к GND, между ними 100 nF |
| Выход | Вывод 1 | Arduino 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.
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. Код измеряет это смещение при запуске и вычитает его из последующих показаний, поэтому включай плату, когда щуп находится при комнатной температуре.
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}Согласование с АЦП Arduino: как уложить сигнал в нужный диапазон
Настоящая задача ОУ в проектах на Arduino — перенести сигнал датчика в тот диапазон, где АЦП использует его эффективнее всего. Правило простое: максимум сигнала должен приближаться к верху диапазона АЦП, но не заходить в края, где ОУ и АЦП работают нелинейно. Например, LM35 в диапазоне 0–50 °C выдаёт 0–500 mV; при прямом чтении на Uno разрешение получается 0,49 °C на шаг. Если усилить тот же сигнал в 6,6 раза до 0–3,3 V, разрешение уменьшится до 0,074 °C. Вот расчёт по шагам:
- Определи выходной диапазон датчика: выпиши из даташита минимальное и максимальное выходное напряжение (LM35, 0–50 °C: 0–0,5 V).
- Выбери целевой диапазон: безопасная зона — примерно 0,02–3,5 V для Uno с LM358, 0,15–2,5 V для ESP32 и 0,03–3,25 V для Pico с MCP6002.
- Рассчитай усиление: G = целевой максимум / максимум датчика = 3,3 / 0,5 = 6,6. Чтобы в неинвертирующем усилителе 1 + Rf / Rg = 6,6, выбери Rf = 56 kΩ и Rg = 10 kΩ.
- Убери смещение: если датчик работает в диапазоне, который начинается не с нуля, например 1–2 V, сначала вычти опорное напряжение (Vref в инвертирующем усилителе или дифференциальный усилитель), а потом усиливай.
- Защити и отфильтруй: поставь последовательный резистор 1 kΩ между выходом ОУ и пином АЦП и 100 nF между пином и GND. Такой RC-фильтр подавляет шум выше примерно 1,6 kHz и ограничивает аварийный ток в пин.
- Пересчитай в программе: раздели измеренное напряжение на усиление, чтобы получить реальное напряжение датчика (Vдатчика = Vadc / G); чтобы точно знать усиление, измерь резисторы мультиметром.
| Плата | АЦП | Рекомендуемый входной диапазон | Шаг | Аналоговые пины |
|---|---|---|---|---|
| Arduino Uno | 10 бит | 0–5 V (0–1,1 V с внутренним опорным напряжением) | 4,88 mV (1,07 mV) | A0–A5 |
| ESP32 | 12 бит | Около 0,15–2,5 V (ослабление 11 dB по умолчанию) | ~0,8 mV | GPIO 32–39 (ADC1, работают и при включённом Wi-Fi) |
| Raspberry Pi Pico | 12 бит | 0–3,3 V | 0,81 mV | GP26, GP27, GP28 |
Чтение выхода ОУ на 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.
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.
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 с первой попытки видит чёткую пульсовую волну.

Идеи проектов с ОУ
- Лампа, включаемая хлопком: управляй модулем реле с помощью микрофонного предусилителя и кода для ESP32 с гистерезисом.
- VU-метр: преврати размах сигнала в столбик на светодиодной ленте WS2812B, который поднимается в такт музыке.
- Термометр для духовки: измеряй температуру до 500 °C с усилителем термопары и выводи значение на OLED-дисплей.
- Ночник без кода: сделай светодиод, который загорается в темноте, на LDR и компараторе на LM358, без всякого микроконтроллера.
- Электронные весы: считывай тензодатчик через HX711 и собери кухонные весы с точностью до грамма.
- Монитор тока мотора: измеряй ток мотора робота-машинки шунтом и ОУ и останавливай мотор, когда ток растёт из-за заклинивания.
Частые ошибки и как их исправить
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Выход всё время на 0 V или на максимуме | Нет обратной связи или она подключена не к тому входу; слишком большое усиление; входной сигнал вне входного диапазона | Проверь, что Rf идёт на вход −, уменьши усиление, убедись, что вход находится между 0 и V+ − 1,5 V |
| Схема на LM741 не работает при 5 V | LM741 нужно симметричное и более высокое питание | Используй 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
Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

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

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

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

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

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

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

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

