Isi kandungan:

Voltan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)
Voltan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)

Video: Voltan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)

Video: Voltan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)
Video: Rangkaian Lampu LED nyala bergantian sederhana 2024, Julai
Anonim
Image
Image

Instructable ini menunjukkan cara menjana perubahan voltan analog super cepat dari Arduino dan pasangan perintang dan kapasitor sederhana. Salah satu aplikasi yang berguna ini adalah menghasilkan grafik pada osiloskop. Terdapat beberapa projek lain yang berjaya melakukannya. Johngineer menunjukkan pokok Krismas sederhana menggunakan modulasi lebar nadi (PWM). Yang lain telah memperbaiki projek itu dengan menggunakan tangga perintang atau menggunakan cip penukar digital-ke-analog khusus.

Menggunakan PWM menyebabkan banyak kerlipan, semasa menggunakan tangga perintang atau penukar digital ke analog memerlukan lebih banyak pin output dan komponen yang mungkin tidak tersedia. Litar yang saya gunakan adalah pasangan resistor dan kapasitor sederhana mati yang sama seperti yang digunakan dalam demo pokok Krismas, tetapi beroperasi dengan lebih sedikit kerlipan.

Pertama, saya akan membimbing anda melalui proses membina litar. Kemudian saya akan mengajar anda cara menambah gambar anda sendiri. Akhirnya, saya akan memperkenalkan teori mengenai apa yang menjadikannya lebih pantas.

Sekiranya anda menyukai Instructable ini, pertimbangkan untuk memilihnya!:)

Langkah 1: Membina Litar

Membina Litar
Membina Litar

Untuk membina litar, anda memerlukan perkara berikut:

a) Arduino berdasarkan Atmel 16MHz ATmega328P, seperti Arduino Uno atau Arduino Nano.

b) Dua perintang nilai R yang sekurang-kurangnya 150Ω.

c) Dua kapasitor nilai C sehingga C = 0.0015 / R, contoh:

  • R = 150Ω dan C = 10µ
  • R = 1.5kΩ dan C = 1µ
  • R = 15kΩ dan C = 100nF
  • R = 150kΩ dan C = 10nF

Sebab-sebab untuk memilih nilai-nilai ini adalah dua kali ganda. Terutama, kami ingin memastikan arus di pin Arduino berada di bawah arus maksimum maksimum 40mA. Menggunakan nilai 150Ω menghadkan arus hingga 30mA apabila digunakan dengan voltan bekalan Arduino 5V. Nilai R yang lebih besar akan menurunkan arus dan oleh itu boleh diterima.

Kekangan kedua ialah kita mahu mengekalkan masa yang tetap, yang merupakan produk R dan C, sama dengan kira-kira 1.5ms. Perisian ini telah disesuaikan secara khusus untuk masa ini secara berterusan. Walaupun mungkin untuk menyesuaikan nilai R dan C dalam perangkat lunak, ada jarak sempit di mana ia akan berfungsi, jadi pilih komponen sedekat mungkin dengan nisbah yang disarankan.

Penjelasan yang lebih teliti mengapa pemalar RC penting akan diberikan di bahagian teori, setelah saya menunjukkan kepada anda cara memasang litar demonstrasi.

Langkah 2: Menyiapkan Osiloskop

Menyiapkan Osiloskop
Menyiapkan Osiloskop

Demonstrasi memerlukan osiloskop yang ditetapkan ke mod X / Y. Petunjuk ujian perlu disambung seperti yang ditunjukkan dalam skema. Osiloskop anda akan berbeza dari saya, tetapi saya akan melalui langkah-langkah yang diperlukan untuk menyiapkan mod X / Y pada unit saya:

a) Tetapkan sapuan mendatar untuk dikendalikan oleh Saluran B (paksi X).

b) Tetapkan osiloskop ke mod saluran dua.

c) Tetapkan volt / div pada kedua-dua saluran sehingga dapat memaparkan voltan dari 0V hingga 5V. Saya menetapkan tambang ke 0.5V / div.

d) Tetapkan mod gandingan ke DC pada kedua saluran.

e) Laraskan kedudukan X dan Y sehingga titik berada di sudut kiri bawah skrin semasa Arduino dimatikan.

Langkah 3: Muat turun dan Jalankan Perisian

Image
Image

Muat turun perisian dari repositori Fast Vector Display For Arduino. Perisian ini dilesenkan di bawah GNU Affero Public License v3 dan boleh digunakan dan diubah secara bebas di bawah syarat-syarat lesen tersebut.

Buka fail "fast-vector-display-arduino.ino" di Arduino IDE dan muat naik ke Arduino anda. Sebentar lagi, anda akan melihat animasi "Selamat Tahun Baru" di skrin osiloskop anda.

Saya mengembangkan projek ini sebagai hackaton peribadi dalam beberapa minggu menjelang Krismas, jadi ada mesej bertema Krismas dan Tahun Baru yang dapat anda lihat dengan mengubah pemboleh ubah PATTERN dalam kod.

Langkah 4: Buat Lukisan Tersuai Anda Sendiri

Fahami Mengapa PWM Begitu Lambat
Fahami Mengapa PWM Begitu Lambat

Sekiranya anda ingin membuat gambar anda sendiri, anda boleh menampal koordinat titik ke dalam lakaran Arduino pada garis yang menentukan USER_PATTERN.

Saya dapati bahawa Inkscape adalah alat yang cukup baik untuk membuat lukisan tersuai:

  1. Buat teks menggunakan fon tebal dan tebal seperti Impact.
  2. Pilih objek teks dan pilih "Objek ke Path" dari menu "Path".
  3. Pilih huruf individu dan tumpang tindih untuk membuat bentuk yang bersambung
  4. Pilih "Union" dari menu "Path" untuk menggabungkannya menjadi satu lengkung.
  5. Sekiranya terdapat lubang pada huruf apa pun, potong takik kecil dengan melukis sebuah segi empat tepat dengan alat segi empat dan mengurangkannya dari kontur menggunakan alat "Perbezaan".
  6. Klik dua kali jalan untuk menunjukkan nod.
  7. Segi empat tepat pilih semua nod dan klik alat "Buat sudut nod yang dipilih".
  8. Simpan fail SVG.

Yang penting gambar anda harus mempunyai satu jalan tertutup dan tidak ada lubang. Pastikan reka bentuk anda mempunyai kurang daripada 130 mata.

Langkah 5: Tampal Koordinat Dari Fail SVG Ke Arduino IDE

  1. Buka fail SVG dan salin koordinat. Ini akan disertakan dalam elemen "jalan". Pasangan koordinat pertama boleh diabaikan; gantikannya dengan 0, 0.
  2. Tampal koordinat ke dalam sketsa Arduino di dalam kurungan tepat selepas "#define USER_PATTERN".
  3. Ganti semua ruang dengan koma, jika tidak, anda akan mendapat ralat kompilasi. Alat "Ganti & Cari" mungkin berguna.
  4. Susun dan jalankan!
  5. Sekiranya anda menghadapi masalah, tonton konsol bersiri untuk sebarang kesilapan. Khususnya, anda akan melihat mesej jika corak anda mempunyai terlalu banyak titik untuk penyangga dalaman. Dalam kes sedemikian, gambar akan menunjukkan kerlipan yang berlebihan.

Langkah 6: Fahami Mengapa PWM Lambat

Untuk memulakan, mari kita periksa tingkah laku kapasitor semasa ia sedang dicas.

Kapasitor yang disambungkan ke sumber voltan Vcc akan meningkatkan voltannya mengikut lengkung eksponen. Lengkung ini tidak simptotik, yang bermaksud ia akan menjadi perlahan ketika menghampiri voltan sasaran. Untuk semua tujuan praktikal, voltan "cukup dekat" selepas 5 saat RC. RC dipanggil "pemalar masa". Seperti yang kita lihat sebelumnya, ia adalah produk dari nilai perintang dan kapasitor dalam litar anda. Masalahnya ialah 5 RC adalah masa yang agak lama untuk mengemas kini setiap titik dalam paparan grafik. Ini menyebabkan banyak kerlipan!

Apabila kita menggunakan modulasi lebar nadi (PWM) untuk mengecas kapasitor, kita tidak lebih baik. Dengan PWM voltan bertukar dengan cepat antara 0V dan 5V. Dalam praktiknya, ini bermaksud kita bergantian dengan cepat antara menolak cas ke kapasitor dan menariknya sedikit lagi - tolakan dan tarikan ini lebih seperti cuba menjalankan maraton dengan mengambil langkah besar ke depan dan kemudian sedikit ke belakang lagi dan lagi.

Apabila anda menilai semuanya, tingkah laku pengisian kapasitor menggunakan PWM adalah sama seperti jika anda menggunakan voltan tetap Vpwm untuk mengecas kapasitor. Masih memerlukan masa sekitar 5 saat RC untuk mendapatkan "cukup dekat" ke voltan yang diinginkan.

Langkah 7: Dapatkan Dari B ke B, Sedikit Lebih Sedikit

Dapatkan Dari B ke B, Sedikit Lebih Sedikit
Dapatkan Dari B ke B, Sedikit Lebih Sedikit

Katakan kita mempunyai kapasitor yang sudah dicas hingga Va. Andaikan kita menggunakan analogWrite () untuk menuliskan nilai baru b. Berapakah jumlah masa minimum yang perlu anda tunggu sehingga voltan Vb tercapai?

Sekiranya anda meneka 5 saat RC, itu bagus! Dengan menunggu 5 saat RC, kapasitor akan dicas ke hampir hampir Vb. Tetapi jika kita mahu, kita sebenarnya boleh menunggu sedikit.

Lihat keluk caj. Anda lihat, kapasitor sudah berada di Va ketika kita mula. Ini bermaksud bahawa kita tidak perlu menunggu masa t_a. Kita hanya perlu jika kita mengisi kapasitor dari sifar.

Oleh itu, dengan tidak menunggu masa itu, kita melihat peningkatan. Masa t_ab sebenarnya sedikit lebih pendek daripada 5 RC.

Tetapi tunggu, kita boleh melakukannya dengan lebih baik! Lihat semua ruang di atas v_b. Itulah perbezaan antara Vcc, voltan maksimum yang ada pada kita, dan Vb yang ingin kita capai. Bolehkah anda melihat bagaimana voltan tambahan itu dapat menolong kita ke tempat yang ingin kita lalui dengan lebih pantas?

Langkah 8: Dapatkan Dari B ke B, Dengan Pengecas Turbo

Dapatkan Dari B ke B, Dengan Pengecas Turbo!
Dapatkan Dari B ke B, Dengan Pengecas Turbo!

Betul betul. Daripada menggunakan PWM pada voltan sasaran V_b, kami menahannya pada Vcc yang stabil untuk jangka masa yang jauh lebih pendek. Saya menyebutnya kaedah Turbo Charger dan ia membawa kita ke mana kita mahu pergi dengan sangat cepat! Selepas kelewatan masa (yang mesti kita hitung), kita membanting brek dengan beralih ke PWM di V_b. Ini mengelakkan voltan daripada mengatasi sasaran.

Dengan kaedah ini, adalah mungkin untuk menukar voltan dalam kapasitor dari V_a ke V_b dalam sepersekian masa daripada hanya menggunakan PWM. Ini adalah bagaimana anda mendapat tempat, sayang!

Langkah 9: Fahami Kod

Fahami Kod
Fahami Kod

Gambar bernilai seribu perkataan, jadi rajah menunjukkan data dan operasi yang dilakukan dalam kod. Dari kiri ke kanan:

  • Data grafik disimpan dalam PROGMEM (iaitu memori flash) sebagai senarai titik.
  • Sebarang kombinasi operasi terjemahan, penskalaan dan putaran digabungkan menjadi matriks transformasi afin. Ini dilakukan sekali pada permulaan setiap bingkai animasi.
  • Titik dibaca satu persatu dari data grafik dan masing-masing didarabkan dengan matriks transformasi yang tersimpan.
  • Titik yang diubah dimasukkan melalui algoritma gunting yang memotong titik di luar kawasan yang kelihatan.
  • Dengan menggunakan jadual pencarian kelewatan RC, titik ditukar menjadi voltan pemanduan dan kelewatan masa. Jadual pencarian kelewatan RC disimpan di EEPROM dan boleh digunakan semula untuk beberapa kod berjalan. Semasa permulaan, jadual carian RC diperiksa untuk ketepatan dan nilai yang salah dikemas kini. Penggunaan EEPROM menjimatkan memori RAM yang berharga.
  • Voltan dan kelewatan pemanduan ditulis ke bingkai yang tidak aktif dalam penyangga bingkai. Penyangga bingkai mengandungi ruang untuk bingkai aktif dan bingkai tidak aktif. Setelah bingkai lengkap ditulis, bingkai yang tidak aktif dibuat aktif.
  • Rutin perkhidmatan gangguan terus melukis semula gambar dengan membaca nilai voltan dan kelewatan dari penyangga bingkai aktif. Berdasarkan nilai tersebut, ia menyesuaikan kitaran tugas pin output. Pemasa 1 digunakan untuk mengukur kelewatan masa hingga ketepatan beberapa nanodetik, sementara pemasa 2 digunakan untuk mengawal pusingan tugas pin.
  • Pin dengan perubahan voltan terbesar selalu "dicas turbo" dengan kitaran tugas sifar atau 100%, memberikan masa pengecasan atau pelepasan terpantas. Pin dengan perubahan voltan yang lebih rendah digerakkan dengan putaran tugas yang dipilih untuk mencocokkan masa peralihan pin pertama-pemadanan kali ini penting untuk memastikan bahawa garis dilukis lurus pada osiloskop.

Langkah 10: Dengan Kepantasan Yang Hebat, Tanggungjawab Yang Hebat

Oleh kerana kaedah ini jauh lebih pantas daripada PWM, mengapa analogWrite () tidak menggunakannya? Oleh kerana hanya menggunakan PWM cukup baik untuk kebanyakan program dan jauh lebih memaafkan. Walau bagaimanapun, kaedah "Turbo Charger" memerlukan pengekodan yang teliti dan hanya sesuai untuk kes tertentu:

  1. Amat sensitif terhadap masa. Sebaik sahaja kita mencapai tahap voltan sasaran, pin penggerak mesti segera diubah ke mod PWM biasa untuk menghindari kelebihan voltan sasaran.
  2. Ia memerlukan pengetahuan mengenai pemalar RC, jadi nilai-nilai ini mesti dimasukkan sebelumnya. Dengan nilai yang tidak betul, waktunya akan salah dan voltan tidak betul. Dengan PWM biasa, ada jaminan bahawa anda akan menggunakan voltan yang betul setelah beberapa waktu, walaupun pemalar RC tidak diketahui.
  3. Mengira selang waktu yang tepat untuk mengecas kapasitor memerlukan persamaan logaritmik yang terlalu perlahan untuk pengiraan masa nyata di Arduino. Ini mesti dihitung sebelum setiap bingkai animasi dan disimpan dalam memori di suatu tempat.
  4. Program yang berurusan dengan kaedah ini mesti bertentangan dengan fakta bahawa kelewatan sangat tidak linear (sebenarnya, eksponensial). Voltan sasaran berhampiran Vcc atau GND akan memerlukan banyak pesanan magnitud lebih lama daripada voltan berhampiran titik tengah.

Untuk mengatasi batasan ini, kod grafik vektor saya melakukan perkara berikut:

  1. Ia menggunakan Pemasa 1 pada 16kHz dan rutin perkhidmatan gangguan untuk manipulasi dan pemasaan output yang tepat.
  2. Ia memerlukan nilai pemalar masa RC tertentu untuk digunakan, yang membatasi pilihan nilai kapasitor dan perintang.
  3. Ia menyimpan kelewatan waktu untuk semua titik dalam bingkai animasi dalam penyangga memori. Ini bermaksud rutin yang menghitung kelewatan masa berjalan pada kadar yang jauh lebih perlahan daripada rutin perkhidmatan gangguan yang mengemas kini pin output. Sebarang bingkai tertentu mungkin dilukis beberapa kali sebelum set kelewatan baru untuk bingkai seterusnya siap digunakan.
  4. Penggunaan buffer memori meletakkan kekangan pada jumlah titik yang dapat ditarik per bingkai. Saya menggunakan pengekodan ruang yang cekap untuk memanfaatkan RAM yang ada sepenuhnya, tetapi masih terhad kepada sekitar 150 mata. Di luar seratus atau lebih poin, paparan akan mula berkedip, jadi ini adalah titik pertengkaran!

Disyorkan: