Projekt miał na celu stworzenie sterowania dla topologii half-bridge z możliwością ustawiania częstotliwości za pomocą programu na komputerze. Dodatkowo układ posiada synchroniczne próbkowanie przebiegu prądu w celu dokładnego pomiaru fazy oraz amplitudy i wykreślenia wykresu wartości tych parametrów na PC. Tego typu układ przydaje się do pomiaru transformatorów impulsowych (w tym wypadku używanych w topologii half-bridge lub full-bridge) w otwartej pętli. Możemy dzięki temu określić maksymalne wzmocnienie naszego układu oraz przy odpowiednim zmodyfikowaniu oprogramowania wykreślić wykres Bodego. Jednocześnie projekt jest rozwinięciem poprzedniego oprogramowania na którym robiłem między innymi takie „zabawki”:
Oczywiście to nie jedyne możliwości takiego układu, możliwe jest nawet generowanie sinusa na wyjściu za pomocą SPWM (https://www.sciencedirect.com/topics/engineering/full-bridge-inverter fig 1.18), służyć do zasilania cewek tesli czy innych urządzeń gdzie wymagany jest przebieg napięcia przemiennego.
Posiadając gotową platformę można się skupić na tworzeniu własnego oprogramowania lub wykorzystaniu gotowego oprogramowanie w celu zbadania swojego dzieła, dzięki czemu można ograniczyć przestrzeń gdzie można popełnić błąd a co za tym idzie rozwijanie swoich pomysłów będzie dużo łatwiejsze. Jeśli ktoś jest ciekawy czy jego pomysł byłby możliwy do zrealizowania na tego typu urządzeniu to śmiało można o to zapytać.
Jak ściągnąć i uruchomić kod.
Kod można ściągnąć z repozystoriów na github:
https://github.com/marcinszajner/Half-bridge-driver-MCU
https://github.com/marcinszajner/Half-bridge-driver-python
1. Zainstallować cygwin z make
2. Dodać cygwin bin folder do zmiennych środowiska
2. download gnu toolchain
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
3. Dodać gnu toolchain do zmiennych środowiska
4. Zainstalować openOCD
5. Dodać openOCD bin do zmiennych środowiska
6. Zainstalować sterowniki st-link
7. Sklonować repozytorium Half-bridge-driver-MCU
8. Wywołać make w folderze projektu
9. Aby zaflashować uC wykonaj make flash.
1. Zainstaluj python 3.8
2. Zainstaluj pyCharm i skonfiguruj go dla python 3.8
3. Zainstaluj Qt designer
4. Sklonuj repozytorium Half-bridge-driver-python zaciągnij project do pyCharm
5. Zainstaluj requirements.txt (python -m pip install -r requirements.txt) lub zrób to poprzez pyCharm
6. Uruchom main w pycharm
Aby edytować interface graficzny polecam użyć Qt designer. Wystarczy w nim otworzyć plik gui.main.ui, edytować a następnie skryptem toPyCode.sh przerobić go w plik .py
A jak to działa w praktyce? O to nagranie prezentujące działanie układu:
Hardware
Niestety schematy do aktualnej prototypowej wersji przepadły, jednak załączam schemat ideowy oraz opis użytych elementów.
Do pomiaru prądu wykorzystuję przekładnik prądowy (CS1050L). Sygnał z przekładnika przechodzi przez mostek prostowniczy a następnie na rezystor pomiarowy 15Ohm. Wykorzystując fakt że, wyjście przekładnika prądowego jest źródłem prądowym to diody w mostku prostowniczym nie wprowadzają błędu w pomiarze. Pomiar napięcia na rezystorze pomiarowym dokonuję poprzez ADC z uC. Chociaż na wejściu do ADC nie mam żadnego filtra dolnoprzepustowego to wyniki pomiaru w rezonansie dla pierwszej harmonicznej są bardzo dobre i porównywalne do I-prober 520. Jednakże sygnał na rezystorze jest mocno zniekształcony co wymaga poprawy w nowszej wersji PCB.
Jako sterownika half-bridge używam l6384. Nie jest to jednak najlepszy sterownik dla częstotliwości powyżej 100kHz. 500ns dead time jest zdecydowanie zauważalny.
400 mA source, oraz 650 mA sink current nie za bardzo nadają się do mosfetów z dużym ładunkiem bramki. Kiedy half bridge jest zasilany z 30V to nie ma takiego znaczenia, ale przy 325V będzie już miało duże znaczenie i powodować duże straty na komutowaniu kluczy.
MCU
Do celów energoelektronicznych na rynku są w sumie dostępne tylko dwa w miarę przystępne rodziny – C2000 od TI oraz seria dedykowanych SoCów od ST z cortex-m4. Zdecydowałem się na firmę ST i ich board NUCLEO64 z układem stm32g474. Jest to następca układu stm32f334. Głównym feature tego układu to HRTIM, który w wypadku aktualnego oprogramowania działa z częstotliwością… 2.72GHz co zapewnia rozdzielczość 368ps. Daje to możliwość bardzo dokładnego sterowania częstotliwością wyjściową półmostka.
Pobocznymi dodatkami, które znajdziemy na tym SoC to między innymi:
- Adaptive real-time accelerator
- FPU, DSP instructions
- CORDIC for trigonometric functions acceleration
- FMAC: filter mathematical accelerator
- CCM SRAM
- amplifiers, ADC, DAC, comparators
GUI PC
Do wykonania części oprogramowania po stronie PC wykorzystałem język skryptowy PYTHON z biblioteką PyQt. Dlaczego? Chciałem nabrać trochę doświadczenia w tym języku i jego wykorzystania w tego typu projektach. Użycie Qt designera dość mocno ułatwia tworzenie GUI oraz jego modyfikowanie, a sam python o dziwo sprawdził się jako język do tego typu aplikacji, chociaż nie obyło się od niespodzianek typu dziwnego zachowania się wątków czy metod nie działających zgodnie z opisem, ale na szczęście sporadycznie.
Ogólnie jestem zadowolony z wykorzystania Qt razem z python.
Program na uC
Ogólnie nie za wiele się tutaj dzieje. W funkcji main inicjalizujemy GPIO, ADC, crc, hrtim, USART z DMA. Następnie uruchomienie hrtim oraz przejście w stan mrugania diodą aby sprawdzać czy mikrokontroler nie zostaje za bardzo wywłaszczony przez przerwania.
Komunikacja z PC polega na odebraniu wiadomości z żądaniem, odpowiednie przetworzenie i w razie potrzeby wysłania odpowiedzi. Kod po stronie PC dba aby była wysyłana tylko jedna wiadomość, która wymaga odpowiedzi. Aktualnie istnieją tylko dwa typy wiadomości:
protocol_change – Wiadomość nie wymagająca odpowiedzi, zmieniająca stan pracy układu (aktualnie częstotliwość)
protocol_data_req – Wiadomość z żądaniem o dane. Odpowiedzią jest protocol_data_resp
Samo próbkowanie jest zrealizowane poprzez przerwanie od ADC w trybie inject. ADC jest triggerowane przez compare unit hrtimera, co zapewnia próbkowanie w odpowiednim punkcie na osi czasu (w odpowiedniej fazie). Niestety to rozwiązanie jest kiepskie gdyż pozwala mi osiągnąć około 2.5MHz częstotliwości próbkowania, co jest trochę za niskim wynikiem i będzie wymagało przepisania funkcjonalności zbierania próbek.
USART z DMA działa prawie bezobsługowo, wystarczy podać pointer na początek bufforu oraz ilość bajtów do wysłania, tak więc nie zużywa za bardzo zasobów rdzenia.
Teoria przetwarzania sygnału
Fast fourier transformate jest algorytmem dla discrete fourier transfoemate, która to jest transformatą dla przestrzeni dyskretnej (nie ciągłej), a transformata fouriera zawiera się w transformacie Laplace.
Najlepiej obrazuje to przedstawienie graficzne.
Jest to szczególny przypadek transformaty Laplace. Liczbę s możemy przedstawić jako parę σ + jω, a transformata fouriera to przypadek gdy σ (sigma) jest równa zero. Czym w ogóle jest sigma? Jest to tłumienie, gdy biegun będzie się znajdować na osi omegi to wzmocnienie dla takiego układu dla pewnej wartości omega, będzie wynosić nieskończoność. Taka sytuacja występuje np. w obwodzie RLC gdy R = 0.
Tak więc korzystając z transformaty Fouriera tak naprawdę operujemy na wycinku transformaty Laplace dla sigma = 0. Niestety tracimy w takim wypadku informacje wynikające stanów przejściowych (nieustalonych), jak dla przykładu czasu zaniku sygnału dla filtra dolnoprzepustowego RC.
Jednak, jeśli nie interesują nas stany przejściowe i chcemy skupić się na przebiegach okresowych to możemy zastąpić s wartością jω lub wykonać od razu transformatę Fouriera.
Weźmy dla przykładu transfer function:
Przy technologii cyfrowej jednak nie analizujemy sygnału ciągłego (ani w czasie ani w wartościach) a pojedyncze punkty w przestrzeni – sygnał dyskretny.
Nie chce w tym wypadku zagłębiać się już w transformatę Z oraz DFT, tylko przejść na poziom abstrakcji FFT (moduł numpy korzysta z algorytmu Cooley-Tukey).
Poniżej przedstawię bardzo podstawowe informację, które jak najbardziej są użyteczne, jednak warto mieć świadomość że to nie wszystko co oferuje fft i DSP.
FFT wykonujemy na N elementowym wektorze próbek. Sam algorytm nie wie nic o częstotliwości, tą informację dostarcza użytkownik podczas analizy otrzymanego wektora liczb zespolonych. Dokładnie tak, wynikiem w transformacie Laplace jest wektor liczb zespolonych. Liczby te niosą dla nas wszystkie istotne informacje – długość wektora oraz nachylenie wektora do dodatniej osi liczb rzeczywistych dla korespondującej częstotliwości. Myślę że dla większości pojęcie magnitude nie jest obce i jest dość dobrze zrozumiałe, jednak z fazą jest trochę gorzej.
Czym jest faza? Faza nie jest niczym innym jak… czasem, a dokładnie czasem opóźnienia między jednym a drugim sygnałem. Jak to między dwoma sygnałami? Przecież w wektorze mamy tylko sygnał który próbkujemy. Tutaj musimy wspomnieć o oknie próbkowania. Aby uzyskać najlepszą dokładność dla algorytmu fft, pełna krotność okresu badanego sygnału powinna zawierać się w oknie próbkowania oraz powinna być to funkcja parzysta aby uzyskać zerowe przesunięcie w fazie. Jeśli zbadamy przebieg cos(50*2*pi*t) to uzyskamy piękną amplitudę oraz zerowe przesunięcie w fazie. Gdy jednak spróbujemy narysować cos(50*2*pi*(t+0.0025)) lub cos(50*2*pi*t + 0.785375) da nam przesunięcie w fazie 45 stopni.
Co jednak gdy próbki nie zawierają pełnej krotności badanego sygnału. Niestety wtedy jakość wyniku znacząco spada i pojawia się wyciek widma:
Aby temu przeciwdziałać możemy nałożyć funkcje okna, które pozwalają na zmniejszenie problemów wynikających z nie pełnej krotności badanego sygnału a przez to wyciekaniu widma.
Z powyższego powodu założeniem mojego oprogramowania było synchroniczne próbkowanie w celu uzyskania pełnej krotności okresu badanego sygnału. Dzięki takiemu zabiegowi, możemy uzyskać bardzo dokładną fazę sygnału oraz amplitudę wykorzystując bardzo małą ilość próbek. Dodatkowo sygnał nie wymaga dodatkowej obróbki w postaci nakładania funkcji okna czy interpolacji, więc przetwarzanie cyfrowe takiego sygnału przebiega bardzo szybko czy to na uC czy na PC. Aktualny program niestety nie pozwala na uzyskanie zbyt dużej częstotliwości próbkowania (8 próbek na okres) co nie pozwala na uzyskanie poglądu dla wyższych harmonicznych badanego sygnału, jednak będę próbował usprawnić program aby uzyskać 16 lub nawet 64 próbki na okres (dla pewnego zakresu częstotliwości) co już pozwoli na pogląd satysfakcjonującej ilości harmonicznych.
Sygnał pobieram z przekładnika prądowego z mostkiem prostowniczym, który wprowadza dwa znaczące zniekształcenia:
1. Sygnał nie jest już sinusem/cosinusem
2. Usuwa składową stałą
Przywrócenie sinusa jest bardzo proste, bazując na ciągu fouriera dla sygnału wyprostowanego:
Sumując kolejne harmoniczne oraz składową stałą odtwarzamy przebieg oryginalny z przesunięciem fazowym oraz podwójną częstotliwością. Jednak te zniekształcenia mają charakter stały i możemy je usunąć w procesie późniejszej analizy wyniku fft.
Większym problemem zaczyna się gdy badany układ posiada składową stałą. Jeśli mamy sygnał AC zawierający dodatkowo składową stałą to podejrzewam że jesteśmy ją w stanie analitycznie odtworzyć, jednak gdy składowa stała jest dominująca (sygnał jest DC) to nie widzę możliwości jej odtworzenia. Dlatego myślę o dodaniu rezystora pomiarowego aby na jego bazie mierzyć składową stałą sygnału i dodawać do uzyskanego sygnału z fft.
źródła
(1)
https://books.google.pl/books?id=866PDwAAQBAJ&pg=PA55&dq=plot+laplace+transform+phase&hl=pl&sa=X&ved=2ahUKEwis5eit-pnqAhUR7KYKHSxmDigQ6AEwAHoECAMQAg#v=onepage&q=plot%20laplace%20transform%20phase&f=false
(2)
https://books.google.pl/books?id=wnpTDwAAQBAJ&pg=PA270&lpg=PA270&dq=plot+laplace+transform&source=bl&ots=FcSk3jh376&sig=ACfU3U0eA5GwlKq1iJLGtXDtzUCcCWRi9Q&hl=pl&sa=X&ved=2ahUKEwi0yIOhmInqAhVDy6QKHWx-AvsQ6AEwD3oECAkQAQ#v=onepage&q=plot%20laplace%20transform&f=false
(3)
https://download.ni.com/evaluation/pxi/Understanding%20FFTs%20and%20Windowing.pdf
(4)
https://books.google.pl/books?id=GV5mDwAAQBAJ&pg=PA206&lpg=PA206&dq=rectified+sine+reconstruct+to+sine&source=bl&ots=FDUoKM0BpL&sig=ACfU3U0NirCTAEx5VCE9Omno_ODg5KmpIA&hl=pl&sa=X&ved=2ahUKEwiX1cbhy-LpAhWODewKHcfrA6UQ6AEwCnoECAkQAQ#v=onepage&q=rectified%20sine%20reconstruct%20to%20sine&f=false
Jako że za niedługo będę modernizować cały układ w między innymi bezprzewodową komunikację z PC, większą ilością wejść (3+1 przekładnik), poprawiał jakość torów pomiarowych i układu sterującego pół mostkiem to mam pytanie do was, co byście chcieli zobaczyć w takim układzie? Może układ dzięki dodatkowym funkcjonalnościom będzie przydatne większej rzeszy użytkowników?
Oczywiście to nie jedyne możliwości takiego układu, możliwe jest nawet generowanie sinusa na wyjściu za pomocą SPWM (https://www.sciencedirect.com/topics/engineering/full-bridge-inverter fig 1.18), służyć do zasilania cewek tesli czy innych urządzeń gdzie wymagany jest przebieg napięcia przemiennego.
Posiadając gotową platformę można się skupić na tworzeniu własnego oprogramowania lub wykorzystaniu gotowego oprogramowanie w celu zbadania swojego dzieła, dzięki czemu można ograniczyć przestrzeń gdzie można popełnić błąd a co za tym idzie rozwijanie swoich pomysłów będzie dużo łatwiejsze. Jeśli ktoś jest ciekawy czy jego pomysł byłby możliwy do zrealizowania na tego typu urządzeniu to śmiało można o to zapytać.
Jak ściągnąć i uruchomić kod.
Kod można ściągnąć z repozystoriów na github:
https://github.com/marcinszajner/Half-bridge-driver-MCU
https://github.com/marcinszajner/Half-bridge-driver-python
1. Zainstallować cygwin z make
2. Dodać cygwin bin folder do zmiennych środowiska
2. download gnu toolchain
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm
3. Dodać gnu toolchain do zmiennych środowiska
4. Zainstalować openOCD
5. Dodać openOCD bin do zmiennych środowiska
6. Zainstalować sterowniki st-link
7. Sklonować repozytorium Half-bridge-driver-MCU
8. Wywołać make w folderze projektu
9. Aby zaflashować uC wykonaj make flash.
1. Zainstaluj python 3.8
2. Zainstaluj pyCharm i skonfiguruj go dla python 3.8
3. Zainstaluj Qt designer
4. Sklonuj repozytorium Half-bridge-driver-python zaciągnij project do pyCharm
5. Zainstaluj requirements.txt (python -m pip install -r requirements.txt) lub zrób to poprzez pyCharm
6. Uruchom main w pycharm
Aby edytować interface graficzny polecam użyć Qt designer. Wystarczy w nim otworzyć plik gui.main.ui, edytować a następnie skryptem toPyCode.sh przerobić go w plik .py
A jak to działa w praktyce? O to nagranie prezentujące działanie układu:
Hardware
Niestety schematy do aktualnej prototypowej wersji przepadły, jednak załączam schemat ideowy oraz opis użytych elementów.
Do pomiaru prądu wykorzystuję przekładnik prądowy (CS1050L). Sygnał z przekładnika przechodzi przez mostek prostowniczy a następnie na rezystor pomiarowy 15Ohm. Wykorzystując fakt że, wyjście przekładnika prądowego jest źródłem prądowym to diody w mostku prostowniczym nie wprowadzają błędu w pomiarze. Pomiar napięcia na rezystorze pomiarowym dokonuję poprzez ADC z uC. Chociaż na wejściu do ADC nie mam żadnego filtra dolnoprzepustowego to wyniki pomiaru w rezonansie dla pierwszej harmonicznej są bardzo dobre i porównywalne do I-prober 520. Jednakże sygnał na rezystorze jest mocno zniekształcony co wymaga poprawy w nowszej wersji PCB.
Jako sterownika half-bridge używam l6384. Nie jest to jednak najlepszy sterownik dla częstotliwości powyżej 100kHz. 500ns dead time jest zdecydowanie zauważalny.
A - opóźnienie spowodowane propagowaniem się sygnału w obwodzie. B – Dead time sterownika.
Opóźnienie związane z propagacją sygnału sterującego nie powoduje żadnego problemu, jednak dead time o wartości 500ns co jest 1/20 całego sygnału poważnie wpływa na cały układ.
Opóźnienie związane z propagacją sygnału sterującego nie powoduje żadnego problemu, jednak dead time o wartości 500ns co jest 1/20 całego sygnału poważnie wpływa na cały układ.
400 mA source, oraz 650 mA sink current nie za bardzo nadają się do mosfetów z dużym ładunkiem bramki. Kiedy half bridge jest zasilany z 30V to nie ma takiego znaczenia, ale przy 325V będzie już miało duże znaczenie i powodować duże straty na komutowaniu kluczy.
MCU
Do celów energoelektronicznych na rynku są w sumie dostępne tylko dwa w miarę przystępne rodziny – C2000 od TI oraz seria dedykowanych SoCów od ST z cortex-m4. Zdecydowałem się na firmę ST i ich board NUCLEO64 z układem stm32g474. Jest to następca układu stm32f334. Głównym feature tego układu to HRTIM, który w wypadku aktualnego oprogramowania działa z częstotliwością… 2.72GHz co zapewnia rozdzielczość 368ps. Daje to możliwość bardzo dokładnego sterowania częstotliwością wyjściową półmostka.
Pobocznymi dodatkami, które znajdziemy na tym SoC to między innymi:
- Adaptive real-time accelerator
- FPU, DSP instructions
- CORDIC for trigonometric functions acceleration
- FMAC: filter mathematical accelerator
- CCM SRAM
- amplifiers, ADC, DAC, comparators
GUI PC
Do wykonania części oprogramowania po stronie PC wykorzystałem język skryptowy PYTHON z biblioteką PyQt. Dlaczego? Chciałem nabrać trochę doświadczenia w tym języku i jego wykorzystania w tego typu projektach. Użycie Qt designera dość mocno ułatwia tworzenie GUI oraz jego modyfikowanie, a sam python o dziwo sprawdził się jako język do tego typu aplikacji, chociaż nie obyło się od niespodzianek typu dziwnego zachowania się wątków czy metod nie działających zgodnie z opisem, ale na szczęście sporadycznie.
Ogólnie jestem zadowolony z wykorzystania Qt razem z python.
Program na uC
Ogólnie nie za wiele się tutaj dzieje. W funkcji main inicjalizujemy GPIO, ADC, crc, hrtim, USART z DMA. Następnie uruchomienie hrtim oraz przejście w stan mrugania diodą aby sprawdzać czy mikrokontroler nie zostaje za bardzo wywłaszczony przez przerwania.
Komunikacja z PC polega na odebraniu wiadomości z żądaniem, odpowiednie przetworzenie i w razie potrzeby wysłania odpowiedzi. Kod po stronie PC dba aby była wysyłana tylko jedna wiadomość, która wymaga odpowiedzi. Aktualnie istnieją tylko dwa typy wiadomości:
protocol_change – Wiadomość nie wymagająca odpowiedzi, zmieniająca stan pracy układu (aktualnie częstotliwość)
protocol_data_req – Wiadomość z żądaniem o dane. Odpowiedzią jest protocol_data_resp
Samo próbkowanie jest zrealizowane poprzez przerwanie od ADC w trybie inject. ADC jest triggerowane przez compare unit hrtimera, co zapewnia próbkowanie w odpowiednim punkcie na osi czasu (w odpowiedniej fazie). Niestety to rozwiązanie jest kiepskie gdyż pozwala mi osiągnąć około 2.5MHz częstotliwości próbkowania, co jest trochę za niskim wynikiem i będzie wymagało przepisania funkcjonalności zbierania próbek.
USART z DMA działa prawie bezobsługowo, wystarczy podać pointer na początek bufforu oraz ilość bajtów do wysłania, tak więc nie zużywa za bardzo zasobów rdzenia.
Teoria przetwarzania sygnału
Fast fourier transformate jest algorytmem dla discrete fourier transfoemate, która to jest transformatą dla przestrzeni dyskretnej (nie ciągłej), a transformata fouriera zawiera się w transformacie Laplace.
Najlepiej obrazuje to przedstawienie graficzne.
Jest to szczególny przypadek transformaty Laplace. Liczbę s możemy przedstawić jako parę σ + jω, a transformata fouriera to przypadek gdy σ (sigma) jest równa zero. Czym w ogóle jest sigma? Jest to tłumienie, gdy biegun będzie się znajdować na osi omegi to wzmocnienie dla takiego układu dla pewnej wartości omega, będzie wynosić nieskończoność. Taka sytuacja występuje np. w obwodzie RLC gdy R = 0.
Tak więc korzystając z transformaty Fouriera tak naprawdę operujemy na wycinku transformaty Laplace dla sigma = 0. Niestety tracimy w takim wypadku informacje wynikające stanów przejściowych (nieustalonych), jak dla przykładu czasu zaniku sygnału dla filtra dolnoprzepustowego RC.
Jednak, jeśli nie interesują nas stany przejściowe i chcemy skupić się na przebiegach okresowych to możemy zastąpić s wartością jω lub wykonać od razu transformatę Fouriera.
Weźmy dla przykładu transfer function:
Przy technologii cyfrowej jednak nie analizujemy sygnału ciągłego (ani w czasie ani w wartościach) a pojedyncze punkty w przestrzeni – sygnał dyskretny.
Nie chce w tym wypadku zagłębiać się już w transformatę Z oraz DFT, tylko przejść na poziom abstrakcji FFT (moduł numpy korzysta z algorytmu Cooley-Tukey).
Poniżej przedstawię bardzo podstawowe informację, które jak najbardziej są użyteczne, jednak warto mieć świadomość że to nie wszystko co oferuje fft i DSP.
FFT wykonujemy na N elementowym wektorze próbek. Sam algorytm nie wie nic o częstotliwości, tą informację dostarcza użytkownik podczas analizy otrzymanego wektora liczb zespolonych. Dokładnie tak, wynikiem w transformacie Laplace jest wektor liczb zespolonych. Liczby te niosą dla nas wszystkie istotne informacje – długość wektora oraz nachylenie wektora do dodatniej osi liczb rzeczywistych dla korespondującej częstotliwości. Myślę że dla większości pojęcie magnitude nie jest obce i jest dość dobrze zrozumiałe, jednak z fazą jest trochę gorzej.
Czym jest faza? Faza nie jest niczym innym jak… czasem, a dokładnie czasem opóźnienia między jednym a drugim sygnałem. Jak to między dwoma sygnałami? Przecież w wektorze mamy tylko sygnał który próbkujemy. Tutaj musimy wspomnieć o oknie próbkowania. Aby uzyskać najlepszą dokładność dla algorytmu fft, pełna krotność okresu badanego sygnału powinna zawierać się w oknie próbkowania oraz powinna być to funkcja parzysta aby uzyskać zerowe przesunięcie w fazie. Jeśli zbadamy przebieg cos(50*2*pi*t) to uzyskamy piękną amplitudę oraz zerowe przesunięcie w fazie. Gdy jednak spróbujemy narysować cos(50*2*pi*(t+0.0025)) lub cos(50*2*pi*t + 0.785375) da nam przesunięcie w fazie 45 stopni.
Co jednak gdy próbki nie zawierają pełnej krotności badanego sygnału. Niestety wtedy jakość wyniku znacząco spada i pojawia się wyciek widma:
Aby temu przeciwdziałać możemy nałożyć funkcje okna, które pozwalają na zmniejszenie problemów wynikających z nie pełnej krotności badanego sygnału a przez to wyciekaniu widma.
Z powyższego powodu założeniem mojego oprogramowania było synchroniczne próbkowanie w celu uzyskania pełnej krotności okresu badanego sygnału. Dzięki takiemu zabiegowi, możemy uzyskać bardzo dokładną fazę sygnału oraz amplitudę wykorzystując bardzo małą ilość próbek. Dodatkowo sygnał nie wymaga dodatkowej obróbki w postaci nakładania funkcji okna czy interpolacji, więc przetwarzanie cyfrowe takiego sygnału przebiega bardzo szybko czy to na uC czy na PC. Aktualny program niestety nie pozwala na uzyskanie zbyt dużej częstotliwości próbkowania (8 próbek na okres) co nie pozwala na uzyskanie poglądu dla wyższych harmonicznych badanego sygnału, jednak będę próbował usprawnić program aby uzyskać 16 lub nawet 64 próbki na okres (dla pewnego zakresu częstotliwości) co już pozwoli na pogląd satysfakcjonującej ilości harmonicznych.
Sygnał pobieram z przekładnika prądowego z mostkiem prostowniczym, który wprowadza dwa znaczące zniekształcenia:
1. Sygnał nie jest już sinusem/cosinusem
2. Usuwa składową stałą
Przywrócenie sinusa jest bardzo proste, bazując na ciągu fouriera dla sygnału wyprostowanego:
Sumując kolejne harmoniczne oraz składową stałą odtwarzamy przebieg oryginalny z przesunięciem fazowym oraz podwójną częstotliwością. Jednak te zniekształcenia mają charakter stały i możemy je usunąć w procesie późniejszej analizy wyniku fft.
Większym problemem zaczyna się gdy badany układ posiada składową stałą. Jeśli mamy sygnał AC zawierający dodatkowo składową stałą to podejrzewam że jesteśmy ją w stanie analitycznie odtworzyć, jednak gdy składowa stała jest dominująca (sygnał jest DC) to nie widzę możliwości jej odtworzenia. Dlatego myślę o dodaniu rezystora pomiarowego aby na jego bazie mierzyć składową stałą sygnału i dodawać do uzyskanego sygnału z fft.
źródła
(1)
https://books.google.pl/books?id=866PDwAAQBAJ&pg=PA55&dq=plot+laplace+transform+phase&hl=pl&sa=X&ved=2ahUKEwis5eit-pnqAhUR7KYKHSxmDigQ6AEwAHoECAMQAg#v=onepage&q=plot%20laplace%20transform%20phase&f=false
(2)
https://books.google.pl/books?id=wnpTDwAAQBAJ&pg=PA270&lpg=PA270&dq=plot+laplace+transform&source=bl&ots=FcSk3jh376&sig=ACfU3U0eA5GwlKq1iJLGtXDtzUCcCWRi9Q&hl=pl&sa=X&ved=2ahUKEwi0yIOhmInqAhVDy6QKHWx-AvsQ6AEwD3oECAkQAQ#v=onepage&q=plot%20laplace%20transform&f=false
(3)
https://download.ni.com/evaluation/pxi/Understanding%20FFTs%20and%20Windowing.pdf
(4)
https://books.google.pl/books?id=GV5mDwAAQBAJ&pg=PA206&lpg=PA206&dq=rectified+sine+reconstruct+to+sine&source=bl&ots=FDUoKM0BpL&sig=ACfU3U0NirCTAEx5VCE9Omno_ODg5KmpIA&hl=pl&sa=X&ved=2ahUKEwiX1cbhy-LpAhWODewKHcfrA6UQ6AEwCnoECAkQAQ#v=onepage&q=rectified%20sine%20reconstruct%20to%20sine&f=false
Jako że za niedługo będę modernizować cały układ w między innymi bezprzewodową komunikację z PC, większą ilością wejść (3+1 przekładnik), poprawiał jakość torów pomiarowych i układu sterującego pół mostkiem to mam pytanie do was, co byście chcieli zobaczyć w takim układzie? Może układ dzięki dodatkowym funkcjonalnościom będzie przydatne większej rzeszy użytkowników?
Cool? Ranking DIY