Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-23 15:03
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
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
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
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:
Jak zrobić CubeSata, który może mierzyć temperaturę: 3 kroki
Jak zrobić CubeSata, który może mierzyć temperaturę: Przyjdź z, a zobaczysz sześcian 11x11x11x11 czystej wyobraźni, weź mnie za rękę, a zobaczysz temperaturę Marsa! (do melodii „Imagination” Willy'ego Wonki) Dzisiaj pokażę, że musisz zbudować swojego własnego CubeSata! Ja i moi partnerzy Alyssa i
Jak zrobić drona za pomocą Arduino UNO - Zrób quadkopter za pomocą mikrokontrolera: 8 kroków (ze zdjęciami)
Jak zrobić drona za pomocą Arduino UNO | Zrób quadkopter za pomocą mikrokontrolera: WprowadzenieOdwiedź mój kanał YouTubeDron to bardzo drogi gadżet (produkt) do kupienia. W tym poście zamierzam omówić, jak robię to tanio?? I jak możesz zrobić taki własny w niskiej cenie… Cóż, w Indiach wszystkie materiały (silniki, ESC
Sterowanie silnikami prądu stałego za pomocą L298N za pomocą mikrokontrolera CloudX: 3 kroki
Sterowanie silnikami prądu stałego za pomocą L298N za pomocą mikrokontrolera CloudX: W tym projekcie wyjaśnimy, jak wykorzystać nasz mostek H L298N do zwiększania i zmniejszania prędkości silnika prądu stałego. Moduł L298N H-bridge może być używany z silnikami o napięciu od 5 do 35 V DC. Istnieje również wbudowany regulator 5 V, więc jeśli
Jak mierzyć prąd i dlaczego należy to robić?: 4 kroki (ze zdjęciami)
Jak mierzyć prąd i dlaczego należy to robić?: Wielu twórców nie wie, jak ważna jest znajomość aktualnego losowania projektu lub dlaczego musisz to wiedzieć. W tym samouczku wyjaśnię Ci, jak zmierzyć aktualny los Twojego projektu i dlaczego tak ważne jest, aby to wiedzieć. T
Niestandardowe srebrne kable Audio/cyfrowe/wysoka częstotliwość/GPS: 7 kroków
Niestandardowe srebrne kable Audio/cyfrowy/wysokiej częstotliwości/GPS: Z wieloma nowymi modami audio/wideo i nowymi urządzeniami, zarówno audio dla iPoda, jak i cyfrowym dla wideo, musimy podłączyć nasze systemy do nowych urządzeń z bardziej złożonymi kablami. Niektóre bardzo drogie… To muszą mieć komponenty i amp; materiały do budowy projektu