ESP32 ADC Doğrusallık testi

ozkarah

Kıdemli Üye
Katılım
4 Ocak 2022
Mesajlar
1,232
Daha önce bir kaç konu içerisinde ESP32 ailesinin ADC girişlerinin çok başarılı olmadığını; ofset ve doğrusallık problemleri olduğunu konuşmuştuk. ESP32 WROOM 32D, ESP32 WROVER ve ESP32-S3 modülleri için uygun bir zamanda birer test yapıp paylaşacağımı yazmıştım.



Test için gerekli düzeneği oluşturdum ve ESP32 ve bilgisayarda çalışacak birer program yazdım. Düzeneğimiz şu şekilde:

1673310309146.png


ESP modüllerini kolay programlamak ve kullanmak için şu break-out kartları kullanıyorum, bayağı pratik oluyor:

1673305527907.png



Genel görüntü de şöyle:

1673305748213.png
 
Son düzenleme:
Sistem şöyle çalışıyor:
1- Testi PC'de çalışan bir Java programı kontrol ediyor. Bu programla SCPI protokolünü kullanarak ağ üzerinden güç kaynağına 0-1200mV (0dB attenuation ayarında) veya 0-3400mV (11dB attenuation ayarında) aralıklarında 1mV adımlarla voltaj gönderiyorum.
2- Daha sonra bu voltajın oturması için 500 ms bekleyip, multimetreden yine SCPI protokolü ile ölçüm güç kaynağının ürettiği voltajın gerçek değerini alıp saklıyorum.
3- Program daha sonra ESP32'de yazdığım programa UART üzerinden komut yollayıp onun ölçtüğü ADC değerini (0-4095) istiyor ve bunları bir çıktıya tablo halinde yazıyor.

Böylece sonuçta elimde 0-1200mV ve 0-3400mV aralığındaki yaklaşık 1 mV adımlarla üretilmiş bir sinyal ve bu sinyalin ADC karşılığı olan bir tablo oluyor:

1673306659543.png


Daha sonra bu tabloyu bir grafikle görselleştirip lineerliği ve ofseti karşılaştırabiliyoruz.

Ölçümlerde test ettiğim iki koşul daha var:
1- Her ölçümde belli bir sayıda (N) örnek alınıp ortalması döndürülüyor. Bu N değerini ESP32'ye komut ile gönderebiliyorum.
2- Attenuation. ESP32'nin ADC devresinde aktive edilebilir dahili zayıflatıcılar var (seçenekler: 0dB, 2.5dB, 6dB, 11dB). Varsayılan değer 11dB. Yine ESP32 için yazdığım yazılıma UART ile PC üzerinden komut yollayıp bu ayarı değiştirebiliyorum.
1673306999428.png
 
İlk testi ESP32 WROOM 32D için yaptım. Yukarıdaki şemada eklemeyi unuttum. Statik yükten kurtulmak için ADC ve GND pinleri arasında 2.2K bir direnç kullanıyorum.

1673307129350.png

Burada 11dB attanuation ve her ölçümde 1 örnek ile çalıştırıyorum.
X ekseni gerçek voltaj değerini ve Y ekseni de ESP32'nin tespit ettiği ADC değerini (0-4095) gösteriyor.
Görüldüğü gibi 130 mV seviyesine kadar ADC kör ve ölçüm 0 dönüyor. oradan başlayarak 2450mV seviyesine kadar lineer gittiğini ve sıkça gürültüye rastladığımız söyleyebiliriz. Güç kaynağım 1 mV aralıklarla sinyal üretebiliyor. 0-3400 mV arasını ölçtüğümüz için için grafikte 3401 ölçüm bilgisi var.



1673307374678.png

Burada ise attenuation aynı, örnek sayısını 5'e çıkartıyorum. Gürültü önemli ölçüde azaılyor. Bekleyeceğiniz gibi ofset ve lineerlik konusunda bir değişiklik yok. Yine burada da 3401 ölçüm sonucu var.




1673307673246.png

Bu sefer 0 dB attenuation ile her ölçümde 5 örnek alarak test yapıyoruz. Ofset hala var ancak 70 mV civarına iniyor. Ama üst bölgedeki eğrilik artık yok ve 72-1042mV aralığında doğrusal bir sonuç elde edebiliyoruz. Her ölçümdeki örnek sayısı yine 5 ancak grafikte daha fazla gürültü varmış gibi görebilirsiniz. Ancak aslında bu durum ölçüm sayısının daha az olmasından kaynaklanıyor. Bu grafikte diğerinin üçte birine yakın ölçüm (nokta) var. Dolayısıyla aradaki boşluklar daha belirgin. Gerlim bölücü kullanarak daha fazla nokta ile test edebilirdim ancak gürültüye etkisini hesaplamak zor olur diye vazgeçtim.


Eğer gürültüden tamamen kurtulalım dersek ne oluyor diye bakayım dedim. Her ölçümdeki örnek sayısını 100'e çıkarttım.

1673308000906.png

Doğal olarak gürültü açısından oldukça temiz bir grafik elde edebiliyoruz.
 
Benim kullandığım işlemci biraz eski bir üretim. Yeni üretimlerde ne kadar farklıdır bilmiyorum ancak şöyle bir not da paylaşayım:

ESP32 ADC için 1.1V bir iç referans kullanıyor. Ancak bu voltaj işlemcinin üretim prosesinden kaynaklı bir nedenden tam 1.1 olamayabiliyor her işlemcide farklı bir değere sahip olabiliyor. Bu durum da tabi ölçümü olumsuz etkiliyor.

Espressif bu konuyu ve lineerlik problemini aşmak için üretim sürecinin sonunda fabrikada bu referans voltajını her işlemci için ölçüp işlemcinin içindeki efuse içerisine yazmak şeklinde bir çözüm üretmiş. Bir de bazı işlemcilerde çok noktalı kalibrasyon verisini de efuse içerisine yazıyorlar. SDK içerisinde bazı özel fonksiyonlar var ve bunları kullanarak kalibre edilşmiş bir voltaj değeri alabiliyorsunuz. Eski işlemciler için geçerli olmadığından ben bu testte bunu dikkate almadım.


Sonuç olarak ADC konusunda en büyük problem alt seviyedeki ofset gibi görünüyor. Bu problemi bir şekilde aşarsanız lineer bölgeyi kullanarak ya da kalibrasyon bilgilerini kullanarak kullanılabilir sonuçlar almak mümkün olabilir.

Uygun olunca ESP32 WROVER ve ESP32-S3 testi ile devam edeceğim.
 
Son düzenleme:
Ofset sorununu, harici bir referans voltajı ve toplayıcı olarak yapılandırılmış OPAMP ile çözülür. Ama lineer bölgede çalıştırmak dinamik alanı çok daraltır. Üst sınıra kadar giden eğri tekrarlanabilir mi? Yani sabah yapsan testi sonra da akşam yapsan iki eğri tam olarak üst üste oturuyor mu? Oturuyor ise bir düzeltme tablosu ile üst sınıra kadar lineerleştirilebilir.
 
Aynı çip için evet, sonuç güvenilir. Farklı çiplerde minor farklar olabilir. Henüz bitmediği için paylaşmadım. ESP32 WROVER üzerinde de biraz test yaptım. Ondaki eğri de tam aynı olmasa da benziyor. Bugün ESP32-S3 ile de etmeyi planlıyorum.

Seçenekler şunlar:
1- 0dB attenuator ile lineerlik gayet iyi. 80 mV ofset ekleyip, 0 dB attenuator ile çalıştırarak tüm dinamik alanı kullanmak. Dezavantajı gürültünün biraz daha fazla olması.

2- 150 mV ofset ile 2400mV aralığında 2700 civarında ADC değeri var. Girişi bu aralığa haritalayıp 11 bitten fazla efektif çözünürlük almak mümkün. Bu yeterliyse, 150 mV ofset ekleyip 11 dB attenuator ile lineer bölgede çalıştırılabilir.

3- 11dB attenuator ile 150 mV ofset ekleyip düzeltme tablosu oluşturarak kullanmak. 12 bit efektif çözünürlüğe çok yakın sonuç verir.

4- Fabrikada içerisine yazılan bir kalibrasyon verisi var. SDK ile gelen fonksiyonlarla bu veriyi kullanarak voltaj okumak. Dezavantajı yeni üretilen çiplere yazıyorlar (son 2-3 yıl). Ayrıca, polinom düzeltmesi olduğu için düzeltme tablosu kadar hassas sonuç vermeyebilir. Bir ara bunu da test edeyim.

5- Daha düşük attanuator seçenekleri ile kullanmak. 2.5 dB ve 6dB henüz test etmedim. Test edince burada paylaşacağım. Hem yeterince lineer hem de gürültü az ise uygun miktarda ofset ekleyip neredeyse tüm dinamik alanla çalıştırmak mümkün olabilir.
 
Önceki kısımda ESP32 WROOM 32x tipi kontrolcü için sonuçları paylaşmıştım. ESP32 WROVER testlerini da bitirdim.
Önden şunu paylaşayım, WROOM 32 serisi ile sonuçlar oldukça benzer. Aynı ADC mimarisini kullandıklarını düşünüyorum.

Önce attenuator kapalıyken ve her ölçümde 1 örnek (yani ortalama kapalı) aldığımız durumdaki sonuçlara bakalım.

1673469973928.png

WROOM 32de olduğu gibi 70mV seviyesinde bir ofset var. Üstü lineer görünüyor. Bir miktar gürültü var. Detayı hesaplamadım ancak 0-1050mV aralığında +-10mV seviyesinde bir sapma olası görünüyor. +-1% gibi düşünebiliriz.



1673470350989.png

Örnek sayısını 5'e çıkartınca gürültüde önemli ölçüde bir azalma oluyor.


1673470415480.png

Gürültüyü iyice azaltalım dersek 10 ya da 25 örnek oldukça iyi sonu veriyor. (10 örnek testinin grafiği silindi ancak gürültü buna çok yakın)



WROOM'da olduğu gibi ikinci deneyde attenuator değerini 11 dB olarak ayarladım.

1673470569825.png

Lineerlik roblemi bunda da benzer seviyeden başlayarak oluştu. Gürültü 0dB attenuatore göre daha az.



1673470686749.png

Örnek sayısını 5'e çıkartınca gürültünün oldukça azaldığını görüyoruz. 10 ve 25 örnek seviyesinde yok debencek kadar az.

Bir sonraki mesajda 2.5 dB ve 6 dB attenuator ayarlarındaki sonuçları paylaşacağım.
 
0 dB attenuator ayarında 0-1050 mV aralığında ölçüm yapabiliyorduk. Ofset ve minor bir gürültü problemi vardı.
Attenuator seviyesini en üst seviye olan 11 dB'e alınca 0-3150 mV seviyesini ölçebiliyoruz, gürültü daha az, ancak ofset problemine bir de lineerlik problemi ekleniyor.

Ara attenuator değerlerinde (2.5dB ve 6dB) gürültü ve lineerlik nasıl etkilenecek diye bakalım:


1673471010110.png

2.5 dB attenuator ile 1 örnek alarak baktığımızda gürültünün biraz azaldığını ve lineerlikten birşeykaybetmediğimizi görüyoruz. Buna emin olmak için eğim ve ofseti kullanarak bir voltaj hesaplama formülü yaptım ve onun sonucunu da grafiğe ekledim.

1673471118996.png

Görüldüğü gibi ölçüm yapılabilen bölgede formülle hesaplanan voltaj ile DMM56500'ün ölçtüğü voltaj oldukça tutarlı. Geriye gürültü ve ofset kalıyor. Ofset için @taydin 'ın da dediği gibi girişe bir opamp ile ya da 3 dirençli bir network ile ofset eklemek mümkün. Daha önceki denemelerimde opampı buffer yapıp çıkışına direnç ağını koymak en düzgün çözümü ürettmişti.


Örnek sayısını arttırdığımızda gürültü doğal olarak azalıyor. Aşağıda aynı attenuator seviyesinin 5 örnek ile alınmış olan sonuçları var.
1673471458916.png


10 örnek (küçük bir konfigürasyon hatasından dolayı üst kısım eksik kaldı :( )
1673471657265.png



25 örnek (üst kısım bunda da yok)
1673471755688.png





Şimdi de 6dB attenuator ile sonuçlar. Önce 1 örnek:
1673471820394.png

Gürültü 2.5 dB'ye göre çok az daha azaldı. Güzel olan doğrusallıkta 11dB attenuator ile oluşan eğrilme oluşmadı.

5 örnek:
1673471925167.png

Gürültü oldukça azalıyor.



10 örnek:
1673471958376.png

6dB 10 örnek konfigürasyonu oldukça güzel görünüyor. Ancak 2.5 dB de buna göre belki çok az daha gürültülü diyebiliriz.


2.5 dB ve 6 dB ayarlarını WROOM 32 için ayrıca test etmedim. İki modelin karakteristikleri oldukça benziyor. Sonuçların farklı olacağını sanmıyorum.


Test kodu ESP32-S3 modülüyle farklı attenuator ve örnek sayısı ayarlarıyla içeride çalışıyor :)
Onu da yarın düzenleyip yüklerim.
 
Bu dB olayını yıllardır kafamda oturtamadım. Mesela 5V 5dB attenuatoru güç kaynağından mı ayarlıyorsun?

5v 5dB ile 5v 10dB nin farkı nedir?
 
Yok. Güç kaynağından dB ile ilgili bir ayar yapmıyorum. Ondan adım adım yükselterek normal DC voltaj gönderiyorum.

Bahsettiğim şey şu; işlemcinin içinde ADC girişinde yazlımla aktive edilebilen bir attenuator grubu var. 0, -2.5, -6 ve -11 dB zayıflatma değerleri var. Kodla bunlardan bir tanesini seçebiliyorsunuz. Bu attenuatorlerin zayıflatma gücü de logaritmik ölçek kullanılarak dB ile ifade ediliyor. Örneğin -6dB 1/2 seviyesine indiriuyor sinyalin genliğini. -20dB 1/10 seviyesine indiriyor. Voltajın ne olduğüundan bağımsız (attenuator'ün güç sınırları içerisinde). Kabaca gerilim bölücü gibi düşünebilirsiniz ancak tasarımı tam olarak aynı değil. İki dirençten değil bir direnç ağından oluşuyor.

Güç kaynaklarında seçilebilen ise genellikle dBm. dBm ise belirli bir giriş/çıkış empedansı için (örneğin 50 Ohm) standart genlik seviyelerinin tanımlandığı bir cetvel. İlgili empedansta 0 dBm 1 mW olacak şekilde hesaplanıyor.

P = V . i = R . i2 denkleminde P 1mV, R 50 Ohm iken V değeri 223.61 mV oluyor. Bu 0 dBm'in gerilim karşılığı (AC için RMS) oluyor. Aşağıda 50 Ohm için bir dBm tablosu bulabilirsiniz. Empedans değişince tablodaki gerilimler de değişiyor. Ancak Dikkat ederseniz örneğin herhangi bir seviyenin 6dBm fazlası öncekinin iki katı. 20dBm fazlası 10 katı...

1673509634948.png




Yani siz güç kaynağından 5.01 V seçmek yerine çıkış empedansını 50 ohm yapıp 27 dBm seçmeniz aynı şey olmuş oluyor.


Bir de dBV diye birşey var. O da gerilimin logaritmik ölçekteki karşılığı. Yani gerilimin 1V referansa karşı dB cinsinden değeri. Örneğin +6dBV 6dB iki kat demek olduğu için 1V x 2 =2V gibi bir değer oluyor. 20 dBV, 1V x 10 = 10V...
 
Yok. Güç kaynağından dB ile ilgili bir ayar yapmıyorum. Ondan adım adım yükselterek normal DC voltaj gönderiyorum.

Bahsettiğim şey şu; işlemcinin içinde ADC girişinde yazlımla aktive edilebilen bir attenuator grubu var. 0, -2.5, -6 ve -11 dB zayıflatma değerleri var. Kodla bunlardan bir tanesini seçebiliyorsunuz. Bu attenuatorlerin zayıflatma gücü de logaritmik ölçek kullanılarak dB ile ifade ediliyor. Örneğin -6dB 1/2 seviyesine indiriuyor sinyalin genliğini. -20dB 1/10 seviyesine indiriyor. Voltajın ne olduğüundan bağımsız (attenuator'ün güç sınırları içerisinde). Kabaca gerilim bölücü gibi düşünebilirsiniz ancak tasarımı tam olarak aynı değil. İki dirençten değil bir direnç ağından oluşuyor.

Açıklama için teşekkür ederim. Gerilim bölücüden çok empedansın değişmesine benzettim. İşlemci içerisinde neden böyle bir yapı var. Testlerinizdeki mantığa benzer şekilde attenuator değerini değiştir. Uygun gördüğün şekilde kullan gibi bir amaç mı var?
 
ESP32'nin ADC modülü aslında bir çok alt bölümden oluşuyor.


1673529940352.png

1673529483482.png


Farklı amaçlar için farklı konfigürasyonları aktive edebiliyorsunuz. Aslında bir LNA bile var Hall Effect sensörü ya da thermocouple gibi çok düşük voltajları ölçebilmek için ancak bu özellik (sanırım çok düzgün çalışmadığı için) de-aktif hale getirmişler sonradan.

Bu arada bir iyi bir de kötü haber vereyim. ESP32 S3 testlerinin sonuçları gayet güzel, detayları akşam paylaşacağım.
Ancak maalesef S3 modelinde dahili DAC kaldırılmış.

ESP32-WROOM 32D ve ESP32 WROVER içib DAC testi de yapıp paylaşacağım daha sonra.
 

Ekler

  • 1673529455996.png
    1673529455996.png
    87.4 KB · Görüntüleme: 74
pek yaramamış gibi o zaman :D :D
Abi o zaman daha çok acemiydim.

2 tane BD139 1 tane 4Watt düz trafo,
trafonun sekonderini sürüp primerden 220V alıp taşınabilir pratik inverter yapmaya çalışmıştım.
primer boştayken 190V alıyordum şarj aletimi taktım daha telefonun şarj oluyor bildirimi gelmeden esp32 çipi üstündeki metal plakayı havaya kaldırdı.

BD139'lar kabak çekirdeği gibi açıldı.
O zaman boşa gidenlerin parasıyla 100W inverter alınıyordu :katil2:
 
Yapılabilir ama sinyal jeneratörüyle bir gürültü üretip bir opamp ile toplamak filan gerekecek. Opamp için simetrik besleme vs gerekecek. Biraz zahmetli bir iş gibi.

Amaç ne burada? Neyi görmek istiyorsunuz?
 
gurultulu olcumdeki attenuator ayarinin etkisini gozlemlemekti.
 
Attenuator ADC modülü içerisinde olduğu için aslında modülün dışıda kalan gürültü dahil her şey sinyalin bir parçası, hatta kendisi. Dolayısıyla ne görüyorsa onu ölçecektir. Tahminim, tek örnekli ölçümlerde gürültü aynen ölçüme yansıyacaktır.

Yukarıda yüksek atennuator seçildiğinde gürültünün azalmasının sebebi analog modülün giriş katındaki gürültünün sinyale göre oranının değişmesi. Attenuator eklediğinizde daha yüksek genlikte sinyal alabiliyorsunuz. Böylece giriş katındaki gürültünün sinyale oranı azalıyor. Attanuator ikisini birlikte aynı oranda azaltarak ADC'ye iletiyor (kullanılan attenuator yapısını bilmiyorum ancak genellikle resistif olduklarından attenuatorlerin bant genişliği fazla oluyor).

Ancak sinyale bir gürültü eklediğimizde yine sinyale oranı oranında diğer tarafa geçeceği için ADC başarımı açısından referansımız gürültülü sinyal olmuş oluyor. Aslında doğru olan ADC'nin o gürültüyü yansıtması zaten. O yüzden sinyale belirli bir oranında gürültü eklediğimizde sonuca etkisi değişmeyecek.

Ama, eğer sinyalde var olan bir gürültüyü elimine etmek istiyorsanız yapacağınız iki şey gürültünün ölçüm sonucuna etkisini değiştirecektir:
1- Birden fazla örnek alarak yaptığım ölçümler gürültünün etkisini önemli ölçüde azaltacaktır.
2- Girişte bir RC alçak geçişli filtre vb olması halinde gürültü sinyale göre çok daha yüksek frekanslı olduğu için azalacaktır.

Teorik olarak böyle düşündüm ama yine uygun biir zaman bulursam bir denemeye çalışırım. :)

Bugün ESP32-S3 ADC sonuçlarını paylaşacağım. Arkadan DAC sonuçları geliyor.
 

Forum istatistikleri

Konular
5,771
Mesajlar
98,803
Üyeler
2,460
Son üye
ByMalicious

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top