O que é um amplificador operacional? Fórmulas de ganho, LM358 e circuitos com Arduino
O que é um amp-op e como funciona? Fórmulas de ganho inversor e não inversor, buffer, comparador, pinagem do LM358 e do LM741, fonte simples e ADC do Arduino.
Um amp-op (amplificador operacional) é um pequeno circuito integrado, normalmente de oito pinos, que multiplica por centenas de milhares a minúscula diferença de tensão entre as suas duas entradas. Essa é a resposta curta para o que é um amplificador operacional, mas um ganho tão grande sozinho não serve para muita coisa. A mágica acontece quando alguns resistores levam parte da saída de volta para a entrada: aí o amp-op vira um amplificador preciso com ganho definido por uma razão entre resistores, um buffer, um comparador ou um filtro. De pré-amplificadores de microfone a sensores de pulso, de módulos de balança a placas de som, há um amp-op em quase todo canto da eletrônica analógica.
Quando você trabalha com Arduino, o principal motivo para precisar de um amp-op é este: muitos sensores produzem sinais na faixa dos milivolts, enquanto o ADC do Arduino Uno só consegue distinguir degraus de 4,88 mV. Um termopar tipo K produz só 4,1 mV a 100 °C; ligado direto, o Arduino mal percebe essa temperatura. Neste guia você vai aprender as regras do amp-op ideal, as fórmulas de ganho inversor e não inversor, o seguidor de tensão, o comparador, a pinagem do LM358 e do LM741, o funcionamento com fonte simples e como adaptar sinais de microfone e de termopar ao ADC de um Arduino, de um ESP32 e de um Raspberry Pi Pico, tudo com valores reais.
O que é um amplificador operacional e como ele funciona?
Um amp-op tem cinco terminais básicos: a entrada não inversora (+), a entrada inversora (−), a saída e dois pinos de alimentação (V+ e V−). Ele só olha a diferença entre as duas entradas e a multiplica pelo seu ganho em malha aberta (A): Vout = A × (V+ − V−). No LM358, A é tipicamente 100.000 (100 dB). Isso quer dizer que uma diferença de apenas 0,1 mV entre as entradas pede 10 V na saída; mas a saída não pode passar da alimentação, então a saída de um amp-op sem realimentação quase sempre gruda em um dos trilhos, ou seja, satura. Esse comportamento é útil em circuitos comparadores. Para montar um amplificador, parte da saída volta para a entrada inversora através de resistores; isso se chama realimentação negativa e, a partir daí, quem define o ganho são os resistores, e não o amp-op.
| Característica | Amp-op ideal | LM358 (típico) | LM741 (típico) |
|---|---|---|---|
| Ganho em malha aberta | Infinito | 100.000 (100 dB) | 200.000 (106 dB) |
| Corrente de entrada (polarização) | 0 | 20 nA | 80 nA |
| Tensão de offset de entrada | 0 | 3 mV (7 mV máx.) | 1 mV (5 mV máx.) |
| Produto ganho-largura de banda (GBW) | Infinito | 0,7 MHz | Cerca de 1 MHz |
| Taxa de variação (slew rate) | Infinita | 0,3 V/µs | 0,5 V/µs |
| Excursão da saída | Até os trilhos | Perto de 0 V, V+ − 1,5 V no topo | 1–3 V para dentro de cada trilho |
| Alimentação | Ilimitada | 3–30 V simples ou ±1,5–±15 V | ±10–±18 V recomendado (LM741C) |
Regras do amp-op ideal: curto-circuito virtual e corrente de entrada zero
- Regra 1 – As entradas não puxam corrente: um amp-op ideal tem resistência de entrada infinita, então nenhuma corrente entra nos pinos + e −. Na prática, o LM358 puxa cerca de 20 nA, o que causa um erro de só 2 mV mesmo sobre um resistor de 100 kΩ.
- Regra 2 – Curto-circuito virtual: com realimentação negativa, a saída faz o que for preciso para deixar as duas entradas na mesma tensão, ou seja, V+ = V−. As entradas não estão ligadas entre si, mas ficam na mesma tensão.
- Regra prática – A saída não passa da alimentação: mesmo que a fórmula peça 12 V, um amp-op alimentado com 5 V só chega até a alimentação, e um LM358 só até cerca de 3,5 V. Uma saída presa nesse limite está em ceifamento (clipping) ou saturação.
Com essas regras você resolve quase qualquer circuito com amp-op no papel em poucas linhas: primeiro encontre a tensão na entrada +, considere que a entrada − está na mesma tensão e depois escreva as correntes nos resistores com a lei de Ohm. Como a corrente não pode entrar na entrada, ela tem de passar pelo resistor de realimentação, e isso dá a tensão de saída. Lembre: a segunda regra só vale quando há realimentação negativa. Em circuitos sem realimentação, como o comparador, as entradas ficam em tensões diferentes e a saída fica em um dos trilhos. Se quiser revisar cálculos de corrente e tensão, dê uma olhada no guia da lei de Ohm.
Amplificador não inversor: fórmula de ganho e exemplo
No amplificador não inversor, o sinal vai direto para a entrada +. Um resistor de realimentação (Rf) vai da saída até a entrada −, e um resistor de terra (Rg) vai da entrada − até o GND. Esses dois resistores formam um divisor de tensão: a tensão na entrada − é Vout × Rg / (Rf + Rg). Pela regra do curto-circuito virtual, ela é igual à entrada, o que dá a fórmula Vout = Vin × (1 + Rf / Rg). Com Rf = 10 kΩ e Rg = 1 kΩ, o ganho é 11, então um sinal de 100 mV vira 1,1 V. A saída se move no mesmo sentido da entrada, o ganho nunca fica abaixo de 1 e a resistência de entrada do circuito é muito alta, então ele não carrega o sensor.
| Rf | Rg (Rin no circuito inversor) | Ganho não inversor | Ganho inversor |
|---|---|---|---|
| 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) |
Amplificador inversor e terra virtual
No amplificador inversor, a entrada + vai ao GND e o sinal chega à entrada − por um resistor Rin; Rf de novo fica entre a saída e a entrada −. Pela regra do curto-circuito virtual, a entrada − também está em 0 V, mas não está ligada ao GND; isso se chama terra virtual. A corrente Vin / Rin que passa por Rin não pode entrar na entrada, então tem de passar por Rf, e a saída fica Vout = −(Rf / Rin) × Vin. Com Rin = 10 kΩ e Rf = 47 kΩ, o ganho é −4,7: uma entrada de 0,5 V dá uma saída de −2,35 V. O sinal de menos indica que o sinal é invertido. A resistência de entrada do circuito é mais ou menos Rin, então ele pode carregar um sensor com resistência interna alta.
Um bom uso da topologia inversora é o amplificador somador (mixer): ligue vários sinais à entrada −, cada um pelo seu próprio resistor, e a saída vira a soma ponderada e invertida desses sinais. Em um circuito Arduino com fonte simples, porém, você precisa ligar a entrada + de um amplificador inversor a uma referência, como metade da alimentação, em vez do GND; caso contrário, entradas positivas pedem uma saída negativa e a saída gruda em 0 V. Nesse caso, a fórmula fica Vout = Vref − (Rf / Rin) × (Vin − Vref).
Seguidor de tensão (buffer): o circuito mais útil com ganho 1
Ligue a saída direto na entrada − e leve o sinal à entrada +, e você tem um seguidor de tensão (buffer). Como Rf é zero e Rg é infinito, o ganho é exatamente 1 e Vout = Vin. Por que um circuito que não amplifica é útil? Porque ele quase não puxa corrente da entrada, mas consegue entregar miliampères na saída; ele transforma uma fonte de alta impedância em uma de baixa impedância. O datasheet do ATmega328P diz que o ADC funciona melhor com uma impedância de fonte de 10 kΩ ou menos. Um divisor de tensão de 100 kΩ + 100 kΩ se comporta como uma fonte de 50 kΩ e, quando o Arduino alterna entre canais, a leitura pode variar alguns degraus. Coloque um seguidor depois do divisor e o problema some.
Outros usos clássicos do seguidor: suavizar um sinal PWM com um filtro RC e passá-lo por um buffer para fazer um DAC simples, compartilhar entre vários circuitos uma tensão de referência tirada de um potenciômetro e acionar um cabo longo a partir da saída de um amp-op em vez de uma saída fraca de sensor. Com fonte simples, o LM358 consegue seguir até 0 V, mas com 5 V de alimentação não passa de cerca de 3,5 V; se quiser bufferizar toda a faixa de 0–5 V, escolha um amp-op rail-to-rail.
O amp-op como comparador
Usado sem realimentação, o amp-op vira uma chave que compara duas tensões: se a entrada + estiver nem que seja alguns milivolts acima da entrada −, a saída vai para o limite superior; se estiver abaixo, a saída vai para 0 V. Uma luz noturna sem microcontrolador é um bom exemplo. Ligue à entrada + o ponto médio de um divisor montado na ordem 5V, 10 kΩ, LDR, GND, e à entrada − o cursor de um potenciômetro. No escuro, a resistência do LDR sobe, a tensão do ponto médio cruza o limiar que você ajustou no potenciômetro e um LED ligado à saída por 330 Ω acende. O LM358 dá conta desse trabalho, mas é lento: com uma taxa de variação de 0,3 V/µs, a saída precisa de mais de 10 µs para subir de 0 a 3,5 V.
Para trabalhos que precisam de transições rápidas e limpas, usa-se um comparador de verdade, como o LM393. O LM393 tem a mesma pinagem do LM358, mas a saída dele é de coletor aberto: ela só consegue puxar a saída para o GND e precisa de um resistor de pull-up, como 10 kΩ, entre a saída e a alimentação para ir para nível alto. Isso permite ligar o pull-up em 3,3 V e levar com segurança a saída de um comparador alimentado com 5 V a um ESP32 ou a um Pico. O chip pequeno ao lado do trimpot azul no sensor de som KY-038 e nos módulos de umidade do solo, chuva, chama e gás é quase sempre um LM393.

Com sinais que mudam devagar ou têm ruído perto do limiar, a saída de um comparador pode oscilar centenas de vezes por segundo; a luz noturna pisca ao entardecer. A solução é a histerese, ou seja, um Schmitt trigger. Leve o sinal à entrada + por um resistor R1 de 10 kΩ e ligue um resistor R2 de 1 MΩ da saída de volta para a entrada +. Cada vez que a saída muda, essa realimentação positiva desloca um pouco o limiar; a distância entre o limiar de subida e o de descida é de cerca de excursão da saída × R1 / R2. Com uma saída que vai de 0 a 5 V, 5 × 10k / 1M dá 50 mV de histerese, o que costuma bastar para engolir o ruído. Você pode aplicar a mesma ideia no software com dois limiares separados; o exemplo com ESP32 mais abaixo faz exatamente isso.
Pinagem do LM358 e do LM741
Os dois amp-ops que você mais vai encontrar na eletrônica de hobby são o LM358, de dois canais, e o clássico LM741, de um canal. Os dois vêm em encapsulamento DIP de 8 pinos. Segure o chip de modo que consiga ler a marcação, com o chanfro virado para a esquerda: o pino 1 fica embaixo à esquerda e a numeração aumenta no sentido anti-horário. As pinagens são diferentes, então não dá para simplesmente colocar um no lugar do outro:
| Pino | LM358 (amp-op duplo) | LM741 (amp-op simples) |
|---|---|---|
| 1 | 1OUT – saída A | Ajuste de offset (offset null) |
| 2 | 1IN− – entrada inversora A | Entrada inversora (−) |
| 3 | 1IN+ – entrada não inversora A | Entrada não inversora (+) |
| 4 | GND (V−) | V− (alimentação negativa) |
| 5 | 2IN+ – entrada não inversora B | Ajuste de offset (offset null) |
| 6 | 2IN− – entrada inversora B | Saída |
| 7 | 2OUT – saída B | V+ (alimentação positiva) |
| 8 | VCC (V+) | NC (não conectado) |
| Característica | LM358 | LM741 | MCP6002 |
|---|---|---|---|
| Canais | 2 | 1 | 2 |
| Alimentação | Fonte simples de 3–30 V | Fonte simétrica de ±10–±18 V recomendada | Fonte simples de 1,8–6 V |
| Com fonte simples de 5 V | Funciona | Na prática não funciona | Funciona |
| Em 3,3 V | Ruim (saída de ~1,8 V no máximo) | Não funciona | Muito bom |
| Faixa de entrada | De 0 V a V+ − 1,5 V | ~3 V para dentro dos trilhos | Até 0,3 V além dos trilhos |
| Faixa de saída (em 5 V) | ~0,02–3,5 V | Inutilizável | 0,025–4,975 V (rail-to-rail) |
| GBW / taxa de variação | 0,7 MHz / 0,3 V/µs | ~1 MHz / 0,5 V/µs | 1 MHz / 0,6 V/µs |
| Corrente de alimentação | 0,35 mA / canal | 1,7 mA | 0,1 mA / canal |
O LM741 é a estrela dos livros didáticos desde 1968, mas foi projetado para uma fonte simétrica como ±15 V: as entradas dele precisam ficar cerca de 3 V e a saída 1–3 V para dentro dos trilhos. Com uma fonte simples de 5 V, depois de descontar essas margens não sobra faixa útil; se um circuito com LM741 não funciona alimentado pelo pino 5V do Arduino, é por isso. Já o LM358 foi projetado para fonte simples: as entradas incluem 0 V, a saída chega a poucos milivolts de 0 V, e a única desvantagem é que o máximo fica em V+ − 1,5 V. Em placas de 3,3 V como o ESP32 e o Pico, use um amp-op rail-to-rail como o MCP6002; ele tem a mesma pinagem do LM358, então entra direto no circuito. Se você precisa de quatro canais, o LM324 de 14 pinos é o irmão quádruplo do LM358.
Funcionamento com fonte simples: terra virtual e rail-to-rail
A maioria dos circuitos com amp-op dos livros didáticos usa uma fonte simétrica como ±15 V, e o sinal oscila dos dois lados de 0 V. No mundo Arduino, normalmente você só tem 5 V ou 3,3 V. Isso não é problema para sinais DC que ficam sempre positivos, como os de um termopar, de um resistor shunt ou de um LM35; eles podem ser amplificados direto com um amp-op cujas entradas incluem 0 V. Mas sinais AC que vão para o positivo e para o negativo, como o de um microfone, precisam primeiro ser elevados até o meio da alimentação. Para isso você cria uma tensão de ponto médio com dois resistores e coloca ao lado um capacitor de 10 µF para reduzir o ruído. Esse ponto se chama terra virtual ou referência; o sinal é sobreposto a ele por um capacitor de acoplamento.
- Escolha o amp-op certo: modelos cuja faixa de entrada não inclui 0 V, como o LM741 ou o TL072, ceifam de forma inesperada com fonte simples; use um LM358, um LM324 ou um MCP6002.
- Leve em conta os limites da saída: a saída do LM358 em 5 V vai de cerca de 0,02 a 3,5 V, então para sinais AC um ponto médio em torno de 1,8 V fica mais equilibrado do que 2,5 V. O MCP6002 chega a cerca de 25 mV dos dois trilhos, então o ponto médio dele pode ser exatamente VCC/2.
- Alimente o amp-op com a mesma tensão da placa: um amp-op alimentado com 12 V pode jogar mais de 10 V em um pino do ESP32 ou do Pico se o ganho estiver errado.
- Use um GND comum: os terras do sensor, do amp-op e da placa precisam estar unidos; o porquê está no guia do terra comum.
- Não deixe o canal sem uso flutuando: ligue a metade sobrando do LM358 como seguidor (saída na entrada −) e ligue a entrada + dele ao GND ou ao ponto médio; entradas flutuantes podem causar oscilação e consumo de corrente desnecessário.
Amplificando o sinal de um microfone: pré-amplificador para microfone de eletreto
Os microfones de eletreto costumam ter uma sensibilidade de cerca de −44 dBV/Pa, o que significa que, mesmo com uma pressão sonora alta de 94 dB, eles entregam só uns 6 mV. Uma conversa normal a um metro de distância fica em torno de 0,1 mV, enquanto uma palma bem ao lado do microfone pode chegar a algumas dezenas de milivolts. Com o degrau de 4,88 mV do Arduino, esse sinal ou nem aparece ou se move só alguns degraus; isso também explica por que a saída analógica de módulos como o sensor de som KY-038 é tão fraca. A solução é um amplificador AC não inversor com ganho de cerca de 100. O circuito abaixo usa o canal A do LM358:
| Componente | Valor | Ligação |
|---|---|---|
| Resistor de polarização do microfone | 2,2 kΩ | Entre o 5V e o terminal + do microfone (terminal − do microfone no GND) |
| Capacitor de acoplamento C1 | 1 µF | Do terminal + do microfone ao pino 3 do LM358 (1IN+) |
| Resistores do ponto médio | 100 kΩ e 56 kΩ | 100 kΩ do pino 3 ao 5V, 56 kΩ do pino 3 ao GND (cerca de 1,8 V) |
| Realimentação Rf | 100 kΩ | Entre o pino 1 (1OUT) e o pino 2 (1IN−) |
| Rg e C2 | 1 kΩ + 10 µF | Em série do pino 2 ao GND (terminal − do C2 no GND) |
| Alimentação | Pino 8 e pino 4 | Pino 8 no 5V, pino 4 no GND, 100 nF entre eles |
| Saída | Pino 1 | A0 do Arduino Uno (GPIO 34 no ESP32, GP26 no Pico: com MCP6002 e 3,3 V) |
Graças ao capacitor C2, o circuito é um seguidor com ganho 1 em DC; em silêncio, a saída fica parada no ponto médio, cerca de 1,8 V. Nas frequências de áudio, porém, o C2 se comporta como um curto-circuito e o ganho passa a ser 1 + 100k / 1k = 101 (40 dB). A frequência de corte inferior é definida por Rg e C2: 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. O limite superior vem do produto ganho-largura de banda do amp-op: 0,7 MHz / 101 ≈ 7 kHz no LM358, o que basta para a voz. Se quiser mais ganho, lembre que a largura de banda diminui na mesma proporção; se precisar de um ganho de 1000, é melhor dividi-lo em dois estágios de cerca de 32 cada.
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}O código coleta o máximo de amostras que consegue durante 50 ms, encontra o menor e o maior valor e converte a diferença em volts; essa é a amplitude pico a pico do som. Dividindo o resultado por 101, você obtém a tensão que o próprio microfone produz. Em um ambiente silencioso, a saída se move só alguns degraus do ADC (0,01–0,02 V), enquanto uma palma por perto passa fácil de 1 V. Se o sinal ceifar, ou seja, se a saída bater em 0 V ou em 3,5 V, baixe o Rf para 47 kΩ. Formas de deixar a medição mais estável estão no guia de filtragem de dados de sensores.
Amplificando um termopar: termopar tipo K e LM358
Um termopar tipo K produz uma pequena tensão proporcional à diferença de temperatura na junção onde dois metais diferentes se encontram: cerca de 41 µV/°C. Você mede 4,1 mV a 100 °C, 20,6 mV a 500 °C e 41,3 mV a 1000 °C. Ligado direto a um Arduino, um degrau do ADC (4,88 mV) corresponde a cerca de 119 °C; isso não é uma medição. Um amplificador não inversor com ganho de 101 montado no canal B do LM358 eleva o sinal para 4,14 mV/°C: agora um degrau equivale a cerca de 1,2 °C, e o limite de 3,5 V da saída do LM358 permite leituras até cerca de 700–800 °C, dependendo do offset. A ligação: terminal + do termopar no pino 5 (2IN+), terminal − no GND; Rf = 100 kΩ entre o pino 7 e o pino 6, Rg = 1 kΩ entre o pino 6 e o GND; o pino 7 vai ao A1 do Arduino. No tipo K, o fio de alumel, que é o terminal −, é levemente magnético, um jeito prático de distinguir os terminais.
Na verdade, o termopar mede a diferença entre a junção quente e a junção fria, onde os fios dele encontram a ligação de cobre. Para obter a temperatura real, você precisa medir a temperatura da junção fria separadamente e somá-la; isso se chama compensação de junção fria. O código abaixo usa para isso um LM35 colocado bem ao lado dos bornes de ligação (saída no A2). Além disso, o offset de entrada de 3–7 mV do LM358 também é multiplicado por 101 e cria um erro de 0,3–0,7 V na saída, ou seja, 70–170 °C. O código mede esse offset na inicialização e o subtrai das leituras seguintes, então ligue a placa com a sonda em temperatura ambiente.
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}Adaptando ao ADC do Arduino: colocando o sinal na faixa certa
O verdadeiro trabalho de um amp-op nos projetos com Arduino é levar o sinal do sensor para a faixa em que o ADC consegue usá-lo com mais eficiência. A regra é simples: o máximo do sinal deve chegar perto do topo da faixa do ADC, mas sem invadir as pontas, onde o amp-op e o ADC não são lineares. Por exemplo, o LM35 dá 0–500 mV entre 0 e 50 °C; lido direto em um Uno, você tem uma resolução de 0,49 °C por degrau. Amplifique o mesmo sinal com ganho de 6,6 para 0–3,3 V e a resolução cai para 0,074 °C. Veja o projeto passo a passo:
- Encontre a faixa de saída do sensor: anote a tensão de saída mínima e máxima no datasheet (LM35, 0–50 °C: 0–0,5 V).
- Escolha a faixa-alvo: a zona segura é de cerca de 0,02–3,5 V para um Uno com LM358, 0,15–2,5 V para um ESP32 e 0,03–3,25 V para um Pico com MCP6002.
- Calcule o ganho: G = máximo da faixa-alvo / máximo do sensor = 3,3 / 0,5 = 6,6. Para 1 + Rf / Rg = 6,6 em um amplificador não inversor, escolha Rf = 56 kΩ e Rg = 10 kΩ.
- Remova o offset: se o sensor trabalha em uma faixa que não começa em zero, como 1–2 V, subtraia primeiro a tensão de referência (Vref em um amplificador inversor, ou um amplificador diferencial) e depois amplifique.
- Proteja e filtre: coloque um resistor de 1 kΩ em série entre a saída do amp-op e o pino do ADC, e 100 nF entre o pino e o GND. Esse filtro RC atenua o ruído acima de cerca de 1,6 kHz e limita qualquer corrente de falha que entre no pino.
- Faça a conta de volta no software: divida a tensão medida pelo ganho para obter a tensão real do sensor (Vsensor = Vadc / G); meça os resistores com um multímetro para acertar o ganho.
| Placa | ADC | Faixa de entrada recomendada | Degrau | Pinos analógicos |
|---|---|---|---|---|
| Arduino Uno | 10 bits | 0–5 V (0–1,1 V com a referência interna) | 4,88 mV (1,07 mV) | A0–A5 |
| ESP32 | 12 bits | Cerca de 0,15–2,5 V (atenuação padrão de 11 dB) | ~0,8 mV | GPIO 32–39 (ADC1, funciona também com o Wi-Fi ligado) |
| Raspberry Pi Pico | 12 bits | 0–3,3 V | 0,81 mV | GP26, GP27, GP28 |
Lendo a saída de um amp-op com o ESP32: interruptor por palmas
Como o ESP32 funciona com 3,3 V, monte o mesmo circuito de microfone com um MCP6002 e alimente-o pelo pino 3V3; use dois resistores de 100 kΩ para o ponto médio (1,65 V). Se você alimentar um LM358 com 5 V, a saída dele pode chegar a 3,5 V e forçar o pino do ESP32. Ligue a saída do amp-op ao GPIO 34, um dos canais do ADC1 que funcionam também com o Wi-Fi ligado. O código abaixo mede a amplitude pico a pico em janelas de 20 ms, usa valores em milivolts calibrados de analogReadMilliVolts() e aplica histerese no software com dois limiares separados: cada palma alterna o LED integrado. Se é a primeira vez que você usa a placa, comece pelos passos de configuração do guia O que é o 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 e MicroPython: medindo corrente com um resistor shunt
Outro trabalho prático para um amp-op é medir corrente. Se você colocar um resistor shunt de 0,1 Ω entre o terminal negativo de um motor ou de uma fita de LED e o GND, uma corrente de 1 A derruba só 100 mV sobre ele. Um amplificador não inversor montado com um MCP6002 (Rf = 100 kΩ, Rg = 4,7 kΩ) multiplica essa tensão por 22,3: 1 A agora vira 2,23 V e, com a faixa de 3,3 V do Pico, dá para medir até cerca de 1,45 A. O lado de cima do shunt vai ao pino 3 do MCP6002 e a saída do amp-op (pino 1) vai ao pino GP26 (ADC0) do Pico; o amp-op é alimentado pelo pino 3V3(OUT), e o GND da fonte da carga é unido ao GND do Pico. Com 1,5 A, o shunt dissipa 0,225 W, então use um resistor de pelo menos 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)Na inicialização, com a carga desligada, o código mede o offset do amp-op e o subtrai das leituras seguintes; a média de 100 leituras atenua o ruído do ADC. Para correntes maiores, diminua o valor do shunt ou o ganho; confira a tensão sobre o shunt e a potência que ele dissipa com a ferramenta Lei de Ohm. Se preferir uma solução pronta, o sensor de corrente ACS712, de efeito Hall, mede a corrente mantendo a carga isolada do seu circuito. Se você está configurando o Pico pela primeira vez, o guia O que é o Raspberry Pi Pico mostra como instalar o MicroPython.
Outros circuitos com amp-op
| Circuito | Fórmula / comportamento | Onde é usado? |
|---|---|---|
| Amplificador somador (mixer) | Vout = −Rf × (V1/R1 + V2/R2 + …) | Mixer de áudio, combinação de vários sinais |
| Amplificador diferencial | Vout = (R2 / R1) × (V2 − V1) | Remover um offset, medir a diferença entre dois pontos |
| Amplificador de instrumentação | Ganho alto definido por um único resistor, excelente rejeição de modo comum | Células de carga, pontes de Wheatstone, sinais biomédicos |
| Integrador | Capacitor na realimentação; a saída é a integral da entrada no tempo | Gerador de onda triangular, controle PI |
| Filtro ativo (Sallen-Key) | Filtragem de segunda ordem com dois resistores e dois capacitores | Filtros de áudio, filtro anti-aliasing antes do ADC |
| Schmitt trigger | Comparador com realimentação positiva, dois limiares separados | Saída digital limpa a partir de um sinal com ruído |
Para sensores em ponte, como as células de carga, em que as duas saídas ficam no meio da alimentação e a diferença entre elas é de só alguns milivolts, chips prontos são mais práticos: o HX711 tem um amplificador com ganho de até 128 e um ADC de 24 bits. Já o amp-op da placa de um sensor de pulso amplifica e filtra o sinal fraco do sensor de luz, e é por isso que o Arduino vê uma onda de pulso nítida logo na primeira tentativa.

Ideias de projetos com amp-op
- Lâmpada acionada por palmas: acione um módulo relé com o pré-amplificador de microfone e o código do ESP32 com histerese.
- VU meter: transforme a amplitude pico a pico em uma barra que sobe com a música em uma fita de LED WS2812B.
- Termômetro de forno: meça até 500 °C com o amplificador de termopar e mostre o valor em um display OLED.
- Luz noturna sem código: faça um LED que acende no escuro com um LDR e um comparador LM358, sem nenhum microcontrolador.
- Balança digital: leia uma célula de carga com o HX711 e monte uma balança de cozinha com precisão de grama.
- Monitor de corrente do motor: meça a corrente do motor do seu carrinho robô com um shunt e um amp-op, e pare o motor quando a corrente subir porque ele travou.
Erros comuns e como corrigi-los
| Sintoma | Causa provável | Solução |
|---|---|---|
| Saída sempre em 0 V ou no topo | Sem realimentação ou ligada na entrada errada; ganho alto demais; entrada fora da faixa de entrada | Confira se o Rf vai para a entrada −, diminua o ganho, garanta que a entrada esteja entre 0 e V+ − 1,5 V |
| Circuito com LM741 não funciona em 5 V | O LM741 precisa de uma fonte simétrica e mais alta | Use um LM358 ou um MCP6002 |
| A saída não passa de 3,5 V | A saída do LM358 para em V+ − 1,5 V | Escolha o ganho de acordo ou use um amp-op rail-to-rail |
| Leituras com ruído e instáveis | Sem desacoplamento da alimentação, fios longos, ganho alto sem necessidade | 100 nF nos pinos de alimentação, fios curtos, filtro RC na saída, média no software |
| O circuito oscila sozinho | O amp-op aciona direto um cabo longo ou uma carga capacitiva grande | Adicione um resistor de 100–470 Ω em série na saída |
| A saída do comparador nunca vai para nível alto | O LM393 é de coletor aberto e está sem pull-up | Ligue 4,7–10 kΩ entre a saída e a alimentação |
| Pino do ESP32 ou do Pico danificado | O amp-op foi alimentado com 5 V ou 12 V e a saída passou de 3,3 V | Alimente o amp-op com 3,3 V ou adicione um divisor e um diodo grampeador na saída |
| Saída presa em 0 V com sinais pequenos | Um offset de entrada negativo prende a saída embaixo com fonte simples | Use um amp-op de precisão ou adicione uma pequena polarização na entrada |
O amp-op é um tradutor que transforma o mundo analógico em uma língua que o microcontrolador entende: sabendo as duas regras e as duas fórmulas de ganho, você deixa qualquer sinal pronto para o ADC, venha ele de um microfone, de um termopar, de um resistor shunt ou de um sensor em ponte. Use a ferramenta Ganho do amp-op para testar valores; no app BlueGrays você encontra projetos analógicos como medição de luz com LDR, luz noturna, voltímetro digital, medição de temperatura com NTC e sensores de chama e de gás, passo a passo, com esquemas de circuito e código.
Perguntas frequentes
Para que serve um amplificador operacional?
O amp-op é usado para amplificar sinais fracos, comparar duas tensões, somar ou subtrair sinais, filtrá-los e bufferizar fontes de alta impedância. Nos projetos com Arduino, ele é usado principalmente para elevar sinais na faixa dos milivolts, vindos de um microfone, de um termopar ou de um resistor shunt, até um nível que o ADC consiga ler.
Como calcular o ganho de um amp-op?
No amplificador não inversor, o ganho é 1 + Rf / Rg e, no inversor, −Rf / Rin. Por exemplo, com Rf = 100 kΩ e Rg = 1 kΩ, o ganho não inversor é 101 e o inversor é −100. O valor em decibéis é 20 × log10(ganho).
Qual é a diferença entre o LM358 e o LM741?
O LM358 tem dois amp-ops em um encapsulamento, funciona com uma fonte simples de 3–30 V e a faixa de entrada dele inclui 0 V, então pode ser usado direto com os 5 V do Arduino. O LM741 é um amp-op simples projetado para uma fonte simétrica como ±15 V e, na prática, não funciona com uma fonte simples de 5 V. As pinagens também são diferentes.
Um amp-op funciona com uma fonte simples de 5 V?
Sim, os modelos projetados para fonte simples funcionam, como o LM358, o LM324 e o MCP6002. Para sinais AC, você precisa elevar a entrada até o meio da alimentação e levar em conta os limites da saída; a saída do LM358 só chega a cerca de 3,5 V com 5 V de alimentação.
Qual é a diferença entre um amp-op e um comparador?
O amp-op tem compensação de frequência para ficar estável com realimentação negativa, e a saída dele pode fornecer e absorver corrente. Comparadores como o LM393 são feitos para comutar rápido sem realimentação, e a maioria tem saída de coletor aberto, que precisa de um resistor de pull-up. Um amp-op pode ser usado como comparador lento, mas um comparador não deve ser usado como amplificador.
O que é um amp-op rail-to-rail?
Em um amp-op rail-to-rail, a entrada ou a saída chega a poucas dezenas de milivolts das tensões de alimentação. Por exemplo, o MCP6002 entrega 0,025–4,975 V com 5 V de alimentação, enquanto o LM358 só chega a cerca de 3,5 V. Em placas de 3,3 V como o ESP32 e o Raspberry Pi Pico, você precisa de um amp-op rail-to-rail para usar toda a faixa do ADC.
Projetos para montar depois desta leitura
Ver todos os projetos
Medição da intensidade da luz com LDR
Quer ver a luminosidade do seu quarto em números? O LDR, um pequeno componente sensível à luz, mede a luz ambiente, e o Arduino exibe o valor na tela do computador a cada meio segundo. Cubra o sensor

Luz noturna com LDR
Uma pequena luz noturna que acende sozinha quando escurece e apaga ao amanhecer. Um sensor de luz mede a luminosidade do quarto, e o Arduino acende o LED quando está escuro o suficiente e apaga quando

Leitura da intensidade da luz com módulo LDR e ESP32
Acompanhe em tempo real no Monitor Serial o valor bruto do ADC do módulo LDR e a porcentagem relativa de luz calculada a partir de referências de escuridão e claridade. Essa porcentagem não é uma medida em lux. O projeto ensina a lógica de calibração do módulo. É ideal fazê-lo antes do projeto 10, pois ajuda a determinar o valor do limiar.

Voltímetro digital com display LCD
Descubra a tensão de uma pilha ou de um adaptador de alimentação com um medidor feito por você. Um divisor formado por dois resistores reduz a tensão alta a um nível que a placa consegue ler, e o Ardu

Medição de temperatura com NTC e display LCD 2x16
Meça a temperatura ao seu redor com um sensor que parece uma pequena conta. Esse componente, chamado NTC, deixa a eletricidade passar com mais facilidade à medida que aquece; o Arduino lê essa mudança

Uso de um sensor de chama
Um pequeno guardião que percebe o fogo antes de você, na cozinha ou na oficina. O sensor de chama capta a luz invisível emitida pelo fogo; enquanto está tudo bem, o LED verde fica aceso e, ao detectar

Uso de um sensor de gás
Um pequeno guardião que percebe um vazamento de gás na cozinha antes de você. O sensor de gás monitora o ar continuamente; enquanto está tudo bem, o LED verde fica aceso e, quando o gás no ar ultrapas

Brilho do LED com potenciômetro no ESP32 (analógico → PWM)
Neste projeto, controlamos o brilho de um LED de forma analógica com um potenciômetro. O pino ADC do ESP32 lê a tensão de 0-3,3V do potenciômetro e converte esse valor em um sinal PWM (modulação por largura de pulso), enviado ao LED. Assim, ao girar o potenciômetro, o brilho do LED aumenta e diminui gradualmente. Com Arduino Core 3.0+, você pode usar analogWrite() diretamente; no ESP32-S2/S3, a resolução do ADC é fixada em 12 bits.
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

