Basi · 21 min di lettura

Amplificatore operazionale: cos'è, guadagno, LM358 e Arduino

Cos'è un amplificatore operazionale? Configurazione invertente e non invertente, buffer, comparatore, piedinatura LM358 e LM741, alimentazione singola e ADC.

Un amplificatore operazionale (op-amp) è un piccolo circuito integrato, di solito a otto piedini, che moltiplica per centinaia di migliaia la minuscola differenza di tensione tra i suoi due ingressi. È la risposta breve alla domanda cos'è un amplificatore operazionale, ma un guadagno così enorme da solo serve a poco. La magia arriva quando poche resistenze riportano una parte dell'uscita all'ingresso: allora l'operazionale diventa un amplificatore preciso con il guadagno fissato da un rapporto di resistenze, un buffer, un comparatore o un filtro. Dai preamplificatori per microfono ai sensori di battito, dai moduli per bilance alle schede audio, c'è un operazionale in quasi ogni angolo dell'elettronica analogica.

Lavorando con Arduino, il motivo principale per cui ti serve un operazionale è questo: molti sensori danno segnali di pochi millivolt, mentre l'ADC dell'Arduino Uno distingue solo passi da 4,88 mV. Una termocoppia di tipo K produce appena 4,1 mV a 100 °C; se la colleghi direttamente, Arduino quasi non si accorge di quella temperatura. In questa guida imparerai le regole dell'operazionale ideale, le formule della configurazione invertente e non invertente, l'inseguitore di tensione, il comparatore, la piedinatura di LM358 e LM741, il funzionamento con alimentazione singola e come adattare i segnali di un microfono e di una termocoppia all'ADC di Arduino, ESP32 e Raspberry Pi Pico, tutto con valori reali.

Cos'è un amplificatore operazionale e come funziona?

Un operazionale ha cinque terminali di base: l'ingresso non invertente (+), l'ingresso invertente (−), l'uscita e due piedini di alimentazione (V+ e V−). Guarda solo la differenza tra i due ingressi e la moltiplica per il suo guadagno ad anello aperto (A): Vout = A × (V+ − V−). Nell'LM358 A vale tipicamente 100.000 (100 dB). Significa che una differenza di soli 0,1 mV tra gli ingressi chiede 10 V in uscita; ma l'uscita non può superare l'alimentazione, quindi l'uscita di un operazionale senza retroazione resta quasi sempre incollata a una delle alimentazioni, cioè va in saturazione. Questo comportamento è utile nei circuiti comparatori. Per fare un amplificatore, una parte dell'uscita viene riportata all'ingresso invertente tramite resistenze; si chiama retroazione negativa, e da quel momento il guadagno lo decidono le resistenze, non più l'operazionale.

CaratteristicaOperazionale idealeLM358 (tipico)LM741 (tipico)
Guadagno ad anello apertoInfinito100.000 (100 dB)200.000 (106 dB)
Corrente d'ingresso (bias)020 nA80 nA
Tensione di offset d'ingresso03 mV (max 7 mV)1 mV (max 5 mV)
Prodotto guadagno-banda (GBW)Infinito0,7 MHzCirca 1 MHz
Slew rateInfinito0,3 V/µs0,5 V/µs
Escursione d'uscitaFino alle alimentazioniVicino a 0 V, in alto V+ − 1,5 V1–3 V all'interno di ogni alimentazione
AlimentazioneIllimitata3–30 V singola o ±1,5–±15 V±10–±18 V consigliata (LM741C)

Regole dell'operazionale ideale: cortocircuito virtuale e corrente d'ingresso nulla

  • Regola 1 – Gli ingressi non assorbono corrente: un operazionale ideale ha resistenza d'ingresso infinita, quindi nei piedini + e − non entra corrente. In pratica l'LM358 assorbe circa 20 nA, che causano un errore di soli 2 mV anche su una resistenza da 100 kΩ.
  • Regola 2 – Cortocircuito virtuale: con la retroazione negativa, l'uscita fa tutto il necessario per portare i due ingressi alla stessa tensione; alla fine V+ = V−. Gli ingressi non sono collegati tra loro, ma si trovano alla stessa tensione.
  • Regola pratica – L'uscita non può superare l'alimentazione: anche se la formula chiede 12 V, un operazionale alimentato a 5 V arriva al massimo all'alimentazione, e un LM358 solo fino a circa 3,5 V. Un'uscita bloccata a quel limite si dice tosata (clipping) o saturata.

Con queste regole puoi risolvere quasi ogni circuito con operazionale in poche righe su carta: trova prima la tensione dell'ingresso +, considera l'ingresso − alla stessa tensione e poi scrivi le correnti nelle resistenze con la legge di Ohm. Dato che la corrente non può entrare nell'ingresso, deve passare nella resistenza di retroazione, e da lì si ricava la tensione d'uscita. Ricorda: la seconda regola vale solo quando c'è retroazione negativa. Nei circuiti senza retroazione, come il comparatore, gli ingressi sono a tensioni diverse e l'uscita sta a una delle alimentazioni. Se vuoi ripassare i calcoli di corrente e tensione, dai un'occhiata alla guida sulla legge di Ohm.

Amplificatore non invertente: formula del guadagno ed esempio

Nell'amplificatore non invertente il segnale arriva direttamente all'ingresso +. Una resistenza di retroazione (Rf) va dall'uscita all'ingresso −, e una resistenza verso massa (Rg) dall'ingresso − a GND. Queste due resistenze formano un partitore di tensione: sull'ingresso − c'è Vout × Rg / (Rf + Rg). Per la regola del cortocircuito virtuale questa tensione è uguale all'ingresso, da cui la formula Vout = Vin × (1 + Rf / Rg). Con Rf = 10 kΩ e Rg = 1 kΩ il guadagno è 11, quindi un segnale da 100 mV diventa 1,1 V. L'uscita si muove nello stesso verso dell'ingresso, il guadagno non scende mai sotto 1 e la resistenza d'ingresso del circuito è altissima, quindi non carica il sensore.

RfRg (Rin nella configurazione invertente)Guadagno non invertenteGuadagno invertente
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)
Puoi calcolare il guadagno, il suo valore in dB e la tensione d'uscita con le tue resistenze nello strumento Guadagno op-amp; ti avvisa anche in anticipo quando l'uscita andrà a sbattere contro il limite dell'alimentazione e verrà tosata. Per trovare la resistenza reale più vicina al valore calcolato, usa lo strumento Valore standard.

Amplificatore invertente e massa virtuale

Nell'amplificatore invertente l'ingresso + va a GND e il segnale arriva all'ingresso − tramite una resistenza Rin; Rf è sempre tra l'uscita e l'ingresso −. Per la regola del cortocircuito virtuale anche l'ingresso − è a 0 V, ma non è collegato a GND; si chiama massa virtuale. La corrente Vin / Rin che attraversa Rin non può entrare nell'ingresso, quindi deve passare in Rf, e l'uscita diventa Vout = −(Rf / Rin) × Vin. Con Rin = 10 kΩ e Rf = 47 kΩ il guadagno è −4,7: un ingresso di 0,5 V dà un'uscita di −2,35 V. Il segno meno indica che il segnale viene invertito. La resistenza d'ingresso del circuito è circa Rin, quindi può caricare un sensore con resistenza interna elevata.

Un bell'uso della configurazione invertente è il sommatore (mixer): se colleghi più segnali all'ingresso −, ciascuno con la propria resistenza, l'uscita è la somma pesata e invertita di quei segnali. In un circuito Arduino con alimentazione singola, però, devi collegare l'ingresso + dell'invertente a un riferimento, per esempio metà dell'alimentazione, invece che a GND; altrimenti gli ingressi positivi chiedono un'uscita negativa e l'uscita resta incollata a 0 V. In questo caso la formula diventa Vout = Vref − (Rf / Rin) × (Vin − Vref).

Inseguitore di tensione (buffer): il circuito più utile con guadagno 1

Se colleghi l'uscita direttamente all'ingresso − e porti il segnale all'ingresso +, ottieni un inseguitore di tensione (voltage follower, buffer). Dato che Rf è zero e Rg infinita, il guadagno è esattamente 1 e Vout = Vin. A cosa serve un circuito che non amplifica? Non preleva quasi corrente dal suo ingresso ma può fornire milliampere in uscita; trasforma una sorgente ad alta impedenza in una a bassa impedenza. Il datasheet dell'ATmega328P dice che il suo ADC funziona al meglio con un'impedenza della sorgente di 10 kΩ o meno. Un partitore di tensione da 100 kΩ + 100 kΩ si comporta come una sorgente da 50 kΩ, e quando Arduino passa da un canale all'altro la lettura può spostarsi di qualche passo. Metti un inseguitore dopo il partitore e il problema sparisce.

Altri usi classici dell'inseguitore: livellare un segnale PWM con un filtro RC e bufferizzarlo per ottenere un semplice DAC, distribuire a più circuiti una tensione di riferimento presa da un potenziometro e pilotare un cavo lungo dall'uscita di un operazionale anziché dall'uscita debole di un sensore. Con alimentazione singola l'LM358 segue fino a 0 V, ma con 5 V non supera circa 3,5 V; se vuoi bufferizzare tutto l'intervallo 0–5 V, scegli un operazionale rail-to-rail.

L'operazionale come comparatore

Senza retroazione, un operazionale diventa un interruttore che confronta due tensioni: se l'ingresso + supera l'ingresso − anche solo di qualche millivolt, l'uscita sale al limite superiore, altrimenti scende a 0 V. Una luce notturna senza microcontrollore è un bell'esempio. Collega il punto centrale di un partitore montato nell'ordine 5V, 10 kΩ, LDR, GND all'ingresso +, e il cursore di un potenziometro all'ingresso −. Al buio la resistenza della LDR aumenta, la tensione del punto centrale supera la soglia impostata con il potenziometro e si accende un LED collegato all'uscita tramite 330 Ω. L'LM358 basta per questo lavoro, ma è lento: con uno slew rate di 0,3 V/µs, l'uscita impiega più di 10 µs per salire da 0 a 3,5 V.

Per i lavori che richiedono commutazioni rapide e pulite si usa un vero comparatore come l'LM393. L'LM393 ha la stessa piedinatura dell'LM358, ma la sua uscita è a collettore aperto: può solo tirare l'uscita verso GND e, per farla salire, serve una resistenza di pull-up, per esempio da 10 kΩ, tra uscita e alimentazione. Così puoi collegare il pull-up a 3,3 V e portare senza rischi l'uscita di un comparatore alimentato a 5 V a un ESP32 o a un Pico. Il piccolo integrato accanto al trimmer blu del sensore di suono KY-038 e dei moduli di umidità del terreno, pioggia, fiamma e gas è quasi sempre un LM393.

Modulo sensore di suono KY-038 con comparatore LM393
Sensore di suono KY-038: il segnale del microfono viene confrontato dal comparatore LM393 sulla scheda con una soglia regolata dal trimmer e diventa un'uscita digitale.

Con segnali lenti o rumorosi vicini alla soglia, l'uscita di un comparatore può oscillare centinaia di volte al secondo; la luce notturna sfarfalla al tramonto. La soluzione è l'isteresi, cioè un trigger di Schmitt. Porta il segnale all'ingresso + tramite una resistenza R1 da 10 kΩ e collega una resistenza R2 da 1 MΩ dall'uscita all'ingresso +. A ogni commutazione dell'uscita questa retroazione positiva sposta leggermente la soglia; la distanza tra la soglia di salita e quella di discesa è circa escursione d'uscita × R1 / R2. Con un'uscita che va da 0 a 5 V, 5 × 10k / 1M dà 50 mV di isteresi, che di solito bastano ad assorbire il rumore. Puoi applicare la stessa idea via software con due soglie distinte; l'esempio con ESP32 più sotto fa esattamente questo.

L'LM393 non è un operazionale: non ha compensazione in frequenza interna, quindi oscilla in un circuito amplificatore con retroazione negativa, e senza resistenza di pull-up la sua uscita non sale mai. Al contrario, puoi usare un operazionale come comparatore, ma resta lento con i segnali veloci. In breve: per amplificare un operazionale, per rilevare una soglia un comparatore.

Piedinatura di LM358 e LM741

I due operazionali che incontrerai più spesso nell'elettronica hobbistica sono il doppio LM358 e il classico singolo LM741. Entrambi sono disponibili in contenitore DIP a 8 piedini. Tieni l'integrato in modo da leggere la scritta, con la tacca rivolta a sinistra: il piedino 1 è in basso a sinistra e la numerazione sale in senso antiorario. Le piedinature sono diverse, quindi non puoi semplicemente mettere l'uno al posto dell'altro:

PiedinoLM358 (operazionale doppio)LM741 (operazionale singolo)
11OUT – uscita AOffset null (regolazione offset)
21IN− – ingresso invertente AIngresso invertente (−)
31IN+ – ingresso non invertente AIngresso non invertente (+)
4GND (V−)V− (alimentazione negativa)
52IN+ – ingresso non invertente BOffset null (regolazione offset)
62IN− – ingresso invertente BUscita
72OUT – uscita BV+ (alimentazione positiva)
8VCC (V+)NC (non collegato)
CaratteristicaLM358LM741MCP6002
Canali212
Alimentazione3–30 V singola±10–±18 V duale consigliata1,8–6 V singola
Con 5 V singoliFunzionaIn pratica non funzionaFunziona
Con 3,3 VScarso (uscita max ~1,8 V)Non funzionaMolto bene
Intervallo d'ingressoDa 0 V a V+ − 1,5 V~3 V dentro le alimentazioniFino a 0,3 V oltre le alimentazioni
Intervallo d'uscita (a 5 V)~0,02–3,5 VInutilizzabile0,025–4,975 V (rail-to-rail)
GBW / slew rate0,7 MHz / 0,3 V/µs~1 MHz / 0,5 V/µs1 MHz / 0,6 V/µs
Consumo0,35 mA / canale1,7 mA0,1 mA / canale

L'LM741 è la star dei libri di testo dal 1968, ma è stato progettato per un'alimentazione duale come ±15 V: i suoi ingressi devono restare circa 3 V e la sua uscita 1–3 V dentro le alimentazioni. Con 5 V singoli, tolti questi margini, non resta alcun intervallo utilizzabile; se un circuito con LM741 non funziona alimentato dal piedino 5V di Arduino, il motivo è questo. L'LM358, invece, è stato progettato per l'alimentazione singola: i suoi ingressi comprendono 0 V, la sua uscita può avvicinarsi a 0 V di pochi millivolt e il suo unico difetto è che in alto si ferma a V+ − 1,5 V. Sulle schede a 3,3 V come ESP32 e Pico usa un operazionale rail-to-rail come l'MCP6002; ha la stessa piedinatura dell'LM358, quindi si monta direttamente al suo posto. Se ti servono quattro canali, l'LM324 a 14 piedini è il fratello quadruplo dell'LM358.

Montare l'integrato al contrario o scambiare i piedini di alimentazione surriscalda l'operazionale e lo distrugge in pochi secondi. Prima di inserirlo controlla la tacca e ricorda che nell'LM358 8 = VCC, 4 = GND, mentre nell'LM741 7 = V+, 4 = V−. Metti un condensatore ceramico da 100 nF tra i piedini di alimentazione di ogni operazionale, il più vicino possibile all'integrato.

Funzionamento con alimentazione singola: massa virtuale e rail-to-rail

La maggior parte dei circuiti con operazionale dei libri usa un'alimentazione duale come ±15 V, e il segnale oscilla da entrambi i lati di 0 V. Nel mondo Arduino di solito hai solo 5 V o 3,3 V. Non è un problema per i segnali continui che restano sempre positivi, come quelli di una termocoppia, di una resistenza di shunt o di un LM35; si amplificano direttamente con un operazionale il cui intervallo d'ingresso comprenda 0 V. I segnali alternati che vanno sia in positivo sia in negativo, come quello di un microfono, vanno invece prima portati a metà dell'alimentazione. Per farlo crei una tensione di punto centrale con due resistenze e aggiungi accanto un condensatore da 10 µF per ridurre il rumore. Questo punto si chiama massa virtuale o riferimento; il segnale vi si sovrappone tramite un condensatore di accoppiamento.

  • Scegli l'operazionale giusto: i modelli il cui intervallo d'ingresso non comprende 0 V, come l'LM741 o il TL072, tosano in modo inatteso con alimentazione singola; usa un LM358, un LM324 o un MCP6002.
  • Tieni conto dei limiti d'uscita: a 5 V l'uscita dell'LM358 va da circa 0,02 a 3,5 V, quindi per i segnali alternati un punto centrale intorno a 1,8 V è più equilibrato di 2,5 V. L'MCP6002 si avvicina di circa 25 mV a entrambe le alimentazioni, quindi il suo punto centrale può essere esattamente VCC/2.
  • Alimenta l'operazionale con la stessa tensione della scheda: un operazionale alimentato a 12 V può mandare più di 10 V su un piedino dell'ESP32 o del Pico se il guadagno è sbagliato.
  • Usa una massa comune: le GND di sensore, operazionale e scheda devono essere collegate; scoprirai perché nella guida sulla massa comune.
  • Non lasciare scollegato il canale inutilizzato: collega la metà libera dell'LM358 come inseguitore (uscita all'ingresso −) e porta il suo ingresso + a GND o al punto centrale; gli ingressi flottanti possono causare oscillazioni e consumi inutili.

Amplificare il segnale di un microfono: preamplificatore per microfono electret

I microfoni electret hanno una sensibilità tipica di circa −44 dBV/Pa; cioè, anche con una forte pressione sonora di 94 dB, danno solo circa 6 mV. Una normale conversazione a un metro resta intorno a 0,1 mV, mentre un battito di mani proprio accanto al microfono può arrivare a qualche decina di millivolt. Con il passo da 4,88 mV di Arduino, questo segnale o non compare affatto o si muove solo di pochi passi; questo spiega anche perché l'uscita analogica di moduli come il sensore di suono KY-038 sia così debole. La soluzione è un amplificatore in alternata non invertente con un guadagno di circa 100. Il circuito qui sotto usa il canale A dell'LM358:

ComponenteValoreCollegamento
Resistenza di polarizzazione del microfono2,2 kΩTra 5V e il terminale + del microfono (terminale − a GND)
Condensatore di accoppiamento C11 µFDal terminale + del microfono al piedino 3 dell'LM358 (1IN+)
Resistenze del punto centrale100 kΩ e 56 kΩ100 kΩ dal piedino 3 a 5V, 56 kΩ dal piedino 3 a GND (circa 1,8 V)
Retroazione Rf100 kΩTra il piedino 1 (1OUT) e il piedino 2 (1IN−)
Rg e C21 kΩ + 10 µFIn serie dal piedino 2 a GND (terminale − di C2 a GND)
AlimentazionePiedino 8 e piedino 4Piedino 8 a 5V, piedino 4 a GND, 100 nF tra i due
UscitaPiedino 1Arduino Uno A0 (ESP32 GPIO 34, Pico GP26: con MCP6002 e 3,3 V)

Grazie al condensatore C2, in continua il circuito è un inseguitore con guadagno 1; nel silenzio l'uscita riposa al punto centrale, circa 1,8 V. Alle frequenze audio, invece, C2 si comporta come un cortocircuito e il guadagno diventa 1 + 100k / 1k = 101 (40 dB). La frequenza di taglio inferiore la fissano Rg e C2: 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. Il limite superiore lo traccia il prodotto guadagno-banda dell'operazionale: nell'LM358 0,7 MHz / 101 ≈ 7 kHz, sufficienti per la voce. Se vuoi più guadagno, ricorda che la banda si restringe nella stessa proporzione; se ti serve un guadagno di 1000, conviene dividerlo in due stadi da circa 32 ciascuno.

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}

Il codice prende quanti più campioni può per 50 ms, trova il valore minimo e quello massimo e converte la differenza in volt; è l'ampiezza picco-picco del suono. Dividendo il risultato per 101 si ottiene la tensione prodotta dal microfono stesso. In una stanza silenziosa l'uscita si muove solo di pochi passi dell'ADC (0,01–0,02 V), mentre un battito di mani vicino supera facilmente 1 V. Se il segnale viene tosato, cioè se l'uscita tocca 0 V o 3,5 V, abbassa Rf a 47 kΩ. Nella guida sul filtraggio dei dati dei sensori trovi i modi per rendere la misura più stabile.

Amplificare una termocoppia: termocoppia tipo K e LM358

Una termocoppia di tipo K genera una piccola tensione proporzionale alla differenza di temperatura nel giunto dove si uniscono due metalli diversi: circa 41 µV/°C. Si misurano 4,1 mV a 100 °C, 20,6 mV a 500 °C e 41,3 mV a 1000 °C. Collegata direttamente ad Arduino, un passo dell'ADC (4,88 mV) corrisponde a circa 119 °C; non è una misura. Un amplificatore non invertente con guadagno 101 sul canale B dell'LM358 porta il segnale a 4,14 mV/°C: ora un passo vale circa 1,2 °C, e il limite d'uscita di 3,5 V dell'LM358 permette di misurare fino a circa 700–800 °C, a seconda dell'offset. Il collegamento: terminale + della termocoppia al piedino 5 (2IN+), terminale − a GND; Rf = 100 kΩ tra i piedini 7 e 6, Rg = 1 kΩ tra il piedino 6 e GND; il piedino 7 va all'A1 di Arduino. Nel tipo K il filo di alumel, che è il terminale −, è leggermente magnetico: un modo pratico per distinguere i terminali.

In realtà una termocoppia misura la differenza tra il giunto caldo e il giunto freddo, dove i suoi fili incontrano il collegamento in rame. Per conoscere la temperatura reale devi misurare a parte la temperatura del giunto freddo e sommarla; si chiama compensazione del giunto freddo. Il codice qui sotto usa a questo scopo un LM35 posizionato proprio accanto ai morsetti di collegamento (uscita su A2). Inoltre anche l'offset d'ingresso dell'LM358, di 3–7 mV, viene moltiplicato per 101 e crea in uscita un errore di 0,3–0,7 V, cioè di 70–170 °C. Il codice misura questo offset all'avvio e lo sottrae dalle letture successive, quindi accendi la scheda quando la sonda è a 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 l'offset è negativo, l'uscita resta incollata a 0 V e il circuito non mostra nulla finché la tensione della termocoppia non supera quell'offset; se all'avvio leggi su A1 un offset vicinissimo a zero, sta succedendo proprio questo. Inoltre l'offset dell'LM358 varia con la temperatura, e l'approssimazione di 41 µV/°C è precisa solo entro pochi gradi tra 0 e 500 °C. Per i lavori che richiedono precisione, come forni, stampanti 3D o trattamenti termici, usa un modulo MAX6675 o MAX31855, che integra la compensazione del giunto freddo e un'uscita digitale, oppure un operazionale di precisione a deriva zero (zero-drift).

Adattare il segnale all'ADC di Arduino: portarlo nell'intervallo giusto

Il vero lavoro di un operazionale nei progetti con Arduino è portare il segnale di un sensore nell'intervallo che l'ADC sfrutta meglio. La regola è semplice: il valore massimo del segnale deve avvicinarsi alla parte alta dell'intervallo dell'ADC, ma senza invadere gli estremi dove operazionale e ADC non sono lineari. Per esempio, l'LM35 dà 0–500 mV tra 0 e 50 °C; letto direttamente su un Uno, ottieni una risoluzione di 0,49 °C per passo. Se amplifichi lo stesso segnale con guadagno 6,6 fino a 0–3,3 V, la risoluzione scende a 0,074 °C. Ecco il progetto passo per passo:

  1. Trova l'intervallo d'uscita del sensore: annota dal datasheet la tensione d'uscita minima e massima (LM35, 0–50 °C: 0–0,5 V).
  2. Scegli l'intervallo di destinazione: la zona sicura è circa 0,02–3,5 V per un Uno con LM358, 0,15–2,5 V per un ESP32 e 0,03–3,25 V per un Pico con MCP6002.
  3. Calcola il guadagno: G = massimo desiderato / massimo del sensore = 3,3 / 0,5 = 6,6. Per avere 1 + Rf / Rg = 6,6 in un non invertente, scegli Rf = 56 kΩ e Rg = 10 kΩ.
  4. Togli l'offset: se il sensore lavora in un intervallo che non parte da zero, come 1–2 V, sottrai prima la tensione di riferimento (Vref in un invertente o un amplificatore differenziale), poi amplifica.
  5. Proteggi e filtra: metti una resistenza in serie da 1 kΩ tra l'uscita dell'operazionale e il piedino dell'ADC, e 100 nF tra il piedino e GND. Questo filtro RC attenua il rumore sopra circa 1,6 kHz e limita qualsiasi corrente di guasto verso il piedino.
  6. Ricalcola nel software: dividi la tensione misurata per il guadagno per ottenere la vera tensione del sensore (Vsensore = Vadc / G); misura le resistenze con il multimetro per precisare il guadagno.
SchedaADCIntervallo d'ingresso consigliatoPassoPiedini analogici
Arduino Uno10 bit0–5 V (0–1,1 V con il riferimento interno)4,88 mV (1,07 mV)A0–A5
ESP3212 bitCirca 0,15–2,5 V (attenuazione predefinita di 11 dB)~0,8 mVGPIO 32–39 (ADC1, funziona anche con il Wi-Fi attivo)
Raspberry Pi Pico12 bit0–3,3 V0,81 mVGP26, GP27, GP28
Per segnali molto piccoli sull'Uno, analogReference(INTERNAL) abbassa il riferimento dell'ADC a 1,1 V e riduce il passo a 1,07 mV; a volte non serve nemmeno uno stadio con operazionale in più. In questa modalità, però, un ingresso oltre 1,1 V satura la lettura. Per i dettagli sull'ADC, consulta la guida su ADC e conversione analogico-digitale.

Leggere l'uscita dell'operazionale con l'ESP32: interruttore a battito di mani

Dato che l'ESP32 lavora a 3,3 V, monta lo stesso circuito del microfono con un MCP6002 e alimentalo dal piedino 3V3; per il punto centrale usa due resistenze da 100 kΩ (1,65 V). Se alimenti un LM358 a 5 V, la sua uscita può arrivare a 3,5 V e mettere sotto stress il piedino dell'ESP32. Collega l'uscita dell'operazionale al GPIO 34, uno dei canali ADC1 che funzionano anche con il Wi-Fi attivo. Il codice qui sotto misura l'ampiezza picco-picco in finestre da 20 ms, usa i millivolt calibrati di analogReadMilliVolts() e applica un'isteresi software con due soglie distinte: ogni battito di mani cambia lo stato del LED integrato. Se usi la scheda per la prima volta, comincia dai passi di installazione della guida Cos'è l'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: misurare la corrente con una resistenza di shunt

Un altro lavoro pratico per un operazionale è misurare la corrente. Se metti una resistenza di shunt da 0,1 Ω tra il terminale negativo di un motore o di una striscia LED e GND, una corrente di 1 A vi fa cadere solo 100 mV. Un amplificatore non invertente con un MCP6002 (Rf = 100 kΩ, Rg = 4,7 kΩ) moltiplica questa tensione per 22,3: 1 A diventa 2,23 V, e con l'intervallo di 3,3 V del Pico misuri fino a circa 1,45 A. Il capo superiore dello shunt va al piedino 3 dell'MCP6002 e l'uscita dell'operazionale (piedino 1) al piedino GP26 (ADC0) del Pico; l'operazionale è alimentato dal piedino 3V3(OUT) e la GND dell'alimentazione del carico è collegata a quella del Pico. A 1,5 A lo shunt dissipa 0,225 W, quindi usa una resistenza da almeno 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)

All'avvio, con il carico spento, il codice misura l'offset dell'operazionale e lo sottrae dalle letture successive; la media di 100 letture attenua il rumore dell'ADC. Per correnti maggiori, abbassa il valore dello shunt o il guadagno; controlla la caduta di tensione e la potenza dissipata nello shunt con lo strumento Legge di Ohm. Se preferisci una soluzione pronta, il sensore di corrente ACS712 a effetto Hall misura la corrente tenendo il carico isolato dal tuo circuito. Se configuri il Pico per la prima volta, la guida Cos'è il Raspberry Pi Pico spiega come installare MicroPython.

Altri circuiti con operazionale

CircuitoFormula / comportamentoDove si usa?
Sommatore (mixer)Vout = −Rf × (V1/R1 + V2/R2 + …)Mixer audio, unire più segnali
Amplificatore differenzialeVout = (R2 / R1) × (V2 − V1)Togliere un offset, misurare la differenza tra due punti
Amplificatore per strumentazioneGuadagno elevato impostato con una sola resistenza, ottima reiezione di modo comuneCelle di carico, ponti di Wheatstone, segnali biomedici
IntegratoreCondensatore nella retroazione; l'uscita è l'integrale dell'ingresso nel tempoGeneratore di onda triangolare, controllo PI
Filtro attivo (Sallen-Key)Filtro del secondo ordine con due resistenze e due condensatoriFiltri audio, filtro anti-aliasing prima dell'ADC
Trigger di SchmittComparatore con retroazione positiva, due soglie distinteUscita digitale pulita da un segnale rumoroso

Per i sensori a ponte come le celle di carico, in cui entrambe le uscite stanno a metà dell'alimentazione e differiscono solo di pochi millivolt, gli integrati pronti sono più pratici: l'HX711 contiene un amplificatore con guadagno fino a 128 e un ADC a 24 bit. L'operazionale sulla scheda di un sensore di battito, invece, amplifica e filtra il debole segnale del sensore di luce; per questo Arduino vede un'onda di battito chiara fin dal primo tentativo.

Sensore di battito cardiaco Pulse Sensor
Pulse Sensor: l'operazionale sulla scheda amplifica e filtra la minima variazione della luce riflessa dal dito; a riposo l'uscita sta a metà dell'alimentazione.

Idee di progetti con l'operazionale

  • Lampada che si accende battendo le mani: pilota un modulo relè con il preamplificatore del microfono e il codice ESP32 con isteresi.
  • VU meter: trasforma l'ampiezza picco-picco in una barra che sale con la musica su una striscia LED WS2812B.
  • Termometro per forno: misura fino a 500 °C con l'amplificatore per termocoppia e mostra il valore su un display OLED.
  • Luce notturna senza codice: realizza un LED che si accende al buio con una LDR e un LM358 come comparatore, senza alcun microcontrollore.
  • Bilancia digitale: leggi una cella di carico con l'HX711 e costruisci una bilancia da cucina precisa al grammo.
  • Monitor della corrente del motore: misura la corrente del motore della tua macchinina robot con uno shunt e un operazionale, e ferma il motore quando la corrente sale perché si è bloccato.

Errori comuni e soluzioni

SintomoCausa probabileSoluzione
Uscita sempre a 0 V o al massimoNessuna retroazione o collegata all'ingresso sbagliato; guadagno troppo alto; ingresso fuori dall'intervallo d'ingressoControlla che Rf vada all'ingresso −, abbassa il guadagno, verifica che l'ingresso sia tra 0 e V+ − 1,5 V
Circuito con LM741 che non funziona a 5 VL'LM741 richiede un'alimentazione duale e più altaUsa un LM358 o un MCP6002
L'uscita non supera 3,5 VL'uscita dell'LM358 si ferma a V+ − 1,5 VScegli il guadagno di conseguenza o usa un operazionale rail-to-rail
Letture rumorose e instabiliManca il disaccoppiamento dell'alimentazione, cavi lunghi, guadagno inutilmente alto100 nF sui piedini di alimentazione, cavi corti, filtro RC in uscita, media via software
Il circuito oscilla da soloL'operazionale pilota direttamente un cavo lungo o un forte carico capacitivoMetti una resistenza in serie da 100–470 Ω sull'uscita
L'uscita del comparatore non sale maiL'LM393 è a collettore aperto e manca il pull-upCollega 4,7–10 kΩ tra uscita e alimentazione
Piedino dell'ESP32 o del Pico danneggiatoL'operazionale era alimentato a 5 V o 12 V e l'uscita ha superato 3,3 VAlimenta l'operazionale a 3,3 V o aggiungi un partitore e un diodo di clamp sull'uscita
Uscita bloccata a 0 V con segnali piccoliUn offset d'ingresso negativo incolla l'uscita in basso con alimentazione singolaUsa un operazionale di precisione o applica all'ingresso una piccola polarizzazione
Quando cerchi un guasto in un circuito con operazionale, misura prima con il multimetro la tensione dei due ingressi. In un amplificatore con retroazione negativa che funziona bene, la differenza tra gli ingressi + e − non supera pochi millivolt. Se la differenza è grande, l'operazionale è in saturazione: l'uscita è incollata a un'alimentazione e la causa è il guadagno, l'intervallo d'ingresso o un collegamento di retroazione interrotto. Per la misura vera e propria, consulta la guida come usare il multimetro.

Un amplificatore operazionale è un traduttore che porta il mondo analogico in una lingua che il microcontrollore capisce: una volta note le due regole e le due formule del guadagno, puoi adattare all'ADC qualsiasi segnale, che venga da un microfono, da una termocoppia, da una resistenza di shunt o da un sensore a ponte. Prova i valori con lo strumento Guadagno op-amp; nell'app BlueGrays trovi progetti analogici come la misura della luce con una LDR, la luce notturna, il voltmetro digitale, la misura della temperatura con un NTC e i sensori di fiamma e di gas, passo per passo con schemi e codice.

Domande frequenti

A cosa serve un amplificatore operazionale?

Un amplificatore operazionale serve ad amplificare segnali deboli, confrontare due tensioni, sommare o sottrarre segnali, filtrarli e fare da buffer a sorgenti ad alta impedenza. Nei progetti con Arduino si usa soprattutto per portare segnali di pochi millivolt, come quelli di un microfono, di una termocoppia o di una resistenza di shunt, a un livello che l'ADC possa leggere.

Come si calcola il guadagno di un operazionale?

Nell'amplificatore non invertente il guadagno è 1 + Rf / Rg, in quello invertente è −Rf / Rin. Per esempio, con Rf = 100 kΩ e Rg = 1 kΩ il guadagno non invertente è 101 e quello invertente −100. In decibel si calcola come 20 × log10(guadagno).

Che differenza c'è tra LM358 e LM741?

L'LM358 contiene due operazionali in un contenitore, funziona con un'alimentazione singola da 3 a 30 V e il suo intervallo d'ingresso comprende 0 V, quindi si usa direttamente con i 5 V di Arduino. L'LM741 è un operazionale singolo pensato per un'alimentazione duale come ±15 V e in pratica non funziona con 5 V singoli. Anche le piedinature sono diverse.

Un operazionale funziona con un'alimentazione singola a 5 V?

Sì, i modelli progettati per l'alimentazione singola funzionano, come LM358, LM324 e MCP6002. Per i segnali alternati devi portare l'ingresso a metà dell'alimentazione e tenere conto dei limiti d'uscita; l'uscita dell'LM358 arriva solo a circa 3,5 V con 5 V.

Che differenza c'è tra operazionale e comparatore?

Un operazionale è compensato in frequenza per restare stabile con la retroazione negativa, e la sua uscita può erogare e assorbire corrente. I comparatori come l'LM393 sono progettati per commutare velocemente senza retroazione, e la maggior parte ha un'uscita a collettore aperto che richiede una resistenza di pull-up. Un operazionale può fare da comparatore lento, ma un comparatore non va usato come amplificatore.

Cos'è un operazionale rail-to-rail?

In un operazionale rail-to-rail l'ingresso o l'uscita possono avvicinarsi a poche decine di millivolt dalle tensioni di alimentazione. Per esempio, l'MCP6002 fornisce 0,025–4,975 V con 5 V, mentre l'LM358 arriva solo a circa 3,5 V. Sulle schede a 3,3 V come ESP32 e Raspberry Pi Pico serve un operazionale rail-to-rail per sfruttare tutto l'intervallo dell'ADC.

Vedi tutti i progetti
Misurare l'intensità luminosa con LDR
#11Principiante

Misurare l'intensità luminosa con LDR

Vuoi vedere quanto è luminosa la tua stanza sotto forma di numero? L'LDR, un piccolo componente sensibile alla luce, misura la luce ambiente e l'Arduino scrive il valore sullo schermo del computer ogn

4.6(81)
139
Luce notturna con LDR
#12Principiante

Luce notturna con LDR

Una piccola luce notturna che si accende da sola quando fa buio e si spegne quando arriva il mattino. Un sensore di luce misura quanto è illuminata la stanza, e l'Arduino accende il LED quando è abbas

4.8(102)
205
Lettura dell'intensità luminosa con il modulo LDR ESP32
#113Principiante

Lettura dell'intensità luminosa con il modulo LDR ESP32

Monitoraggio in tempo reale sul Serial Monitor del valore grezzo dell'ADC del modulo LDR e della percentuale relativa di luce calcolata dai valori di riferimento al buio e alla luce. Questa percentuale non è una misurazione in lux. Spiega il principio di calibrazione del modulo. È consigliabile eseguirlo prima del Progetto 10, poiché serve a determinare il valore di soglia.

4.6(36)
55
Voltmetro digitale con display LCD
#56Intermedio
Premium

Voltmetro digitale con display LCD

Scopri quanta tensione dà una pila o un alimentatore con uno strumento costruito da te. Un partitore fatto di due resistenze abbassa la tensione alta a un livello che la scheda può leggere, e l'Arduin

4.5(27)
36
Misura di temperatura con NTC e display Lcd 2x16
#44Principiante
Premium

Misura di temperatura con NTC e display Lcd 2x16

Misura la temperatura dell'ambiente con un sensore che sembra una piccola perlina. Questo componente, chiamato NTC, fa passare la corrente sempre più facilmente man mano che si scalda; l'Arduino legge

4.5(33)
44
Utilizzo del sensore di fiamma
#50Intermedio
Premium

Utilizzo del sensore di fiamma

Un piccolo guardiano che si accorge del fuoco prima di te, in cucina o in laboratorio. Il sensore di fiamma cattura la luce invisibile che il fuoco emette; se va tutto bene è acceso il LED verde, quan

4.6(33)
44
Utilizzo del sensore di gas
#51Principiante
Premium

Utilizzo del sensore di gas

Un piccolo guardiano che si accorge di una fuga di gas in cucina prima di te. Il sensore di gas annusa l'aria di continuo; finché va tutto bene resta acceso il LED verde, e quando il gas nell'aria sup

4.6(37)
50
Luminosità di un LED con Potenziometro su ESP32 (Analogico → PWM)
#115Intermedio
Premium

Luminosità di un LED con Potenziometro su ESP32 (Analogico → PWM)

In questo progetto controlliamo in modo analogico la luminosità di un LED tramite un potenziometro. Il pin ADC dell'ESP32 legge la tensione tra 0 e 3,3 V dal potenziometro; il valore viene convertito in un segnale PWM (Pulse Width Modulation) e inviato al LED. Ruotando il potenziometro, il LED si accende e si spegne gradualmente. Con Arduino Core 3.0+ si usa direttamente analogWrite(); su ESP32-S2/S3 la risoluzione dell'ADC è fissata a 12 bit.

4.5(19)
32