İçindekiler:
- Adım 1: Old School Frekans Sayımı
- Adım 2: Karşılıklı Yol
- Adım 3: Donanım ve Şeması
- Adım 4: Kod
- Adım 5: Doğruluk ve Kesinlik
Video: Yüksek Çözünürlüklü Frekans Sayacı: 5 Adım (Resimli)
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:16
Bu talimat, frekansları hızlı ve makul bir hassasiyetle ölçebilen karşılıklı bir frekans sayacını gösterir. Standart bileşenlerle yapılmıştır ve bir hafta sonu yapılabilir (biraz daha uzun sürdü:-))
EDIT: Kod artık GitLab'da mevcut:
gitlab.com/WilkoL/high- Resolution-frequency-counter
Adım 1: Old School Frekans Sayımı
Bir sinyalin frekansını ölçmenin eski yöntemi, bir VE-kapısı mantığı kullanmak, ölçülecek sinyali bir bağlantı noktasına ve tam olarak 1 saniyelik yüksek zamanlı bir sinyali diğer bağlantı noktasına beslemek ve çıkışı saymaktır. Bu, birkaç kHz'lik sinyaller için GHz'e oldukça iyi çalışır. Peki ya düşük frekanslı bir sinyali iyi çözünürlükte ölçmek isterseniz? Şebeke frekansını ölçmek istediğinizi varsayalım (burada 50 Hz). Eski usul yöntemle, eğer şanslıysanız ekranınızda sabit bir 50 göreceksiniz, ancak daha büyük olasılıkla ekranın 49'dan 50'ye veya 50'den 51'e geçtiğini göreceksiniz. Çözünürlük 1 Hz ve bu kadar. Geçit süresini 1000 saniyeye çıkarmaya istekli olmadığınız sürece asla 50.002 Hz göremezsiniz. Bu, tek bir ölçüm için 16 dakikadan fazla!
Düşük frekanslı sinyalleri ölçmenin daha iyi bir yolu, periyodunu ölçmektir. Şebeke yine örnek olarak 20 milisaniyelik bir periyoda sahiptir. Aynı mantığı VE geçidini alın, 10 MHz (0,1 us darbe) ile besleyin ve diğer bağlantı noktasındaki sinyaliniz 200000 darbe gelir, bu nedenle periyot süresi 20000.0 uS'dir ve bu 50Hz'e geri döner. Sadece 199650 darbesini ölçtüğünüzde frekans 50.087 Hz'dir, bu çok daha iyidir ve sadece bir saniyelik ölçüm süresindedir. Ne yazık ki bu, daha yüksek frekanslarla iyi çalışmaz. Örneğin, şimdi 40 kHz ölçmek istiyoruz. Referans olarak aynı 10 MHz giriş frekansı ile artık sadece 250 darbeyi ölçüyoruz. Sadece 249 darbe saydığımızda hesaplama 40161 Hz verir ve 251 ile sonuç 39840 Hz olur. Bu kabul edilebilir bir karar değil. Elbette referans frekansını artırmak sonuçları iyileştirir ancak bir mikro denetleyicide kullanabileceklerinizin bir sınırı vardır.
Adım 2: Karşılıklı Yol
Hem düşük hem de yüksek frekanslar için çalışan bir çözüm, karşılıklı bir frekans sayacıdır. İlkesini açıklamaya çalışacağım. Yaklaşık 1 saniyelik bir ölçüm süresi ile başlıyorsunuz, çok hassas olması gerekmiyor ancak ölçüm için makul bir süre. Bu 1 Hz sinyali D-girişindeki bir D-iki duraklıya besleyin. Çıktı(lar)da henüz hiçbir şey olmuyor. Ölçmek istediğiniz sinyali D-flipflop'un CLOCK girişine bağlayın.
Bu sinyal DÜŞÜK'ten YÜKSEK'e gider gitmez, D-iki duraklının çıkışı, D-girişinin durumunu çıkışa (Q) aktarır. Bu RISING sinyali, bir referans saat sinyalinin yanı sıra giriş sinyalini saymaya başlamak için kullanılır.
Yani tam olarak aynı anda İKİ sinyali sayıyorsunuz, ölçmek istediğiniz sinyal ve bir referans saati. Bu referans saatin kesin bir değeri olmalı ve kararlı olmalı, normal bir kristal osilatör iyidir. Yüksek bir frekans olduğu ve değeri iyi bilindiği sürece değer çok önemli değildir.
Bir süre sonra, diyelim ki birkaç milisaniye, D-flipflop'un D-girişini tekrar düşük yaparsınız. Bir sonraki SAAT girişinde Q çıkışı, girişin durumunu takip eder, ancak mikro denetleyici yalnızca bir YÜKSELİŞ sinyaline tepki verecek şekilde ayarlandığından başka hiçbir şey olmaz. Ardından, ölçüm süresi sona erdikten sonra (yaklaşık 1 saniye) D-girişini YÜKSEK yaparsınız.
Yine bir sonraki SAAT girişinde Q çıkışı takip eder ve bu YÜKSELİŞ sinyali mikro denetleyiciyi tetikler, bu sefer her iki sayacın sayımını bitirmek için.
Sonuç iki sayıdır. İlk sayı, referanstan sayılan darbelerin sayısıdır. Referans frekansını bildiğimiz gibi, bu darbeleri saymak için geçen süreyi de biliyoruz.
İkinci sayı, ölçtüğümüz giriş sinyalinden gelen darbelerin sayısıdır. Tam olarak bu sinyalin YÜKSELEN kenarlarından başladığımız için, bu giriş sinyalinin darbe sayısından çok eminiz.
Şimdi sadece giriş sinyalinin frekansını belirlemek için yapılan bir hesaplamadır.
Bir örnek, diyelim ki bu sinyallere sahibiz ve f-girişini ölçmek istiyoruz. Referans, bir kuvars kristal osilatörü tarafından üretilen 10 MHz'dir. f_input = 31.416 Hz f_referans = 10000000 Hz (10 MHz), ölçüm süresi yakl. 1 saniye
Bu süre içinde 32 darbe saydık. Şimdi bu sinyalin bir periyodu 1 / 31.416 = 31830.9 uS alır. Yani 32 periyot 1.0185892 saniye sürdü, bu da 1 saniyenin biraz üzerinde.
Bu 1.0186 saniyede referans sinyalinin 10185892 darbesini de saymış olacağız.
Bu bize şu bilgileri verir: input_count = 32 Reference_count = 10185892 f_reference = 10000000 Hz
Ortaya çıkan frekansı hesaplamak için formül şudur: freq = (input_count * f_reference) / ref_count
Örneğimizde f-giriş = (32 * 10000000) / 10185892 = 31.416 Hz
Ve bu, hem düşük frekanslar hem de yüksek frekanslar için iyi çalışır, yalnızca giriş sinyali referans frekansına yaklaştığında (veya ondan daha yüksek olduğunda) standart "geçitli" ölçüm yöntemini kullanmak daha iyidir. Ancak, bu karşılıklı yöntem herhangi bir frekans için aynı çözünürlüğe sahip olduğundan (yine referansa kadar) giriş sinyaline basitçe bir frekans bölücü de ekleyebiliriz. Dolayısıyla, 100 kHz'i doğrudan bölünerek harici bir 1000x bölücüyle ölçseniz de, çözünürlük aynıdır.
Adım 3: Donanım ve Şeması
Bu tür frekans sayaçlarından birkaç tane yaptım. Uzun zaman önce bir ATMEGA328 (Arduino'dakiyle aynı denetleyici), daha sonra ST'den ARM mikro denetleyicileri ile bir tane yaptım. En sonuncusu, 168 MHz'de saat hızına sahip bir STM32F407 ile yapıldı. Ama şimdi aynısını *çok* daha küçüğüyle yapsam ne olur diye merak ettim. Sadece 2kbayt FLASH belleğe ve 128 bayt RAM'e sahip bir ATTINY2313 seçtim. Sahip olduğum ekran, üzerinde 8 adet yedi segment ekran bulunan bir MAX7219, bu ekranlar Ebay'de sadece 2 Euro'ya satılıyor. Bir ATTINY2313, yaklaşık 1,5 Euro'ya satın alınabilir, kullandığım parçaların geri kalanı sadece bir sente mal oldu. En pahalısı muhtemelen plastik proje kutusuydu. Daha sonra bir lityum iyon pille çalıştırmaya karar verdim, bu yüzden bir (LDO) 3.3V voltaj sabitleyici, bir pil şarj modülü ve pilin kendisini eklemem gerekiyordu. Bu fiyatı biraz artırıyor ama sanırım 20 Euro'dan daha ucuza yapılabilir.
Adım 4: Kod
Kod, Atmel (Microchip) Studio 7 ile C dilinde yazılmış ve bir OLIMEX AVR_ISP (klon?) kullanılarak ATTINY2313'e programlanmıştır. Buradaki açıklamayı takip etmek istiyorsanız aşağıdaki zip dosyasındaki (main.c) dosyasını açın.
BAŞLATMA
İlk olarak ATTINY2313, dahili RC osilatörü herhangi bir şeyi ölçmek için işe yaramaz olduğundan harici bir kristal kullanacak şekilde ayarlandı. Küçük bir değişken kapasitör ile doğru 10 000 000 Hz frekansına ayarladığım 10 MHz'lik bir kristal kullanıyorum. Başlatma, girişlere ve çıkışlara bağlantı noktalarının ayarlanması, zamanlayıcıların ayarlanması ve kesintilerin etkinleştirilmesi ve MAX7219'un başlatılması ile ilgilenir. TIMER0, harici bir saati, TIMER1 dahili saati saymak ve ayrıca D-flipflop'tan gelen ICP'nin yükselen kenarındaki sayacın değerini yakalamak için ayarlanmıştır.
Ana programı en son tartışacağım, sıradaki kesme rutinleri.
TIMER0_OVF
TIMER0 255'e (8 bit) kadar saydığından ve ardından 0'a geçtiğinden, taşma sayısını saymak için bir kesmeye ihtiyacımız var. TIMER0_OVF'nin yaptığı bu kadar, taşma sayısını saymanız yeterli. Daha sonra bu sayı sayacın kendi değeri ile birleştirilir.
TIMER1_OVF
TIMER1 65536'ya (16 bit) kadar sayabilir, bu nedenle TIMER1_OVF kesmesi ayrıca taşma sayısını da sayar. Ama daha fazlasını yapar. Ayrıca 152'den 0'a düşer, bu yaklaşık 1 saniye sürer ve daha sonra iki duraklının D-girişine giden bir çıkış pini ayarlar. Ve bu kesme rutininde yapılan son şey, zaman aşımı sayacını 765'ten 0'a, yani yaklaşık 5 saniye sürecek şekilde azaltmaktır.
TIMER1_CAPT
Bu, D-flipflop'un giriş sinyalinin yükselen kenarında (yukarıda açıklandığı gibi) kendisine her sinyal gönderdiğinde tetiklenen TIMER1_CAPT kesmesidir. Yakalama mantığı, yakalama anında TIMER1 sayacının değerini kaydetmeye özen gösterir, taşma sayacının yanı sıra kaydedilir. Ne yazık ki TIMER0'ın bir giriş yakalama işlevi yoktur, bu nedenle burada mevcut değeri ve taşma sayacının mevcut değeri okunur. Ana programın, bunların yeni veriler olduğunu söylemesi için bir mesaj değişkeni bire ayarlanır.
Sonraki, MAX7219'u kontrol etmek için iki işlevdir
SPI
Çipte bir Evrensel Seri Arabirim (USI) varken, onu kullanmamayı seçtim. MAX7219 ekranının SPI aracılığıyla kontrol edilmesi gerekir ve bu USI ile mümkündür. Ama SPI'yi bit-banging o kadar basit ki USI ile yapmak için zaman ayırmadım.
MAX7219
MAX7219'u kurma protokolü de kılavuzunu okuduktan sonra oldukça basittir. Rakam sayısı (1 ila 8) için 8 bit ve ardından görüntülemesi gereken sayı için 8 bitten oluşan her basamak için 16 bitlik bir değere ihtiyaç duyar.
ANA PROG
Son şey ana programı açıklamaktır. Sonsuz bir döngüde (while(1)) çalışır, ancak yalnızca kesme rutininden bir mesaj (1) olduğunda veya zaman aşımı sayacı sıfıra düştüğünde (giriş sinyali yok) bir şeyler yapar.
Değişken mesajı bire ayarlandığında yapılacak ilk şey, bir sinyal olduğunu bildiğimizden sonra zaman aşımı sayacını sıfırlamaktır. D-flipflop, ölçüm süresinden sonra gelecek olan bir sonraki tetiklemeye hazır hale getirmek için sıfırlanır (bir saniye bekleyin).
Yakalama kesintisine kaydedilen sayılar, referans sayısını ve giriş frekansı sayısını vermek için eklenir. (daha sonra böleceğimiz için referansın asla sıfır olamayacağından emin olmalıyız)
Sonraki, gerçek frekansın hesaplanmasıdır. Kesinlikle sadece 2kbyte flash ve sadece 128 byte ram içeren bir mikrodenetleyicide kayan sayılar kullanmak istemiyorum, tamsayı kullanıyorum. Ancak frekanslar, birkaç ondalık basamakla 314.159 Hz gibi olabilir. Bu nedenle giriş frekansını yalnızca referans frekansıyla değil, aynı zamanda bir çarpanla da çarpıyorum ve sonra ondalık noktanın gitmesi gereken yere bir sayı ekliyorum. Bunu yaptığınızda bu sayılar çok çok büyüyecek. Örneğin. 500 kHz giriş, 10 MHz referans ve 100 çarpan ile bu 5 x 10^14 verir, bu gerçekten çok büyük! 32 bitlik bir sayıya sığmayacaklar, bu yüzden 1.8 x 10 ^ 19'a kadar gidecek 64 bit sayılar kullanıyorum (ATTINY2313'te iyi çalışıyor)
Ve yapılacak son şey, sonucu MAX7219 ekranına göndermektir.
Kod yaklaşık 1600 bayta derlenir, bu nedenle ATTINY2313'te bulunan 2048 baytlık flaşa sığar.
Sigorta kayıtları şu şekilde okumalıdır:
GENİŞLETİLMİŞ 0xFF
YÜKSEK 0xDF
DÜŞÜK 0xBF
Adım 5: Doğruluk ve Kesinlik
Doğruluk ve kesinlik iki ayrı canavardır. Buradaki kesinlik yedi basamaktır, gerçek kesinliğin ne olduğu donanıma ve kalibrasyona bağlıdır. 10 MHz'i (test noktasında 5 MHz) GPS disiplinli bir osilatöre sahip başka bir frekans sayacı ile kalibre ettim.
Ve oldukça iyi çalışıyor, denediğim en düşük frekans 0.2 Hz, en yüksek 2 MHz. Tam yerinde. 2 MHz'in üzerinde kontrolör kesintileri kaybetmeye başlar, 2 MHz'lik giriş sinyalinde TIMER0'ın saniyede 7800'den fazla kesinti ürettiğini bildiğinizde gerçekten şaşırtıcı değildir. ATTINY2313'ün başka şeyler de yapması gerekiyor, TIMER1'den gelen kesintiler, saniyede 150 kesinti daha ve tabii ki hesaplamaları yaparak, ekranı ve D-flipflop'u kontrol ediyor. Asıl cihaza baktığınızda, ekranın sekiz hanesinden sadece yedisini kullandığımı göreceksiniz. Bunu birkaç nedenden dolayı yapıyorum.
Birincisi, giriş frekansının hesaplanması bir bölmedir, neredeyse her zaman bir tamsayı bölümü olduğu için görmediğiniz bir kalanı olacaktır. İkincisi, kuvars kristal osilatörünün sıcaklık stabilize olmamasıdır.
Onu doğru 10 MHz'e ayarlayan kapasitörler seramiktir, sıcaklık değişimlerine çok duyarlıdır. O zaman, TIMER0'ın yerleşik yakalama mantığına sahip olmadığı ve kesme işlevlerinin hepsinin işlerini yapması biraz zaman aldığı gerçeği var. Bence yedi hane zaten yeterince iyi.
Önerilen:
Arduino İle Frekans Sayacı: 8 Adım (Resimli)
Arduino ile Frekans Sayacı: Bu basit ve ucuz bir arduino tabanlı frekans Sayacı maliyeti 4 $ 'dan az, küçük devreleri ölçmek için çok faydalı oldu
Yüksek Çözünürlüklü Web Kamerası: 9 Adım (Resimlerle)
Yüksek Çözünürlüklü Web Kamerası: Birkaç yıl boyunca RPi tabanlı bir web kamerası (PiCam modülü ile) kullandım. Üretilen görüntüler iyiydi ama sonra kaliteden artık memnun olmadığım bir an oldu. Yüksek çözünürlüklü bir Web kamerası yapmaya karar verdim. Aşağıdaki parçalar
OpenLogger: Yüksek Çözünürlüklü, Wi-Fi Etkin, Açık Kaynak, Taşınabilir Veri Kaydedici: 7 Adım
OpenLogger: Yüksek Çözünürlüklü, Wi-Fi Etkin, Açık Kaynaklı, Taşınabilir Veri Kaydedici: OpenLogger, pahalı yazılım veya yazma yazılımı gerektirmeden yüksek kaliteli ölçümler sağlamak üzere tasarlanmış taşınabilir, açık kaynaklı, düşük maliyetli, yüksek çözünürlüklü bir veri kaydedicidir. sıfırdan. Eğer bir mühendis, bilim insanı veya meraklıysanız
STM32 Cihazlarla RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: 3 Adım
STM32 Cihazları ile RC Servolar için Yüksek Çözünürlüklü PWM Sinyal Üretimi: Şu anda, SX1280 RF çipine dayalı bir RC verici/alıcı yapıyorum. Projenin amaçlarından biri, çubuklardan servolara kadar 12 bit servo çözünürlük istiyorum. Kısmen modern dijital servoların 12 bit çözünürlüğü olduğu için
Talimatlardan Yüksek Çözünürlüklü Görüntüler Nasıl Elde Edilir: 4 Adım
Talimatlardan Yüksek Çözünürlüklü Görüntüler Nasıl Elde Edilir: Bu öğretilebilir resimden gerçekten keyif aldınız mı ve yüksek çözünürlüklü bir kopyasını kaydetmek mi istiyorsunuz? Bu harika küçük özellik kolayca gözden kaçabilir