Daftar Isi:

Cara Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler: 4 Langkah
Cara Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler: 4 Langkah

Video: Cara Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler: 4 Langkah

Video: Cara Mengukur Frekuensi Tinggi dan Siklus Kerja, Secara Bersamaan, Menggunakan Mikrokontroler: 4 Langkah
Video: Pulse Counter - Menghitung Pulsa dengan Interupsi | ESP8266 | NodeMcu dan Flowmeter AICHI OF05ZAT 2024, November
Anonim
Cara Mengukur High Frequency dan Duty Cycle Secara Bersamaan Menggunakan Mikrokontroler
Cara Mengukur High Frequency dan Duty Cycle Secara Bersamaan Menggunakan Mikrokontroler
Cara Mengukur High Frequency dan Duty Cycle Secara Bersamaan Menggunakan Mikrokontroler
Cara Mengukur High Frequency dan Duty Cycle Secara Bersamaan Menggunakan Mikrokontroler
Cara Mengukur High Frequency dan Duty Cycle Secara Bersamaan Menggunakan Mikrokontroler
Cara Mengukur High Frequency dan Duty Cycle Secara Bersamaan Menggunakan Mikrokontroler

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

Divisi Frekuensi Digital
Divisi Frekuensi Digital
Divisi Frekuensi Digital
Divisi Frekuensi Digital
Divisi Frekuensi Digital
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

Perangkat Keras yang Direkomendasikan
Perangkat Keras yang Direkomendasikan
Perangkat Keras yang Direkomendasikan
Perangkat Keras yang Direkomendasikan
Perangkat Keras yang Direkomendasikan
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

Sirkuit
Sirkuit
Sirkuit
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: