Fmeter. Automatyczny licznik częstotliwości 0,1Hz - 50MHz i czasu 20ns - 10s

Miejsce dobre do dyskusji nad własnymi projektami - pochwal się wszystkim co samodzielnie stworzyłeś.
ODPOWIEDZ

Czy miernik powinien znaleźć sie w ofercie AVT?

Tak, zmontowane urządzenie w obudowie.
0
Brak głosów
Tak, zmontowane urządzenie przystosowane do montażu w typowej obudowie.
1
100%
Tak, zmontowane urządzenie bez obudowy (do wbudowania - miernik panelowy).
0
Brak głosów
Tak, płytka + zaprogramowany układ.
0
Brak głosów
Tak, tylko PCB.
0
Brak głosów
Nie.
0
Brak głosów
 
Liczba głosów: 1

es2
-
Posty: 98
Rejestracja: 13 mar 2018, 9:47

Fmeter. Automatyczny licznik częstotliwości 0,1Hz - 50MHz i czasu 20ns - 10s

Post autor: es2 » 19 sty 2020, 17:50

Licznik częstotliwości i czasu na STM32F411 zamontowany na płytce KA-NUCLEO-F411CE. Wynik wyświetlany na nienadającym* się do użytku, przeznaczonym dla Arduino, module ośmiu wyświetlaczy LED sterowanych z układów 74HC595. Docelowo użyty będzie STM32F410RBT6 (12zł netto w TME).
Pomiary wykonywane są bardzo szybko. Pomiar częstotliwości 1.25Hz z rozdzielczością 1mH dokonywany jest w ciągu kilku sekund! Miernik "w boju" można zobaczyć na filmach https://www.youtube.com/playlist?list=P ... GtgPpYgrwI

Jak to działa?
Jeden timer mierzy czas trwania impulsu i jego okres. W tym samym czasie drugi timer, bramkowany trzecim, mierzy częstotliwość. Gdy jest ona mniejsza od 10kHz, częstotliwość jest wyliczana z okresu sygnału. Dzięki temu pomiar 1Hz z rozdzielczością 1mH nie trwa 1000 sekund (16 minut) lecz mniej niż 2 sekundy!
Program dosyć prostszy niż na AVR gdzie zwyczajnie brakuje timerów, które są mało funkcjonalne i wolne. Nie potrafią sprzętowo mierzyć czasu impulsu (tylko okres, pomiar czasu wymaga silnego wsparcia programowego) a jak uwzględnić, że STM jest 2 razy tańszy od AVR, który z bólem podoła zadaniu pomiaru to "oczywistą oczywistością" był wybór STM32 do tej konstrukcji.
Obsługa modułu wyświetlacza realizowana jest w przerwaniu systemowym 1ms. SPI skonfigurowano transmisję 16-bit co ułatwiło obsługę programową modułu. W przypadku AVR transmisja ograniczona jest do 8-bit, w konsekwencji albo w przerwaniu należy czekać na zakończenie transmisji pierwszego bajtu, co nie jest dobrym rozwiązaniem albo użyć transmisji w przerwaniach, co komplikuje program. W STM32 problem rozwiązany jest prosto i skutecznie. Gdyby trzeba jednak wysyłac więcej niż dwa bajty, można skorzystać z DMA, dobrego i skutecznego mechanizmu odciążającego CPU, znanego juz w latach 70 ale nieosiągalnego dla AVRtiny/mega.
W docelowym urządzeniu rolę wyświetlacza będzie pełnić hybryda 8*7-seg + LCD:
V2 przod.jpg
V2 przod.jpg (42.31 KiB) Przejrzano 833 razy
z tymże zamiast alfanumerycznego będzie graficzny:


[EDIT 2020-01-20 17:42]
Oprogramowanie obsługuje wyświetlacz graficzny OLED co można zobaczyć na filmie https://youtu.be/0dJfYwAFLlk i fotografiach.
duo DSCN1305.JPG
duo DSCN1307.JPG
duo DSCN1309.JPG
duo DSCN1310.JPG
Prezentowane urządzenie to prototyp, w docelowym wyświetlacze będą w tej samej barwie najprawdopodobniej niebieskiej.


[EDIT 2020-01-20 21:27]
W programie poprawiono formatowanie liczb, teraz są dosuwane do prawej. Na fotografiach pomiar częstotliwości 1,234567 Hz:
pomiar 1.234567 Hz DSCN1315.JPG
pomiar 1.234567 Hz DSCN1314.JPG
Przypominam, że sam pomiar trwa ok 1,2 sekundy, przy czym automatyka miernika potrzebuje poniżej 3 sekund aby dokonać pierwszego pomiaru. Metoda polegająca na zliczaniu impulsów, dla uzyskania rozdzielczości 1uHz (1E-6 Hz) trwałaby milion sekund - ponad 10 dni!


[EDIT 2020-01-21 11:04]
Nowa funkcja, wygaszenie zer nieznaczących z prawej strony:
wygaszenie zer nieznaczacych z prawej ON - DSCN1316.JPG
Be tej funkcji wynik był mniej czytelny:
wygaszenie zer nieznaczacych z prawej OFF - DSCN1317.JPG

WAŻNE!
Czy projekt ukaże się w postaci kitu AVT zależy od Czytelników.
Na razie odzewu nie ma.


-----------------------------------------------------
* - W module brak rezystorów ograniczających prąd segmentów a co gorsza anody wyświetlacza są sterowane bezpośrednio z wyjść rejestru 74HC595:
8 led module 74hc595.jpg
8 led module 74hc595.jpg (34.62 KiB) Przejrzano 834 razy
Dlaczego to działa i się nie uszkadza wymagałoby dokładniejszego omówienia i wynika z charakterystyki tranzystorów MOSFET. Używanie modułu jest dość ryzykowne, w prototypie jest o tyle korzystna sytuacja, że moduł zasilany jest napięciem 3,3V.
Ostatnio zmieniony 21 sty 2020, 17:17 przez es2, łącznie zmieniany 5 razy.

es2
-
Posty: 98
Rejestracja: 13 mar 2018, 9:47

Re: Fmeter. Automatyczny licznik częstotliwości 0,1Hz - 50MHz i czasu 20ns - 10s

Post autor: es2 » 21 sty 2020, 13:53

Kolejna funkcjonalność, licznik z funkcją resetu i przechwytywania. Poza wskazaniem stanu licznika, na OLED pokazywana jest częstotliwość sygnału wejściowego, czas trwania stanu wysokiego, niskiego, wypełnienia i przechwycona wartość:
Tryb CNT 10Hz - DSCN1330.JPG
Tryb CNT 100kHz - DSCN1334.JPG
Tryb CNT 1MHz - DSCN1338.JPG
Na filmie widać https://youtu.be/3-48iof8Rjw?list=PLdtk ... GtgPpYgrwI , że po zliczeniu 1000 impulsów, pojawia się separator w postaci kropki. Kolejny separator pojawia się po zliczeniu miliona impulsów. Nie wiem czy funkcja licznika jest przydatna, jeśli tak, to należy zastanowić się nad zwiększeniem liczby wyświetlaczy LED.


Po analizie cen wyświetlaczy monochromatycznych OLED i kolorowych TFT oraz fakcie, że uC spełniające wymogi dla miernika częstotliwości (2 szybkie timery) mają co najmniej 64kb RAM, zadecydowałem, że w konstrukcji docelowej zastosowany będzie kolorowy wyświetlacz TFT 128x128 lub 160x128 pikseli. . Taki wyświetlacz nie tylko uatrakcyjni wygląd przyrządu ale pozwoli dostosować kolor wyświetlanych jednostek do koloru wyświetlacza LED.

es2
-
Posty: 98
Rejestracja: 13 mar 2018, 9:47

Re: Fmeter. Automatyczny licznik częstotliwości 0,1Hz - 50MHz i czasu 20ns - 10s

Post autor: es2 » 25 sty 2020, 15:08

Mały krok dla programisty, duży dla projektu.
Zrealizowałem precyzyjny pomiar długich czasów. Dotychczasowe funkcje były dobre dla mierników o rozdzielczości 1:65536 Pomiar sekundy mógł się więc odbywać z rozdzielczością 15us. Gdy wzorcem jest kwarc o stabilności ok 50ppm wszystko jest ok, mamy rezerwę ok 3 krotną. Jeśli jedna wzorcem miałby być choćby wzorzec 1pp to rozdzielczość jest "na dzień dobry" 15 razy za mała, w praktyce 100 razy. Problem rozwiązała praca licznika przechwytującego w rozdzielczości 32-bit. Zaczęły się "chody". Liczniki 32-bit nie mogą pracować z maksymalną częstotliwością, to potrafią tylko 16-bit (chyba, ze coś mi umknęło). Po 3,5 godzinach pracy z płytką NUCLEO-L412RB-P udało się mierzyć długie czasy z rozdzielczością 32-bit
Pomiar 10sek i 1sek.png
Widać pomiar czasu 10 sek i 1 sekundy. Licznik w tym czasie zlicze 800 lub 80 milionów impulsów. Ze względu na to, ze licznik jest 16-bit, trzeba było posiłkować się dodatkowym licznikiem programowym w przerwaniach. Niby proste, przerwanie UPADATE i już. Niestety nie, jest to bardziej skomplikowane. W każdym razie udało się sprzętowo mierzyć młodsze 16-bit, przy niewielkim wspomaganiu sprzetu starsze 16-bir.

Łączny czas prac wstępnych na projektem ok 50h pozwala zbudować dwie wersje licznika:
1) "Prosty" ale tani licznik częstotliwości i czasu, którego parametry są w pierwszej wypowiedzi w temacie. GPS może byc wzorcem czasu ale tylko w roli bramkowania 1 sekunda / 10 czy 100 sekund. Ogranicza to możliwości miernika do precyzyjnego pomiaru częstotliwości zliczaniem impulsów. GPS, jak to GPS, nie wszędzie zadziała, synchronizacja może trwać i 20 minut.
2) Zaawansowany miernik. Synchronizacja z wzorcami jak GPS czy 225kHz i innym do 40..50MHz. Praca bez wzorca synchronizującego, na wszystkich zakresach bramkowania (100ms i większe) jak i przy pomiarze czasu dzięki precyzyjnemu (2ppm) generatorowi TXCO.


[EDIT 2020-01-25 19:21]
Dwie godzinki roboty i z dwóch timerów 16-bit powstał jeden 32-bit umożliwiając dokładny pomiar okresu i czasu stanu H jak i L w całkowicie sprzętowy sposób.
32bit czas okres.png
32bit czas okres.png (14.69 KiB) Przejrzano 562 razy
Dlaczego dobrego licznika częstotliwości i czasu nie da się wykonać na AVR?
Brakuje timerów. Aby liczyć czasy z rozdzielczością 32-bit i synchronizować się z GPS potrzeba 6 timerów! Do tego timer systemowy i osobny w roli licznika (to już dla wygody, bo sztuczkami programowymi rodem z Arduino można zaoszczędzić jeden timer). W sumie miernik będzie używał8 timerów!
Czemu aż tyle?
1) 16-bit do pomiaru częstotliwości + programowy aby uzyskać 32-bit.
2) 16-bit do sprzętowego pomiaru czasu młodsze 16-bit.
3) 16-bit do sprzętowego pomiaru czasu starsze 16-bit.
4) 16-bit generujący przebieg bramkujący pomiar częstotliwości.
5) 16-bit + programowy do pomiary okresu sygnału wzorcowego np GPS.
6) 16-bit (lub DAC jeśli można użyć) do generowania napięcia dla generatora TXCO.
7) Timer systemowy 1ms wbudowany w rdzeń.
8) Licznik impulsów, można skorzystać z 32-bit lub 16-bit + programowy starszej części 32-bit.

Na AVR zadanie możliwe do zrealizowania (robiłem) ale max częstotliwość 8MHz (6 timerów, w tym 5 16-bit mają tylko AVR w dużych obudowach a te max taktowanie 16MHz) czas z rozdzielczością 125ns. Dla porównania, 2..3 razy tańszy STM32F taktowany 168 pozwala na pomiar częstotliwości do 84MHz, czasów z rozdzielczością 12ns. W cenie Mega2560 można kupić STM32H7 taktowany 400..480MHz gdzie pomiar 200MHz i czasy 5ns nie są problemem.


[EDIT 2020-01-26 0:45]
Po zastanowieniu wybrałem uC dla wersji Tiny licznika. Docelowym uC bedzie STM32F401RB lub RC w cenie brutto 13,07 / 14,75 https://kamami.pl/szukaj?controller=sea ... it_search=. Prototyp powstaje na NUCLEO-F401RE https://kamami.pl/stm-nucleo-64/212018- ... &results=6. Poza samym uC, na płytce będzie stabilizator 3,3V i 8 tranzystorów lub scalony driver sterujący anodami wyświetlacza oraz kilkanaście elementów RC, przyciski, enkoder.
Parametry:
- Pomiar częstotliwości do 42MHz.
- Czas/okres 23ns..10s.
- Licznik zdarzeń 32-bit, wyświetlanie ograniczone do 8 cyfr. Gdy licznik zliczy ponad 1e8, ostatnia, najmłodsza cyfra wyjdzie poza wyświetlacz, podobnie po 1e9. Opcjonalne wejście B do 42Mhz np z preskalera. Pomiar podstawowy i z wejścia B wykonywane są równocześnie!
- Bramkowanie 100ms, 1s, 10s, 100s. Zamiast czekać ponad półtorej minuty lepiej mierzyć czas ale opcje 10 i 100s zostawiłem dla tradycjanolistów.
- Wejście wzorca częstotliwości 1Hz...65kHz
- Wyjście PWM VCO (gdy urządzenie będzie posiadać zewnętrzny, precyzyjny generator np TXCO).
- Gdy zewnętrznego generatora nie będzie, cyfrowa korekta pomiaru.
- Wyświetlacz 8xLED 7-seg WA + OLED 128x64.
- UART dla GPS.
- UART do komunikacji.
Jak na uC za mniej niż 15 zł nie ma chyba co narzekać?
Funkcje timerów:

Kod: Zaznacz cały

Tim1:	16-b F	GATED mode	Pomiar częstotliwości (max 42MHz)
Tim2:	32-bit	PW Input	Okres/czas impulsu rozdzielczość 23ns
Tim3:	16-b	GATED mode	Licznik zdarzeń / Wejście z preskalera
Tim4:	16-b	PWM		PWM do regulacji TXCO
Tim5:	32-bit	PWM		Sygnał GATE 100ms, 1s, 10s, 100s
Tim9:	16-b F	UP		10kHz dla multipleksowanego LED, regulacja jasności w 16 krokach
Tim10:	16-b F    nie używany
Tim11:	16-b F	Capture In	1pps	Pomiar wzorca 1 sek, rozdzielczość 11ns
Wersja Mega, prawdopodobnie na STM32H750 (może H743), będzie miała kolorowy wyświetlacz 160x128, prawdopodobnie 10 a nie 8 wyświetlaczy LED, pomiar większych częstotliwości (na pewno 100Mhz, może 200), pomiar czasu z większa rozdzielczością (na pewno 10ns, może 5). Rozbudowane obwody wejściowe, wbudowany preskaler do 1,3..1,5GHz, prawdopodobnie zamiast enkodera klawiatura z indywidualnymi opisami przystosowanymi do miernika. Komunikacja USB i RS485 izolowana galwanicznie.


[EDIT 2020-01-28 2:15]
Licznik mierzy wzorcowy przebieg z GPS. Odchyłka kwarcu zainstalowanego na NUCLEO jest mała:
8ppm_.png
8ppm_.png (16.12 KiB) Przejrzano 563 razy
Jaka stabilność na razie nie wiem. Pozostało zrobić sterowaniem PWM, który wytworzy napięcie dla TXCO. Kilka generatorów mam, gorzej z PCB dla nich (SMD). Jeśli uda się zmontować to wypróbuję działanie synchronizacji z GPS, jak nie to trzeba czekać za PCB.

ODPOWIEDZ