Fundamentos · 23 min de leitura

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ísticaAmp-op idealLM358 (típico)LM741 (típico)
Ganho em malha abertaInfinito100.000 (100 dB)200.000 (106 dB)
Corrente de entrada (polarização)020 nA80 nA
Tensão de offset de entrada03 mV (7 mV máx.)1 mV (5 mV máx.)
Produto ganho-largura de banda (GBW)Infinito0,7 MHzCerca de 1 MHz
Taxa de variação (slew rate)Infinita0,3 V/µs0,5 V/µs
Excursão da saídaAté os trilhosPerto de 0 V, V+ − 1,5 V no topo1–3 V para dentro de cada trilho
AlimentaçãoIlimitada3–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.

RfRg (Rin no circuito inversor)Ganho não inversorGanho 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)
Você pode calcular o ganho, o valor em dB e a tensão de saída para os seus próprios resistores com a ferramenta Ganho do amp-op; ela também avisa antes quando a saída vai bater no limite da alimentação e ceifar. Para achar o resistor real mais próximo do valor calculado, use a ferramenta Valor padrão.

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.

Módulo sensor de som KY-038 com comparador LM393
Sensor de som KY-038: o sinal do microfone é comparado pelo comparador LM393 da placa com um limiar ajustado no trimpot e vira uma saída digital.

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.

O LM393 não é um amp-op: ele não tem compensação de frequência interna, então oscila em um circuito amplificador com realimentação negativa, e sem resistor de pull-up a saída dele nunca vai para nível alto. No sentido contrário, você pode usar um amp-op como comparador, mas ele é lento com sinais rápidos. Resumindo: escolha um amp-op para amplificar e um comparador para detectar limiares.

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:

PinoLM358 (amp-op duplo)LM741 (amp-op simples)
11OUT – saída AAjuste de offset (offset null)
21IN− – entrada inversora AEntrada inversora (−)
31IN+ – entrada não inversora AEntrada não inversora (+)
4GND (V−)V− (alimentação negativa)
52IN+ – entrada não inversora BAjuste de offset (offset null)
62IN− – entrada inversora BSaída
72OUT – saída BV+ (alimentação positiva)
8VCC (V+)NC (não conectado)
CaracterísticaLM358LM741MCP6002
Canais212
AlimentaçãoFonte simples de 3–30 VFonte simétrica de ±10–±18 V recomendadaFonte simples de 1,8–6 V
Com fonte simples de 5 VFuncionaNa prática não funcionaFunciona
Em 3,3 VRuim (saída de ~1,8 V no máximo)Não funcionaMuito bom
Faixa de entradaDe 0 V a V+ − 1,5 V~3 V para dentro dos trilhosAté 0,3 V além dos trilhos
Faixa de saída (em 5 V)~0,02–3,5 VInutilizável0,025–4,975 V (rail-to-rail)
GBW / taxa de variação0,7 MHz / 0,3 V/µs~1 MHz / 0,5 V/µs1 MHz / 0,6 V/µs
Corrente de alimentação0,35 mA / canal1,7 mA0,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.

Encaixar o chip ao contrário ou trocar os pinos de alimentação esquenta o amp-op e o destrói em segundos. Confira o chanfro antes de encaixar e lembre que no LM358 8 = VCC, 4 = GND, enquanto no LM741 7 = V+, 4 = V−. Coloque um capacitor cerâmico de 100 nF entre os pinos de alimentação de cada amp-op, o mais perto possível do chip.

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:

ComponenteValorLigação
Resistor de polarização do microfone2,2 kΩEntre o 5V e o terminal + do microfone (terminal − do microfone no GND)
Capacitor de acoplamento C11 µFDo terminal + do microfone ao pino 3 do LM358 (1IN+)
Resistores do ponto médio100 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 Rf100 kΩEntre o pino 1 (1OUT) e o pino 2 (1IN−)
Rg e C21 kΩ + 10 µFEm série do pino 2 ao GND (terminal − do C2 no GND)
AlimentaçãoPino 8 e pino 4Pino 8 no 5V, pino 4 no GND, 100 nF entre eles
SaídaPino 1A0 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.

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}

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.

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}
Se o offset for negativo, a saída gruda em 0 V e o circuito não mostra nada até que a tensão do termopar vença esse offset; se você ler no A1 um offset muito perto de zero na inicialização, é isso que está acontecendo. O offset do LM358 também varia com a temperatura, e a aproximação de 41 µV/°C só é precisa dentro de alguns graus entre 0 e 500 °C. Para trabalhos que exigem precisão, como fornos, impressoras 3D ou tratamento térmico, use um módulo MAX6675 ou MAX31855, que inclui compensação de junção fria e saída digital, ou um amp-op de precisão com deriva zero.

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:

  1. 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).
  2. 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.
  3. 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Ω.
  4. 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.
  5. 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.
  6. 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.
PlacaADCFaixa de entrada recomendadaDegrauPinos analógicos
Arduino Uno10 bits0–5 V (0–1,1 V com a referência interna)4,88 mV (1,07 mV)A0–A5
ESP3212 bitsCerca de 0,15–2,5 V (atenuação padrão de 11 dB)~0,8 mVGPIO 32–39 (ADC1, funciona também com o Wi-Fi ligado)
Raspberry Pi Pico12 bits0–3,3 V0,81 mVGP26, GP27, GP28
Para sinais muito pequenos no Uno, analogReference(INTERNAL) baixa a referência do ADC para 1,1 V e reduz o degrau para 1,07 mV; às vezes você nem precisa de um estágio extra com amp-op. Nesse modo, porém, uma entrada acima de 1,1 V satura a leitura. Para os detalhes do ADC, veja o guia de ADC e conversão analógico-digital.

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.

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 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.

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)

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

CircuitoFórmula / comportamentoOnde é usado?
Amplificador somador (mixer)Vout = −Rf × (V1/R1 + V2/R2 + …)Mixer de áudio, combinação de vários sinais
Amplificador diferencialVout = (R2 / R1) × (V2 − V1)Remover um offset, medir a diferença entre dois pontos
Amplificador de instrumentaçãoGanho alto definido por um único resistor, excelente rejeição de modo comumCélulas de carga, pontes de Wheatstone, sinais biomédicos
IntegradorCapacitor na realimentação; a saída é a integral da entrada no tempoGerador de onda triangular, controle PI
Filtro ativo (Sallen-Key)Filtragem de segunda ordem com dois resistores e dois capacitoresFiltros de áudio, filtro anti-aliasing antes do ADC
Schmitt triggerComparador com realimentação positiva, dois limiares separadosSaí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.

Sensor de frequência cardíaca Pulse Sensor
Pulse Sensor: o amp-op da placa amplifica e filtra a minúscula variação da luz refletida pelo seu dedo; em repouso, a saída fica na metade da alimentação.

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

SintomaCausa provávelSolução
Saída sempre em 0 V ou no topoSem realimentação ou ligada na entrada errada; ganho alto demais; entrada fora da faixa de entradaConfira 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 VO LM741 precisa de uma fonte simétrica e mais altaUse um LM358 ou um MCP6002
A saída não passa de 3,5 VA saída do LM358 para em V+ − 1,5 VEscolha o ganho de acordo ou use um amp-op rail-to-rail
Leituras com ruído e instáveisSem desacoplamento da alimentação, fios longos, ganho alto sem necessidade100 nF nos pinos de alimentação, fios curtos, filtro RC na saída, média no software
O circuito oscila sozinhoO amp-op aciona direto um cabo longo ou uma carga capacitiva grandeAdicione um resistor de 100–470 Ω em série na saída
A saída do comparador nunca vai para nível altoO LM393 é de coletor aberto e está sem pull-upLigue 4,7–10 kΩ entre a saída e a alimentação
Pino do ESP32 ou do Pico danificadoO amp-op foi alimentado com 5 V ou 12 V e a saída passou de 3,3 VAlimente 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 pequenosUm offset de entrada negativo prende a saída embaixo com fonte simplesUse um amp-op de precisão ou adicione uma pequena polarização na entrada
Ao procurar defeitos em um circuito com amp-op, primeiro meça a tensão nas duas entradas com um multímetro. Em um amplificador com realimentação negativa funcionando direito, a diferença entre as entradas + e − não passa de alguns milivolts. Se a diferença for grande, o amp-op está saturado: a saída está presa em um dos trilhos, e a causa é o ganho, a faixa de entrada ou uma ligação de realimentação interrompida. Para a medição em si, veja o guia como usar um multímetro.

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.

Ver todos os projetos
Medição da intensidade da luz com LDR
#11Iniciante

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

4.6(81)
139
Luz noturna com LDR
#12Iniciante

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

4.8(102)
205
Leitura da intensidade da luz com módulo LDR e ESP32
#113Iniciante

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.

4.6(36)
55
Voltímetro digital com display LCD
#56Intermediário
Premium

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

4.5(27)
36
Medição de temperatura com NTC e display LCD 2x16
#44Iniciante
Premium

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

4.5(33)
44
Uso de um sensor de chama
#50Intermediário
Premium

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

4.6(33)
44
Uso de um sensor de gás
#51Iniciante
Premium

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

4.6(37)
50
Brilho do LED com potenciômetro no ESP32 (analógico → PWM)
#115Intermediário
Premium

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.

4.5(19)
32