Isi kandungan:
- Langkah 1: Pengiraan Kekerapan Sekolah Lama
- Langkah 2: Cara Balik Balik
- Langkah 3: Perkakasan dan Skematiknya
- Langkah 4: Kodnya
- Langkah 5: Ketepatan dan Ketepatan
Video: Kaunter Frekuensi Resolusi Tinggi: 5 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:07
Petunjuk ini menunjukkan pembilang frekuensi timbal balik yang mampu mengukur frekuensi dengan pantas dan tepat. Ia dibuat dengan komponen standard dan boleh dibuat pada hujung minggu (saya memerlukan sedikit masa lagi:-))
EDIT: Kodnya kini tersedia di GitLab:
gitlab.com/WilkoL/high-resolution-frequency-counter
Langkah 1: Pengiraan Kekerapan Sekolah Lama
Cara sekolah lama untuk mengukur frekuensi isyarat adalah dengan menggunakan log-AND-gerbang, memberi makan isyarat yang akan diukur menjadi satu port dan isyarat dengan waktu tinggi tepat 1 saat ke port lain dan hitung outputnya. Ini berfungsi dengan baik untuk isyarat beberapa kHz ke dalam GHz. Tetapi bagaimana jika anda ingin mengukur isyarat frekuensi rendah dengan resolusi yang baik? Katakan anda mahu mengukur frekuensi sesalur (di sini 50 Hz). Dengan kaedah sekolah lama, anda akan melihat pemalar 50 pada paparan anda jika anda bernasib baik, tetapi kemungkinan besar anda akan melihat suis paparan dari 49 hingga 50 atau 50 hingga 51. Resolusi adalah 1 Hz, dan itu sahaja. Anda tidak akan dapat melihat 50.002 Hz melainkan anda bersedia meningkatkan masa pintu masuk menjadi 1000 saat. Lebih dari 16 minit, untuk satu pengukuran!
Kaedah yang lebih baik untuk mengukur isyarat frekuensi rendah adalah dengan mengukur tempohnya. Mengambil utama sebagai contoh sekali lagi, mempunyai jangka masa 20 milisaat. Ambil logik AND-gate yang sama, beri makan dengan, katakanlah 10 MHz (pulsa 0.1 us) dan isyarat anda di port yang lain dan keluarlah 200000 denyutan, jadi jangka masa adalah 20000.0 uS dan yang diterjemahkan kembali menjadi 50Hz. Apabila anda mengukur hanya denyutan 199650, frekuensi 50.087 Hz, itu jauh lebih baik, dan hanya dalam masa pengukuran satu saat. Malangnya ini tidak berfungsi dengan baik dengan frekuensi yang lebih tinggi. Contohnya, kita sekarang mahu mengukur 40 kHz. Dengan frekuensi input 10 MHz yang sama dengan rujukan kita sekarang mengukur hanya 250 denyutan. Apabila kita mengira hanya 249 denyutan, pengiraan memberikan 40161 Hz dan dengan 251 hasilnya adalah 39840 Hz. Itu bukan resolusi yang boleh diterima. Sudah tentu meningkatkan frekuensi rujukan meningkatkan hasilnya tetapi ada batasan untuk apa yang boleh anda gunakan dalam pengawal mikro.
Langkah 2: Cara Balik Balik
Penyelesaian yang berfungsi untuk frekuensi rendah dan tinggi adalah pembilang frekuensi timbal balik. Saya akan cuba menerangkan prinsipnya. Anda memulakan dengan masa pengukuran kira-kira 1 saat, ia tidak semestinya tepat tetapi ini adalah masa yang tepat untuk pengukuran. Masukkan isyarat 1 Hz ini ke D-flipflop pada input D. Tidak ada yang berlaku pada output. Sambungkan isyarat yang ingin anda ukur ke input CLOCK D-flipflop.
Sebaik sahaja isyarat ini beralih dari RENDAH ke TINGGI, output D-flipflop memindahkan keadaan input D ke output (Q). Sinyal RISING going ini digunakan untuk mulai menghitung isyarat input dan juga isyarat jam rujukan.
Oleh itu, anda mengira DUA isyarat pada masa yang sama, isyarat yang ingin anda ukur dan jam rujukan. Jam rujukan ini mesti mempunyai nilai yang tepat dan stabil, pengayun kristal biasa tidak mengapa. Nilainya tidak begitu penting selagi frekuensi tinggi dan nilainya diketahui dengan baik.
Setelah beberapa lama, katakan beberapa milisaat, anda menjadikan input D-flipflop D rendah kembali. Pada input CLOCK seterusnya, output Q mengikuti keadaan input, tetapi tidak ada yang lain berlaku kerana pengawal mikro diatur untuk bertindak balas terhadap isyarat RISING sahaja. Kemudian, setelah masa pengukuran selesai (kira-kira 1 saat) anda membuat input D TINGGI.
Sekali lagi pada CLOCK-input seterusnya output Q berikut dan isyarat RISING ini mencetuskan pengawal mikro, kali ini untuk mengakhiri pengiraan kedua-dua pembilang.
Hasilnya adalah dua nombor. Nombor pertama adalah bilangan denyutan yang dikira dari rujukan. Seperti yang kita tahu frekuensi rujukan, kita juga tahu masa yang diperlukan untuk menghitung denyutan tersebut.
Nombor kedua ialah bilangan denyutan dari isyarat input yang kita ukur. Semasa kami bermula tepat di tepi RISING isyarat ini, kami sangat yakin dengan bilangan denyutan isyarat input ini.
Sekarang ini hanyalah pengiraan untuk menentukan frekuensi isyarat input.
Contohnya, katakan kita mempunyai isyarat ini dan kita mahu mengukur input f. Rujukannya adalah 10 MHz, dihasilkan oleh pengayun kristal kuarza. f_input = 31.416 Hz f_referensi = 10000000 Hz (10 MHz), masa pengukuran adalah lebih kurang. 1 saat
Pada masa ini kami mengira 32 denyutan. Sekarang, satu tempoh isyarat ini memerlukan 1 / 31.416 = 31830.9 uS. Oleh itu, 32 tempoh memerlukan 1.0185892 saat, iaitu lebih dari 1 saat.
Dalam 1.0186 saat ini, kita juga akan mengira 10185892 denyutan isyarat rujukan.
Ini memberi kita maklumat berikut: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz
Rumus untuk mengira frekuensi yang dihasilkan adalah ini: freq = (input_count * f_reference) / ref_count
Dalam contoh kami iaitu: f-input = (32 * 10000000) / 10185892 = 31.416 Hz
Dan ini berfungsi dengan baik untuk frekuensi rendah dan juga frekuensi tinggi, hanya apabila isyarat input mendekati (atau bahkan lebih tinggi daripada) ke frekuensi rujukan, lebih baik menggunakan cara pengukuran "berpagar" standard. Tetapi kita juga boleh menambahkan pembahagi frekuensi ke isyarat input kerana kaedah timbal balik ini mempunyai resolusi yang sama untuk frekuensi apa pun (hingga rujukannya lagi). Oleh itu, sama ada anda mengukur 100 kHz secara langsung dibahagi dengan pembahagi 1000x luaran, resolusinya sama.
Langkah 3: Perkakasan dan Skematiknya
Saya telah membuat beberapa pembilang frekuensi jenis ini. Sudah lama saya membuat satu dengan ATMEGA328 (pengawal yang sama seperti yang ada di Arduino), kemudian dengan pengawal mikro ARM dari ST. Yang terbaru dibuat dengan STM32F407 yang dicatat pada 168 MHz. Tetapi sekarang saya tertanya-tanya bagaimana jika saya melakukan perkara yang sama dengan yang * jauh * lebih kecil. Saya memilih ATTINY2313, yang hanya mempunyai 2kbyte memori FLASH dan 128 byte RAM. Paparan yang saya miliki adalah MAX7219 dengan 8 paparan tujuh segmen di atasnya, paparan ini tersedia di Ebay dengan harga hanya 2 Euro. Sebuah ATTINY2313 boleh dibeli dengan harga sekitar 1.5 Euro, selebihnya bahagian yang saya gunakan berharga hanya sen sekeping. Paling mahal mungkin kotak projek plastik. Kemudian saya memutuskan untuk menggunakannya pada bateri lithium-ion jadi saya perlu menambah (LDO) 3.3V penstabil voltan modul pengecasan bateri dan bateri itu sendiri. Ini sedikit menaikkan harganya, tetapi saya rasa ia boleh dibina dengan harga kurang dari 20 Euro.
Langkah 4: Kodnya
Kod tersebut ditulis dalam C dengan Atmel (Microchip) Studio 7 dan diprogramkan ke dalam ATTINY2313 menggunakan OLIMEX AVR_ISP (klon?). Buka (main.c) dalam fail zip di bawah ini jika anda ingin mengikuti keterangan di sini.
INISIISASI
Mula-mula ATTINY2313 ditetapkan untuk menggunakan kristal luaran kerana RC-oscillator dalaman tidak berguna untuk mengukur apa-apa. Saya menggunakan kristal 10 MHz yang saya tetapkan dengan frekuensi 10 000 000 Hz yang betul dengan kapasitor pemboleh ubah kecil. Inisialisasi mengurus pengaturan port ke input dan output, mengatur pemasa dan memungkinkan gangguan dan inisialisasi MAX7219. TIMER0 disiapkan untuk mengira jam luaran, TIMER1 jam dalaman dan juga untuk menangkap nilai kaunter di tepi ICP yang naik, berasal dari D-flipflop.
Saya akan membincangkan program utama yang terakhir, jadi seterusnya adalah rutin gangguan.
TIMER0_OVF
Oleh kerana TIMER0 mengira hingga 255 (8 bit) dan kemudian beralih ke 0, kita memerlukan gangguan untuk mengira jumlah limpahan. Itu sahaja yang dilakukan TIMER0_OVF, hitung jumlah limpahan. Kemudian nombor ini digabungkan dengan nilai kaunter itu sendiri.
TIMER1_OVF
TIMER1 boleh mengira hingga 65536 (16 bit), jadi gangguan TIMER1_OVF juga mengira jumlah limpahan. Tetapi ia lebih banyak. Ia juga menurun dari 152 hingga 0 yang mengambil masa sekitar 1 saat dan kemudian menetapkan pin output, menuju ke input D dari flipflop. Dan perkara terakhir yang dilakukan dalam rutin interupsi ini adalah mengurangkan penghitung waktu tamat, dari 765 hingga 0, yang memakan masa sekitar 5 saat.
TIMER1_CAPT
Ini adalah gangguan TIMER1_CAPT yang dicetuskan setiap kali D-flipflop mengirimkannya isyarat, di tepi isyarat input yang meningkat (seperti yang dijelaskan di atas). Logik tangkapan mengurus menyimpan nilai pembilang TIMER1 pada saat tangkapan, ia disimpan dan juga pembilang limpahan. Malangnya TIMER0 tidak mempunyai fungsi tangkapan input jadi di sini nilai semasa dan nilai arus pembilang limpahan dibaca. Pembolehubah mesej ditetapkan ke satu untuk program utamanya untuk memberitahu bahawa ini adalah data baru.
Seterusnya adalah dua fungsi untuk mengawal MAX7219
SPI
Walaupun terdapat Interface Serial Universal (USI) yang terdapat di dalam cip, saya memilih untuk tidak menggunakannya. Paparan MAX7219 perlu dikendalikan melalui SPI dan itu mungkin dilakukan dengan USI. Tetapi bitbanging SPI sangat mudah sehingga saya tidak meluangkan masa untuk melakukannya dengan USI.
MAX7219
Protokol untuk menyiapkan MAX7219 juga cukup mudah setelah anda membaca manualnya. Ia memerlukan nilai 16 bit untuk setiap digit yang terdiri daripada 8 bit untuk nombor digit (1 hingga 8) diikuti oleh 8 bit untuk nombor yang perlu ditunjukkan.
PROGI UTAMA
Perkara terakhir adalah menerangkan program utama. Ia berjalan dalam gelung tak terhingga (sementara (1)) tetapi hanya benar-benar melakukan sesuatu apabila ada mesej (1) dari rutin interupsi atau ketika penghitung waktu tamat habis hingga nol (tidak ada isyarat input).
Perkara pertama yang perlu dilakukan apabila mesej pemboleh ubah ditetapkan ke satu, adalah menetapkan semula kaunter tamat masa, setelah kita tahu bahawa terdapat isyarat. D-flipflop diset semula untuk menyiapkannya untuk pencetus seterusnya yang akan datang setelah masa pengukuran (tunggu sebentar).
Nombor yang didaftarkan dalam gangguan tangkapan ditambahkan untuk memberikan kiraan rujukan dan kiraan frekuensi input. (kita harus memastikan bahawa rujukan tidak boleh menjadi sifar kerana kita akan membahagikannya nanti)
Seterusnya adalah pengiraan frekuensi sebenar. Saya pasti tidak mahu menggunakan nombor terapung pada mikrokontroler dengan hanya 2kbytes denyar dan hanya 128 bait ram yang saya gunakan bilangan bulat. Tetapi frekuensi boleh seperti 314.159 Hz, dengan beberapa perpuluhan. Oleh itu, saya mengalikan frekuensi input bukan sahaja dengan frekuensi rujukan tetapi juga dengan pengganda, dan kemudian menambahkan nombor ke titik perpuluhan yang seharusnya. Nombor ini akan menjadi sangat besar apabila anda melakukannya. Cth. dengan input 500 kHz, rujukan 10 MHz dan pengganda 100, ini memberikan 5 x 10 ^ 14, itu sangat besar! Mereka tidak akan sesuai dengan nombor 32 bit jadi saya menggunakan nombor 64 bit yang akan meningkat sehingga 1.8 x 10 ^ 19 (yang berfungsi dengan baik pada ATTINY2313)
Dan perkara terakhir yang perlu dilakukan adalah menghantar hasilnya ke paparan MAX7219.
Kodnya disusun menjadi sekitar 1600 byte, sehingga sesuai dengan flash 2048 byte yang tersedia di ATTINY2313.
Daftar fius mesti dibaca seperti ini:
DILANJUTKAN 0xFF
0xDF TINGGI
0xBF RENDAH
Langkah 5: Ketepatan dan Ketepatan
Ketepatan dan ketepatan adalah dua binatang berasingan. Ketepatan di sini adalah tujuh digit, ketepatan sebenarnya bergantung pada perkakasan dan penentukuran. Saya menentukur 10 MHz (5 MHz pada titik ujian) dengan pembilang frekuensi lain yang mempunyai pengayun berdisiplin GPS.
Dan ia berfungsi dengan baik, frekuensi terendah yang saya cuba ialah 0.2 Hz, 2 MHz tertinggi. Ia tepat. Di atas 2 MHz, pengawal mula kehilangan gangguan, tidak terlalu mengejutkan apabila anda mengetahui bahawa pada isyarat input 2 MHz TIMER0 menghasilkan lebih dari 7800 gangguan sesaat. Dan ATTINY2313 juga harus melakukan perkara lain, gangguan dari TIMER1, pada 150 gangguan lagi sesaat dan tentu saja melakukan pengiraan, mengawal paparan dan D-flipflop. Apabila anda melihat peranti sebenar, anda akan melihat bahawa saya menggunakan hanya tujuh daripada lapan digit paparan. Saya melakukan ini kerana beberapa sebab.
Pertama adalah bahawa pengiraan frekuensi input adalah pembahagian, hampir selalunya akan ada selebihnya, yang tidak anda lihat kerana itu adalah pembahagian integer. Kedua ialah pengayun kristal kuarza tidak stabil suhu.
Kapasitor yang menyesuaikannya dengan 10 MHz yang betul adalah seramik, sangat sensitif terhadap perubahan suhu. Maka ada kenyataan bahawa TIMER0 tidak mempunyai logik tangkapan, dan fungsi-fungsi gangguan memerlukan sedikit masa untuk melakukan kerja mereka. Saya rasa tujuh digit cukup baik.
Disyorkan:
Kaunter Frekuensi Dengan Arduino: 8 Langkah (dengan Gambar)
Kaunter Kekerapan Dengan Arduino: Ini adalah Kaunter frekuensi berdasarkan arduino yang sederhana dan murah berharga kurang dari 4 $ sangat berguna untuk mengukur litar kecil
Webcam Resolusi Tinggi: 9 Langkah (dengan Gambar)
Webcam Resolusi Tinggi: Selama beberapa tahun saya menggunakan kamera web berasaskan RPi (dengan modul PiCam). Imej yang dihasilkan baik-baik saja tetapi kemudian, ada saat di mana saya tidak lagi berpuas hati dengan kualiti. Saya memutuskan untuk membuat Webcam dengan resolusi tinggi. Bahagian berikut dengan
OpenLogger: Resolusi Tinggi, Diaktifkan Wi-Fi, Sumber Terbuka, Logger Data Mudah Alih: 7 Langkah
OpenLogger: Resolusi Tinggi, Diaktifkan Wi-Fi, Sumber Terbuka, Logger Data Mudah Alih: OpenLogger adalah logger data mudah alih, sumber terbuka, kos rendah, dan beresolusi tinggi yang direka untuk memberikan pengukuran berkualiti tinggi tanpa memerlukan perisian mahal atau perisian penulisan dari awal. Sekiranya anda seorang jurutera, saintis, atau peminat yang
Penjanaan Isyarat PWM Resolusi Tinggi untuk Servos RC Dengan Peranti STM32: 3 Langkah
Penjanaan Isyarat PWM Resolusi Tinggi untuk Servos RC Dengan Peranti STM32: Pada masa ini, saya sedang membina pemancar / penerima RC berdasarkan cip SX1280 RF. Salah satu tujuan untuk projek ini ialah saya mahukan resolusi servo 12 bit dari stik hingga ke servo. Sebahagiannya kerana servo digital moden mempunyai reso 12 bit
Cara Mendapatkan Imej Resolusi Tinggi daripada Instruktif: 4 Langkah
Bagaimana Mendapatkan Gambar Resolusi Tinggi daripada Instructables: Adakah anda benar-benar menikmati gambar yang boleh dipelajari dan ingin menyimpan salinan resolusi tinggi? Ciri kecil yang hebat ini mudah dilupakan