Daftar Isi:
- Langkah 1: Divisi Frekuensi Digital
- Langkah 2: Perangkat Keras yang Direkomendasikan
- Langkah 3: Sirkuit
- Langkah 4: Kode dan Pengukuran Frekuensi Rendah
Video: Cara Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler: 4 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:56
Saya tahu apa yang Anda pikirkan: "Hah? Ada banyak Instructables tentang cara menggunakan mikrokontroler untuk mengukur frekuensi sinyal. Menguap." Tapi tunggu, ada hal baru dalam hal ini: Saya menjelaskan metode pengukuran frekuensi yang jauh lebih tinggi daripada yang dapat ditanggung oleh mikrokontroler (MCU) dan siklus tugas sinyal - semuanya pada saat yang bersamaan!
Rentang frekuensi perangkat berkisar dari ~43 Hz hingga ~450 kHz, sedangkan siklus kerja berkisar dari 1% hingga 99%.
Mari saya jelaskan bagian "dapat menanggung": MCU mengukur periode sinyal gelombang persegi, T, dengan melacak waktu antara dua peristiwa transisi berikutnya. Misalnya, tegangan rendah ke tinggi melompat pada salah satu pin I/O-nya. Ia melakukannya dengan menghitung jumlah pulsa dari jam internalnya sendiri. Secara naif, batas atas untuk frekuensi terukur harus mematuhi teorema pengambilan sampel Nyqvist-Shannon; yaitu, kira-kira sama dengan setengah dari frekuensi clock MCU. Pada kenyataannya batasnya jauh, jauh lebih rendah, karena MCU harus mengeksekusi kode untuk menangani interupsi, menyimpan variabel, melakukan operasi aritmatika, menampilkan hasil, dll. Dalam eksperimen saya dengan MCU 48 MHz, jumlah minimal siklus clock antara transisi terukur adalah sekitar 106. Oleh karena itu, batas atas rentang frekuensi terukur dalam kasus ini adalah 48.000 / 212 / 2 = 226,4 kHz.
Sementara MCU mengukur periode sinyal, MCU juga dapat menentukan lebar pulsanya, P: waktu tegangan sinyal tetap tinggi. Dengan kata lain, waktu antara transisi rendah ke tinggi dan transisi tinggi ke rendah. Siklus tugas sinyal kemudian didefinisikan sebagai persentase berikut:
Tugas = 100% * P / T
Sama seperti dalam kasus frekuensi, ada batasan praktis pada lebar pulsa. Menggunakan contoh di atas, 106 siklus clock akan membatasi lebar pulsa tidak kurang dari 2,21 mikrodetik. Atau, tidak kurang dari 50% pada 226,4 kHz.
Salah satu cara untuk meningkatkan batas frekuensi atas sinyal gelombang persegi adalah penerapan pembagi digital yang memanfaatkan flip-flop. Membagi frekuensi input dengan n akan memperpanjang rentang atas terukur sebanyak n kali. Ini adalah berita bagus, pembagi digital memiliki satu kelemahan mendasar: sinyal yang terbagi kehilangan informasi lebar pulsa (dan siklus kerja)! Karena cara kerja pembagi, outputnya selalu memiliki siklus kerja 50%. Kekecewaan…
Namun, pada halaman berikut, saya akan menunjukkan cara membagi frekuensi secara digital dan mempertahankan lebar pulsa asli yang memungkinkan saya mengukur sinyal jauh melampaui batas yang ditentukan oleh penghitungan langsung.
Langkah 1: Divisi Frekuensi Digital
Pembagi frekuensi digital tradisional menggunakan flip-flop; tutorial ini dengan baik menjelaskan prinsip-prinsip cara membuat pembagi menggunakan sandal jepit JK standar. Ini memecahkan masalah frekuensi input yang terlalu tinggi untuk MCU, tetapi memiliki satu kelemahan utama: sinyal terbagi memiliki siklus kerja 50% terlepas dari tugas sinyal input! Untuk melihat mengapa demikian, lihat dua angka pertama. Sinyal asli dengan periode T dan lebar pulsa P diumpankan ke pin clock flip-flop JK sementara pin J dan K-nya tetap tinggi setiap saat (gambar pertama). Logika 3.3V diasumsikan di seluruh. Misalkan flip-flop dipicu oleh sisi positif (yaitu, naik) jam. Di bawah kondisi ini, perubahan status pin output (individu "flip" dan "flop") terjadi setiap kali pin clock berubah dari rendah ke tinggi. Transisi tinggi ke rendah jam (yaitu, tepi negatif) sepenuhnya diabaikan. Lihat gambar kedua. Pin keluaran, Q, memancarkan sinyal yang periodenya dua kali lebih lama dari periode aslinya, yaitu frekuensinya dibelah dua. Lebar pulsa keluaran selalu sama dengan T. Akibatnya, lebar pulsa asli, P, hilang.
Menambahkan flip-flop JK lain dalam konfigurasi yang ditunjukkan pada gambar ketiga membagi frekuensi asli dengan 4. Menambahkan lebih banyak flip-flop dengan cara berurutan yang sama membagi frekuensi dengan kekuatan berikutnya dari 2: 8, 16, 32, dll.
Soal: bagaimana cara membagi frekuensi gelombang persegi sambil mempertahankan lebar pulsanya?
Idenya adalah dengan benar menambahkan tepi negatif yang dipicu JK flip-flop ke dalam campuran. Sebut saja "Neg FF"; lihat gambar keempat. Di sini, "dengan benar" berarti bahwa pin J dan K dari flip-flop baru masing-masing diikat ke pin keluaran Q dan Qbar, dari pembagi-oleh-4 ("Pos FF") yang diilustrasikan pada gambar sebelumnya. (Di sini, "bar" adalah bilah horizontal di atas simbol Q yang menunjukkan negasi logis.) Untuk melihat apa yang dicapai, lihat tabel fungsi "Neg FF" pada gambar kelima: Pin output Neg, Q dan Qbar, mencerminkan keadaan pin inputnya, J dan K, masing-masing. Yang berarti mereka mencerminkan keadaan Pos' Q dan Qbar. Tetapi, tindakan flip-flop Neg harus menunggu tepi negatif dari sinyal asli, yang tiba pada waktu P setelah tepi positif. Ah!
Bentuk gelombang yang dihasilkan diilustrasikan pada gambar keenam. "Pos Q" mengeluarkan sinyal pada frekuensi 1/4, "Pos Qbar" adalah kebalikannya, "Neg Q" mengikuti "Pos Q" digeser oleh lebar pulsa P, dan "Neg Qbar" adalah kebalikannya. Anda dapat memverifikasi bahwa logika AND dari "Pos Qbar" dan "Neg Q" menghasilkan rangkaian pulsa yang dicirikan oleh lebar pulsa asli P dan 1/4 frekuensi. Bingo!
Pada awalnya saya menggunakan sinyal output ini untuk memberi makan MCU. Namun, ternyata menjadi masalah untuk lebar pulsa yang sangat pendek karena keterbatasan 106 siklus MCU yang disebutkan dalam Pendahuluan. Saya telah memecahkan masalah kecil ini dengan memilih keluaran lain: "Pos Qbar" DAN "Neg Qbar" sebagai gantinya. Satu melihat bentuk gelombang harus meyakinkan Anda bahwa lebar pulsa dari bentuk gelombang khusus ini, P', bervariasi antara T dan 2T, bukan rentang (0, T) untuk P. P dapat dengan mudah diperoleh dari P' dengan:
P = 2T - P'
Langkah 2: Perangkat Keras yang Direkomendasikan
Saya benar-benar menyukai pendatang baru bagi penggemar elektronik: Atmel SAM D21 MCU berdasarkan prosesor ARM Cortex M0+ 32-bit yang beroperasi pada kecepatan clock 48 MHz, jauh lebih tinggi daripada Atmels yang lebih lama. Untuk proyek ini saya membeli:
- Papan MCU ItsyBitsy M0 Express dari Adafruit
- Saya kebetulan memiliki baterai LiPo yang dapat diisi ulang dari Adafruit
- Tampilan monokrom 128x32 SPI OLED (Anda dapat menebaknya: Adafruit)
- Flip-flop JK SN74HC109 yang dipicu oleh tepi positif ganda dari Texas Instruments
- JK flip-flop SN74HC112 yang dipicu oleh tepi negatif ganda dari Texas Instruments
- Quadruple AND gate CD74AC08E dari Texas Instruments
- Quadruple OR gerbang CD74AC32E dari Texas Instruments
Langkah 3: Sirkuit
Gambar pertama menunjukkan skema yang disederhanakan dari pengukur frekuensi/tugas. Logika CMOS 3,3 V diasumsikan secara keseluruhan. Akibatnya, amplitudo gelombang persegi input harus antara V. yang sesuaiAKU H level (yaitu, 2 V) dan 3,3 V. Jika tidak, Anda perlu menaikkan atau menurunkannya. Dalam kebanyakan kasus, pembagi tegangan sederhana sudah cukup. Jika Anda ingin mendesain versi meteran Anda pada level logika yang berbeda, maka Anda harus menggunakan pengontrol mikro (MCU), baterai, dan tampilan lain yang berfungsi pada level yang diinginkan. Gerbang logika dan flip-flop yang digunakan dalam proyek ini bekerja dengan level logika di mana saja antara 2 V dan 6 V dan seharusnya baik-baik saja dalam banyak kasus.
Seperti yang ditunjukkan, MCU ItsyBitsy menggunakan pin 9-13 untuk berkomunikasi dengan layar melalui protokol perangkat lunak SPI. Pin 3V memberikan daya ke seluruh rangkaian. Pin input digital 3 menerima sinyal yang dianalisis, sedangkan pin 2 dan 4 mengontrol sumber sinyal: baik sinyal langsung yang datang melalui gerbang AND3 (frekuensi input rendah), atau sinyal dibagi 4 melalui gerbang AND4 (frekuensi input tinggi) seperti dijelaskan pada Langkah 2 Kode, yang dibahas pada langkah berikutnya, secara otomatis mendeteksi rentang frekuensi yang masuk dan mengganti sumber sinyal dengan tepat.
Skema tidak menunjukkan kompleksitas sebenarnya dari koneksi chip digital. Gambar kedua menunjukkan bagaimana proyek akan terlihat di papan tempat memotong roti. Sinyal input datang melalui kabel merah ke pin 2CLK dari flip-flop tepi positif ganda. PERHATIAN: Biasanya, semua pin J dan K dari flip-flop ini harus dipegang tinggi, tetapi SN74HC109 khususnya menampilkan pin Kbar - pin K terbalik - sebagai gantinya. Oleh karena itu, pin ini harus di-ground! Flip-flop tepi negatif pertama di SN74HC112 memiliki pin 1K dan 1J yang terhubung ke pin 1Q dan 1Qbar dari SN74HC109. Flip-flop kedua di SN74HC112 tidak digunakan dan pin inputnya (2K, 2J, 2CLRbar) di-ground. Semua pin ekstra PREbar (preset) dan CLRbar (clear) lainnya di semua flip-flop harus terhubung ke logika tinggi. Jam dan pin keluaran yang tidak digunakan dibiarkan tidak terhubung. Demikian pula, pin input yang tidak digunakan di semua gerbang di-ground, sedangkan pin output yang tidak digunakan dibiarkan tidak terhubung. Seperti yang saya diskusikan dalam "Pembunuh Cincin Telepon yang Tak Terlihat" Saya, mengardekan pin input chip logis yang tidak digunakan menghilangkan osilasi acak dan menghemat daya baterai.
Langkah 4: Kode dan Pengukuran Frekuensi Rendah
Secara alami, semua tindakan terjadi dalam kode yang ditautkan di bawah ini. Ketika input yang masuk pada pin 3 beralih dari digital low ke high, MCU mulai menghitung pulsa dari clock 48 MHz internalnya. Ini mencatat momen transisi tinggi ke rendah dan melanjutkan penghitungan hingga sakelar rendah ke tinggi berikutnya, ketika memulai kembali seluruh proses lagi. Hitungan pertama mewakili lebar pulsa, sedangkan seluruh hitungan mewakili periode sinyal. Dan itulah seluruh rahasianya.
CPU mencatat transisi ini melalui interupsi perangkat keras. SAMD21 memiliki beberapa jam; kode saya menggunakan TC3. Awalnya, saya sudah mulai dengan membaca lembar data M0 yang menguatkan untuk banyak upaya dalam mengkodekan pengendali interupsi, tetapi segera saya telah menemukan kode yang sangat terkait di posting Forum Arduino oleh pengguna electro_95, MartinL, dan Rucus yang kontribusinya adalah diakui sebagaimana mestinya. Saya memasukkan dan memodifikasi kode gabungan mereka ke dalam kode saya; menghemat banyak waktu!
Seperti yang saya sebutkan sebelumnya, resolusi sinyal dibatasi oleh ~106 siklus CPU untuk mengeksekusi kode di antara interupsi. Divisi digital dengan pelestarian lebar pulsa menangani frekuensi tinggi. Frekuensi rendah, di sisi lain, menimbulkan tantangan lain: karena penghitung jam TC3 panjangnya 16 bit, penghitung itu meluap setelah melewati batas 65.536 hitungan. Seseorang dapat menangani situasi ini dengan menambahkan interupsi overflow, tetapi memilih solusi yang berbeda: TC3 dapat menggunakan jam CPU yang telah diskalakan (yaitu, dibagi perangkat lunak) alih-alih perangkat keras 48 MHz. Jadi, jika periode sinyal mendekati batas overflow, kode dapat menginstruksikan TC3 untuk menggunakan hitungan 24 MHz untuk periode berikutnya dan, voila, penghitung turun di bawah 32.768 hitungan. Untuk frekuensi yang lebih rendah, TC3 dapat diinstruksikan untuk menghitung pulsa 12 MHz, dll. Prescaler yang sesuai secara otomatis ditentukan berdasarkan frekuensi sinyal, dengan histeresis, untuk menjaga pencacah TC3 dalam batas overflow. Akibatnya, ujung bawah jangkauan perangkat adalah sekitar 43 Hz.
Anda dipersilakan untuk melakukan fork kode dan menggunakannya dalam proyek Anda, tetapi harap sebutkan sumbernya saat memublikasikan hasil.
Tautan ke kode.
Direkomendasikan:
Cara Merobek Kaliper Digital dan Cara Kerja Kaliper Digital: 4 Langkah
Cara Merobek Kaliper Digital dan Cara Kerja Kaliper Digital: Banyak orang tahu cara menggunakan kaliper untuk mengukur. Tutorial ini akan mengajarkan Anda cara merobohkan caliper digital dan penjelasan tentang cara kerja caliper digital
Pengukur Frekuensi Menggunakan Mikrokontroler: 8 Langkah
Pengukur Frekuensi Menggunakan Mikrokontroler: Tutorial ini hanya menyatakan cara menghitung frekuensi sumber pulsa menggunakan mikrokontroler. Tingkat tegangan tinggi sumber pulsa adalah 3,3 V dan rendah adalah 0V. Saya telah menggunakan STM32L476, Tiva launchpad, LCD alfanumerik 16x2 beberapa kabel papan tempat memotong roti dan 1K resi
Rotary Encoder: Cara Kerja dan Cara Menggunakan Dengan Arduino: 7 Langkah
Rotary Encoder: Cara Kerja dan Cara Menggunakan Dengan Arduino: Anda dapat membaca ini dan tutorial menakjubkan lainnya di situs web resmi ElectroPeakOverviewDalam tutorial ini, Anda akan mengetahui cara menggunakan rotary encoder. Pertama, Anda akan melihat beberapa informasi tentang encoder rotasi, dan kemudian Anda akan belajar bagaimana
Siklus LED RGB Melalui Spektrum Warna Menggunakan Raspberry Pi 2 dan Scratch: 11 Langkah
Siklus LED RGB Melalui Spektrum Warna Menggunakan Raspberry Pi 2 dan Scratch: Catatan Pembaruan Kamis 25 Februari 2016: Saya telah meningkatkan program Scratch dan mendesain ulang instruksi saya. Hai teman-teman, dengan proyek ini saya ingin menggunakan Scratch untuk menggilir LED RGB melalui spektrum warna. Ada banyak proyek yang melakukan ini dengan
Konfigurasi Bit Fuse Mikrokontroler AVR. Membuat dan Mengunggah di Memori Flash Mikrokontroler Program Berkedip LED.: 5 Langkah
Konfigurasi Bit Fuse Mikrokontroler AVR. Membuat dan Mengupload di Flash Memory Mikrokontroler Program LED Blinking.: Dalam hal ini kita akan membuat program sederhana dalam kode C dan membakarnya ke dalam memori mikrokontroler. Kami akan menulis program kami sendiri dan mengkompilasi file hex, menggunakan Atmel Studio sebagai platform pengembangan terintegrasi. Kami akan mengkonfigurasi fuse bi