Daftar Isi:
- Langkah 1: Apa itu Konverter IKLAN?
- Langkah 2: Sumber Daya yang Digunakan
- Langkah 3: ESP32 ADC
- Langkah 4: Sirkuit Digunakan
- Langkah 5: Tanda Tangan Digunakan
- Langkah 6: Data yang Diperoleh oleh Osiloskop
- Langkah 7: Data yang Diperoleh oleh Oscilloscope (File csv di Excel)
- Langkah 8: Data yang Diperoleh oleh ADC
- Langkah 9: Data yang Diperoleh oleh ADC - Excel
- Langkah 10: Perbandingan Ramp Panjat
- Langkah 11: Menyamakan Jumlah Sampel
- Langkah 12: Mengisi Kesenjangan - Garis Tren
- Langkah 13: Mengisi Kesenjangan - Kurva Polinomial Grade 2
- Langkah 14: Mengisi Kesenjangan - Mengevaluasi Fungsi
- Langkah 15: Mengubah Tegangan Osiloskop ke Nilai Setara untuk Dibandingkan Dengan ADC
- Langkah 16: Membandingkan Dua Ramp yang Diperoleh
- Langkah 17: Perilaku Perbedaan Pembacaan ADC (ERROR)
- Langkah 18: Perilaku Perbedaan Pembacaan ADC - Menemukan Fungsi Koreksi
- Langkah 19: Menggunakan Perangkat Lunak Lain
- Langkah 20: Konstanta dan Pengaturan ()
- Langkah 21: Loop () dan Fungsi Koreksi
- Langkah 22: Menggunakan Fungsi Koreksi PolySolve
- Langkah 23: Tangkap Dengan Koreksi - Serial Plotter
- Langkah 24: Biaya Komputasi
- Langkah 25: Kode Uji - Setup () dan Loop Start ()
- Langkah 26: Kode Uji - Loop () dan Pemrosesan
- Langkah 27: Kode Tes - Loop () - Hasil
- Langkah 28: Kode Uji - Fungsi yang Digunakan
- Langkah 29: File
Video: Apakah Anda Tahu Tentang Penyesuaian ADC ESP32?: 29 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:56
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
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
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
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
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)
Kami memiliki sampel di sini.
Langkah 8: 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
Menggunakan tingkat yang lebih tinggi dan terminal serial, kita dapat menangkap nilai dan menerapkannya di Excel untuk perbandingan kita.
Langkah 10: 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
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
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
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
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
Memvisualisasikan perbedaan yang didapat pada kedua bacaan tersebut.
Langkah 17: 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
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
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
Langkah 24: 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:
SAYA TIDAK
Spreadsheet
Direkomendasikan:
Tidak Kencing Sekarang, Perangkat Penyesuaian Perilaku Hewan Peliharaan Yang Menghentikan Kucing Kencing Di Sekitar Rumah Anda: 4 Langkah
Tidak Kencing Sekarang, Perangkat Penyesuaian Perilaku Hewan Peliharaan yang Menghentikan Kucing untuk Kencing Di Sekitar Rumah Anda: Saya sangat terganggu oleh kucing saya sehingga dia suka buang air kecil di tempat tidur saya, saya memeriksa semua yang dia butuhkan dan saya juga membawanya ke dokter hewan. Setelah saya memecahkan semua yang saya bisa pikirkan dan mendengarkan kata-kata dokter, saya menyadari dia hanya memiliki beberapa perilaku buruk. Jadi
S.H.I.E.L.D - Apakah Seseorang Mengawasi Anda?: 4 Langkah (dengan Gambar)
S.H.I.E.L.D - Is Someone Watching You?: Saya melihat banyak video orang yang malu ketika mereka tidak menyadari bahwa mikrofon atau kamera mereka menyala, dan itu memberi saya ide untuk proyek ini. Saya telah menulis aplikasi sederhana di C# yang mendeteksi ketika kamera atau mikrofon sedang digunakan
Konversi (hanya Tentang) File Media Apa Saja ke (Hanya Tentang) File Media Lainnya Gratis!: 4 Langkah
Konversi (hanya Tentang) File Media Apa Saja ke (Hanya Tentang) File Media Lainnya Gratis!: Instruksi pertama saya, sorak-sorai! Bagaimanapun, saya di Google mencari program gratis yang akan mengonversi file Youtube.flv saya ke format yang lebih universal, seperti.wmv atau.mov.Saya mencari forum dan situs web yang tak terhitung jumlahnya dan kemudian menemukan sebuah program bernama
Cara Memeriksa Apakah Game Akan Berjalan di Komputer Anda Sebelum Anda Membeli Game: 4 Langkah
Cara Memeriksa Apakah Game Akan Berjalan di Komputer Anda Sebelum Anda Membeli Game tersebut.: Saya baru-baru ini memperoleh Call of Duty 4 dari seorang teman (bisa saya tambahkan secara gratis) karena tidak dapat berjalan di komputernya. Yah, komputernya cukup baru, dan saya bingung mengapa komputer itu tidak bisa dijalankan. Jadi setelah beberapa jam mencari di internet, saya menemukan
Titik Kuning Misteri: Apakah Printer Anda Memata-matai Anda?: 5 Langkah (dengan Gambar)
Titik Kuning Misteri: Apakah Printer Anda Memata-matai Anda?: Bayangkan bahwa setiap kali Anda mencetak dokumen, secara otomatis menyertakan kode rahasia yang dapat digunakan untuk mengidentifikasi printer -- dan, kemungkinan, orang yang menggunakannya. Kedengarannya seperti sesuatu dari film mata-mata, kan? Sayangnya, skenarionya