Daftar Isi:

Penghitung Frekuensi Resolusi Tinggi: 5 Langkah (dengan Gambar)
Penghitung Frekuensi Resolusi Tinggi: 5 Langkah (dengan Gambar)

Video: Penghitung Frekuensi Resolusi Tinggi: 5 Langkah (dengan Gambar)

Video: Penghitung Frekuensi Resolusi Tinggi: 5 Langkah (dengan Gambar)
Video: STATISTIK. Cara membuat tabel distribusi frekuensi (tabel data kelompok) 2024, November
Anonim

Instruksi ini menunjukkan penghitung frekuensi timbal balik yang mampu mengukur frekuensi dengan cepat dan dengan presisi yang wajar. Itu dibuat dengan komponen standar dan dapat dibuat di akhir pekan (saya butuh sedikit lebih lama:-))

EDIT: Kode sekarang tersedia di GitLab:

gitlab.com/WilkoL/high-resolution-frequency-counter

Langkah 1: Penghitungan Frekuensi Sekolah Lama

Penghitungan Frekuensi Sekolah Lama
Penghitungan Frekuensi Sekolah Lama
Penghitungan Frekuensi Sekolah Lama
Penghitungan Frekuensi Sekolah Lama

Cara lama untuk mengukur frekuensi sinyal adalah dengan menggunakan logika AND-gerbang, mengumpankan sinyal yang akan diukur ke satu port dan sinyal dengan waktu tinggi tepat 1 detik ke port lain dan menghitung output. Ini bekerja cukup baik untuk sinyal beberapa kHz hingga GHz. Tetapi bagaimana jika Anda ingin mengukur sinyal frekuensi rendah dengan resolusi yang baik? Katakanlah Anda ingin mengukur frekuensi listrik (di sini 50 Hz). Dengan metode jadul Anda akan melihat 50 konstan pada layar Anda jika Anda beruntung, tetapi kemungkinan besar Anda akan melihat layar beralih dari 49 ke 50 atau 50 ke 51. Resolusinya adalah 1 Hz, dan hanya itu. Anda tidak akan pernah melihat 50,002 Hz kecuali jika Anda bersedia meningkatkan waktu gerbang menjadi 1000 detik. Itu lebih dari 16 menit, untuk satu pengukuran!

Cara yang lebih baik untuk mengukur sinyal frekuensi rendah adalah dengan mengukur periodenya. Mengambil listrik sebagai contoh lagi, memiliki periode 20 milidetik. Ambil logika AND-gerbang yang sama, beri makan dengan, katakanlah 10 MHz (pulsa 0,1 us) dan sinyal Anda di port lain dan keluarlah 200000 pulsa, jadi periode waktu adalah 20000,0 uS dan itu diterjemahkan kembali menjadi 50Hz. Ketika Anda mengukur hanya 199650 pulsa frekuensinya adalah 50,087 Hz, itu jauh lebih baik, dan hanya dalam satu detik waktu pengukuran. Sayangnya ini tidak bekerja dengan baik dengan frekuensi yang lebih tinggi. Ambil contoh, kita sekarang ingin mengukur 40 kHz. Dengan frekuensi input 10 MHz yang sama dengan referensi, kami sekarang hanya mengukur 250 pulsa. Ketika kita menghitung hanya 249 pulsa, perhitungannya memberikan 40161 Hz dan dengan 251 hasilnya adalah 39840 Hz. Itu bukan resolusi yang bisa diterima. Tentu saja meningkatkan frekuensi referensi meningkatkan hasil tetapi ada batasan untuk apa yang dapat Anda gunakan dalam pengontrol mikro.

Langkah 2: Cara Timbal Balik

Cara Timbal Balik
Cara Timbal Balik
Cara Timbal Balik
Cara Timbal Balik

Solusi yang bekerja untuk frekuensi rendah dan tinggi adalah penghitung frekuensi timbal balik. Saya akan mencoba menjelaskan prinsipnya. Anda memulai dengan waktu pengukuran yang kira-kira 1 detik, tidak harus sangat tepat tetapi ini adalah waktu yang wajar untuk pengukuran. Umpankan sinyal 1 Hz ini ke D-flipflop pada input-D. Belum ada yang terjadi pada output. Hubungkan sinyal yang ingin Anda ukur ke input CLOCK dari D-flipflop.

Segera setelah sinyal ini berubah dari LOW ke HIGH, output dari D-flipflop mentransfer status input-D ke output (Q). Sinyal RISING ini akan digunakan untuk mulai menghitung sinyal input serta sinyal clock referensi.

Jadi Anda menghitung DUA sinyal pada waktu yang sama persis, sinyal yang ingin Anda ukur dan jam referensi. Jam referensi ini harus memiliki nilai yang tepat dan stabil, osilator kristal normal baik-baik saja. Nilainya tidak terlalu penting selama frekuensinya tinggi dan nilainya diketahui dengan baik.

Setelah beberapa waktu, katakanlah beberapa milidetik, Anda membuat D-input dari D-flipflop rendah lagi. Pada input JAM berikutnya, output Q mengikuti keadaan input, tetapi tidak ada hal lain yang terjadi karena pengontrol mikro diatur untuk bereaksi hanya pada sinyal NAIK. Kemudian, setelah waktu pengukuran selesai (sekitar 1 detik) Anda membuat input-D TINGGI.

Sekali lagi pada input JAM berikutnya, output Q mengikuti dan sinyal RISING ini memicu pengontrol mikro, kali ini untuk mengakhiri penghitungan kedua pencacah.

Hasilnya adalah dua angka. Angka pertama adalah jumlah pulsa yang dihitung dari referensi. Seperti yang kita ketahui frekuensi referensi, kita juga tahu waktu yang dibutuhkan untuk menghitung pulsa tersebut.

Angka kedua adalah jumlah pulsa dari sinyal input yang kita ukur. Saat kami mulai tepat di tepi NAIK dari sinyal ini, kami sangat yakin tentang jumlah pulsa dari sinyal input ini.

Sekarang tinggal perhitungan untuk menentukan frekuensi sinyal input.

Sebagai contoh, katakanlah kita memiliki sinyal-sinyal ini dan kita ingin mengukur input-f. Referensinya adalah 10 MHz, yang dihasilkan oleh osilator kristal kuarsa. f_input = 31,416 Hz f_reference = 10000000 Hz (10 MHz), waktu pengukuran kira-kira. 1 detik

Kali ini kami menghitung 32 pulsa. Sekarang, satu periode sinyal ini membutuhkan 1/31.416 = 31830.9 uS. Jadi 32 periode membawa kami 1,0185892 detik, yang hanya lebih dari 1 detik.

Dalam 1,0186 detik ini kita juga akan menghitung 10185892 pulsa dari sinyal referensi.

Ini memberi kita informasi berikut: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Rumus untuk menghitung frekuensi yang dihasilkan adalah sebagai berikut: freq = (input_count * f_reference) / ref_count

Dalam contoh kita yaitu: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

Dan ini bekerja dengan baik untuk frekuensi rendah maupun frekuensi tinggi, hanya ketika sinyal input mendekati (atau bahkan lebih tinggi dari) ke frekuensi referensi, lebih baik menggunakan cara pengukuran standar "berpintu". Tapi kemudian kita juga bisa menambahkan pembagi frekuensi ke sinyal input karena metode timbal balik ini memiliki resolusi yang sama untuk frekuensi apa pun (sampai referensi lagi). Jadi apakah Anda mengukur 100 kHz langsung dibagi dengan pembagi 1000x eksternal, resolusinya sama.

Langkah 3: Perangkat Keras dan Skemanya

Perangkat Keras dan Skemanya
Perangkat Keras dan Skemanya
Perangkat Keras dan Skemanya
Perangkat Keras dan Skemanya

Saya telah membuat beberapa penghitung frekuensi jenis ini. Dulu saya membuatnya dengan ATMEGA328 (kontroler yang sama seperti yang ada di Arduino), kemudian dengan pengontrol mikro ARM dari ST. Yang terbaru dibuat dengan STM32F407 clock pada 168 MHz. Tapi sekarang saya bertanya-tanya bagaimana jika saya melakukan hal yang sama dengan yang *jauh* lebih kecil. Saya memilih ATTINY2313, yang hanya memiliki 2kbyte memori FLASH dan 128 byte RAM. Layar yang saya miliki adalah MAX7219 dengan 8 layar tujuh segmen di atasnya, layar ini tersedia di Ebay hanya dengan 2 Euro. ATTINY2313 dapat dibeli dengan harga sekitar 1,5 Euro, sisa suku cadang yang saya gunakan harganya hanya sen per potong. Yang paling mahal mungkin adalah kotak proyek plastik. Kemudian saya memutuskan untuk menjalankannya dengan baterai lithium-ion jadi saya perlu menambahkan penstabil tegangan (LDO) 3.3V, modul pengisian baterai dan baterai itu sendiri. Ini agak menaikkan harga, tapi saya kira itu bisa dibangun dengan harga kurang dari 20 Euro.

Langkah 4: Kode

Kode
Kode
Kode
Kode

Kode ditulis dalam C dengan Atmel (Microchip) Studio 7 dan diprogram ke dalam ATTINY2313 menggunakan OLIMEX AVR_ISP (klon?). Buka (main.c) di file zip di bawah ini jika Anda ingin mengikuti deskripsi di sini.

INISIALISASI

Pertama, ATTINY2313 diatur untuk menggunakan kristal eksternal karena osilator RC internal tidak berguna untuk mengukur apa pun. Saya menggunakan kristal 10 MHz yang saya setel ke frekuensi 10 000 000 Hz yang benar dengan kapasitor variabel kecil. Inisialisasi menangani pengaturan port ke input dan output, mengatur timer dan mengaktifkan interupsi dan inisialisasi MAX7219. TIMER0 diatur untuk menghitung jam eksternal, TIMER1 jam internal dan juga untuk menangkap nilai penghitung di tepi naik ICP, yang berasal dari D-flipflop.

Saya akan membahas program utama terakhir, jadi selanjutnya adalah rutinitas interupsi.

TIMER0_OVF

Karena TIMER0 menghitung hingga 255 (8 bit) dan kemudian bergulir ke 0, kita memerlukan interupsi untuk menghitung jumlah overflow. Hanya itu yang dilakukan oleh TIMER0_OVF, hitung saja jumlah overflow. Nanti angka ini digabungkan dengan nilai penghitung itu sendiri.

TIMER1_OVF

TIMER1 dapat menghitung hingga 65536 (16 bit), sehingga TIMER1_OVF interupsi juga menghitung jumlah overflow. Tapi itu lebih. Ini juga mengurangi dari 152 menjadi 0 yang membutuhkan waktu sekitar 1 detik dan kemudian menetapkan pin output, menuju ke input-D dari flipflop. Dan hal terakhir yang dilakukan dalam rutin interupsi ini adalah mengurangi penghitung waktu habis, dari 765 menjadi 0, yang membutuhkan waktu sekitar 5 detik.

TIMER1_CAPT

Ini adalah interupsi TIMER1_CAPT yang dipicu setiap kali D-flipflop mengirimkan sinyal, di tepi naik dari sinyal input (seperti dijelaskan di atas). Logika penangkapan menangani penyimpanan nilai penghitung TIMER1 pada saat penangkapan, itu disimpan serta penghitung luapan. Sayangnya TIMER0 tidak memiliki fungsi pengambilan input jadi di sini nilai saat ini dan nilai saat ini dari penghitung luapan dibaca. Variabel pesan diset ke satu untuk program utama untuk memberitahunya bahwa ini adalah data baru.

Berikutnya adalah dua fungsi untuk mengontrol MAX7219

SPI

Meskipun ada Universal Serial Interface (USI) yang tersedia dalam chip, saya memilih untuk tidak menggunakannya. Tampilan MAX7219 perlu dikontrol melalui SPI dan itu dimungkinkan dengan USI. Tapi bitbanging SPI sangat sederhana sehingga saya tidak meluangkan waktu untuk melakukannya dengan USI.

MAX7219

Protokol untuk mengatur MAX7219 juga cukup sederhana setelah Anda membaca manualnya. Dibutuhkan nilai 16 bit untuk setiap digit yang terdiri dari 8 bit untuk angka digit (1 hingga 8) diikuti oleh 8 bit untuk angka yang perlu ditampilkan.

PROG UTAMA

Hal terakhir adalah menjelaskan program utama. Ini berjalan dalam loop tak terbatas (sementara (1)) tetapi hanya benar-benar melakukan sesuatu ketika ada pesan (1) dari rutin interupsi atau ketika penghitung batas waktu telah turun ke nol (tidak ada sinyal input).

Hal pertama yang harus dilakukan ketika pesan variabel disetel ke satu, adalah mengatur ulang penghitung waktu habis, setelah semua kita tahu bahwa ada sinyal yang ada. D-flipflop diatur ulang untuk membuatnya siap untuk pemicu berikutnya yang akan datang setelah waktu pengukuran (tunggu-a-detik).

Angka-angka yang terdaftar dalam interupsi penangkapan ditambahkan untuk memberikan jumlah referensi dan jumlah frekuensi input. (kita harus memastikan bahwa referensi tidak pernah bisa menjadi nol karena kita akan membaginya nanti)

Selanjutnya adalah perhitungan frekuensi sebenarnya. Saya pasti tidak ingin menggunakan angka mengambang pada mikrokontroler hanya dengan 2kbytes flash dan hanya 128 byte ram saya menggunakan bilangan bulat. Tapi frekuensi bisa seperti 314.159 Hz, dengan beberapa desimal. Oleh karena itu saya mengalikan frekuensi input tidak hanya dengan frekuensi referensi tetapi juga dengan pengali, dan kemudian menambahkan angka ke tempat titik desimal seharusnya. Angka-angka ini akan menjadi sangat sangat besar ketika Anda melakukan itu. Misalnya. dengan input 500 kHz, referensi 10 MHz dan pengali 100, ini memberikan 5 x 10^14, itu sangat besar! Mereka tidak akan muat lagi dalam angka 32 bit jadi saya menggunakan angka 64 bit yang akan mencapai hingga 1,8 x 10^19 (yang berfungsi dengan baik pada ATTINY2313)

Dan hal terakhir yang harus dilakukan adalah mengirimkan hasilnya ke tampilan MAX7219.

Kode dikompilasi menjadi sekitar 1600 byte, sehingga cocok dengan 2048 byte flash yang tersedia di ATTINY2313.

Register sekering harus membaca seperti ini:

DIPERPANJANG 0xFF

TINGGI 0xDF

RENDAH 0xBF

Langkah 5: Akurasi dan Presisi

Akurasi dan Presisi
Akurasi dan Presisi
Akurasi dan Presisi
Akurasi dan Presisi
Akurasi dan Presisi
Akurasi dan Presisi

Akurasi dan presisi adalah dua binatang yang terpisah. Presisi di sini adalah tujuh digit, apa presisi sebenarnya tergantung pada perangkat keras dan kalibrasi. Saya mengkalibrasi 10 MHz (5 MHz pada titik uji) dengan penghitung frekuensi lain yang memiliki osilator disiplin GPS.

Dan bekerja cukup baik, frekuensi terendah yang saya coba adalah 0,2 Hz, tertinggi 2 MHz. Hal ini tepat. Di atas 2 MHz pengontrol mulai kehilangan interupsi, tidak terlalu mengejutkan ketika Anda tahu bahwa pada sinyal input 2 MHz TIMER0 menghasilkan lebih dari 7800 interupsi per detik. Dan ATTINY2313 harus melakukan hal-hal lain juga, interupsi dari TIMER1, di 150 interupsi lain per detik dan tentu saja melakukan perhitungan, mengendalikan tampilan dan D-flipflop. Ketika Anda melihat perangkat yang sebenarnya, Anda akan melihat bahwa saya hanya menggunakan tujuh dari delapan digit tampilan. Saya melakukan ini karena beberapa alasan.

Pertama adalah bahwa perhitungan frekuensi input adalah pembagian, hampir selalu memiliki sisa, yang tidak Anda lihat karena merupakan pembagian bilangan bulat. Kedua adalah bahwa osilator kristal kuarsa tidak stabil suhunya.

Kapasitor yang menyetelnya ke 10 MHz yang benar adalah keramik, sangat sensitif terhadap perubahan suhu. Lalu ada fakta bahwa TIMER0 tidak memiliki logika penangkapan, dan semua fungsi interupsi membutuhkan waktu untuk melakukan pekerjaannya. Saya pikir tujuh digit sudah cukup baik.

Direkomendasikan: