Serwisy partnerskie:
Close icon
Serwisy partnerskie

F-meter: Modułowy licznik częstotliwości i czasu cz.1 - opis, schematy, oprogramowanie

Article Image
Elmax
Projektów liczników częstotliwości w Internecie jest bardzo dużo, poczynając od opartych na mikrokontrolerach 8051, przez AVR, PIC do ARM. Niestety, znalezienie dobrej konstrukcji nie jest łatwe. Popularne rozwiązania oparte na PIC, jak AVT- 2885, bazują na pomiarze liczby impulsów w jednostce czasu. Metoda ta ma poważną wadę przy pomiarze niskich częstotliwości – mała rozdzielczość. Aby polepszyć sytuację, trzeba rozsądnie zwiększyć czas pomiaru.

Opisywane urządzenie służy do pomiaru częstotliwości w zakresie od 0,1Hz do 42MHz i czasu do 10 sekund z rozdzielczością 23,8ns. Tym, co odróżnia prezentowany licznik od innych, jest sposób pomiaru niskich częstotliwości. Przy pomiarze częstotliwości niższych niż 50kHz mierzony jest okres sygnału, po czym przeliczany na częstotliwość. Dzięki temu pomiar częstotliwości 1Hz z rozdzielczością 1μHz (0,000001Hz) trwa tyle co okres sygnału, czyli sekundę. Tradycyjną metodą pomiar trwałby milion sekund, czyli ponad 11,5 dnia!

Poza pomiarem częstotliwości możliwy jest pomiar okresu. Można zmierzyć czas trwania stanu wysokiego i niskiego badanego sygnału. Na podstawie tych pomiarów wyliczany jest współczynnik wypełnienia z rozdzielczością 0,01%. Miernik ma dwa wejścia, drugie nie mierzy czasów, tylko częstotliwość, ale można przełączyć je w tryb licznika impulsów z przechwytywaniem i resetem. Ze względu na to, że impulsy sygnału wejściowego są zliczane w liczniku 32-bitowym, który może być taktowany częstotliwością do 42MHz, nawet przy bramkowaniu 100 sekund nie następuje przepełnienie licznika.

Miernik nie ma automatycznej zmiany zakresu, tylko wynik pomiaru jest reprezentowany w inny sposób. Podobnie przy pomiarze czasu, pomiar trwający 10 sekund nie jest w stanie przepełnić licznika taktowanego 42MHz. W tym przypadku także sposób reprezentacji pomiaru jest różny dla różnych sygnałów wejściowych. Wynik pomiaru jest prezentowany na ośmiu wyświetlaczach 7-segmentowych oraz dodatkowym OLED 128×64 piksele.

Mikrokontroler jest taktowany generatorem kwarcowym, ale można doprowadzić sygnał z zewnętrznego precyzyjnego generatora, który może być synchronizowany jeszcze precyzyjniejszym wzorcem, na przykład sygnałem GPS. Do licznika można podłączyć rozbudowany układ obwodów wejściowych AVT3277 sterowany magistralą I2C.

Rys.1 Schemat ideowy - modułowy licznik częstotliwości i czasu

Opis układu - modułowy licznik częstotliwości i czasu

Schemat ideowy pokazany jest na rysunku 1. Jak widać, budowa miernika nie jest skomplikowana, czego nie można powiedzieć o pierwszym, który zbudowałam ponad 30 lat temu. Miał 37 układów TTL, pobierał 1,5A, mierzył częstotliwość do 125MHz (układy rodziny 74S rodzimej produkcji) w sześciu zakresach przełączanych ręcznie przyciskami góra dół, więc był przygotowany do automatycznej zmiany zakresu, której się nigdy nie doczekał. Mierzył okres i czas trwania poziomu H, L sygnału.

Wyniki były prezentowane na 6-cyfrowym wyświetlaczu 7-segmentowym. Gdy budowałam tamten miernik, nie miałam oscyloskopu. Analizatory logiczne były nieosiągalne dla przeciętnego Kowalskiego. Miałam tylko prostą sondę TTL. Z tego powodu uruchomienie miernika trwało kilka dni. Samo wiercenie PCB pochłonęło cały dzień, bo na płytce było ponad 700 otworów.

Mimo że konstrukcja była dosyć nietypowa, redakcja „Radioelektronika“ nie była zainteresowana publikacją, a konkurencyjne czasopisma jeszcze nie istniały. Dlaczego nie byli zainteresowani? Tego nie wiem. Może nie chcieli uwierzyć, że młody człowiek może zaprojektować tak skomplikowane urządzenie, wykonać w domu dwuwarstwową PCB i całość działa. Teraz jest inaczej. Płytek nie trzeba robić w domu, a AVT wykona prototypowe płytki nieodpłatnie.

Czy teraz do uruchomienia prezentowanego licznika wymagany jest oscyloskop i/lub analizator logiczny? Tylko jeśli wystąpią jakieś problemy, to bez oscyloskopu czy analizatora stanów logicznych pewnie się nie obejdzie. Jednak szansa na bezproblemowe uruchomienie miernika są bardzo duże.

Rys.2 Bezpośrednia metoda pomiarowa (licznik częstotliwości i czasu)

Przed opisaniem konstrukcji przybliżę metody pomiaru częstotliwości i czasu, bo czy pomiar dokonywany jest z użyciem układów TTL, CPLD/FPGA, czy mikrokontrolera, zasada pomiaru nie zmieniła się od lat. Pierwsza metoda pomiaru to metoda bezpośrednia – rysunek 2. Generator wzorcowy poprzez zespół dzielników wytwarza przebieg o okresie wzorcowym.

W przykładzie z rysunku 2 poza podstawowym sekundowym okresem (1Hz) jest jeszcze 10 sekund (0,1Hz), 100ms (10Hz) i 10ms (100Hz). Sygnał wzorcowy trafia na dzielnik przez dwa, w tym przypadku zbudowany z przerzutnika T. Zakładając, że wybrano sygnał wzorcowy 1Hz, na wyjściu przerzutnika pojawi się sygnał o okresie dwóch sekund (0,5Hz), gdzie stan wysoki będzie trwał sekundę, tak samo jak i stan niski. W czasie stanu wysokiego na wyjściu bramka przepuści do licznika liczbę impulsów odpowiadającą mierzonej częstotliwości, przykładowo sygnał 1kHz spowoduje zliczenie 1000 impulsów.

Taka metoda pomiaru jest dobra dla wysokich częstotliwości. Miernik cyfrowy, zależnie od momentu, w którym rozpoczyna pomiar, może zliczyć faktyczną liczbę impulsów lub o jeden mniej (zauważy jedno zbocze). W konsekwencji ostatnia cyfra może się zmieniać podczas pomiarów. Dlatego w przypadku mierników cyfrowych podaje się dokładność w procentach i cyfrach wyświetlacza. W tym przypadku będzie to ±1.

Gdy mierzona częstotliwość jest niska, przykładowo 10Hz, bramkując sygnałem 1 sekundy, możemy uzyskać wynik 10 lub 9. Daje to też 10% niedokładności. Dla porównania, bardzo kiepski kwarc 100ppm ma dokładność 0,01%. Wynika z tego, że dopiero gdy mierzymy częstotliwość 10kHz niedokładność kwarcu może o sobie dać znać. Z tego powodu przy pomiarze niskich częstotliwości lepsza jest metoda pośrednia – rysunek 3.

Rys.3 Pośrednia metoda pomiarowa (niskie częstotliwości)

W tym przypadku sygnał wejściowy trafia na dzielnik przez dwa, dzięki czemu na wyjściu pojawia się stan niski trwający tyle, co okres mierzonego sygnału. Generator wzorcowy generuje sygnał o wysokiej częstotliwości, który trafia na bramkę. Jak widać, zamienione zostały role generatora i sygnału wejściowego. Zakładając, że na wejście podany jest sygnał mierzony o częstotliwości 2Hz, którego okres trwa 500ms, a generator wzorcowy generuje 1000Hz (1kHz), licznik zliczy 500 impulsów.

Zgodnie ze wzorem Tx = N / Fwz, okres sygnału mierzonego wynosi 500 / 1000Hz = 0,5Hz = 500ms, częstotliwość zaś, według wzoru Fx=Fwz/N, wynosi 1000Hz / 500 = 2Hz. Ze względu na to, że w czasach „nieprocesorowych” takie obliczenia do łatwych nie należały, liczniki częstotliwości najczęściej mierzyły metodą bezpośrednią. Liczniki na rysunkach 2 i 3 pokazano w postaci uproszczonej, nie miałby prawa w praktyce działać poprawnie, bo nie są zerowane przed rozpoczęciem zliczania. Praktyczna realizacja licznika wyglądać może jak na rysunku 4.

Rys.4 Praktyczna realizacja licznika częstotliwości i czasu

W czasie stanu wysokiego na wyjściu przerzutnika T bramka przepuszcza impulsy, które są zliczane. Opadające zbocze sygnału na wyjściu przerzutnika wyzwala multiwibrator, który przepisuje zliczoną wartość do przerzutników LATCH, natomiast opadające zbocze pierwszego multiwibratora wyzwala kolejny, który zeruje licznik, przygotowując go do kolejnego pomiaru.

Bardziej rozbudowane liczniki miały synchronizację sygnału bramkującego z mierzonym przebiegiem, dzięki czemu wynik pomiaru nie zmieniał ostatniej cyfry, oczywiście o ile badany sygnał był stabilny. Czasem liczniki były budowane na bazie liczników rewersyjnych z ustawianiem. Umożliwiało to wpisanie częstotliwości pośredniej, odejmowanie jej lub dodawanie przy pomiarze. Konstrukcja takiego licznika była skomplikowana i 37 układów scalonych nie wystarczało, a i pobór prądu zdecydowanie przekraczał 1,5A.

Po (nie)zbędnej teorii przejdźmy do opisu miernika. Układ zasilany jest napięciem 5–5,5V doprowadzonym do złącza J6 lub 5V na J9. Napięcie to można nieznacznie zwiększyć. Jego górną wartość ograniczają diody LED D1, D2 i D8 sterowane z portu PA11 oraz diody wyświetlaczy LED przyłączone do portów PA i PB. Miernik można zasilić napięciem do 6,5V. Układ U4 stabilizuje napięcie dla mikrokontrolera i wyświetlacza OLED, natomiast diody i wyświetlacze LED zasilane są z 5V.

Prototyp zasilany napięciem 5,5V pobierał ok. 100mA podczas wyświetlania „0.999985”, co wydziela na stabilizatorze U4 około 500mW mocy. Do jej rozproszenia wystarczy niewielka powierzchnia miedzi na płytce. Główną rolę w mierniku odgrywa mikrokontroler U1 STM32F401RCT6, który został wybrany ze względu na niską cenę w stosunku do możliwości. W swoim wnętrzu ma 256kB pamięci FLASH, 64kB RAM, 8 timerów, w tym dwa 32-bit, po kilka UART, SPI, I2C, do tego RTC, dwa układy watchdog, wiele innych udogodnień i ma FPU, co nie jest takie oczywiste w mikrokontrolerach ARM. Mikrokontroler jest taktowany sygnałem 8MHz, ale wewnętrzny PLL powiela tę częstotliwość do 84MHz.

Mikrokontroler steruje ośmioma multipleksowanymi wyświetlaczami 7-segmentowymi. Dodatkowe informacje są wyświetlane na wyświetlaczu OLED 128×64 piksele przyłączonym do J5, który komunikuje się z mikrokontrolerem przez magistralę I2C. Linie magistrali są podciągane rezystorami 2,2kΩ. Ponad dwa razy mniejsza wartość rezystorów niż najczęściej spotykana 4,7kΩ wynika z tego, że wyświetlacz pracuje w trybie FAST (400kHz), a do magistrali mogą być podłączone kolejne płytki przyłączone do J12.

Obsługę miernika umożliwia klawiatura składająca się z ośmiu przycisków oraz enkodera. Aby nie używać mikrokontrolera w większej obudowie, klawiatura obsługiwana jest, tak jak wyświetlacze – przez multipleksowanie. Ponieważ nie przewiduje się naciśnięcia więcej niż jednego przycisku w tym samym czasie, budowa klawiatury została uproszczona i nie zamontowano w niej diod separujących. To, ze względu na sterowanie jej razem z anodami wyświetlacza, powoduje fałszowanie wyświetlanej treści w przypadku naciśnięcia równocześnie więcej niż jednego przycisku oraz powoduje zwarcia pomiędzy portami mikrokontrolera. Krótkotrwałe zwarcia nie doprowadzą do ich uszkodzenia, ale takie postępowanie nie jest zalecane.

Enkoder jest przyłączony bezpośrednio do wejść mikrokontrolera. Sygnał wejściowy przechodzi przez prosty wzmacniacz zbudowany na tranzystorze T1. Mimo wypróbowania dwóch rozwiązań, o czym w dalszej części artykułu, nie byłam zadowolona z ich pracy. Dlatego zdecydowałam się pominąć wzmacniacz, bo i tak planowałam zaprojektować bardziej rozbudowane obwody wejściowe. Wejścia A, B, 1PPS i LATCH/RESET mikrokontrolera zabezpiecza transil D3. Złącze J10 umożliwia doprowadzenie zewnętrznego sygnału bramkującego; jeśli ta możliwość nie jest wykorzystana, należy zewrzeć piny 3 i 4 złącza. J11 umożliwia komunikację z modułem GSM oraz sterowanie generatorem VCO.

Na USART dostępny na złączu J7 wysyłane są informacje o zmierzonej częstotliwości i czasie. Parametry transmisji 921600 8N1. J8 służyła do prób z wyświetlaczem komunikującym się przez SPI. Na razie ta funkcja nie jest wykorzystana. J3 umożliwia zaprogramowanie mikrokontrolera. W J2 wykorzystane jest na razie tylko wyprowadzenie numer dwa umożliwiające przechwycenie i zresetowanie licznika B.

Niewykluczone, że gdy Czytelnicy wykażą zainteresowanie poparte listami do redakcji, funkcja zatrzaskiwania i resetowania zostanie rozdzielona. Wtedy to wykorzystane będzie kolejne wyprowadzenie złącza J2. J4 umożliwia podłączenie rezonatora kwarcowego 32kHz i baterii, co pozwoli uruchomić RTC. Do J13 można podłączyć konwerter USB-UART, który może zapewnić komunikację z mikrokontrolerem (złącze J7).

Pamięć EEPROM U3a lub U3b jest konieczna tylko wtedy, gdy wymagane jest, aby ustawienia miernika były zapamiętane po wyłączeniu zasilania. Czytelników może zastanowić, dlaczego EEPROM nie została emulowana w pamięci FLASH. Otóż STM32F401 ma pięć stron pamięci o rozmiarach 4×16kB, 64kB i 128kB. EEPROM najlepiej emulować na ostatnich stronach pamięci, w konsekwencji 192kB zostałoby stracone. Jeśli skorzystać z pierwszych stron po 16kB, aby zapisać kilkadziesiąt bajtów w emulowanym EEPROM, trzeba poświęcić 48kB FLASH (strona 0 skok do programu, strony 1 i 2 na EEPROM), tyle ile RAM miał ZX-Spectrum :).

Pod tym względem seria F4 nie jest zbyt atrakcyjna. Miałam dylemat, czy zastosować pamięć w obudowie TO-92, czy prawie dwa razy tańszą w SOIC-6. W prototypie zdecydowałam się na TO-92, ale w docelowej płytce pozwoliłam wybrać użytkownikowi typ pamięci pomiędzy tanią, ale trudniejszą w montażu SOIC-6, a droższą, ale łatwą do wlutowania TO-92.

Kilka słów o oprogramowaniu - modułowy licznik częstotliwości i czasu

Program napisano z wykorzystaniem CubeIDE. Zajmuje 85kB FLASH z dostępnych 256, używa 10kB RAM z dostępnych 64kB. Z dostępnych ośmiu timerów wykorzystano siedem, plus systemowy generujący przerwania co 1ms, przy czym do samego pomiaru częstotliwości i czasu wystarczą cztery.

Rys.5 Pomiar częstotliwości realizowany przez timer1 ustawiony w tryb GATED MODE

Pomiar częstotliwości realizuje timer1 ustawiony w tryb GATED MODE – rysunek 5. Sygnał taktujący licznik jest pobierany z wejścia „ETR1” (PA12, pin 45), zliczanie bramkuje „TI1FP1” (PA8, pin 41). Ze względu na to, że licznik jest 16-bitowy, starsze słowo zliczane jest programowo w przerwaniu.

uint16_t volatile timH;
void irqTim1update(){
timH++;
}

Sygnał bramkujący wywołuje przerwanie

uint32_t volatile Freq;
void irqTim1trigger(void){
Freq = TIM1->CNT | timH << 16;
TIM1->CNT = timH = 0;
FreqAend = true;
}

Aby uniknąć czasochłonnych obliczeń zmiennoprzecinkowych (przeliczanie częstotliwości na czas), w przerwaniu jest wykonywana tylko prosta operacja przesuwania i dodawania oraz ustawiana flaga „FreqAend” dla pętli głównej programu. Dzięki temu czasochłonne operacje wykonywane są w pętli głównej, a nie w przerwaniu. Chwila odczytu licznika timera 1 nie ma większego znaczenia, ponieważ ze względu na bramkowanie nie zmienia on już swej wartości.

Rys.6 Pomiar czasu zrealizowany za sprawą 32-bitowego licznika w trybie COMBINED MODE INPUT PWM

Pomiar czasu jest zrealizowany jeszcze prościej, a to za sprawą 32-bitowego licznika w trybie COMBINED MODE INPUT PWM – rysunek 6. Ze względu na to, że HAL dla STM32 nie zawsze jest wygodny, konfigurację licznika zrealizowano, pisząc bezpośrednio do rejestrów.

TIM2->ARR = UINT32_MAX;
TIM2->PSC = 0;
TIM2->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_1;
TIM2->CCER = TIM_CCER_CC2P | TIM_CCER_CC1E | TIM_CCER_CC2E;
TIM2->SMCR = TIM_SMCR_TS_2 | TIM_SMCR_TS_0 | TIM_SMCR_SMS_2;
TIM2->CR1 = TIM_CR1_CEN;

W tym przypadku nie są używane przerwania. Pomiar czasu impulsu i okresu jest mierzony sprzętowo, więc wystarczy w programie głównym sprawdzać flagę przerwania, a gdy ustawiona odczytać rejestry. Realizuje to poniższa sekwencja rozkazów.

if( TIM2->SR & TIM_IT_TRIGGER ) {
// Czy flaga wyzwolenia ustawiona ?
TIM2->SR &= ~TIM_IT_TRIGGER; //Kasuj flagę
impuls = TIM2→CCR2; Okres = TIM2→CCR1; }
Rys.7 Timer 4 generuje sygnał PWM  służący do sterowania generatorem VCO

Timer 3 mierzy częstotliwość wejścia B tak samo jak i timer 1 wejścia A. Przewidziano możliwość pracy wejścia B w roli licznika zdarzeń. Opadające zbocze na wejściu PC12 (pin 53) odczytuje stan licznika, przepisuje do zmiennej, po czym zeruje licznik. Tę samą funkcjonalność można uzyskać z klawiatury miernika. Timer 4 generuje sygnał PWM (rysunek 7) służący do sterowania generatorem VCO, ale ze względu na to, że potrzebna jest do tego dodatkowa płytka z generatorem (AVT3276), nie będę teraz przybliżała szczegółów podobnie jak i pracy timera 11 (rysunek 8), którego zadaniem jest pomiar czasu sygnału wzorcowego 1Hz, aby korygować napięcie na VCO.

Rys.8 Timer 11 - wybór trybu

Timer 5 (rysunek 9) generuje sygnał GATE. Jego nastawy są modyfikowane w programie tak, aby uzyskać sygnał bramkujący o czasach 100ms, sekundy, 10 sekund lub 100 sekund. Sygnał ten jest wyprowadzony na zewnątrz przez J10. Dzięki temu zewnętrzny multiplekser sterowany linią „Gate- MUX” może doprowadzić do wejść bramkujących timerów 1 i 3 sygnał z mikrokontrolera lub zewnętrznego źródła.

Rys.9 Timer 5 generuje sygnał GATE

Timer 10 (rysunek 10) służy do odmierzania mikrosekundowych odcinków czasu na potrzeby interfejsu 1-Wire. Najlepszym sposobem obsługi tegoż interfejsu jest UART, ale dwa są zajęte na inne cele (komunikacja z terminalem i moduł GPS), a trzeciego nie da się użyć, bo występuje konflikt z innymi peryferiami – rysunek 11. Tak oto, na potrzeby banalnego, wydawałoby się, licznika częstotliwości wykorzystano siedem z ośmiu dostępnych timerów, w tym dwa 32-bitowe oraz jeden wbudowany w architekturę ARM. W mierniku skorzystano z wielopoziomowego systemu przerwań (rysunek 12).

Rys.10 Timer 10 służy do odmierzania mikrosekundowych odcinków czasu na potrzeby interfejsu 1-Wire

Krytyczne czasowo operacje realizowane są przez przerwania. Tam, gdzie się dało odciążyć CPU (wysyłanie danych przez I2C do wyświetlacza OLED, wysyłanie danych przez UART), skorzystano z dobrodziejstw DMA, dobrodziejstwa niedostępnego w AVRmega/tiny. W pętli głównej obsługiwany jest licznik watchdog, po czym CPU jest usypiany, dzięki czemu zmniejsza się emisja EMI.

Rys.11 Brak możliwości użycia UART

Po wybudzeniu przez przerwanie, czyli nie później niż po 1ms (przerwanie systemowe „SysTick”), sprawdzana jest zawartość buforów UART GSM. Pozwala to określić, z ilu satelitów jest odbierany sygnał. W kolejnym kroku obsługiwana jest dioda „GATE” na panelu przednim. Jeśli miernik pracuje w trybie częstościomierza, dioda odzwierciedla stan wejścia bramkującego PA8, a jeśli w trybie miernika czasu – odzwierciedla stan wejścia sygnału PA12.

Następnie wykonywane są, o ile istnieje taka potrzeba, zapisy do pamięci EEPROM. Pierwotnie funkcje zapisu EEPROM DS2431, przeniesione z AVR (zaleta C, Basic takich „luksusów” nie zapewnia), „blokowały” CPU na 10ms przy zapisie każdej strony, co dawało łączny czas zapisu struktury konfiguracji EEPROM 80ms. Nie wpływało to na pracę miernika, bo pomiary realizowane są sprzętowo i na przerwaniach, ale nieładnie wyglądało zatrzymanie odświeżania OLED przy odliczaniu czasu bramkowania. Z tego powodu funkcje zostały wzbogacone o nieblokujące.

Rys.12 Wielopoziomowy system przerwań

Podczas przenoszenia funkcji obsługi 1-Wire wspomagano się analizatorem logicznym i emulatorem/skanerem 1-Wire – fotografia 1 (artykuł opisujący emulator znajduje się w „Elektronice Praktycznej“ 7/2020), który wraz z programem terminala i debugerem ułatwił pracę – rysunek 13. Po przeniesieniu podstawowej komunikacji zrealizowano odczyt w szybkim trybie overdrive – rysunek 14.

Fot.1 Analizator logiczny i emulatorem (skanerem) 1-Wire

Po ewentualnej obsłudze EEPROM sprawdzana jest klawiatura, a właściwie bufor klawiatury obsługiwany w przerwaniach. Po tym następuje obsługa wyświetlacza OLED oraz wypełniany jest bufor wyświetlacza LED, obsługiwanego, jak się łatwo domyślić, w przerwaniu SysTick wywoływanym co milisekundę. Na końcu pętli głównej następuje wysłanie danych na terminal. Typowy czas obiegu pętli głównej to 2,2μs. W tym czasie AVR taktowany zegarem 16MHz wykona 35,2 taktu, co daje średnio 20 rozkazów. Montaż i uruchomienie licznika zostaną omówione w następnym numerze.

Rys.13 Program terminala i debuger
Rys.14 Odczyt w szybkim trybie overdrive
Firma:
Tematyka materiału: miernik częstotliwości, timer
AUTOR
Źródło
Elektronika dla Wszystkich wrzesień 2020
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Edukacja
1/10 Jak działa rezystor LDR?
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"