Op Amp Nedir? İşlemsel Yükselteç, Kazanç Formülleri ve LM358
Op amp nedir, nasıl çalışır? Eviren ve evirmeyen yükselteç formülleri, buffer, karşılaştırıcı, LM358/LM741 pinleri, tek besleme ve Arduino ADC'ye uyumlama.
Op amp (işlemsel yükselteç), iki girişi arasındaki çok küçük gerilim farkını yüz binlerce kat büyüten, genellikle sekiz bacaklı küçük bir entegre devredir. Op amp nedir sorusunun kısa cevabı budur, ama tek başına bu kadar büyük bir kazanç pek işe yaramaz. Asıl sihir, çıkıştan girişe birkaç dirençle geri besleme verildiğinde ortaya çıkar: op amp o zaman kazancını dirençlerin oranının belirlediği hassas bir yükseltece, bir tampona, bir karşılaştırıcıya ya da bir filtreye dönüşür. Mikrofon ön yükselteçlerinden nabız sensörlerine, terazi modüllerinden ses kartlarına kadar analog elektroniğin neredeyse her köşesinde bir op amp vardır.
Arduino ile uğraşırken op ampe en çok şu yüzden ihtiyaç duyarsın: birçok sensörün sinyali milivolt düzeyindedir, Arduino Uno'nun ADC'si ise ancak 4,88 mV'luk adımları ayırt edebilir. K tipi bir termokupl 100 °C'de yalnızca 4,1 mV üretir; doğrudan bağlarsan Arduino bu sıcaklığı neredeyse hiç fark etmez. Bu yazıda ideal op amp kurallarını, eviren ve evirmeyen yükselteç formüllerini, gerilim izleyiciyi, karşılaştırıcıyı, LM358 ve LM741 pinlerini, tek besleme ile çalışmayı ve mikrofon ile termokupl sinyalini Arduino, ESP32 ve Raspberry Pi Pico'nun ADC'sine uyumlamayı gerçek değerlerle öğreneceksin.
Op amp nedir, nasıl çalışır?
Bir op ampin beş temel ucu vardır: evirmeyen giriş (+), eviren giriş (−), çıkış ve iki besleme ucu (V+ ve V−). Op amp yalnızca iki giriş arasındaki farka bakar ve onu açık çevrim kazancıyla (A) çarpar: Vçıkış = A × (V+ − V−). LM358'de A tipik olarak 100.000'dir (100 dB). Bu, girişler arasındaki yalnızca 0,1 mV'luk farkın çıkışta 10 V istemesi demektir; ama çıkış besleme geriliminin dışına çıkamaz, bu yüzden geri beslemesiz bir op ampin çıkışı neredeyse her zaman beslemelerden birine yapışır, yani doyuma gider. Bu davranış karşılaştırıcı devrelerinde işe yarar. Yükselteç yapmak içinse çıkışın bir kısmı dirençlerle eviren girişe geri verilir; buna negatif geri besleme denir ve kazancı artık op amp değil, dirençler belirler.
| Özellik | İdeal op amp | LM358 (tipik) | LM741 (tipik) |
|---|---|---|---|
| Açık çevrim kazancı | Sonsuz | 100.000 (100 dB) | 200.000 (106 dB) |
| Giriş akımı (bias) | 0 | 20 nA | 80 nA |
| Giriş ofset gerilimi | 0 | 3 mV (en çok 7 mV) | 1 mV (en çok 5 mV) |
| Kazanç-bant genişliği çarpımı (GBW) | Sonsuz | 0,7 MHz | Yaklaşık 1 MHz |
| Yükselme hızı (slew rate) | Sonsuz | 0,3 V/µs | 0,5 V/µs |
| Çıkış salınımı | Besleme uçlarına kadar | 0 V'a yakın, üstte V+ − 1,5 V | Her iki uçtan 1–3 V içeride |
| Besleme | Sınırsız | 3–30 V tek ya da ±1,5–±15 V | ±10–±18 V önerilir (LM741C) |
İdeal op amp kuralları: sanal kısa devre ve sıfır giriş akımı
- Kural 1 – Girişler akım çekmez: İdeal op ampin giriş direnci sonsuzdur; + ve − uçlarına hiç akım girmez. Gerçekte LM358'de bu akım 20 nA civarındadır, yani 100 kΩ'luk bir dirençte bile yalnızca 2 mV'luk bir hata yaratır.
- Kural 2 – Sanal kısa devre: Negatif geri besleme varsa çıkış, iki girişi aynı gerilime getirmek için ne gerekiyorsa onu yapar; sonuçta V+ = V− olur. Girişler birbirine bağlı değildir ama aynı gerilimde dururlar.
- Pratik kural – Çıkış beslemeyi aşamaz: Formül 12 V istese bile 5 V ile beslenen bir op amp en fazla beslemeye kadar, LM358'de yaklaşık 3,5 V'a kadar çıkabilir. Bu sınıra dayanan çıkışa kırpılma ya da doyum denir.
Bu kurallarla neredeyse her op amp devresini kâğıt üzerinde birkaç satırda çözebilirsin: önce + girişinin gerilimini bul, − girişinin de aynı gerilimde olduğunu kabul et, sonra dirençlerden geçen akımları Ohm kanunuyla yaz. Akım girişe giremediği için geri besleme direncinden geçmek zorundadır ve çıkış gerilimi buradan çıkar. Unutma: ikinci kural yalnızca negatif geri besleme olduğunda geçerlidir. Karşılaştırıcı gibi geri beslemesiz devrelerde girişler farklı gerilimdedir ve çıkış uçlardan birindedir. Akım ve gerilim hesaplarını tazelemek istersen Ohm kanunu yazısına göz at.
Evirmeyen yükselteç: kazanç formülü ve örnek
Evirmeyen (non-inverting) yükselteçte sinyal doğrudan + girişine verilir. Çıkıştan − girişine bir geri besleme direnci (Rf), − girişinden GND'ye de bir toprak direnci (Rg) bağlanır. Bu iki direnç bir gerilim bölücüdür: − girişindeki gerilim Vçıkış × Rg / (Rf + Rg) olur. Sanal kısa devre kuralına göre bu gerilim girişe eşittir ve buradan Vçıkış = Vgiriş × (1 + Rf / Rg) formülü çıkar. Rf = 10 kΩ ve Rg = 1 kΩ seçersen kazanç 11 olur ve 100 mV'luk bir sinyal 1,1 V'a yükselir. Çıkış girişle aynı yönde hareket eder, kazanç hiçbir zaman 1'in altına inmez ve devrenin giriş direnci çok yüksektir; bu yüzden sensörü yüklemez.
| Rf | Rg (eviren devrede Rin) | Evirmeyen kazanç | Eviren kazanç |
|---|---|---|---|
| 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) |
Eviren yükselteç ve sanal toprak
Eviren (inverting) yükselteçte + girişi GND'ye bağlanır, sinyal ise bir Rin direnci üzerinden − girişine gelir; Rf yine çıkış ile − girişi arasındadır. Sanal kısa devre kuralına göre − girişi de 0 V'tadır ama GND'ye bağlı değildir; buna sanal toprak denir. Rin'den geçen Vgiriş / Rin akımı girişe giremediği için Rf'ten geçmek zorundadır ve çıkış Vçıkış = −(Rf / Rin) × Vgiriş olur. Rin = 10 kΩ ve Rf = 47 kΩ ile kazanç −4,7'dir: 0,5 V'luk giriş −2,35 V'luk çıkış verir. Eksi işareti sinyalin ters çevrildiğini gösterir. Devrenin giriş direnci yaklaşık Rin kadardır, yani yüksek iç dirençli bir sensörü yükleyebilir.
Eviren yapının güzel bir kullanımı toplayıcı (mikser) devresidir: − girişine her biri kendi direnciyle birden fazla sinyal bağlarsan çıkış, bu sinyallerin ağırlıklı toplamının tersi olur. Tek beslemeli bir Arduino devresinde ise eviren yükseltecin + girişini GND yerine bir referansa, örneğin beslemenin yarısına bağlaman gerekir; yoksa pozitif girişler negatif çıkış ister ve çıkış 0 V'a yapışır. Bu durumda formül Vçıkış = Vref − (Rf / Rin) × (Vgiriş − Vref) olur.
Gerilim izleyici (buffer): kazancı 1 olan en kullanışlı devre
Çıkışı doğrudan − girişine bağlar ve sinyali + girişine verirsen gerilim izleyici (voltage follower, tampon) elde edersin. Rf sıfır, Rg sonsuz olduğu için kazanç tam 1'dir ve Vçıkış = Vgiriş olur. Gerilimi büyütmeyen bir devre neden işe yarar? Çünkü girişten neredeyse hiç akım çekmez ama çıkıştan miliamperler verebilir; yani yüksek empedanslı bir kaynağı düşük empedanslı bir kaynağa çevirir. ATmega328P'nin veri sayfası, ADC'nin en iyi 10 kΩ ya da daha düşük kaynak empedansıyla çalıştığını söyler. 100 kΩ + 100 kΩ'luk bir gerilim bölücü 50 kΩ'luk bir kaynak gibi davranır ve Arduino kanallar arasında geçiş yaptığında okuma birkaç adım kayabilir. Bölücünün çıkışına bir izleyici koyarsan sorun kaybolur.
İzleyicinin diğer klasik kullanımları şunlardır: PWM sinyalini RC filtreyle düzleştirip izleyiciyle tamponlayarak basit bir DAC yapmak, bir potansiyometreden alınan referans gerilimini birden fazla devreye dağıtmak ve uzun bir kabloyu zayıf bir sensör çıkışı yerine op amp çıkışıyla sürmek. LM358 tek beslemede 0 V'a kadar izleyebilir ama 5 V beslemede yaklaşık 3,5 V'un üstüne çıkamaz; 0–5 V aralığının tamamını tamponlamak istiyorsan rail-to-rail bir op amp seç.
Karşılaştırıcı (comparator) olarak op amp
Geri besleme olmadan kullanılan op amp, iki gerilimi karşılaştıran bir anahtara dönüşür: + girişi − girişinden birkaç milivolt bile yüksekse çıkış üst sınıra, düşükse 0 V'a gider. Mikrodenetleyicisiz bir gece lambası buna güzel bir örnektir. 5V, 10 kΩ, LDR ve GND sırasıyla kurduğun bölücünün orta noktasını + girişine, bir potansiyometrenin orta ucunu − girişine bağla. Karanlıkta LDR'nin direnci artar, orta nokta gerilimi potla ayarladığın eşiği geçer ve çıkışa 330 Ω ile bağlı LED yanar. LM358 bu iş için yeterlidir ama yavaştır: 0,3 V/µs'lik yükselme hızıyla çıkışın 0'dan 3,5 V'a çıkması 10 µs'den uzun sürer.
Hızlı ve temiz geçiş gereken işlerde LM393 gibi gerçek bir karşılaştırıcı kullanılır. LM393, LM358 ile aynı bacak dizilimine sahiptir ama çıkışı açık kollektörlüdür: çıkışı yalnızca GND'ye çekebilir, yukarı çıkması için çıkış ile besleme arasına 10 kΩ gibi bir pull-up direnci gerekir. Bu sayede pull-up'ı 3,3 V'a bağlayıp 5 V ile beslenen bir karşılaştırıcının çıkışını ESP32 ya da Pico'ya güvenle verebilirsin. KY-038 ses sensörünün, toprak nem, yağmur, alev ve gaz modüllerinin üzerindeki mavi trimpotun yanında duran küçük entegre neredeyse her zaman bir LM393'tür.

Eşiğe yakın, yavaş değişen ya da gürültülü sinyallerde karşılaştırıcının çıkışı saniyede yüzlerce kez titreyebilir; gece lambası alacakaranlıkta yanıp söner. Çözüm histerezis, yani Schmitt tetikleyicidir. Sinyali + girişine 10 kΩ'luk bir R1 direnciyle ver ve çıkıştan + girişine 1 MΩ'luk bir R2 direnci bağla. Çıkış her değiştiğinde bu pozitif geri besleme eşiği biraz kaydırır; yükselme ve düşme eşikleri arasındaki fark yaklaşık çıkış salınımı × R1 / R2 kadar olur. 0–5 V salınan bir çıkışla 5 × 10k / 1M = 50 mV'luk bir histerezis, gürültüyü yutmaya genellikle yeter. Aynı fikri yazılımda iki ayrı eşikle de uygulayabilirsin; aşağıdaki ESP32 örneği tam olarak bunu yapıyor.
LM358 ve LM741 pinleri
Hobi elektroniğinde en sık karşılaşacağın iki op amp, çift kanallı LM358 ve tek kanallı klasik LM741'dir. İkisi de 8 bacaklı DIP kılıfta gelir. Entegreyi yazısı okunacak şekilde ve çentiği sola bakacak gibi tuttuğunda 1 numaralı bacak sol alttadır, numaralar saat yönünün tersine artar. Pin dizilimleri farklıdır, bu yüzden birini diğerinin yerine doğrudan takamazsın:
| Pin | LM358 (çift op amp) | LM741 (tek op amp) |
|---|---|---|
| 1 | 1OUT – A çıkışı | Offset null (ofset ayarı) |
| 2 | 1IN− – A eviren giriş | Eviren giriş (−) |
| 3 | 1IN+ – A evirmeyen giriş | Evirmeyen giriş (+) |
| 4 | GND (V−) | V− (negatif besleme) |
| 5 | 2IN+ – B evirmeyen giriş | Offset null (ofset ayarı) |
| 6 | 2IN− – B eviren giriş | Çıkış |
| 7 | 2OUT – B çıkışı | V+ (pozitif besleme) |
| 8 | VCC (V+) | NC (boş) |
| Özellik | LM358 | LM741 | MCP6002 |
|---|---|---|---|
| Kanal sayısı | 2 | 1 | 2 |
| Besleme | 3–30 V tek besleme | ±10–±18 V çift besleme önerilir | 1,8–6 V tek besleme |
| 5 V tek beslemede | Çalışır | Pratikte çalışmaz | Çalışır |
| 3,3 V ile | Zayıf (çıkış en fazla ~1,8 V) | Çalışmaz | Çok iyi |
| Giriş aralığı | 0 V'tan V+ − 1,5 V'a | Beslemelerden ~3 V içeride | Beslemelerin 0,3 V dışına kadar |
| Çıkış aralığı (5 V'ta) | ~0,02–3,5 V | Kullanılamaz | 0,025–4,975 V (rail-to-rail) |
| GBW / yükselme hızı | 0,7 MHz / 0,3 V/µs | ~1 MHz / 0,5 V/µs | 1 MHz / 0,6 V/µs |
| Akım tüketimi | 0,35 mA / kanal | 1,7 mA | 0,1 mA / kanal |
LM741 1968'den beri ders kitaplarının yıldızıdır, ama ±15 V gibi simetrik bir besleme için tasarlanmıştır: girişleri beslemelerden yaklaşık 3 V, çıkışı 1–3 V içeride kalmak zorundadır. 5 V tek beslemede bu paylar düşülünce kullanılabilir bir aralık kalmaz; LM741'li bir devre Arduino'nun 5V pininden beslendiğinde çalışmıyorsa sebep budur. LM358 ise tek besleme için tasarlanmıştır: girişleri 0 V'u da kapsar, çıkışı 0 V'a birkaç milivolt yaklaşabilir, tek eksiği üstte V+ − 1,5 V'ta kalmasıdır. ESP32 ve Pico gibi 3,3 V kartlarda MCP6002 gibi rail-to-rail bir op amp kullan; LM358 ile aynı bacak dizilimine sahip olduğu için devrede doğrudan yerine takılır. Dört kanala ihtiyacın varsa 14 bacaklı LM324, LM358'in dörtlü kardeşidir.
Tek besleme ile çalışma: sanal toprak ve rail-to-rail
Ders kitaplarındaki op amp devrelerinin çoğu ±15 V gibi simetrik besleme kullanır ve sinyal 0 V'un iki yanında salınır. Arduino dünyasında ise elinde genellikle yalnızca 5 V ya da 3,3 V vardır. Termokupl, şönt direnç ya da LM35 gibi hep pozitif kalan DC sinyaller için bu sorun değildir; girişleri 0 V'u kapsayan bir op ampla doğrudan yükseltilirler. Ama mikrofon gibi artı ve eksi yönde salınan AC sinyalleri önce beslemenin ortasına kaldırman gerekir. Bunun için iki dirençle bir orta nokta gerilimi üretir, gürültüyü azaltmak için yanına 10 µF'lık bir kondansatör koyarsın. Bu noktaya sanal toprak ya da referans denir; sinyal bir kuplaj kondansatörüyle bu referansın üzerine bindirilir.
- Doğru op ampi seç: Girişi 0 V'u kapsamayan LM741 ya da TL072 gibi modeller tek beslemede beklenmedik şekilde kırpar; LM358, LM324 ya da MCP6002 kullan.
- Çıkış sınırlarını hesaba kat: LM358'in 5 V'taki çıkışı yaklaşık 0,02–3,5 V'tur, bu yüzden AC sinyaller için orta nokta 2,5 V yerine 1,8 V civarında daha dengelidir. MCP6002 ise iki uca da 25 mV kadar yaklaşır ve orta nokta tam VCC/2 olabilir.
- Op ampi kartla aynı gerilimden besle: 12 V'tan beslenen bir op amp, yanlış bir kazançta ESP32 ya da Pico'nun pinine 10 V'tan fazlasını basabilir.
- Ortak GND kullan: Sensörün, op ampin ve kartın GND'leri birleşmelidir; nedenini ortak toprak yazısında bulabilirsin.
- Kullanmadığın kanalı boşta bırakma: LM358'in boşta kalan yarısını izleyici olarak bağla (çıkışı − girişine) ve + girişini GND'ye ya da orta noktaya ver; havada kalan girişler salınıma ve gereksiz akım çekmeye yol açabilir.
Mikrofon sinyalini yükseltmek: elektret mikrofon ön yükselteci
Elektret mikrofonların tipik hassasiyeti −44 dBV/Pa civarındadır; yani 94 dB'lik yüksek bir ses basıncında bile yalnızca yaklaşık 6 mV verirler. Bir metre uzaktaki normal konuşma 0,1 mV civarında kalır, mikrofonun dibinde çırpılan bir el ise birkaç on milivolta ulaşabilir. Arduino'nun 4,88 mV'luk adımıyla bu sinyal ya hiç görünmez ya da birkaç adım oynar; KY-038 ses sensörü gibi modüllerin analog çıkışının neden bu kadar zayıf olduğu da buradan anlaşılır. Çözüm, yaklaşık 100 kazançlı evirmeyen bir AC yükselteçtir. Aşağıdaki devre LM358'in A kanalını kullanır:
| Eleman | Değer | Bağlantı |
|---|---|---|
| Mikrofon besleme direnci | 2,2 kΩ | 5V ile mikrofonun + ucu arasına (mikrofonun − ucu GND'ye) |
| Kuplaj kondansatörü C1 | 1 µF | Mikrofonun + ucundan LM358 pin 3'e (1IN+) |
| Orta nokta dirençleri | 100 kΩ ve 56 kΩ | Pin 3'ten 5V'a 100 kΩ, pin 3'ten GND'ye 56 kΩ (yaklaşık 1,8 V) |
| Geri besleme Rf | 100 kΩ | Pin 1 (1OUT) ile pin 2 (1IN−) arasına |
| Rg ve C2 | 1 kΩ + 10 µF | Pin 2'den seri olarak GND'ye (C2'nin − ucu GND'ye) |
| Besleme | Pin 8 ve pin 4 | Pin 8 5V'a, pin 4 GND'ye, aralarına 100 nF |
| Çıkış | Pin 1 | Arduino Uno A0 (ESP32 GPIO 34, Pico GP26: MCP6002 ve 3,3 V ile) |
C2 kondansatörü sayesinde devre DC'de kazancı 1 olan bir izleyicidir; çıkış sessizlikte orta noktada, yaklaşık 1,8 V'ta durur. Ses frekanslarında ise C2 kısa devre gibi davranır ve kazanç 1 + 100k / 1k = 101 (40 dB) olur. Alt kesim frekansını Rg ve C2 belirler: 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. Üst sınırı ise op ampin kazanç-bant genişliği çarpımı çizer: LM358'de 0,7 MHz / 101 ≈ 7 kHz, konuşma için yeterlidir. Daha yüksek kazanç istersen bant genişliğinin aynı oranda daralacağını unutma; 1000 kazanç gerekiyorsa bunu her biri yaklaşık 32 kazançlı iki kademeye bölmek daha iyidir.
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}Kod 50 ms boyunca olabildiğince çok örnek alır, en küçük ve en büyük değeri bulur ve farkı volta çevirir; bu, sesin tepe-tepe genliğidir. Sonucu 101'e bölmek mikrofonun kendi ürettiği gerilimi verir. Sessiz bir odada çıkış yalnızca birkaç ADC adımı oynar (0,01–0,02 V), yakında çırpılan bir el ise 1 V'u kolayca aşar. Sinyal kırpılıyorsa, yani çıkış 0 V'a ya da 3,5 V'a dayanıyorsa Rf'yi 47 kΩ'a düşür. Ölçümü daha kararlı hale getirmenin yollarını sensör verisi filtreleme yazısında bulabilirsin.
Termokupl sinyalini yükseltmek: K tipi termokupl ve LM358
K tipi termokupl, iki farklı metalin birleştiği uçtaki sıcaklık farkıyla orantılı küçük bir gerilim üretir: yaklaşık 41 µV/°C. 100 °C'de 4,1 mV, 500 °C'de 20,6 mV, 1000 °C'de 41,3 mV ölçülür. Doğrudan Arduino'ya bağlarsan bir ADC adımı (4,88 mV) yaklaşık 119 °C'ye karşılık gelir; bu bir ölçüm sayılmaz. LM358'in B kanalıyla kurulan 101 kazançlı evirmeyen yükselteç sinyali 4,14 mV/°C'ye çıkarır: artık bir adım yaklaşık 1,2 °C'dir ve LM358'in 3,5 V'luk çıkış sınırı, ofsete bağlı olarak yaklaşık 700–800 °C'ye kadar ölçüm sağlar. Bağlantı şöyledir: termokuplun + ucu pin 5'e (2IN+), − ucu GND'ye; Rf = 100 kΩ pin 7 ile pin 6 arasına, Rg = 1 kΩ pin 6 ile GND arasına; pin 7 de Arduino'nun A1 pinine gider. K tipinde − ucu olan alümel tel hafifçe mıknatıs tutar, bu da kutupları ayırt etmenin pratik bir yoludur.
Termokupl aslında sıcak uç ile tellerin bakır bağlantıya girdiği soğuk uç arasındaki farkı ölçer. Gerçek sıcaklığı bulmak için soğuk uç sıcaklığını ayrıca ölçüp eklemen gerekir; buna soğuk uç telafisi denir. Aşağıdaki kodda bu iş için bağlantı klemenslerinin hemen yanına yerleştirilmiş bir LM35 kullanılıyor (çıkışı A2'ye). Ayrıca LM358'in 3–7 mV'luk giriş ofseti de 101 ile çarpılır ve çıkışta 0,3–0,7 V'luk, yani 70–170 °C'lik bir hata yaratır. Kod bu ofseti açılışta ölçüp sonraki okumalardan çıkarır; bu yüzden kartı prob oda sıcaklığındayken çalıştır.
1// K tipi termokupl + LM358 (kazanç 101) + LM35 soğuk uç / K-type thermocouple + LM358 (gain 101) + LM35 cold junction
2const int TC_PIN = A1; // LM358 pin 7 (2OUT)
3const int LM35_PIN = A2; // LM35 çıkışı / LM35 output
4const float GAIN = 101.0; // 1 + 100k / 1k
5const float MV_PER_C = 0.041; // K tipi: yaklaşık 41 µV/°C / K-type: about 41 µV/°C
6float zeroMv = 0; // açılışta ölçülen ofset / offset measured at power-up
7
8float readMv(int pin) {
9 long sum = 0;
10 for (int i = 0; i < 64; i++) sum += analogRead(pin); // 64 okumanın ortalaması / average of 64 readings
11 return sum / 64.0 * 5000.0 / 1023.0;
12}
13
14void setup() {
15 Serial.begin(115200);
16 delay(500);
17 zeroMv = readMv(TC_PIN); // prob oda sıcaklığında olmalı / probe must be at room temperature
18 Serial.print("Ofset / offset: ");
19 Serial.print(zeroMv, 1);
20 Serial.println(" mV");
21}
22
23void loop() {
24 float coldC = readMv(LM35_PIN) / 10.0; // LM35: 10 mV/°C
25 float tcMv = (readMv(TC_PIN) - zeroMv) / GAIN; // termokupl gerilimi / thermocouple voltage
26 float hotC = coldC + tcMv / MV_PER_C; // soğuk uç telafisi / cold-junction compensation
27
28 Serial.print("Ortam / ambient: ");
29 Serial.print(coldC, 1);
30 Serial.print(" °C Prob / probe: ");
31 Serial.print(hotC, 1);
32 Serial.println(" °C");
33 delay(500);
34}Arduino ADC'ye uyumlama: sinyali doğru aralığa oturtmak
Op ampin Arduino projelerindeki asıl işi, sensör sinyalini ADC'nin en verimli kullanacağı aralığa taşımaktır. Kural basittir: sinyalin en büyük değeri ADC aralığının üst kısmına yaklaşmalı ama op ampin ve ADC'nin doğrusal olmadığı uçlara taşmamalıdır. Örneğin LM35 0–50 °C arasında 0–500 mV verir; doğrudan okunduğunda Uno'da adım başına 0,49 °C çözünürlük elde edersin. Aynı sinyali 6,6 kazançla 0–3,3 V'a yükseltirsen çözünürlük 0,074 °C'ye iner. Adım adım tasarım şöyle:
- Sensörün çıkış aralığını bul: Veri sayfasından en küçük ve en büyük çıkış gerilimini yaz (LM35, 0–50 °C: 0–0,5 V).
- Hedef aralığı seç: Uno ve LM358 için yaklaşık 0,02–3,5 V, ESP32 için 0,15–2,5 V, Pico ve MCP6002 için 0,03–3,25 V güvenli bölgedir.
- Kazancı hesapla: G = hedef üst değer / sensör üst değeri = 3,3 / 0,5 = 6,6. Evirmeyen yükselteçte 1 + Rf / Rg = 6,6 için Rf = 56 kΩ ve Rg = 10 kΩ seç.
- Ofseti ayıkla: Sensör 1–2 V gibi sıfırdan başlamayan bir aralıkta çalışıyorsa önce referans gerilimini çıkar (eviren yükselteçte Vref ya da fark yükselteci), sonra yükselt.
- Koru ve süz: Op amp çıkışı ile ADC pini arasına 1 kΩ seri direnç, pin ile GND arasına 100 nF koy. Bu RC filtre yaklaşık 1,6 kHz üzerindeki gürültüyü bastırır ve pine akabilecek hata akımını sınırlar.
- Yazılımda geri hesapla: Okunan gerilimi kazanca bölerek sensörün gerçek gerilimini bul (Vsensör = Vadc / G); kazancı kesinleştirmek için dirençleri multimetreyle ölç.
| Kart | ADC | Önerilen giriş aralığı | Adım | Analog pinler |
|---|---|---|---|---|
| Arduino Uno | 10 bit | 0–5 V (iç referansla 0–1,1 V) | 4,88 mV (1,07 mV) | A0–A5 |
| ESP32 | 12 bit | Yaklaşık 0,15–2,5 V (varsayılan 11 dB zayıflatma) | ~0,8 mV | GPIO 32–39 (ADC1, Wi-Fi açıkken de çalışır) |
| Raspberry Pi Pico | 12 bit | 0–3,3 V | 0,81 mV | GP26, GP27, GP28 |
ESP32 ile op amp çıkışını okumak: el çırpma anahtarı
ESP32 3,3 V ile çalıştığı için aynı mikrofon devresini MCP6002 ile kur ve 3V3 pininden besle; orta nokta için iki 100 kΩ kullan (1,65 V). LM358'i 5 V'tan beslersen çıkış 3,5 V'a çıkabilir ve ESP32'nin pinini zorlar. Op amp çıkışını, Wi-Fi açıkken de çalışan ADC1 kanallarından GPIO 34'e bağla. Aşağıdaki kod 20 ms'lik pencerelerde tepe-tepe genliği ölçer, analogReadMilliVolts() ile kalibre edilmiş milivolt değerini kullanır ve iki ayrı eşikle yazılımda histerezis uygular: her alkışta dahili LED'in durumu değişir. Kartı ilk kez kullanıyorsan ESP32 nedir yazısındaki kurulum adımlarıyla başla.
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 ve MicroPython: şönt dirençle akım ölçmek
Op ampin pratik bir başka işi akım ölçmektir. Motorun ya da LED şeridin eksi ucu ile GND arasına 0,1 Ω'luk bir şönt direnç koyarsan 1 A'lik akım üzerinde yalnızca 100 mV düşürür. MCP6002 ile kurulan evirmeyen yükselteç (Rf = 100 kΩ, Rg = 4,7 kΩ) bu gerilimi 22,3 kat büyütür: 1 A artık 2,23 V'tur ve Pico'nun 3,3 V'luk aralığıyla yaklaşık 1,45 A'e kadar ölçüm yapılır. Şöntün üst ucu MCP6002'nin pin 3'üne, op amp çıkışı (pin 1) Pico'nun GP26 (ADC0) pinine bağlanır; op amp 3V3(OUT) pininden beslenir ve yük kaynağının GND'si Pico'nunkiyle birleştirilir. 1,5 A'de şöntte 0,225 W ısı açığa çıktığı için en az 0,5 W'lık direnç kullan.
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)Kod açılışta yük kapalıyken op ampin ofsetini ölçer ve sonraki okumalardan çıkarır; 100 okumanın ortalaması ADC gürültüsünü bastırır. Daha büyük akımlar için şönt değerini ya da kazancı düşür; şöntte düşen gerilimi ve harcanan gücü Ohm kanunu aracıyla kontrol et. Hazır bir çözüm istersen Hall etkili ACS712 akım sensörü, yükü devreden yalıtarak akımı ölçer. Pico'yu ilk kez kuruyorsan Raspberry Pi Pico nedir yazısı MicroPython kurulumunu anlatıyor.
Diğer op amp devreleri
| Devre | Formül / davranış | Nerede kullanılır? |
|---|---|---|
| Toplayıcı (mikser) | Vçıkış = −Rf × (V1/R1 + V2/R2 + …) | Ses mikseri, birden fazla sinyali birleştirme |
| Fark yükselteci | Vçıkış = (R2 / R1) × (V2 − V1) | Ofset çıkarma, iki nokta arasındaki farkı ölçme |
| Enstrümantasyon yükselteci | Tek dirençle ayarlanan yüksek kazanç, çok iyi ortak mod bastırma | Yük hücresi, Wheatstone köprüsü, biyomedikal sinyaller |
| İntegratör | Geri beslemede kondansatör; çıkış, girişin zamana göre integrali | Üçgen dalga üreteci, PI kontrol |
| Aktif filtre (Sallen-Key) | İki direnç ve iki kondansatörle 2. dereceden süzme | Ses filtreleri, ADC öncesi örtüşme (aliasing) filtresi |
| Schmitt tetikleyici | Pozitif geri beslemeli karşılaştırıcı, iki ayrı eşik | Gürültülü sinyalden temiz dijital çıkış |
Yük hücresi gibi iki çıkışı da beslemenin ortasında duran ve aradaki fark yalnızca birkaç milivolt olan köprü sensörleri için hazır entegreler daha pratiktir: HX711, içinde 128'e kadar kazançlı bir yükselteç ve 24 bitlik bir ADC barındırır. Nabız sensörlerinin kartındaki op amp ise ışık sensörünün zayıf sinyalini hem yükseltir hem süzer; bu sayede Arduino ilk denemede net bir nabız dalgası görür.

Op amp ile proje fikirleri
- Alkışla yanan lamba: Mikrofon ön yükselteci ve histerezisli ESP32 koduyla bir röle modülü sür.
- VU metre: Tepe-tepe genliği WS2812B LED şeritte müziğe göre yükselen bir çubuğa çevir.
- Fırın termometresi: Termokupl yükselteciyle 500 °C'ye kadar ölç ve değeri OLED ekranda göster.
- Kodsuz gece lambası: LDR ve LM358 karşılaştırıcıyla, mikrodenetleyici kullanmadan karanlıkta yanan bir LED yap.
- Dijital terazi: HX711 ile yük hücresini okuyup gram hassasiyetinde bir mutfak terazisi kur.
- Motor akım izleyici: Şönt ve op ampla robot arabanın motor akımını ölç, motor sıkıştığında akım yükselince durdur.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Çıkış sürekli 0 V'ta ya da en üstte | Geri besleme yok ya da yanlış girişe bağlı; kazanç çok yüksek; giriş, giriş aralığının dışında | Rf'nin − girişine gittiğini kontrol et, kazancı düşür, girişin 0 ile V+ − 1,5 V arasında olduğundan emin ol |
| LM741'li devre 5 V'ta çalışmıyor | LM741 simetrik ve yüksek besleme ister | LM358 ya da MCP6002 kullan |
| Çıkış 3,5 V'un üstüne çıkmıyor | LM358'in çıkışı V+ − 1,5 V'ta kalır | Kazancı buna göre seç ya da rail-to-rail op amp kullan |
| Okumalar gürültülü ve titrek | Besleme dekuplajı yok, uzun kablolar, gereksiz yüksek kazanç | Besleme bacaklarına 100 nF, kısa kablolar, çıkışa RC filtre, yazılımda ortalama |
| Devre kendi kendine salınıyor | Op amp uzun bir kabloyu ya da büyük bir kapasitif yükü doğrudan sürüyor | Çıkışa 100–470 Ω seri direnç koy |
| Karşılaştırıcı çıkışı hiç yükselmiyor | LM393 açık kollektörlüdür, pull-up yok | Çıkış ile besleme arasına 4,7–10 kΩ bağla |
| ESP32 ya da Pico pini bozuldu | Op amp 5 V ya da 12 V'tan beslendi, çıkış 3,3 V'u aştı | Op ampi 3,3 V'tan besle ya da çıkışa bölücü ve kenetleme diyotu koy |
| Küçük sinyallerde çıkış 0 V'ta takılı | Negatif giriş ofseti tek beslemede çıkışı alta yapıştırır | Hassas op amp kullan ya da girişe küçük bir ön gerilim ver |
Op amp, analog dünyayı mikrodenetleyicinin anlayacağı dile çeviren bir tercümandır: iki kuralı ve iki kazanç formülünü bildiğinde mikrofon, termokupl, şönt direnç ya da köprü sensörü fark etmeksizin sinyali ADC'ye uygun hale getirebilirsin. Değerleri denemek için Op-amp kazancı aracını kullan; BlueGrays uygulamasında LDR ile ışık ölçme, gece lambası, dijital voltmetre, NTC ile sıcaklık ölçümü, alev ve gaz sensörü gibi analog projeleri devre şemaları ve kodlarıyla adım adım bulabilirsin.
Sıkça sorulan sorular
Op amp ne işe yarar?
Op amp zayıf sinyalleri yükseltmek, iki gerilimi karşılaştırmak, sinyalleri toplamak ya da çıkarmak, filtrelemek ve yüksek empedanslı kaynakları tamponlamak için kullanılır. Arduino projelerinde en çok mikrofon, termokupl ve şönt direnç gibi milivolt düzeyindeki sinyalleri ADC'nin okuyabileceği seviyeye çıkarmak için tercih edilir.
Op amp kazancı nasıl hesaplanır?
Evirmeyen yükselteçte kazanç 1 + Rf / Rg, eviren yükselteçte ise −Rf / Rin formülüyle bulunur. Örneğin Rf = 100 kΩ ve Rg = 1 kΩ ile evirmeyen kazanç 101, eviren kazanç −100 olur. Desibel karşılığı 20 × log10(kazanç) ile hesaplanır.
LM358 ile LM741 arasındaki fark nedir?
LM358 tek kılıfta iki op amp barındırır, 3–30 V tek beslemeyle çalışır ve girişi 0 V'u kapsar; bu yüzden Arduino'nun 5 V'uyla doğrudan kullanılabilir. LM741 tek kanallıdır ve ±15 V gibi simetrik besleme için tasarlanmıştır; 5 V tek beslemede pratikte çalışmaz. Pin dizilimleri de farklıdır.
Op amp 5 V tek besleme ile çalışır mı?
Tek besleme için tasarlanmış LM358, LM324 ve MCP6002 gibi modeller çalışır. AC sinyaller için girişi beslemenin ortasına kaldırman ve çıkış sınırlarını hesaba katman gerekir; LM358'in çıkışı 5 V beslemede yaklaşık 3,5 V'a kadar çıkar.
Op amp ile karşılaştırıcı (comparator) arasındaki fark nedir?
Op amp, negatif geri beslemeyle kararlı çalışacak şekilde frekans dengelemesi içerir ve çıkışı iki yöne de akım verebilir. LM393 gibi karşılaştırıcılar ise geri beslemesiz ve hızlı geçiş için tasarlanmıştır, çoğunun çıkışı pull-up direnci gerektiren açık kollektördür. Op amp karşılaştırıcı olarak kullanılabilir ama yavaştır; karşılaştırıcı ise yükselteç olarak kullanılmamalıdır.
Rail-to-rail op amp nedir?
Rail-to-rail op ampin girişi ya da çıkışı besleme gerilimlerine birkaç on milivolta kadar yaklaşabilir. Örneğin MCP6002 5 V'ta 0,025–4,975 V arası çıkış verir, LM358 ise ancak yaklaşık 3,5 V'a çıkabilir. ESP32 ve Raspberry Pi Pico gibi 3,3 V'luk kartlarda ADC aralığının tamamını kullanmak için rail-to-rail op amp gerekir.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Ldr İle Işık Şiddeti Okuma
Odanın ne kadar aydınlık olduğunu sayıyla görmek ister misin? Işığa duyarlı küçük bir parça olan LDR ortam ışığını ölçer ve Arduino bu değeri yarım saniyede bir bilgisayar ekranına yazar. Elinle üstün

Ldr İle Gece Lambası
Hava karardığında kendiliğinden yanan, sabah olunca sönen küçük bir gece lambası. Işık sensörü odadaki aydınlığı ölçer; Arduino ortam yeterince karanlıksa LED'i yakar, aydınlanınca söndürür. Sokak lam

ESP32 LDR Modülü ile Işık Şiddeti Okuma
LDR modülünün ham ADC değerini ve karanlık/aydınlık referanslarına göre hesaplanan göreli ışık yüzdesini Serial Monitor'da gerçek zamanlı izleme. Bu yüzde lux ölçümü değildir. Modülün kalibrasyon mantığını öğretir. Proje 10'un öncesinde yapılması ideal; çünkü eşik değerini belirlemek için kullanılır.

LCD Ekran ile Dijital Voltmetre
Pilin ya da adaptörün ne kadar gerilim verdiğini kendi yaptığın ölçü aletiyle öğren. İki dirençten oluşan bir bölücü yüksek gerilimi kartın okuyabileceği seviyeye indirir, Arduino da gerçek değeri hes

NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü
Ortamın sıcaklığını küçük bir boncuk gibi görünen sensörle ölç. NTC adlı bu parça ısındıkça elektriği daha kolay geçirir; Arduino bu değişimi okuyup bir formülle santigrat dereceye çevirir ve iki satı

Alev Sensörü Kullanımı
Mutfakta ya da atölyede ateşi senden önce fark eden küçük bir bekçi. Alev sensörü ateşin yaydığı görünmez ışığı yakalar; her şey yolundayken yeşil LED yanar, alev görünce kırmızı LED yanar ve buzzer ö

Gaz Sensörü Kullanımı
Mutfakta gaz kaçağını senden önce fark eden küçük bir bekçi. Gaz sensörü havayı sürekli koklar; her şey yolundayken yeşil LED yanar, havadaki gaz belli bir seviyeyi aşınca kırmızı LED yanar ve buzzer

ESP32 Potansiyometre ile LED Parlaklık (Analog → PWM)
Bu projede bir potansiyometre ile LED parlaklığını analog olarak kontrol ediyoruz. ESP32'nin ADC pini potansiyometreden gelen 0-3.3V gerilimi okur, ardından bu değer PWM (Pulse Width Modulation) sinyaline çevrilerek LED'e gönderilir. Böylece potansiyometreyi çevirdikçe LED kademeli olarak parlar ve söner. Arduino Core 3.0+ ile analogWrite() doğrudan kullanılabilir; ESP32-S2/S3'te ADC çözünürlüğü 12-bit'e sabitlenir.
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

