ShIoTiny dan dunia: sensor analog atau ADC untuk yang terkecil

gambar


Poin-poin penting atau tentang artikel ini


Kelanjutan dari serangkaian artikel tentang ShIoTiny - pengontrol yang dapat diprogram secara visual berdasarkan chip ESP8266 . Fitur utama dari pengontrol ini adalah kemampuan untuk memprogramnya dengan menggambar program di browser.


Artikel ini menjelaskan teori singkat konversi analog-ke-digital dan aplikasi praktis dari kontroler ShIoTiny ADC.


Artikel sebelumnya dalam seri.


ShIoTiny: otomatisasi kecil, Internet, atau "enam bulan sebelum liburan"


ShIoTiny: node, tautan, dan acara atau fitur program menggambar


ShIoTiny: ventilasi kamar basah (contoh proyek)


ShIoTiny dan dunia sekitarnya: menghubungkan sensor ke input biner, pantulan kontak, dan masalah lainnya


Situs proyek


Firmware biner, sirkuit pengontrol, dan dokumentasi di sini


Pengantar atau bukannya teori serius


Dalam artikel sebelumnya , kami memeriksa koneksi jenis sensor utama dengan output biner ke input biner dari pengontrol ShIoTiny .


Tetapi, seperti yang diketahui oleh kebanyakan orang, juga anak sekolah dan siswa, sebagian besar informasi tentang dunia sekitarnya adalah jumlah analog dari berbagai sifat fisik: kekuatan cahaya dan suara, kecepatan, tekanan udara, tingkat cairan, dan sebagainya.


Hampir semua mikroprosesor dan mikrokontroler modern hanya mampu memproses nilai diskrit dalam representasi biner.


Bagi mereka yang belum tahu bagaimana nilai analog berbeda dari yang diskrit, saya akan menulis penjelasan singkat. Siapa pun yang sudah tahu segalanya bisa melewati mereka. Saya akan segera melakukan pemesanan - analogi dan penyederhanaan ada tempatnya. Ini bukan disertasi, melainkan penjelasan singkat di jari.


Jumlah analog dan diskrit (Anda tidak dapat membaca untuk profesor, akademisi, dan Geeks)


Semua orang belajar matematika di sekolah. Oleh karena itu, kita beralih ke sana dan menggambar analogi antara jumlah dan angka analog dan diskrit.


Dari sudut pandang matematika, kuantitas analog adalah bilangan real , didefinisikan pada titik mana pun pada segmen tertentu dari garis bilangan.


Nilai diskrit dari sudut pandang matematika adalah bilangan bulat . Dan itu didefinisikan hanya pada titik-titik tertentu dari segmen tertentu dari garis bilangan.


Gambar di bawah ini secara skematis menunjukkan lokasi angka-angka analog dan diskrit pada garis angka.


gambar


Misalnya, perhatikan segmen dari garis bilangan dari -4 hingga 3 . Seperti yang Anda lihat, jumlah diskrit yang ditunjukkan oleh titik-titik merah - bilangan bulat di atasnya hanya 8 buah. Nilai analog yang ditunjukkan oleh garis hijau pada gambar tidak terbatas.


Misalnya, kami memiliki kuantitas X tertentu, yang memiliki rentang nilai dari 0 hingga 127 . Jika kami menyatakan kuantitas ini sebagai analog , maka secara teoritis kami dapat mewakilinya dengan akurasi apa pun - misalnya, 12.123455454980 atau 126.00000000007 atau secara umum dengan sejuta tempat desimal.


Tetapi begitu mikrokontroler memasuki bisnis dan nilai X memperoleh representasi diskrit , maka tidak ada pembicaraan tentang “akurasi tak terbatas” bahkan secara teoritis. Akurasi dibatasi oleh jumlah digit biner, yang kami tetapkan untuk representasi kuantitas X.


Sebagai contoh, kami mengambil 7 bit. Dalam hal ini, kita dapat merepresentasikan nilai X dengan akurasi satu. Artinya, dimungkinkan untuk menentukan X = 1 atau X = 112 . Tetapi X = 112.5 tidak dapat diindikasikan - tidak ada kedalaman bit yang cukup. Jika kita mengambil untuk representasi dengan nilai X yang sama bukan 7 , tetapi 10 digit, maka keakuratan representasi tidak akan menjadi satu, tetapi 0,125 . Dan dalam formulir ini, Anda dapat membayangkan X = 95.125 atau X = 112.5 . Tetapi lebih tepatnya, misalnya, dalam bentuk X = 112.13 - nilai ini belum dapat direpresentasikan.


Jika Anda bingung dengan fakta bahwa saya menulis nilai fraksional dan pada saat yang sama saya berbicara tentang mereka sebagai bilangan bulat, maka ingatlah bahwa "titik diskrit" dapat ditempatkan pada garis angka bukan dalam satuan, tetapi misalnya dalam 0,5 atau 0,125 unit. Tetapi karena mereka, nilai akhir akan tetap pada segmen mana pun. Dan semua sifat dari kuantitas yang terpisah dipertahankan.


Perbedaan utama antara nilai diskrit dan nilai analog adalah bahwa pada setiap segmen terbatas dari garis bilangan akan ada jumlah terbatas nilai diskrit (integer) dan jumlah tak terbatas nilai analog (nyata). Dengan demikian, kita memperoleh bahwa representasi kuantitas yang diskrit selalu memiliki akurasi yang terbatas.


Sebagai hasil dari semua hal di atas, kita mendapatkan kesimpulan yang sepele. Sebagian besar kuantitas dunia nyata yang terukur adalah analog . Mikrokontroler hanya bekerja dengan representasi numerik diskrit dari jumlah. Oleh karena itu, sebelum memproses nilai analog apa pun menggunakan mikrokontroler, nilai ini harus dinyatakan sebagai nilai diskrit. Ya, dan dalam bentuk biner.


Konversi semacam itu dari analog ke digital disebut konversi analog-ke-digital .


Konverter analog ke digital


Perangkat untuk mengubah sinyal analog ke digital disebut ADC ( analog-to-digital converter ).


Biasanya, perangkat tersebut memiliki satu atau lebih input analog, yang mana sinyal analog dan output digital dengan kedalaman bit diberikan (biasanya dari 8 hingga 16 bit).


Mikrokontroler modern, termasuk ESP8266 kami, memiliki unit ADC bawaan .


Apa karakteristik yang dilakukan ADC pada umumnya dan ESP8266 pada khususnya?


Karakteristik pertama adalah jenis input analog apa yang dikonversi ADC menjadi kode digital keluaran. Paling sering, nilai ini adalah tegangan pada input analog ADC. Jadi itu akan menjadi kasus kita. Namun secara alami, ada ADC dengan input saat ini.


Karakteristik kedua ADC, yang diperlukan dalam praktiknya, adalah rentang nilai dari nilai input ADC. Dalam kasus kami, ini adalah nilai tegangan minimum dan maksimum pada input ADC. Nilai-nilai ini akan menjadi 0V dan 1V, masing-masing. Kisaran input 1V tampak kecil, tetapi voltase besar selalu dapat dibagi dan dikurangi, dan voltase kecil dapat diperkuat.


Karakteristik ketiga dan mungkin yang paling penting dari ADC adalah kapasitasnya. Nilai ini menentukan keakuratan transformasi atau (dengan analogi kami) - seberapa sering titik "diskrit" ditempatkan pada garis bilangan "nyata". Dalam kasus kami, ADC memiliki resolusi 10 . Apa artinya ini? Dan ini berarti bahwa kode digital keluaran diwakili oleh 10 digit biner dan memiliki nilai 1024 - dari 0 hingga 1023.
Sebenarnya, perlu diingat bahwa keakuratan konversi tidak hanya bergantung pada kedalaman bit, tetapi juga pada sejumlah parameter lain, misalnya, linearitas ADC. Tetapi banyak yang telah ditulis tentang hal ini oleh paman yang sangat pintar dalam buku yang sangat pintar, jadi dalam artikel ini saya akan meninggalkan pembaca tanpa detail.


Selain itu, ESP8266 ADC dapat mendeteksi kelebihan, yaitu situasi di mana tegangan lebih besar dari 1V diterapkan pada input.


Jika Anda mengambil buku referensi pintar tentang ADC dan mencari di sana, maka akan ada puluhan karakteristik lainnya. Semuanya penting dan penting, tetapi kita tidak akan melangkah sejauh ini. Sebagai contoh , kami tidak akan menyentuh parameter waktu ADC , karena kami percaya bahwa dalam kasus kami nilai yang diukur berubah agak lambat dan ADC mengubahnya menjadi representasi digital “secara instan”.


Untuk meringkas hasil awal.
Pengontrol ShIoTiny memiliki ADC yang dibangun ke dalam ESP8266 .


Tegangan dalam rentang dari 0 hingga 1V diterapkan pada input dari ADC ESP8266 .


Pada output dari ESP8266 ADC, kita mendapatkan angka yang sebanding dengan tegangan input dalam kisaran dari 0 hingga 1023 . Tegangan 0V sesuai dengan kode 0 pada output ADC, tegangan 1V sesuai dengan kode 1023 pada output ADC.


Membaca data dari ADC di ShIoTiny dilakukan dengan kecepatan sekitar 10 kali per detik .


Input perangkat keras ADC dilindungi terhadap tegangan lebih, mirip dengan bagaimana input biner Input1,2,3 dilindungi ( lihat di sini ).


Itu untuk perangkat keras ShIoTiny ADC .


Sekarang mari kita berurusan dengan simpul ADC1 , yang memproses data dari perangkat keras ESP8266 .


Lonceng atau peluit perangkat lunak ADC1


Dalam diagram program di editor ElDraw , rakitan konverter analog-ke-digital disebut ADC1 .



Seperti yang telah disebutkan, simpul ADC1 menerima data dari perangkat keras ESP8266 ADC sekitar 10 kali per detik . Tetapi node yang ditentukan tidak tenang dalam hal ini, tetapi mulai memproses data ini dan bahkan menganalisisnya sedikit.


Pertama , diperiksa - apakah ada overflow ADC? Artinya - bukankah input ADC lebih dari 1V ? Jika situasi seperti itu terdeteksi, maka output dari simpul ADC1 diatur ke NAN ( bukan angka ).


Kedua , jika tidak ada luapan, nilai output ADC 0..1023 dikonversi ke nilai tegangan pada input ADC uin- angka floating point dalam kisaran 0..1 .


Ketiga , nilai yang dikonversi 0..1 ini dihitung ulang sesuai dengan rumus X=k cdotuin+bdimana uin- tegangan pada input ADC (dari 0 ke 1V ); k adalah rentang (rentang ADC ) dan b adalah offset ( offset ADC ). Dan akhirnya, nilai X yang diperoleh diatur ke output dari simpul ADC1 .


Dan akhirnya di urutan kelima . Jika nilai X telah berubah dengan persentase yang ditentukan (dari 1 hingga 100% ), maka unit ADC menghasilkan peristiwa, menyebabkan konversi nilai dari node yang terhubung dengannya. Ini pada dasarnya adalah parameter sensitivitas ADC ( perubahan ADC, kisaran% ). Lagi pula, biasanya tidak ada alasan untuk bereaksi "terhadap setiap bersin", yaitu, untuk sedikit perubahan pada bit-bit rendah ADC - mereka sering "membuat suara". Oleh karena itu, parameter sensitivitas sangat penting secara praktis.


Pertanyaan yang sah muncul - bagaimana kita mengkonfigurasi pengaturan ini? Klik dengan mouse Anda pada simpul ADC1 dalam diagram dan di sana Anda akan melihat jendela pengaturan.


Di dalamnya Anda dapat mengatur semua yang Anda butuhkan. Untuk kasus kami, itu akan menjadi jendela seperti itu, seperti pada gambar.


gambar


Di jendela ini, Anda dapat mengatur semua parameter yang disebutkan di atas - rentang, offset, dan sensitivitas ADC.


Jika Anda tidak menentukan apa pun, maka kisarannya adalah 1. Offsetnya adalah nol. Dan sensitivitasnya 1%.


Artinya, secara default, sebenarnya, output dari simpul ADC1 akan menjadi nilai tegangan analog yang dipasok ke input ADC.


Seperti yang Anda lihat, simpul ADC1 cukup kompleks. Mengapa semua ini dilakukan? Ya untuk Anda, pengguna terkasih! Hanya bercanda, tentu saja, sebagai egois jahat, saya mempertimbangkan pengalaman sebelumnya dan mencoba membuat hidup saya lebih mudah.


Kami, sebagai insinyur sederhana, ingin agar nilai-nilai yang disajikan tidak dalam "parrot", tetapi dalam nilai-nilai normal dan dapat dipahami - volt, ampere, kilogram atau meter.


Banyak sensor memberikan nilai "dalam beo", berharap bahwa mikrokontroler yang pintar akan menghitung ulang mereka ke nilai yang diinginkan.


Untuk tujuan ini, konversi nilai ADC yang diukur dengan fungsi yang diberikan diperkenalkan.


Tapi, seperti biasa, lebih baik melihat sekali daripada mendengar sepuluh kali. Lebih baik mencoba sekali daripada melihat sepuluh kali ... Tapi bukan itu intinya.
Oleh karena itu, saya akan memberikan beberapa contoh yang tidak rumit: sistem kontrol catu daya dan sistem pengukuran suhu berdasarkan sensor dengan output arus 4-20mA .


Pemantauan sumber listrik


Mengukur tegangan adalah tugas yang umum. Sebagai contoh, kami ingin mengukur tegangan listrik ~ 220V . Jika pasokan listrik kami buruk, tugasnya sangat nyata. Kami tidak membutuhkan perubahan yang sangat, sangat akurat. Sudah cukup bahwa ketika tegangan 15% di atas norma, Relay1 dipicu pada ShIoTiny , dan ketika tegangan berkurang 15% dari norma, Relay2 dipicu .


Tentu saja, kita tidak bisa memasukkan input ADC1 dari kontroler ShIoTIny ke soket. Apa yang harus dilakukan Pertama, tegangan harus dikurangi ke tingkat yang dapat diterima - 0..1V . Dan, kedua, itu harus diperbaiki: ADC kami tidak dapat mengukur tegangan bolak-balik.


Tegangan dalam jaringan dapat berada di bawah norma dan di atas norma. Untuk kesederhanaan, kita asumsikan bahwa 220V tegangan utama akan sesuai dengan 0,5V dari tegangan pada input ADC.


Selanjutnya, kita mencari transformator step-down yang pada ~ 220V dari tegangan input akan memberi kita, katakan ~ 3V dari tegangan output dan merakit sirkuit seperti pada gambar di bawah ini.



Di sini kejutan dapat menunggu orang-orang bodoh dalam elektronik. Pada keluaran penyearah, bukan tegangan DC 3V tiba-tiba muncul, tetapi beberapa plus 4V ! Bahkan, semuanya dijelaskan dengan sederhana. Ketika kita mengukur tegangan bolak-balik, voltmeter menunjukkan kepada kita nilai tegangan aktual . Dan ketika kita memperbaiki tegangan ini, maka pada keluaran rectifier kita mendapatkan nilai puncak tegangan, yang untuk sinyal sinusoidal adalah sekitar 1,41 , dan tepatnya  sqrt2kali lebih banyak dari yang sekarang. Oleh karena itu 4.23V "dimengerti" pada output dari penyearah.


Dan akhirnya, kita perlu menghitung pembagi tegangan, yaitu resistansi R1 dan R2 . Kita perlu mendapatkan output dari pembagi 0,5V dengan tegangan pada inputnya 4,23V . Jadi tegangan terkoreksi 4.23V harus dibagi 8,46 kali. Untuk melakukan ini, atur resistor R2 = 100 Ohm , dan resistor R1 = 746 Ohm . Tapi ini ideal. Sebenarnya, resistor dengan resistansi 746 ohm tidak ada. Ya, dan transformer tidak terlalu akurat. Karena itu, jika ada yang berani mencoba solusi ini, saya sangat menyarankan Anda untuk meletakkan resistor R1 = 760 Ohm , dan ambil trimmer resistor R2 , dengan hambatan 180 Ohm atau 220 Ohm . Kemudian Anda dapat, dipersenjatai dengan voltmeter, menyesuaikan R2 sehingga pada ~ 220V tegangan pada gulungan primer transformator, pada output pembagi (atau, yang sama, pada input ADC1 ) adalah = 0,5V .


Kami mengukur tegangan tidak hanya seperti itu, tetapi untuk melakukan sesuatu dengan melebihi atau menurunkannya dari norma. Misalnya, nyalakan daya cadangan agar beberapa perangkat tidak hangus dan tidak mati.


Oleh karena itu, kita akan menggambar skema program yang paling sederhana, yang, ketika tegangannya 15% di atas normal, menyebabkan relai Relay1 bekerja , dan ketika voltase berkurang 15% dari norma, relai Relay2 berfungsi . Selain itu, tegangan lebih atau undervoltage harus dipertahankan pada jaringan selama minimal 1 menit untuk memicu relai. Ini akan mencegah alarm palsu selama puncak tegangan pendek yang sering terjadi pada jaringan. Program skema yang mengimplementasikan ide kami ditunjukkan pada gambar.


gambar


Agar sirkuit ini berfungsi, perlu untuk mengatur koefisien k (rentang) sama dengan 440 dalam pengaturan parameter ADC, seperti yang ditunjukkan pada gambar.


gambar


Dengan koefisien 440 dan tegangan tegangan pada input ADC 0.5V, output dari simpul ADC1 akan menjadi 220 . Itu adalah tegangan listrik yang sebenarnya!


Ini sangat nyaman, karena memungkinkan Anda untuk mengatur konstanta segera dalam volt: 220V + 15% adalah 253V dan 220V-15% adalah 187V . Jika perlu, nilai-nilai ini dapat dengan mudah diubah tanpa membuang waktu untuk menghitung dan menerjemahkan voltase menjadi "parrot".


Sensor suhu 4-20mA


Sensor yang memiliki keluaran arus 4-20mA sangat umum di industri. Dalam kehidupan sehari-hari Anda tidak akan sering bertemu mereka. Namun demikian, seseorang memilikinya dan seseorang ini ingin menyesuaikannya dengan penyebabnya.


ADC memungkinkan penggunaan sensor semacam itu bersama dengan pengontrol ShIoTiny .


Mengapa output sensor saat ini dan tepatnya 4-20mA ? Saya akan jelaskan.


Output saat ini bekerja dengan baik pada garis panjang. Katakan satu kilometer. Mereka tidak peduli dengan hambatan kabel: arusnya sama di sepanjang kabel, terlepas dari hambatan konduktor.


Nilai awal saat ini dari 4mA , dan bukan hanya kurangnya arus, membuatnya mudah untuk mendeteksi putus kawat. Jika sensornya utuh dan kabelnya tidak putus, maka selalu ada arus. Setidaknya 4mA . Dan jika kawat putus, tidak ada arus ( 0mA ).


Misalkan kita memiliki sensor suhu dengan output arus 4-20mA dan kisaran suhu yang diukur dari -40C hingga + 125C . Kami ingin menghubungkannya dengan ShIoTin . Hal pertama yang perlu kita lakukan adalah mengubah arus menjadi tegangan. Cara yang ideal untuk konversi semacam itu adalah resistor konvensional.


Karena tegangan maksimum pada input ADC adalah 1V , dan arus maksimum dalam saluran adalah 20mA , mudah untuk menghitung bahwa resistor yang mengubah 20mA ke 1V akan memiliki resistansi 50 Ohm . ( Tidak tahu hukum Ohm - tetap di rumah! ).


Kami akan menghubungkan sensor kami seperti yang ditunjukkan pada gambar.


gambar


Sensor adalah generator arus yang sebanding dengan suhu yang diukur. Dengan resistansi 50 ohm yang terhubung secara paralel dengan input ADC1 , nilai tegangan berikut akan berada di input ADC, tergantung pada arus yang dihasilkan dalam rangkaian sensor:


  • saat ini kurang dari 4mA , tegangan pada input ADC kurang dari 0,2V - putus baris;
  • arus dari 4mA ke 20mA , tegangan dari 0,2V ke 1V - sensor berfungsi;
  • arus lebih besar dari 20mA , tegangan input lebih besar dari 1V - sensor rusak. Dengan korsleting pada sensor, resistor 50 Ohm dapat terbakar jika daya kurang dari 2W.

Misalkan kita ingin mengukur suhu dan menerbitkannya dengan MQTT . Selain itu, kami akan mempublikasikan status sensor (sirkuit terbuka, sirkuit pendek atau semuanya dalam urutan).


Hal pertama yang perlu kita lakukan adalah menghitung ulang nilai dari "beo" ke derajat. Mengetahui bahwa suhu -40 ° C sesuai dengan arus 4 mA dan tegangan pada input ADC 0,2 V , dan suhu +125 ° C sesuai dengan arus 20 mA dan tegangan pada input ADC 1 V , kita memperoleh koefisien: k = 206.25 dan b = -81.25 . Masukkan koefisien ini di jendela pengaturan ADC, seperti yang ditunjukkan pada gambar.


gambar


Siapa yang ingin memverifikasi kebenaran perhitungan k dan b sendiri - putuskan sendiri sistem persamaan:


 begincases0.2 cdotk+b=401 cdotk+b=125 endcases


Nah, skema program tidak akan rumit sama sekali dan ditunjukkan pada gambar di bawah ini.


gambar


Jika semuanya baik-baik saja dan sensor suhu 4-20mA berfungsi , suhunya dipublikasikan pada server MQTT dengan nama / t_sens . Gejala juga dipublikasikan dengan nama / sens_short dan / sens_break . Jika semuanya baik-baik saja, maka tanda-tanda kecelakaan adalah nol.


Jika saluran putus , maka suhunya akan kurang dari -40C . Dalam hal ini, parameter / sens_break pada broker MQTT akan diterbitkan sebagai satu unit.


Jika ada hubungan pendek di saluran, maka suhunya akan lebih dari + 125C . 1 NAN ( - ). /sens_short MQTT .


Relay3 , , , .


«» , , , 200 .


Kesimpulan


ShIoTiny , . , .


, - «» , - , - .


— . .


: shiotiny@yandex.ru .


Referensi


, , .




-


.




: 4-20 –


ESPPOWER ANDROID

Source: https://habr.com/ru/post/id466443/


All Articles