Daftar Isi:

Apakah Anda Tahu Tentang Penyesuaian ADC ESP32?: 29 Langkah
Apakah Anda Tahu Tentang Penyesuaian ADC ESP32?: 29 Langkah

Video: Apakah Anda Tahu Tentang Penyesuaian ADC ESP32?: 29 Langkah

Video: Apakah Anda Tahu Tentang Penyesuaian ADC ESP32?: 29 Langkah
Video: Perbedaan ESP8266 dengan ESP32 - Belajar Microcontroller Part 1 2024, Juli
Anonim
Image
Image
Sumber Daya yang Digunakan
Sumber Daya yang Digunakan

Hari ini, saya akan berbicara tentang masalah yang lebih teknis, tetapi saya pikir semua orang yang bekerja dengan ESP32 harus tahu: masalah penyesuaian baca ADC (analog-to-digital converter). Saya menganggap ini penting karena ketika melakukan "pengukuran", terutama dengan instrumen yang memiliki output analog, Anda harus benar-benar yakin bahwa pembacaan dilakukan dengan benar.

Oleh karena itu, dalam video hari ini, kami akan melakukan pengukuran menggunakan "konverter analog-digital" dari ESP32, mengamati perbedaan konversi, dan menerapkan metode penyesuaian / kalibrasi ADC.

Langkah 1: Apa itu Konverter IKLAN?

Konverter AD adalah sirkuit yang mampu menerjemahkan kuantitas analog (kontinu) menjadi nilai digital (diskrit). Apa artinya? Ini berarti bahwa sementara nilai-nilai digital hanya dapat mengasumsikan nilai-nilai diskrit yang dibentuk oleh kombinasi nol dan satu, kuantitas analog dapat mengasumsikan nilai apa pun dalam suatu rentang. Misalnya, jika kita mengukur tegangan sel AA yang ideal, kita dapat menemukan nilai antara 0V dan 1,5V, karena ini adalah kuantitas analog. Keadaan keluaran lampu ideal harus mengasumsikan hanya dua keadaan (mati atau hidup), yang merupakan magnitudo diskrit. Karena mikrokontroler bekerja menggunakan logika diskrit ini, kita memerlukan rangkaian yang mampu menerjemahkan besaran analog menjadi digital (atau diskrit).

Langkah 2: Sumber Daya yang Digunakan

• Satu kartu Lolin32 Lite v1.0.0

• Osiloskop Tektronix TDS1001C untuk menangkap

• Satu kabel USB untuk ESP32

• Osiloskop Hantek DSO4102C sebagai generator sinyal

Langkah 3: ESP32 ADC

ESP32 ADC
ESP32 ADC

Menurut data Espressif, chip ESP32 dapat menunjukkan perbedaan +/- 6% dari satu chip ke chip lainnya dalam hasil yang diukur.

Selain itu, konversi TIDAK memiliki jawaban linier untuk setiap rentang yang tersedia untuk dibaca. Espressif menyediakan metode untuk kalibrasi dan menyarankan agar pengguna menerapkan metode lain jika dianggap perlu untuk mencapai akurasi yang diinginkan.

Kami akan melakukan akuisisi data, dan dari sini, kami akan menunjukkan respons ADC dan contoh penerapan proses matematika untuk membaca penyesuaian.

Ada beberapa cara (lebih sederhana atau lebih kompleks) untuk menyelesaikan perbaikan ini. Terserah Anda untuk mengevaluasi yang paling tepat untuk proyek Anda.

Yang ditampilkan di sini akan memiliki tujuan ilustratif dan mencoba untuk membahas poin menarik yang dapat diamati selama penyesuaian.

Langkah 4: Sirkuit Digunakan

Sirkuit Digunakan
Sirkuit Digunakan

Saya menggunakan osiloskop dengan generator sinyal hingga 25 MHz, Hantek DSO4102C. Kami menghasilkan gelombang yang dibaca oleh ESP A / D dan osiloskop. Data yang dikumpulkan dicatat dalam csv dan dalam spreadsheet, yang akan saya tinggalkan di akhir artikel untuk diunduh.

Langkah 5: Tanda Tangan Digunakan

Tanda Digunakan
Tanda Digunakan

Kami memilih sinyal trapesium frekuensi rendah yang memungkinkan akses ke landai yang berjalan melalui seluruh rentang konversi. Hal ini memungkinkan untuk sejumlah besar sampel pada landai ini.

Langkah 6: Data yang Diperoleh oleh Osiloskop

Data yang Diperoleh oleh Osiloskop
Data yang Diperoleh oleh Osiloskop

Pengambilan citra dilakukan oleh osiloskop. Data disimpan dalam file csv. Perhatikan sedikit kelengkungan pada jalur naik dan turun sinyal.

Langkah 7: Data yang Diperoleh oleh Oscilloscope (File csv di Excel)

Data Diperoleh oleh Oscilloscope (File csv di Excel)
Data Diperoleh oleh Oscilloscope (File csv di Excel)

Kami memiliki sampel di sini.

Langkah 8: Data yang Diperoleh oleh ADC

Data yang Diperoleh oleh ADC
Data yang Diperoleh oleh ADC

Dengan mengubah kecepatan transfer serial, kita dapat melihat data yang ditangkap oleh ADC. Amati deformasi sinyal trapesium.

Data diamati pada plotter serial Arduino IDE

Langkah 9: Data yang Diperoleh oleh ADC - Excel

Data Diperoleh oleh ADC - Excel
Data Diperoleh oleh ADC - Excel

Menggunakan tingkat yang lebih tinggi dan terminal serial, kita dapat menangkap nilai dan menerapkannya di Excel untuk perbandingan kita.

Langkah 10: Perbandingan Ramp Panjat

Perbandingan Ramp Panjat
Perbandingan Ramp Panjat

Kami membandingkan dua tanjakan panjat dari dua tangkapan.

Perhatikan kelengkungan yang terjadi pada kedua ramp.

Perhatikan juga bahwa untuk ramp yang sama, kami memiliki lebih banyak sampel ESP32 daripada dari osiloskop.

Langkah 11: Menyamakan Jumlah Sampel

Menyamakan Jumlah Sampel
Menyamakan Jumlah Sampel
Menyamakan Jumlah Sampel
Menyamakan Jumlah Sampel

Karena ESP32 memberikan jumlah sampel yang lebih banyak daripada osiloskop, kita perlu menyamakan nilai-nilai ini, karena nilai-nilai ini akan berfungsi sebagai indeks untuk membandingkan dua kurva.

Untuk ini, kami akan membuat perbandingan langsung.

Kami memiliki 305 sampel untuk ramp osiloskop dan 2365 sampel untuk ramp ADC.

Karena landai memiliki kisaran yang sama, kita dapat mengatakan bahwa kita memiliki sekitar 7,75 sampel ADC untuk setiap osiloskop.

Mengalikan indeks setiap sampel osiloskop memiliki kurva yang sama, tetapi dengan indeks yang setara dengan ADC dan data yang didistribusikan kembali.

Untuk mengisi data yang hilang untuk posisi baru, kami akan menerapkan kurva yang secara statistik cocok dengan data yang diketahui.

Langkah 12: Mengisi Kesenjangan - Garis Tren

Mengisi Kesenjangan - Garis Tren
Mengisi Kesenjangan - Garis Tren
Mengisi Kesenjangan - Garis Tren
Mengisi Kesenjangan - Garis Tren

Memilih data yang diketahui (titik biru), dengan mengklik dan kemudian mengklik dengan tombol kanan, kami memilih: "Tambahkan garis Trend …"

Di jendela yang muncul, kami memilih jenis Polinomial (urutan 2 sudah cukup).

Kami juga memeriksa opsi "Lihat Persamaan di bagan" dan "Tampilkan nilai R-kuadrat di bagan".

Kami mengklik "Tutup".

Langkah 13: Mengisi Kesenjangan - Kurva Polinomial Grade 2

Mengisi Kesenjangan - Kurva Polinomial Grade 2
Mengisi Kesenjangan - Kurva Polinomial Grade 2

Excel memberi kita dua informasi baru; persamaan orde kedua yang paling sesuai dengan data, dan persamaan R-kuadrat yang mengukur kecukupan ini.

Ingatlah bahwa semakin dekat ke 1, semakin sesuai persamaannya.

Mari kita tidak mempelajari matematika yang terlibat, mari kita gunakan sebagai alat.

Langkah 14: Mengisi Kesenjangan - Mengevaluasi Fungsi

Mari kita isi celah pengambilan sampel dengan data yang dihasilkan oleh persamaan. Dan kemudian, bandingkan poin demi poin.

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

R² = 0, 9999

Tegangan osiloskop = -9E-08 * indeks2 + 0, 0014 * indeks + 0, 1505

Langkah 15: Mengubah Tegangan Osiloskop ke Nilai Setara untuk Dibandingkan Dengan ADC

Mengubah Tegangan Osiloskop ke Nilai Setara untuk Dibandingkan Dengan ADC
Mengubah Tegangan Osiloskop ke Nilai Setara untuk Dibandingkan Dengan ADC

Mari kita manfaatkan ini untuk juga mengubah nilai tegangan osiloskop menjadi nilai ADC yang setara.

Karena nilai tertinggi yang diperoleh dalam ADP ESP32 adalah 4095, yang setara dengan pembacaan 2.958V untuk indeks yang sama, kita dapat mengatakan bahwa:

Setiap volt dalam pengukuran osiloskop sama dengan sekitar 1384,4 unit AD. Oleh karena itu, kita dapat mengalikan semua pengukuran osiloskop dengan nilai ini.

Langkah 16: Membandingkan Dua Ramp yang Diperoleh

Membandingkan Dua Ramp yang Diperoleh
Membandingkan Dua Ramp yang Diperoleh

Memvisualisasikan perbedaan yang didapat pada kedua bacaan tersebut.

Langkah 17: Perilaku Perbedaan Pembacaan ADC (ERROR)

Perilaku Perbedaan Pembacaan ADC (ERROR)
Perilaku Perbedaan Pembacaan ADC (ERROR)

Kurva di bawah ini menunjukkan bagaimana perbedaan pembacaan ADC berperilaku sebagai fungsi pengukuran. Kumpulan data ini akan memungkinkan kita untuk menemukan fungsi koreksi.

Untuk menemukan kurva ini, kami hanya memplot perbedaan yang ditemukan di setiap ukuran sebagai fungsi dari setiap posisi AD yang mungkin (0 hingga 4095).

Langkah 18: Perilaku Perbedaan Pembacaan ADC - Menemukan Fungsi Koreksi

Perilaku Perbedaan Pembacaan ADC - Menemukan Fungsi Koreksi
Perilaku Perbedaan Pembacaan ADC - Menemukan Fungsi Koreksi

Kita dapat menentukan di Excel fungsi koreksi dengan menambahkan Garis Tren, sekarang dengan tingkat yang lebih tinggi, hingga cukup sesuai dengan data kita.

Langkah 19: Menggunakan Perangkat Lunak Lain

Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain
Menggunakan Perangkat Lunak Lain

Software lain yang menarik untuk menentukan kurva adalah PolySolve, yang dapat digunakan langsung di tautan: https://arachnoid.com/polysolve/ atau diunduh sebagai aplikasi Java.

Ini memungkinkan penerapan regresi polinomial tingkat tinggi dan pengiriman fungsi yang diformat, serta fungsi lainnya.

Untuk menggunakannya, cukup masukkan data di kotak teks pertama. Data harus mengikuti urutan X, Y dipisahkan dengan koma, atau tab. Berhati-hatilah dalam menggunakan titik dengan benar sebagai titik desimal.

Bagan akan muncul di kotak berikutnya jika data yang dimasukkan diformat dengan benar.

Inilah bagaimana kurva kesalahan ADC kami berjalan.

Jendela ini akan menampilkan hasil regresi, termasuk data kecukupan fungsi, yang pada gilirannya dapat diformat outputnya dalam beberapa cara: sebagai fungsi C / C ++, daftar koefisien, fungsi yang ditulis dalam Java, dll.

Catatan: Perhatikan pemisah desimal

Langkah 20: Konstanta dan Pengaturan ()

Saya tunjukkan di sini GPIO yang digunakan untuk menangkap analog. Saya menginisialisasi port serial, serta pin yang ditentukan untuk pengambilan analog.

const int pin_leiura = 36; //GPIO menggunakan para captura analógica void setup() { Serial.begin(1000000); //Iniciciando a porta serial somente untuk debug pinMode(pin_leitura, INPUT); //Pino utilizado para captura analógica }

Langkah 21: Loop () dan Fungsi Koreksi

Kami membuat penangkapan tegangan yang disesuaikan, dan kami mencetak nilainya dengan atau tanpa koreksi yang benar.

void loop() { int valor_analogico = analogRead(pin_leiura); //realiza a captura da tensão ajustada //Serial.print(valor_analogico + f(valor_analogico)); //imprime os valores para debug (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(", "); Serial.println(0); //cria uma linha para marcar o valor mínimo de 0 }

Perhatikan pada baris 12 bahwa kita memiliki pilihan untuk mencetak data dengan penambahan fungsi selisih f (analog_value).

Langkah 22: Menggunakan Fungsi Koreksi PolySolve

Di sini, kami menggunakan fungsi PolySolve di dalam Arduino IDE.

/* Modus: normal Derajat polinomial 6, 2365 x, y pasangan data Koefisien korelasi (r^2) = 9, 907187626418e-01 Standar error = 1, 353761109831e+01 Bentuk keluaran: Fungsi C/C++: Hak Cipta © 2012, P. Lutus -- https://www.arachnoid.com. Seluruh hak cipta. */ double f(double x) { kembali 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); }

Perhatikan perubahan koma demi titik sebagai pemisah desimal.

Langkah 23: Tangkap Dengan Koreksi - Serial Plotter

Tangkap Dengan Koreksi - Serial Plotter
Tangkap Dengan Koreksi - Serial Plotter

Langkah 24: Biaya Komputasi

Biaya Komputasi
Biaya Komputasi
Biaya Komputasi
Biaya Komputasi

Untuk melakukan perhitungan polinomial, prosesor perlu menangani tugas ini. Hal ini dapat menyebabkan penundaan dalam eksekusi, tergantung pada kode sumber dan daya komputasi yang tersedia.

Di sini, kita melihat tabel hasil tes menggunakan polinomial multi-derajat. Perhatikan perbedaan antara waktu ketika fungsi pow () digunakan dan ketika tidak.

Langkah 25: Kode Uji - Setup () dan Loop Start ()

Di sini, kami memiliki kode yang digunakan dalam pengujian kami.

void setup() { Serial.begin(1000000); //Iniciando a porta serial somente para debug } void loop() { float valor_analogico = 500,0; //um valor arbtrario float quantidade = 10000.0; //quantidade de chamadas float contador = 0.0; //kontador de chamadas

Langkah 26: Kode Uji - Loop () dan Pemrosesan

Saya menggunakan fungsi mikro () untuk mendapatkan nilai dalam mikrodetik.

//============== inicia o proses float agora = micros(); //marca o instan inisial while (contador < quantidade) { //v(valor_analogico); //kesenangan vazia //r(keberanian_analogico); //função com retorno //f0(valor_analogico); //grau 0 //f1(keberanian_analogico); //grau 1 //f2(keberanian_analogico); //grau 2 //f3(keberanian_analogico); //grau 3 //f4(keberanian_analogico); //grau 4 //f5(keberanian_analogico); //grau 5 //f6(keberanian_analogico); //grau 6 //f13_semPow(keberanian_analogico); //grau 13º SEM menyenangkanção POW //f13_comPow(valor_analogico); //grau 13º COM menyenangkanção POW contador++; } agora = (mikro() - agora) / quantidade; //determina o intervalo que se passou para cada iteração //============= finaliza o processo

Langkah 27: Kode Tes - Loop () - Hasil

Kami mencetak nilai yang dikembalikan dari fungsi kelas 13 dengan dan tanpa POW untuk perbandingan, serta interval pemrosesan.

//imprime o valor retornado da função de grau 13 com e sem POW untuk membandingkan Serial.print(f13_semPow(valor_analogico)); //grau 13º SEM menyenangkanção POW Serial.print(" - "); Serial.print(f13_comPow(valor_analogico)); //grau 13º COM menyenangkanção POW Serial.print(" - "); //imprime atau intervalo lakukan proses Serial.println(agora, 6); }

Langkah 28: Kode Uji - Fungsi yang Digunakan

Fungsi kosong (hanya dengan pengembalian) derajat 0 dan 1.

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

Fungsi kelas 2, 3, dan 4.

//FUNÇÃO DE GRAU 2double f2(double x) { return 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2); } //FUNÇÃO DE GRAU 3 double f3(double x) { return 2.202196968876e+02 + 3.561383996027e-01 * x + 1.276218788985e-04 * pow(x, 2) + -3.470360275448e-07 * pow(x, 3); } //FUNÇÃO DE GRAU 4 double f4(double x) { return 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); }

Fungsi kelas 5 dan 6.

//FUNÇÃO DE GRAU 5double f5(double x) { return 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 double f6(double x) { return 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); }

Fungsi kelas 13 menggunakan POW.

//FUNÇÃO DE GRAU 13 USANDO O POWdouble f13_comPow(double x) { return 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, 220894795714e-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); }

Fungsi kelas 13 tanpa menggunakan POW.

//FUNÇÃO DE GRAU SEM USAR O POWdouble f13_semPow(double x) { return 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; }

Langkah 29: File

Unduh file:

PDF

SAYA TIDAK

Spreadsheet

Direkomendasikan: