Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera.: 4 kroki
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera.: 4 kroki
Anonim
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera
Jak mierzyć jednocześnie wysoką częstotliwość i cykl pracy za pomocą mikrokontrolera

Wiem, co myślisz: „Hę? Jest wiele instrukcji, jak używać mikrokontrolerów do pomiaru częstotliwości sygnału. Ziew”. Ale czekaj, w tym jest nowość: opisuję metodę pomiaru częstotliwości znacznie wyższych niż może wytrzymać mikrokontroler (MCU) i współczynnik wypełnienia sygnału - wszystko w tym samym czasie!

Zakres częstotliwości urządzenia obejmuje od ~43 Hz do ~450 kHz, a współczynnik wypełnienia od 1% do 99%.

Pozwólcie, że wyjaśnię część "może wytrzymać": MCU mierzy okres sygnału fali prostokątnej, T, śledząc czas między dwoma kolejnymi zdarzeniami przejścia. Na przykład, napięcie od niskiego do wysokiego przeskakuje na jednym z jego pinów we/wy. Robi to, zliczając liczbę impulsów własnego wewnętrznego zegara. Naiwnie górna granica mierzonych częstotliwości powinna być zgodna z twierdzeniem o próbkowaniu Nyqvista-Shannona; tj. byłoby to mniej więcej równe połowie częstotliwości zegara MCU. W rzeczywistości limit jest znacznie, znacznie niższy, ponieważ MCU musi wykonać kod do obsługi przerwań, zapisywania zmiennych, wykonywania operacji arytmetycznych, wyświetlania wyników itp. W moich eksperymentach z MCU 48 MHz minimalna liczba cykli zegara między mierzalnymi przejściami była około 106. Stąd górna granica zakresu mierzalnych częstotliwości w tym przypadku wynosiłaby 48 000 / 212 / 2 = 226,4 kHz.

Podczas gdy MCU mierzy okres sygnału, może również określić jego szerokość impulsu, P: czas pozostawania wysokiego napięcia sygnału. Innymi słowy, czas między przejściami od niskiego do wysokiego i od wysokiego do niskiego. Cykl pracy sygnału jest wtedy definiowany jako następujący procent:

Cło = 100% * P / T

Podobnie jak w przypadku częstotliwości, istnieje praktyczne ograniczenie szerokości impulsu. Korzystając z powyższego przykładu, 106 cykli zegara ograniczyłoby szerokość impulsu do nie mniej niż 2,21 mikrosekundy. Lub nie mniej niż 50% przy 226,4 kHz.

Jednym ze sposobów na podniesienie górnej granicy częstotliwości sygnałów o przebiegu prostokątnym jest zastosowanie dzielników cyfrowych wykorzystujących przerzutniki. Dzielenie częstotliwości wejściowej przez n rozszerzyłoby górny zakres mierzalny n razy. To świetna wiadomość, dzielniki cyfrowe mają jedną podstawową wadę: podzielony sygnał traci informacje o szerokości impulsu (i cyklu pracy)! Ze względu na sposób działania dzielników ich wydajność ma zawsze 50% cyklu pracy. Porażka…

Na następnych stronach pokażę jednak, jak cyfrowo podzielić częstotliwość i zachować pierwotną szerokość impulsu, co pozwoli mi mierzyć sygnały znacznie poza ograniczeniami narzuconymi przez bezpośrednie zliczanie.

Krok 1: Cyfrowy podział częstotliwości

Podział częstotliwości cyfrowej
Podział częstotliwości cyfrowej
Podział częstotliwości cyfrowej
Podział częstotliwości cyfrowej
Podział częstotliwości cyfrowej
Podział częstotliwości cyfrowej

Tradycyjne cyfrowe dzielniki częstotliwości wykorzystują przerzutniki; ten samouczek ładnie wyjaśnia zasady konstruowania przegródek przy użyciu standardowych klapek JK. Rozwiązuje to problem zbyt wysokich częstotliwości wejściowych dla MCU, ale ma jedną poważną wadę: podzielony sygnał ma 50% współczynnik wypełnienia, niezależnie od wypełnienia sygnału wejściowego! Aby zobaczyć, dlaczego tak jest, spójrz na dwie pierwsze cyfry. Oryginalny sygnał o okresie T i szerokości impulsu P jest podawany na pin zegarowy przerzutnika JK, podczas gdy piny J i K są utrzymywane przez cały czas na wysokim poziomie (pierwszy rysunek). W całym tekście zakładana jest logika 3,3 V. Załóżmy, że przerzutnik jest wyzwalany przez dodatnią (tj. rosnącą) krawędź zegara. W tych warunkach zmiany stanu pinu wyjściowego (indywidualne „flipy” i „flops”) następują za każdym razem, gdy pin zegara przechodzi z niskiego na wysoki. Przejście z wysokiego do niskiego zegara (tj. ujemna krawędź) jest całkowicie ignorowane. Zobacz drugą figurę. Pin wyjściowy, Q, emituje sygnał, którego okres jest dwa razy dłuższy niż pierwotny okres, tj. jego częstotliwość jest zmniejszona o połowę. Szerokość impulsu wyjścia jest zawsze równa T. W konsekwencji pierwotna szerokość impulsu P jest tracona.

Dodanie kolejnego przerzutnika JK w konfiguracji pokazanej na trzecim rysunku dzieli pierwotną częstotliwość przez 4. Dodanie kolejnych przerzutników w ten sam sposób sekwencyjny dzieli częstotliwość przez kolejne potęgi 2: 8, 16, 32 itd.

Problem: jak podzielić częstotliwość fali prostokątnej zachowując jej szerokość impulsu?

Chodzi o to, aby odpowiednio dodać do miksu przerzutnik JK wyzwalany ujemną krawędzią. Nazwijmy to „Neg FF”; patrz czwarty rysunek. Tutaj „prawidłowo” oznacza, że styki J i K nowego przerzutnika są połączone odpowiednio z szpilkami wyjściowymi Q i Qbar dzielnika przez 4 („Pos FF”) zilustrowanego na poprzednim rysunku. (Tutaj „bar” jest poziomym paskiem nad symbolem Q, wskazującym na logiczną negację.) Aby zobaczyć, co to daje, spójrz na tabelę funkcji „Neg FF” na piątym rysunku: piny wyjściowe Nega, Q i Qbar, odzwierciedlają stan swoich pinów wejściowych, odpowiednio J i K. Co oznacza, że odzwierciedlają stan Q i Qbar Pos. Ale działanie flip-flop Nega musi czekać na ujemną krawędź oryginalnego sygnału, która pojawia się w czasie P po dodatnim zboczu. Aha!

Powstałe przebiegi przedstawiono na szóstym rysunku. „Pos Q” wyprowadza sygnał o 1/4 częstotliwości, „Pos Qbar” jest odwrotnością, „Neg Q” następuje po „Pos Q” przesuniętym o szerokość impulsu P, a „Neg Qbar” jest jego odwrotnością. Możesz sprawdzić, czy logiczne AND z "Pos Qbar" i "Neg Q" wytwarza ciąg impulsów charakteryzujący się pierwotną szerokością impulsu P i 1/4 częstotliwości. Bingo!

Na początku użyłem dokładnie tego sygnału wyjściowego do zasilania MCU. Jednak okazało się to problematyczne dla bardzo krótkich szerokości impulsów ze względu na ograniczenie MCU do 106 cykli, o którym mowa we wstępie. Rozwiązałem ten mały problem, wybierając zamiast tego inne wyjście: "Pos Qbar" ORAZ "Neg Qbar". Jedno spojrzenie na przebiegi powinno cię przekonać, że szerokość impulsu tego konkretnego przebiegu, P', waha się między T a 2T zamiast zakresu (0, T) dla P. P można łatwo odzyskać z P' przez:

P = 2T - P'

Krok 2: Zalecany sprzęt

Zalecany sprzęt
Zalecany sprzęt
Zalecany sprzęt
Zalecany sprzęt
Zalecany sprzęt
Zalecany sprzęt

Naprawdę podoba mi się stosunkowo nowość wśród elektronicznych hobbystów: mikrokontrolery Atmel SAM D21 oparte na 32-bitowym procesorze ARM Cortex M0+ pracującym z zegarem 48 MHz, znacznie wyższym niż starsze Atmely. Do tego projektu kupiłem:

  • Płyta MCU ItsyBitsy M0 Express firmy Adafruit
  • Zdarzyło mi się mieć akumulator LiPo od Adafruit
  • Monochromatyczny wyświetlacz OLED 128x32 SPI (zgadłeś: Adafruit)
  • Podwójny przerzutnik JK z wyzwalaniem dodatnim krawędzią SN74HC109 firmy Texas Instruments
  • Podwójny przerzutnik JK SN74HC112 z wyzwalaniem ujemną krawędzią firmy Texas Instruments
  • Poczwórna bramka AND CD74AC08E firmy Texas Instruments
  • Poczwórna bramka OR CD74AC32E firmy Texas Instruments

Krok 3: Obwód

Obwód
Obwód
Obwód
Obwód

Pierwszy rysunek przedstawia uproszczony schemat miernika częstotliwości/ciążenia. W całym tekście zakładana jest logika CMOS 3,3 V. W związku z tym amplituda wejściowej fali prostokątnej musi znajdować się między odpowiednim VIH poziom (tj. 2 V) i 3,3 V. Jeśli nie, musisz odpowiednio przeskalować go w górę lub w dół. W większości przypadków wystarczy prosty dzielnik napięcia. Jeśli chcesz zaprojektować swoją wersję miernika na innym poziomie logicznym, musisz użyć innego mikrokontrolera (MCU), baterii i wyświetlacza, które działają na żądanym poziomie. Bramki logiczne i przerzutniki używane w tym projekcie działają z poziomami logicznymi w dowolnym miejscu od 2 V do 6 V i w większości przypadków powinny być OK.

Jak pokazano, MCU ItsyBitsy używa pinów 9-13 do komunikacji z wyświetlaczem za pośrednictwem protokołu SPI oprogramowania. Pin 3V dostarcza zasilanie do całego obwodu. Wejście cyfrowe pin 3 akceptuje analizowany sygnał, podczas gdy piny 2 i 4 kontrolują źródło sygnału: albo bezpośredni sygnał przechodzący przez bramkę AND3 (niskie częstotliwości wejściowe), albo sygnał podzielony przez 4 przez bramkę AND4 (wysokie częstotliwości wejściowe), jak opisano w kroku 2 Kod, omówiony w następnym kroku, automatycznie wykrywa przychodzący zakres częstotliwości i odpowiednio przełącza źródło sygnału.

Schemat nie pokazuje prawdziwej złożoności połączeń chipów cyfrowych. Drugi obraz pokazuje, jak projekt wyglądałby na płytce prototypowej. Sygnał wejściowy przechodzi przez czerwony przewód do pinu 2CLK przerzutnika z podwójnym dodatnim zboczem. UWAGA: Normalnie wszystkie piny J i K tego przerzutnika powinny być trzymane wysoko, ale w szczególności SN74HC109 ma pin Kbar - odwrócony pin K - zamiast tego. Dlatego ten pin musi być uziemiony! Pierwszy przerzutnik z ujemnym zboczem w SN74HC112 ma piny 1K i 1J połączone z pinami 1Q i 1Qbar SN74HC109. Drugi przerzutnik w SN74HC112 jest nieużywany, a jego piny wejściowe (2K, 2J, 2CLRbar) są uziemione. Wszystkie inne dodatkowe piny PREbar (preset) i CLRbar (clear) we wszystkich przerzutnikach muszą być podłączone do logicznego wysokiego. Nieużywany zegar i piny wyjściowe pozostają niepodłączone. Podobnie nieużywane piny wejściowe we wszystkich bramkach są uziemione, podczas gdy nieużywane piny wyjściowe pozostają niepodłączone. Jak omówiłem w mojej instrukcji „Invisible Killer of the Phone Ring”, uziemienie nieużywanych pinów wejściowych układów logicznych eliminuje przypadkowe oscylacje i oszczędza energię baterii.

Krok 4: Kod i pomiar niskich częstotliwości

Oczywiście cała akcja dzieje się w kodzie, do którego link znajduje się poniżej. Kiedy wejście przychodzące na pin 3 przełącza się z cyfrowego niskiego na wysoki, MCU zaczyna zliczać impulsy swojego wewnętrznego zegara 48 MHz. Odnotowuje moment przejścia ze stanu wysokiego na niski i kontynuuje liczenie do następnego przełączenia stanu niskiego na wysoki, kiedy to cały proces jest ponownie uruchamiany. Pierwsze zliczenie reprezentuje szerokość impulsu, podczas gdy całe zliczenie reprezentuje okres sygnału. I to jest cały sekret.

CPU odnotowuje te przejścia poprzez przerwania sprzętowe. SAMD21 ma kilka zegarów; mój kod używa TC3 jeden. Początkowo zacząłem od przeczytania arkusza danych M0, aby uzyskać dużo wysiłku w kodowaniu obsługi przerwań, ale wkrótce odkryłem bardzo podobny kod w postach na forum Arduino autorstwa użytkowników electro_95, MartinL i Rucus, których wkład jest należycie uznane. Włączyłem i zmodyfikowałem ich połączony kod do mojego; oszczędzając mi dużo czasu!

Jak wspomniałem wcześniej, rozdzielczość sygnału jest ograniczona przez ~106 cykli procesora do wykonania kodu między przerwaniami. Podział cyfrowy z zachowaniem szerokości impulsu dba o wysokie częstotliwości. Z drugiej strony niskie częstotliwości stanowią kolejne wyzwanie: ponieważ licznik zegara TC3 ma długość 16 bitów, przepełnia się po przekroczeniu limitu 65 536 zliczeń. Można poradzić sobie z tą sytuacją przez dodanie przerwania przepełnienia, ale wybrałem inne rozwiązanie: TC3 może użyć preskalowanego (tj. podzielonego programowo) zegara procesora zamiast sprzętowego 48 MHz. Tak więc, jeśli okres sygnału zbliża się do limitu przepełnienia, kod może poinstruować TC3, aby użył zliczeń 24 MHz przez następny okres i voila, licznik spadnie poniżej 32 768 zliczeń. Dla jeszcze niższych częstotliwości TC3 może zostać poinstruowany, aby zliczał impulsy 12 MHz itp. Odpowiedni preskaler jest automatycznie określany na podstawie częstotliwości sygnału z histerezą, aby utrzymać licznik TC3 w limicie przepełnienia. W efekcie dolna granica zakresu urządzenia to około 43 Hz.

Możesz rozwidlić kod i użyć go w swoim projekcie, ale podczas publikowania wyników prosimy o podanie jego źródła.

Link do kodu.

Zalecana: