İçindekiler:

Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür: 4 Adım
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür: 4 Adım

Video: Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür: 4 Adım

Video: Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür: 4 Adım
Video: Arduino Dijital Pinlerini Çıkış Olarak Kullanmak - Robo90 Arduino Dersleri #18 2024, Kasım
Anonim
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür?
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür?
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür?
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür?
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür?
Mikrodenetleyici Kullanarak Aynı Anda Yüksek Frekans ve Görev Döngüsü Nasıl Ölçülür?

Ne düşündüğünüzü biliyorum: "Ha? Sinyal frekansını ölçmek için mikrodenetleyicilerin nasıl kullanılacağına dair çok sayıda Talimat var. Esneme." Ama bekleyin, bunda bir yenilik var: Bir mikrodenetleyicinin (MCU) taşıyabileceğinden çok daha yüksek frekansları ölçmek için bir yöntem ve sinyalin görev döngüsü - hepsini aynı anda açıklıyorum!

Cihazın frekans aralığı ~43 Hz ila ~450 kHz arasındadır, görev döngüsü ise %1 ila %99 arasındadır.

"Dayanabilir" kısmını açıklamama izin verin: bir MCU, sonraki iki geçiş olayı arasındaki süreyi izleyerek kare dalga sinyalinin (T) periyodunu ölçer. Örneğin, G/Ç pinlerinden birinde düşükten yükseğe voltaj atlar. Bunu kendi iç saatinin darbe sayısını sayarak yapar. Naif olarak, ölçülen frekansların üst sınırı Nyqvist-Shannon örnekleme teoremine uymalıdır; yani, kabaca MCU'nun saat frekansının yarısına eşit olacaktır. Gerçekte sınır çok, çok daha düşüktür, çünkü MCU'nun kesintileri işlemek, değişkenleri kaydetmek, aritmetik işlemler yapmak, sonuçları görüntülemek vb. için kod yürütmesi gerekir. 48 MHz MCU ile yaptığım deneylerde ölçülebilir geçişler arasındaki minimum saat döngüsü sayısı şuydu: yaklaşık 106. Dolayısıyla, bu durumda ölçülebilir frekans aralığının üst sınırı 48.000 / 212 / 2 = 226,4 kHz olacaktır.

MCU, sinyalin periyodunu ölçerken, darbe genişliğini de belirleyebilir, P: sinyal voltajının yüksek kaldığı süre. Başka bir deyişle, düşükten yükseğe ve yüksekten düşüğe geçişler arasındaki süre. Sinyalin görev döngüsü daha sonra aşağıdaki yüzde olarak tanımlanır:

Görev = %100 * P / T

Tıpkı frekans durumunda olduğu gibi, darbe genişliğinde pratik bir sınır vardır. Yukarıdaki örneği kullanarak, 106 saat döngüsü darbe genişliğini 2,21 mikrosaniyeden az olmayacak şekilde sınırlayacaktır. Veya 226.4 kHz'de %50'den az olmamalıdır.

Kare dalga sinyallerinin üst frekans sınırını artırmanın yollarından biri, parmak arası terlik kullanan dijital bölücülerin uygulanmasıdır. Giriş frekansını n'ye bölmek, ölçülebilir üst aralığı n kat uzatacaktır. Bu harika bir haber, dijital bölücülerin temel bir kusuru var: bölünmüş sinyal, darbe genişliği (ve görev döngüsü) bilgisini kaybeder! Bölücülerin çalışma şekli nedeniyle çıktıları her zaman %50 görev döngüsüne sahiptir. serseri…

Ancak ilerleyen sayfalarda, frekansı dijital olarak nasıl böleceğimi ve doğrudan saymanın getirdiği sınırların çok ötesinde sinyalleri ölçmeme izin veren orijinal darbe genişliğini nasıl koruyacağımı göstereceğim.

Adım 1: Dijital Frekans Bölümü

Dijital Frekans Bölümü
Dijital Frekans Bölümü
Dijital Frekans Bölümü
Dijital Frekans Bölümü
Dijital Frekans Bölümü
Dijital Frekans Bölümü

Geleneksel dijital frekans bölücüler parmak arası terlik kullanır; bu öğretici, standart JK parmak arası terliklerini kullanarak bölücülerin nasıl oluşturulacağını güzel bir şekilde açıklar. Bu, MCU için çok yüksek giriş frekansları sorununu çözer, ancak önemli bir dezavantajı vardır: bölünmüş sinyal, giriş sinyalinin görevinden bağımsız olarak %50 görev döngüsüne sahiptir! Durumun neden böyle olduğunu görmek için ilk iki rakama bakın. Periyodu T ve darbe genişliği P olan orijinal sinyal, J ve K pinleri her zaman yüksek tutulurken bir JK flip-flop'un saat pinine beslenir (ilk şekil). Boyunca 3.3V mantığı varsayılır. Flip-flop'un saatin pozitif (yani yükselen) kenarı tarafından tetiklendiğini varsayalım. Bu koşullar altında, saat pimi düşükten yükseğe her gittiğinde çıkış piminin durumundaki değişiklikler (bireysel "dönüşler" ve "floplar") meydana gelir. Saatin yüksekten düşüğe geçişi (yani negatif kenar) tamamen yok sayılır. İkinci şekle bakın. Çıkış pimi Q, periyodu orijinal periyodun iki katı olan bir sinyal yayar, yani frekansı yarıya iner. Çıkışın darbe genişliği her zaman T'ye eşittir. Sonuç olarak, orijinal darbe genişliği P kaybolur.

Üçüncü şekilde gösterilen bir konfigürasyonda başka bir JK flip-flop eklemek, orijinal frekansı 4'e böler. Aynı sıralı şekilde daha fazla flip-flop eklemek, frekansı takip eden 2: 8, 16, 32 vb.

Sorun: Darbe genişliğini korurken bir kare dalganın frekansı nasıl bölünür?

Buradaki fikir, karışıma bir negatif kenar tetiklemeli JK flip-flop'u düzgün bir şekilde eklemektir. Buna "Neg FF" diyelim; dördüncü şekle bakın. Burada "düzgün" ifadesi, yeni flip-flop'un J ve K pinlerinin, önceki şekilde gösterilen bölücü-by-4'ün ("Pos FF") sırasıyla Q ve Qbar çıkış pinlerine bağlı olduğu anlamına gelir. (Burada "bar", mantıksal olumsuzlamayı gösteren Q sembolünün üzerindeki yatay çubuktur.) Bunun ne başardığını görmek için beşinci şekildeki "Neg FF" fonksiyon tablosuna bakın: Neg'in çıkış pinleri, Q ve Qbar, sırasıyla J ve K giriş pinlerinin durumunu yansıtır. Bu, Pos' Q ve Qbar'ın durumunu yansıttıkları anlamına gelir. Ancak, Neg'in flip-flop eylemi, pozitif kenardan sonra P zamanında gelen orijinal sinyalin negatif kenarını beklemelidir. Aha!

Ortaya çıkan dalga biçimleri altıncı şekilde gösterilmektedir. "Pos Q" 1/4 frekansta sinyal verir, "Pos Qbar" tersidir, "Neg Q", darbe genişliği P tarafından kaydırılan "Pos Q"yu takip eder ve "Neg Qbar" bunun tersidir. "Poz Qbar" ve "Neg Q"nun mantıksal AND'sinin, orijinal darbe genişliği P ve frekansın 1/4'ü ile karakterize edilen bir darbe dizisi ürettiğini doğrulayabilirsiniz. Bingo!

İlk başta MCU'yu beslemek için tam olarak bu çıkış sinyalini kullandım. Ancak, Giriş bölümünde bahsedilen MCU'nun 106 döngü sınırlaması nedeniyle çok kısa darbe genişlikleri için sorunlu olduğu ortaya çıktı. Bu küçük sorunu başka bir çıktı seçerek çözdüm: bunun yerine "Pos Qbar" VE "Neg Qbar". Dalga biçimlerine bir bakış, bu belirli dalga biçiminin darbe genişliğinin, P', P için (0, T) aralığı yerine T ile 2T arasında değiştiğine sizi ikna etmelidir. P, P''den şu şekilde kolayca kurtarılabilir:

P = 2T - P'

2. Adım: Önerilen Donanım

Önerilen Donanım
Önerilen Donanım
Önerilen Donanım
Önerilen Donanım
Önerilen Donanım
Önerilen Donanım

Elektronik meraklılarına nispeten yeni gelenleri gerçekten seviyorum: Eski Atmel'lerden çok daha yüksek, 48 MHz saat hızında çalışan 32-bit ARM Cortex M0+ işlemciye dayalı Atmel SAM D21 MCU'lar. Bu proje için satın aldım:

  • Adafruit'ten ItsyBitsy M0 Express MCU kartı
  • Adafruit'ten şarj edilebilir bir LiPo pilim oldu
  • Monokrom 128x32 SPI OLED ekran (tahmin ettiniz: Adafruit)
  • Texas Instruments'tan çift pozitif kenar tetiklemeli JK flip-flop SN74HC109
  • Texas Instruments'tan çift negatif kenar tetiklemeli JK flip-flop SN74HC112
  • Texas Instruments'tan Dörtlü VE kapısı CD74AC08E
  • Texas Instruments'tan Dörtlü VEYA kapısı CD74AC32E

Adım 3: Devre

Devre
Devre
Devre
Devre

İlk şekil, frekans/görev ölçerin basitleştirilmiş bir şemasını göstermektedir. 3,3 V CMOS mantığı baştan sona varsayılır. Sonuç olarak, giriş kare dalganın genliği karşılık gelen V arasında olmalıdır.IH seviye (yani, 2 V) ve 3,3 V. Değilse, buna göre yukarı veya aşağı ölçeklendirmeniz gerekir. Çoğu durumda basit bir voltaj bölücü yeterli olacaktır. Metre versiyonunuzu farklı bir mantık seviyesinde tasarlamak istiyorsanız, o zaman başka bir mikro denetleyici (MCU), pil ve istenilen seviyede çalışan bir ekran kullanmanız gerekir. Bu projede kullanılan mantık kapıları ve parmak arası terlikler 2 V ile 6 V arasında herhangi bir yerde mantık seviyeleriyle çalışır ve çoğu durumda sorunsuz olmalıdır.

Gösterildiği gibi, ItsyBitsy MCU, yazılım SPI protokolü aracılığıyla ekranla iletişim kurmak için 9-13 pinlerini kullanır. 3V pin tüm devreye güç sağlar. Dijital giriş pimi 3 analiz edilen sinyali kabul ederken, pim 2 ve 4 sinyal kaynağını kontrol eder: ya AND3 kapısından gelen doğrudan sinyal (düşük giriş frekansları) ya da Adım 2'de açıklandığı gibi kapı AND4 aracılığıyla 4'e bölünen sinyal (yüksek giriş frekansları) Sonraki adımda açıklanan kod, gelen frekans aralığını otomatik olarak algılar ve sinyal kaynağını uygun şekilde değiştirir.

Şematik, dijital çip bağlantılarının gerçek karmaşıklığını göstermez. İkinci resim, projenin bir devre tahtasında nasıl görüneceğini gösterir. Giriş sinyali kırmızı bir kablo üzerinden çift pozitif kenarlı flip-flop'un 2CLK pinine gelir. DİKKAT: Normalde, bu flip-flop'un tüm J ve K pinleri yüksek tutulmalıdır, ancak özellikle SN74HC109 bunun yerine Kbar pinini (ters çevrilmiş bir K pinini) içerir. Bu nedenle, bu pim topraklanmalıdır! SN74HC112'deki ilk negatif kenarlı flip-flop, SN74HC109'un 1Q ve 1Qbar pinlerine bağlı 1K ve 1J pinine sahiptir. SN74HC112'deki ikinci flip-flop kullanılmamaktadır ve giriş pinleri (2K, 2J, 2CLRbar) topraklanmıştır. Tüm parmak arası terliklerdeki diğer tüm ekstra pimler PREbar (ön ayar) ve CLRbar (temizle) mantıksal yükseğe bağlanmalıdır. Kullanılmayan saat ve çıkış pinleri bağlanmadan bırakılır. Benzer şekilde tüm kapılardaki kullanılmayan giriş pinleri topraklanır, kullanılmayan çıkış pinleri bağlanmadan bırakılır. "Telefon Zillerinin Görünmez Katili" Eğitilebilirliğimde tartıştığım gibi, kullanılmayan mantıksal yonga giriş pinlerini topraklamak, rastgele salınımları ortadan kaldırır ve pil gücünden tasarruf sağlar.

Adım 4: Kod ve Düşük Frekansların Ölçülmesi

Doğal olarak, tüm eylemler aşağıda bağlantısı verilen kodda gerçekleşir. Pim 3'e gelen giriş dijital düşükten yükseğe geçtiğinde, MCU dahili 48 MHz saatinin darbelerini saymaya başlar. Yüksekten düşüğe geçiş anını not eder ve tüm süreci yeniden başlattığında bir sonraki düşükten yükseğe geçişe kadar saymaya devam eder. İlk sayım darbe genişliğini temsil ederken, tüm sayım sinyalin periyodunu temsil eder. Ve tüm sır bu.

CPU, bu geçişleri donanım kesintileri aracılığıyla not eder. SAMD21'in birkaç saati vardır; kodum TC3 birini kullanıyor. Başlangıçta, kesme işleyicisini kodlamak için çok çaba sarf etmek için M0'ın veri sayfasını okuyarak başladım, ancak kısa süre sonra Arduino Forum gönderilerinde, katkısı olan elektro_95, MartinL ve Rucus kullanıcıları tarafından çok ilgili bir kod keşfettim. usulüne uygun olarak kabul edildi. Birleştirilmiş kodlarını benimkiyle birleştirdim ve değiştirdim; bana çok zaman kazandırıyor!

Daha önce bahsettiğim gibi, sinyal çözünürlüğü, kesintiler arasında kod yürütmek için ~106 CPU döngüsü ile sınırlıdır. Darbe genişliği korumalı dijital bölme, yüksek frekanslarla ilgilenir. Düşük frekanslar ise başka bir zorluk teşkil eder: TC3 saat sayacı 16 bit uzunluğunda olduğundan, 65,536 sayım sınırını geçtikten sonra taşar. Bu durum, bir taşma kesintisi ekleyerek halledilebilir, ancak farklı bir çözüm seçti: TC3, donanım 48 MHz yerine önceden ölçeklendirilmiş (yani, yazılıma bölünmüş) bir CPU saati kullanabilir. Bu nedenle, sinyalin periyodu taşma sınırına yaklaşırsa, kod TC3'e bir sonraki periyot için 24 MHz sayım kullanma talimatı verebilir ve voila, sayaç 32, 768 sayımın altına düşer. Daha düşük frekanslar için TC3'e 12 MHz darbeleri vb. sayması talimatı verilebilir. Uygun ön ölçekleyici, TC3 sayacını taşma limiti içinde tutmak için sinyalin frekansına dayalı olarak histerezis ile otomatik olarak belirlenir. Sonuç olarak, cihazın aralığının alt sınırı yaklaşık 43 Hz'dir.

Kodu çatallayabilir ve projenizde kullanabilirsiniz, ancak sonuçları yayınlarken lütfen kaynağını belirtin.

Kodun bağlantısı.

Önerilen: