İçindekiler:

ESP32 ADC Ayarını Biliyor Musunuz?: 29 Adım
ESP32 ADC Ayarını Biliyor Musunuz?: 29 Adım

Video: ESP32 ADC Ayarını Biliyor Musunuz?: 29 Adım

Video: ESP32 ADC Ayarını Biliyor Musunuz?: 29 Adım
Video: BUNU YAŞAMAYAN YOKTUR 😂 #emirbeşli #shorts 2024, Temmuz
Anonim
Image
Image
Kullanılan Kaynaklar
Kullanılan Kaynaklar

Bugün daha teknik bir konudan bahsedeceğim ama bence ESP32 ile çalışan herkesin bilmesi gereken bir konu: ADC (analog-dijital dönüştürücü) sorunu okuma ayarı. Bunu önemli buluyorum çünkü özellikle analog çıkışı olan bir cihazla bir "ölçüm" yaparken, okumanın doğru yapıldığından kesinlikle emin olmanız gerekiyor.

Bu nedenle bugünkü videoda ESP32'nin "analog-dijital dönüştürücüsünü" kullanarak ölçümler yapacağız, dönüştürme tutarsızlıklarını gözlemleyeceğiz ve bir ADC ayarlama/kalibrasyon yöntemi uygulayacağız.

Adım 1: AD Dönüştürücü Nedir?

AD dönüştürücü, analog (sürekli) bir miktarı dijital (ayrık) değerlere çevirebilen bir devredir. Bu ne anlama geliyor? Bu, dijital değerler yalnızca sıfırlar ve birlerin birleşiminden oluşan ayrık değerler alabilirken, analog bir niceliğin bir aralık içinde herhangi bir değeri alabileceği anlamına gelir. Örneğin, ideal bir AA hücresinin voltajını ölçtüysek, bu analog bir büyüklük olduğu için 0V ile 1.5V arasında herhangi bir değer bulabiliriz. İdeal bir lambanın çıkış durumu, ayrı bir büyüklük olan yalnızca iki durumu (kapalı veya açık) kabul etmelidir. Mikrodenetleyiciler bu ayrık mantığı kullanarak çalıştığından, analog bir miktarı dijitale (veya ayrık) çevirebilen bir devreye ihtiyacımız var.

2. Adım: Kullanılan Kaynaklar

• Bir Lolin32 Lite kartı v1.0.0

• Yakalamak için bir Tektronix TDS1001C osiloskop

• ESP32 için bir USB kablosu

• Sinyal oluşturucu olarak bir Hantek DSO4102C osiloskop

Adım 3: ESP32 ADC

ESP32 ADC
ESP32 ADC

Espressif verilerine göre ESP32 çipleri, ölçülen sonuçlarda bir çipten diğerine +/- %6 fark gösterebilir.

Ek olarak, dönüştürme, okuma için mevcut her aralık için doğrusal bir yanıta sahip DEĞİLDİR. Espressif, kalibrasyon için bir yöntem sunar ve kullanıcıların istenen doğruluğa ulaşmak için gerekli gördükleri takdirde başka yöntemler uygulamasını önerir.

Bir veri toplama gerçekleştireceğiz ve bundan, ADC yanıtlarını ve ayarlamayı okumak için matematiksel bir işlem uygulama örneğini göstereceğiz.

Bu düzeltmeleri gerçekleştirmenin birkaç (daha basit veya daha karmaşık) yolu vardır. Projenize en uygun olanı değerlendirmek size kalmış.

Burada gösterilen, açıklayıcı bir amaca sahip olacak ve ayarlamalar sırasında gözlemlenebilecek ilginç noktalara değinmeye çalışacaktır.

Adım 4: Kullanılan Devre

Kullanılan Devre
Kullanılan Devre

25 MHz'e kadar çıkan bir sinyal üreteci olan bir osiloskop, Hantek DSO4102C kullandım. ESP A / D ve osiloskop tarafından okunan bir dalga oluşturduk. Toplanan veriler csv'ye ve indirilmek üzere makalenin sonunda bırakacağım bir elektronik tabloya kaydedildi.

Adım 5: Kullanıldığını İşaretle

Kullanılan İşaret
Kullanılan İşaret

Tüm dönüşüm aralığı boyunca uzanan rampalara erişime izin veren düşük frekanslı bir yamuk sinyali seçtik. Bu, bu rampalarda çok sayıda numuneye izin verir.

Adım 6: Osiloskop Tarafından Elde Edilen Veriler

Osiloskopla Elde Edilen Veriler
Osiloskopla Elde Edilen Veriler

Yakalama görüntüsü osiloskop tarafından gerçekleştirildi. Veriler bir csv dosyasında saklandı. Sinyalin yükselen ve düşen rampalarındaki hafif eğriliğe dikkat edin.

Adım 7: Osiloskop Tarafından Elde Edilen Veriler (Excel'de csv Dosyası)

Osiloskop Tarafından Elde Edilen Veriler (Excel'de csv Dosyası)
Osiloskop Tarafından Elde Edilen Veriler (Excel'de csv Dosyası)

Burada numunelerimiz var.

Adım 8: ADC Tarafından Elde Edilen Veriler

ADC Tarafından Elde Edilen Veriler
ADC Tarafından Elde Edilen Veriler

Serinin aktarım hızını değiştirerek ADC'nin yakaladığı verileri görebiliriz. Yamuk sinyalinin deformasyonunu gözlemleyin.

Arduino IDE seri çizicide gözlenen veriler

Adım 9: ADC Tarafından Elde Edilen Veriler - Excel

ADC Tarafından Elde Edilen Veriler - Excel
ADC Tarafından Elde Edilen Veriler - Excel

Daha yüksek bir oran ve seri terminal kullanarak değerleri yakalayabilir ve karşılaştırmalarımız için Excel'de uygulayabiliriz.

Adım 10: Tırmanma Rampalarının Karşılaştırılması

Tırmanma Rampalarının Karşılaştırılması
Tırmanma Rampalarının Karşılaştırılması

İki yakalamanın iki tırmanma rampasını karşılaştırıyoruz.

Her iki rampada oluşan eğriliği not edin.

Aynı rampa için, osiloskoptan çok daha fazla ESP32 örneğine sahip olduğumuzu da unutmayın.

Adım 11: Örnek Sayısının Eşitlenmesi

Örnek Sayısının Eşitlenmesi
Örnek Sayısının Eşitlenmesi
Örnek Sayısının Eşitlenmesi
Örnek Sayısının Eşitlenmesi

ESP32, osiloskoptan daha fazla sayıda örnek sağladığından, iki eğriyi karşılaştırmak için bir indeks görevi görecekleri için bu değerleri eşitlememiz gerekir.

Bunun için doğrudan bir karşılaştırma yapacağız.

Osiloskop rampası için 305 örneğimiz ve ADC rampası için 2365 örneğimiz var.

Rampalar aynı aralıkta olduğu için her osiloskop için yaklaşık 7.75 ADC örneğine sahip olduğumuzu söyleyebiliriz.

Her osiloskop örneğinin indeksinin çarpılması aynı eğriye sahiptir, ancak indeksler ADC'ye ve yeniden dağıtılan verilere eşdeğerdir.

Yeni pozisyonlar için eksik verileri doldurmak için, bilinen verilere istatistiksel olarak uyan bir eğri uygulayacağız.

Adım 12: Boşlukları Doldurma - Trend Çizgisi

Boşlukları Doldurma - Trend Çizgisi
Boşlukları Doldurma - Trend Çizgisi
Boşlukları Doldurma - Trend Çizgisi
Boşlukları Doldurma - Trend Çizgisi

Bilinen verileri (mavi noktalar) seçerek ve ardından sağ tuş ile tıklayarak "Trend çizgisi ekle …" seçeneğini seçiyoruz.

Gelen pencerede Polinom tipini seçiyoruz (2. sıra yeterli olacaktır).

Ayrıca "Denklemi Grafikte Görüntüle" ve "Grafikte R-kare değerini göster" seçeneklerini de kontrol ettik.

"Kapat" ı tıklıyoruz.

Adım 13: Boşlukları Doldurma - 2. Derece Polinom Eğrisi

Boşlukları Doldurma - 2. Derece Polinom Eğrisi
Boşlukları Doldurma - 2. Derece Polinom Eğrisi

Excel bize iki yeni bilgi veriyor; verilere en iyi uyan ikinci dereceden denklem ve bu yeterliliği ölçen R-kare denklemi.

Sadece 1'e ne kadar yakınsa, denklemin o kadar uygun olduğunu unutmayın.

İlgili matematiğe girmeyelim, sadece bir araç olarak kullanalım.

Adım 14: Boşlukları Doldurma - Fonksiyonu Değerlendirme

Örnekleme boşluklarını denklem tarafından oluşturulan verilerle dolduralım. Ve sonra bunları nokta nokta karşılaştırın.

y = -9E-08x2 + 0, 0014x + 0, 1505

R² = 0, 9999

Osiloskop voltajı = -9E-08 * indeks2 + 0, 0014 * indeks + 0, 1505

Adım 15: Osiloskop Voltajını ADC ile Karşılaştırmak İçin Eşdeğer Bir Değere Dönüştürme

Osiloskop Voltajını ADC ile Karşılaştırmak İçin Eşdeğer Bir Değere Dönüştürme
Osiloskop Voltajını ADC ile Karşılaştırmak İçin Eşdeğer Bir Değere Dönüştürme

Osiloskop voltajının değerini de eşdeğer bir ADC değerine dönüştürmek için bundan yararlanalım.

ESP32'nin ADP'sinde elde edilen en yüksek değer, aynı indeks için 2.958V okumasına eşdeğer olan 4095 olduğu için şunu söyleyebiliriz:

Osiloskop ölçümlerindeki her volt, AD'nin yaklaşık 1384.4 birimine eşittir. Dolayısıyla osiloskopun tüm ölçümlerini bu değerle çarpabiliriz.

Adım 16: Elde Edilen İki Rampanın Karşılaştırılması

Elde Edilen İki Rampanın Karşılaştırılması
Elde Edilen İki Rampanın Karşılaştırılması

İki okumada elde edilen farklılıkları görselleştirmek.

Adım 17: ADC Okuma Farkının Davranışı (ERROR)

ADC Okuma Farkının Davranışı (ERROR)
ADC Okuma Farkının Davranışı (ERROR)

Aşağıdaki eğri, ADC okumasındaki farkın ölçümün bir fonksiyonu olarak nasıl davrandığını gösterir. Bu veri toplama, bir düzeltme işlevi bulmamızı sağlayacaktır.

Bu eğriyi bulmak için, her bir olası AD konumunun (0 ila 4095) bir fonksiyonu olarak her ölçüde bulunan farkı basitçe çizeriz.

Adım 18: ADC Okuma Farkı Davranışı - Bir Düzeltme Fonksiyonu Bulma

ADC Okuma Farkı Davranışı - Bir Düzeltme Fonksiyonu Bulma
ADC Okuma Farkı Davranışı - Bir Düzeltme Fonksiyonu Bulma

Excel'de, verilerimize yeterince uyana kadar şimdi daha yüksek derecede bir Trend Çizgisi ekleyerek bir düzeltme işlevi belirleyebiliriz.

Adım 19: Diğer Yazılımları Kullanma

Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma
Diğer Yazılımları Kullanma

Eğrileri belirlemek için diğer ilginç yazılım, doğrudan bağlantıda kullanılabilen PolySolve'dir: https://arachnoid.com/polysolve/ veya bir Java uygulaması olarak indirilebilir.

Daha yüksek dereceli polinom regresyonlarının uygulanmasına ve biçimlendirilmiş işlevin yanı sıra diğer işlevlerin teslimine izin verir.

Kullanmak için verileri ilk metin kutusuna girmeniz yeterlidir. Veriler, virgül veya sekme ile ayrılmış X, Y sırasını izlemelidir. Noktayı ondalık nokta olarak doğru şekilde kullanırken dikkatli olun.

Girilen veriler doğru biçimlendirilmişse, sonraki kutuda bir grafik görünecektir.

İşte ADC hata eğrimiz böyle gitti.

Bu pencere, çıktısını çeşitli şekillerde biçimlendirebilecek olan işlev yeterlilik verileri de dahil olmak üzere gerilemenin sonucunu sunacaktır: bir C / C++ işlevi, bir katsayı listesi, Java ile yazılmış bir işlev, vb.

Not: Ondalık ayırıcılara dikkat edin

Adım 20: Sabitler ve Kurulum ()

Burada analog yakalama için kullanılan GPIO'ya işaret ediyorum. Analog yakalama için belirlenen pinin yanı sıra seri portu da başlatıyorum.

const int pin_leitura = 36; //GPIO usado para captura analógica void setup() { Serial.begin(1000000); //Debug pinMode(pin_leitura, INPUT); //Pino, captura analógica para birimini kullanır }

Adım 21: Döngü () ve Düzeltme İşlevi

Ayarlanan voltajın yakalamasını yapıyoruz ve değerleri doğru düzeltmeli veya düzeltmesiz olarak yazdırıyoruz.

void loop() { int valor_analogico = analogRead(pin_leitura); //gerçekleştirme ve düzeltme //Serial.print(valor_analogico + f(valor_analogico)); // valores para hata ayıklama (COM CORREÇÃO) Serial.print(valor_analogico); //imprimime os valores para debug (SEM CORREÇÃO) Serial.print(", "); Serial.print(4095);//cria uma linha para marcar o valor máximo de 4095 Serial.print(", "); Seri.println(0); // cria uma linha para marcar o valor minimo de 0 }

12. satırda, f (analog_değer) fark fonksiyonunun eklenmesiyle verileri yazdırma seçeneğimiz olduğuna dikkat edin.

Adım 22: PolySolve Düzeltme İşlevini Kullanma

Burada, Arduino IDE içindeki PolySolve işlevini kullanıyoruz.

/* Mod: normal Polinom derecesi 6, 2365 x, y veri çiftleri Korelasyon katsayısı (r^2) = 9, 907187626418e-01 Standart hata = 1, 353761109831e+01 Çıkış formu: C/C++ işlevi: Copyright © 2012, P. Lutus -- https://www.arachnoid.com. Her hakkı saklıdır. */ double f(double x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3) + 2.082790802069e- 10 * pow(x, 4) + -5.306931174991e-14 * pow(x, 5) + 4.787659214703e-18 * pow(x, 6); }

Ondalık ayırıcı olarak virgül nokta değişikliğine dikkat edin.

Adım 23: Düzeltmeyle Yakalama - Seri Plotter

Düzelterek Yakala - Plotter Seri
Düzelterek Yakala - Plotter Seri

Adım 24: Hesaplama Maliyeti

Hesaplamalı Maliyet
Hesaplamalı Maliyet
Hesaplamalı Maliyet
Hesaplamalı Maliyet

Polinom hesaplamaları yapmak için işlemcinin bu görevi yerine getirmesi gerekir. Bu, kaynak koduna ve mevcut bilgi işlem gücüne bağlı olarak yürütmede gecikmelere neden olabilir.

Burada, çok dereceli polinomları kullanan bir testin sonuç tablosunu görüyoruz. pow() işlevinin kullanıldığı ve kullanılmadığı zamanlar arasındaki farka dikkat edin.

Adım 25: Test Kodu - Kurulum () ve Döngü Başlatma ()

Burada, testimizde kullanılan kodumuz var.

geçersiz kurulum() { Serial.begin(1000000); //Bir porta seri bazında hata ayıklama işlemi yapın } void loop() { float valor_analogico = 500.0; //um valor arbtrario kayan nokta nicelik değeri = 10000.0; // kantitatif de chamadas yüzer contador = 0.0; //contador de chamadas

Adım 26: Test Kodu - Döngü () ve İşleme

Değeri mikrosaniye cinsinden almak için mikros() işlevini kullandım.

//============= inicia o processo float agora = micros(); //marca o instante inicial while (contador < quantidade) { //v(valor_analogico); //função vazia //r(valor_analogico); //função com retorno //f0(valor_analogico); //grau 0 //f1(valor_analogico); //grau 1 //f2(valor_analogico); //grau 2 //f3(valor_analogico); //grau 3 //f4(valor_analogico); //grau 4 //f5(valor_analogico); //grau 5 //f6(valor_analogico); //grau 6 //f13_semPow(valor_analogico); //grau 13º SEM bir função POW //f13_comPow(valor_analogico); // 13º COM bir função POW contador++; } agora = (mikrolar() - agora) / nicelik; //belirleme o intervalo que se passou para cada iteração //============= finalize o süreç

Adım 27: Test Kodu - Döngü () - Sonuçlar

Karşılaştırma için POW ile ve POW olmadan 13. sınıf fonksiyondan döndürülen değeri ve ayrıca işlem aralığını yazdırıyoruz.

// 13'ten bu yana en iyi şekilde değerlendirilen bir değer ya da yiğitlik örneği Serial.print(f13_semPow(valor_analogico)); // 13º SEM bir função POW Serial.print(" - "); Serial.print(f13_comPow(valor_analogico)); // 13º COM bir função POW Serial.print(" - "); //işlem yapmak için aralıklı veya aralıklı Serial.println(agora, 6); }

Adım 28: Test Kodu - Kullanılan Fonksiyonlar

0 ve 1 dereceli boş fonksiyonlar (sadece dönüşlü).

//FUNÇÃO VAZIAdouble v(double x) { } //FUNÇÃO SOMENTE COM RETORNO double r(double x) { dönüş x; } //FUNÇÃO DE GRAU 0 double f0(double x) { return 2.202196968876e+02; } //FUNÇÃO DE GRAU 1 çift f1(çift x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x; }

2., 3. ve 4. sınıf fonksiyonlar.

//FUNÇÃO DE GRAU 2çift f2(çift x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2); } //FUNÇÃO DE GRAU 3 çift f3(çift x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3); } //FUNÇÃO DE GRAU 4 çift f4(çift x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3) + 2.082790802069e-10 * pow(x, 4); }

5. ve 6. sınıf fonksiyonları.

//FUNÇÃO DE GRAU 5double f5(double x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3) + 2.082790802069e-10 * pow(x, 4) + -5.306931174991e-14 * pow(x, 5); } //FUNÇÃO DE GRAU 6 çift f6(çift x) { dönüş 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3) + 2.082790802069e-10 * pow(x, 4) + -5.306931174991e-14 * pow(x, 5) + 4.787659214703e-18 * pow(x, 6); }

POW kullanarak 13. sınıf işlevi.

//FUNÇÃO DE GRAU 13 USANDO O POWdouble f13_comPow(çift x) { dönüş 2, 161282383460e+02 + 3, 944594843419e-01 * x + 5, 395439724295e-04 * pow(x, 2) + -3, 968558178426e-06 * pow(x, 3) + 1, 047910519933e-08 * pow(x, 4) + -1, 479271312313e-11 * pow(x, 5) + 1, 22089479514e-14 * pow(x, 6) + -6, 136200785076e-18 * pow(x, 7) + 1, 910015248179e-21 * pow(x, 8) + -3, 566607830903e-25 * pow(x, 9) + 5, 000280815521e-30 * pow(x, 10) + 3, 434515045670e-32 * pow(x, 11) + -1, 407635444704e-35 * pow(x, 12) + 9, 871816383223e-40 * pow(x, 13); }

POW kullanmadan sınıf 13 işlevi.

//FUNÇÃO DE GRAU SEM USAR O POWdouble f13_semPow(çift x) { dönüş 2, 161282383460e+02 + 3, 944594843419e-01 * x + 5, 395439724295e-04 * x * x + -3, 968558178426e-06 * x * x * x + 1, 047910519933e-08 * x * x * x * x + -1, 479271312313e-11 * x * x * x * x * x + 1, 220894795714e-14 * x * x * x * x * x * x + -6, 136200785076e-18 * x * x * x * x * x * x * x + 1, 910015248179e-21 * x * x * x * x * x * x * x * x + -3, 566607830903e- 25 * x * x * x * x * x * x * x * x * x + 5, 000280815521e-30 * x * x * x * x * x * x * x * x * x * x + 3, 434515045670e- 32 * x * x * x * x * x * x * x * x * x * x * x + -1, 407635444704e-35 * x * x * x * x * x * x * x * x * x * x * x * x + 9, 871816383223e-40 * x * x * x * x * x * x * x * x * x * x * x * x * x; }

29. Adım: Dosyalar

Dosyaları indirin:

PDF

BEN HAYIR

E-tablo

Önerilen: