Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pomiar napięcia skutecznego STM32F469

zdzisek999 05 Lut 2017 13:38 2082 55
  • #1 05 Lut 2017 13:38
    zdzisek999
    Poziom 7  

    Mam pytanie: jak obliczyć wartość napięcia skutecznego napięcia sinusoidalnego?
    Podaje sobie napięcie o amplitudzie 1V (+offset 1V) na kanał przetwornika ADC.
    I tu się pojawia problem. Jak powinienem napisać program, aby zbierać te próbki do jakiegoś bufora (rozumiem, że może być tablica float)? I dalej: jak policzyć tą wartość skuteczną? Wiem, że wzór wygląda: sum(U(n)^2)/N, wartość n-tej próbki, N- liczba próbek. Napisałem coś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Przetwornik jest taktowany częstotliwością 2MHz (już po preskalerze)
    Bardzo proszę o pomoc.

  • #2 05 Lut 2017 14:07
    Piotrus_999
    Poziom 39  

    zapomniał kolega na końcu podzielić i pierwiastek wyciągnąć.

    https://pl.wikipedia.org/wiki/Warto%C5%9B%C4%87_skuteczna

  • #3 05 Lut 2017 14:59
    zdzisek999
    Poziom 7  

    No masz rację. Moje błędy. Bardziej mi chodzi o to czy programowo jest dobrze? Przede wszystkim nie wiem czy te próbki zapisują się do tych tablic wektor i wektor_napiec. Nawet nie wiem jak to sprawdzić...

  • #4 05 Lut 2017 15:09
    Piotrus_999
    Poziom 39  

    Toopdłacz sobie jakieś napięcie (np przez potencjometr) - zmierz multimetrem i zobacz czy się zgadza z tym które odczytujesz ADC. No kolego - troche trzeba ruszyć kiepełę

  • #5 05 Lut 2017 15:27
    zdzisek999
    Poziom 7  

    To znaczy napięcie mierzy. Podaję napięcie na dzielnik, a zmienna do której przypisuję pomiar z ADC wskazuje circa about prawidłową wartość. Zmienną obserwuję w STMStudio. Tylko jeśli chodzi już o tablicę do której mają "wpadać" próbki z przetwornika - nie wiem jak sprawdzić zawartość tej tablicy. Czy są w niej te próbki? Korzystam ze środowiska As6 Eclipse.

  • #6 05 Lut 2017 15:31
    Piotrus_999
    Poziom 39  

    Jak wiesz jakie wartości napięcia możesz dostać i jaka jest częstotliwość sygnału i jak często mierzysz to będziesz wiedział czy wartości maja sens.

  • #7 05 Lut 2017 15:34
    zdzisek999
    Poziom 7  

    Problem w tym, że nie wiem jak się do nich dostać. W sensie jak sprawdzić zawartość tej tablicy tj. wartości w niej zapisanych?

  • #8 05 Lut 2017 15:39
    Piotrus_999
    Poziom 39  

    A jak klega sprawdził

    zdzisek999 napisał:
    a zmienna do której przypisuję pomiar z ADC wskazuje circa about prawidłową wartość
    . Jaka jest różnica podejrzenia zmiennej i tablicy?

  • #9 05 Lut 2017 15:44
    zdzisek999
    Poziom 7  

    Podgląd mam w STMStudio. Tam importuje się zmienne z maina i można w czasie rzeczywistym widzieć ich wartość. Natomiast nie można zaimportować tablicy... :/

  • #10 05 Lut 2017 15:55
    Piotrus_999
    Poziom 39  

    Skoro możesz w studio to dlaczego nie podejrzysz w debugerze

  • #11 05 Lut 2017 16:07
    Marek_Skalski
    Poziom 32  

    Tablice są błędnie indeksowane. Zaczynasz od 1 i kończysz na 20, a powinieneś zaczynać od indeksu 0 i kończyć na 19. W większości języków programowania liczenie zaczyna się od zera, co w przypadku tablic oznacza, że indeks ostatniego elementu jest o 1 mniejszy niż rozmiar tablicy. W Twoim programie, ostatni element może nadpisywać inne dane, a jego odczyt jest przypadkowy; należy do innej struktury.
    W jakim środowisku pracujesz? Jeżeli pod Eclipse, to nie ma nic prostszego niż zatrzymanie programu po zebraniu wyników i sprawdzenie zawartości tablicy w zakładce Variables lub Expressions. W ostateczności nawet w oknie podglądu zawartości pamięci.
    Sam proces zbierania wartości jest mało optymalny. Znacznie lepszą opcją jest wyzwalanie ADC z timera, przesyłanie danych z użyciem DMA do podwójnego bufora w pamięci. Wykonywanie obliczeń w przerwaniu DMA po zakończeniu połowy i całego transferu, czyli chwilę po zebraniu próbek w każdej połówce bufora, pozwoli uniknąć nadpisania danych nawet przy dość szybkim próbkowaniu.

  • #12 05 Lut 2017 19:16
    zdzisek999
    Poziom 7  

    Tak właśnie mam zamiar zrobić docelowo, żeby bezpośrednio z pamięci poprzez DMA zbierać te dane. Nie wiem co jest nie tak, ale w moim debuggerze nie wyświetlają się zmienne :/ przynajmniej te z maina, bo z innego pliku .c już mogą sie wyświetlać... Udało mi się to obejść, bo znalazłem w STMStudio możliwości importowania całej tablicy. Problem chyba też jest z moją płytką. Teraz zacząłem programować stm32F746G i mierzy normalnie w "czasie rzeczywistym" to napięcie.
    Dalej jednak nierozwiązany pozostaje problem tego debuggera, który nie chce wyświetlać mi moich zmiennych :(

  • #13 05 Lut 2017 19:29
    Freddie Chopin
    Specjalista - Mikrokontrolery

    zdzisek999 napisał:
    Dalej jednak nierozwiązany pozostaje problem tego debuggera, który nie chce wyświetlać mi moich zmiennych

    Zmienne lokalne zwykle są optymalizowane. Jeśli chcesz je oglądać w debuggerze, to albo trzeba kombinować (volatile, zmienne globalne/statyczne), albo trzeba zmniejszyć poziom optymalizacji.

  • #14 05 Lut 2017 19:32
    zdzisek999
    Poziom 7  

    Sorry, jeśli to trywialne, ale nie rozumiem, co masz na myśli mówić "zmniejszyć poziom optymalizacji."

  • #15 05 Lut 2017 19:37
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Chodzi o zmianę ustawień kompilacji w projekcie. Jeśli masz włączoną optymalizację typu -O1, -O2, -O3, -Os albo -Og, to istnieje szansa, że zmienne lokalne zostaną przez kompilator zoptymalizowane w tylko jemu znany sposób, przez co podgląd ich przez debugger będzie problematyczny. Dotyczy to jednak tylko zmiennych lokalnych automatycznych (wewnętrznych zmiennych w funkcji [bez statycznych]) - zmienne globalne czy lokalne dla pliku nie są w ten sposób modyfikowane, choć mogą zostać wywalone całkowicie, jeśli nie są używane.

  • #16 06 Lut 2017 09:37
    PDT
    Poziom 23  

    zdzisek999 napisał:
    Mam pytanie: jak obliczyć wartość napięcia skutecznego napięcia sinusoidalnego?
    Podaje sobie napięcie o amplitudzie 1V (+offset 1V) na kanał przetwornika ADC.
    I tu się pojawia problem. Jak powinienem napisać program, aby zbierać te próbki do jakiegoś bufora (rozumiem, że może być tablica float)? I dalej: jak policzyć tą wartość skuteczną? Wiem, że wzór wygląda: sum(U(n)^2)/N, wartość n-tej próbki, N- liczba próbek.


    WSKAZÓWKA: Ile jest warte 20 próbek (kilkanaście/dziesiąt mikrosekund) pomiarów przebiegu 50Hz? Nic, to wartość niemal losowa.

    Przemyślenia wymaga metodologia pomiaru. A więc przykładowo:
    - jaka jest maksymalna częstotliwość mierzonego przebiegu? Załóżmy 1kHz
    - ile minimalnie próbek na 1 okres przebiegu potrzeba aby osiągnąć wymaganą dokładność pomiaru? Przyjmijmy 8 próbek/okres
    Z tego wynika częstotliwość próbkowania 8000/sekundę.

    A teraz pytanie jak często dokonujemy odczytu? Co pół sekundy? Zatem:
    * POMIARY => w buforze cyklicznym musimy mieć 4000 ostatnio odczytanych. Bufor nie musi być 'float', nawet lepiej by był 'integer'. Z buforem związać trzeba zagregowaną sumę kwadratów, przy odczycie odejmujemy od niej kwadrat najstarszej wartości z bufora i dodajemy kwadrat aktualnej.
    * ODCZYTY => wartość bieżącą sumy kwadratów dzielimy przez ich liczność (4000) i skalujemy do 'float', pierwiastkujemy i ... jest gotowe.

    PS Z oczywistych względów wygodniej jest powyższe przykładowe wartości 'zaokrąglić' do informatycznego tysiąca (1024, 4096 itp.) :)

  • #17 07 Lut 2017 07:50
    94075
    Usunięty  
  • #18 07 Lut 2017 09:23
    chudybyk
    Poziom 25  

    albertb napisał:

    Rany, jak będę mierzył prądy i napięcia 3 fazowe zużyję prawie 100kB RAM na same bufory
    Autor powinien podać założenia pomiaru.
    Bo w najprostszym przypadku spełniającym podane (sinus) to mierzymy wartość maksymalną i skalujemy.

    Albert


    Może nie trzeba całej tablicy? Znamy częstotliwość sygnału mierzonego? Dla napięcia sieciowego to raczej tak. Dla innego wystarczy zwykle wielokrotność okresu, np.:
    Przyjąć czas pomiaru jako wielokrotność okresu (najprościej 1, ale można i 2 lub więcej) i w tym czasie dla każdej próbki wykonać podniesienie do kwadratu oraz sumować te kwadraty. Po upłynięciu czasu pomiaru dzielimy przez ilość próbek i liczymy pierwiastek. Potrzebujemy trzy zmienne - sumę kwadratów, ilość próbek oraz licznik czasu pomiaru.
    Oczywiście ilość próbek na okres powinna być sensowna.

  • #19 25 Lut 2017 15:42
    zdzisek999
    Poziom 7  

    Dziękuję wszystkim za aktywny udział w dyskusji. Aktualnie skupiam się na obliczeniu wartości skutecznej, ale docelowo będę chciał policzyć widmo sygnału napięciowego, do ok. 30 -ej harmonicznej.
    30x50Hz=1500Hz. Myślę, że 10 próbek na okres to zdecydowanie za mało, jeśli chce się liczyć w miarę dokładne widmo. Jeżeli przyjmę 50próbek/okres (najwyższej harmonicznej), stąd częstotliwość próbkowania powinna u mnie wynieść ~75kHz.
    Z tego co udało mi się policzyć (nie wiem czy dobrze), zegar dla samego przetwornika powinien wynosić 1MHz.

  • #20 25 Lut 2017 16:19
    michalko12
    Specjalista - Mikrokontrolery

    Żeby policzyć do 30 harmonicznej musisz mieć co najmniej 60 próbek na okres, dla FFT będą to 64 próbki, czyli obliczenia będą do 32 harmonicznej. Częstotliwość próbkowania powinna wynosić dokładnie 64x50 = 3200Hz.

  • #21 25 Lut 2017 16:29
    zdzisek999
    Poziom 7  

    Nie no chwila. 32-ga harmoniczna napięcia podstawowego 50Hz to f=32*50=1600Hz.
    Sinusoida o częst. 1600Hz. Żeby ją spróbkować 64 razy za okres, trzeba próbkować f=1600*64=102400=~1MHz. Czyż nie?

  • #22 25 Lut 2017 16:41
    michalko12
    Specjalista - Mikrokontrolery

    zdzisek999 napisał:
    Nie no chwila. 32-ga harmoniczna napięcia podstawowego 50Hz to f=32*50=1600Hz.
    Sinusoida o częst. 1600Hz. Żeby ją spróbkować 64 razy za okres, trzeba próbkować f=1600*64=102400=~1MHz. Czyż nie?


    Niezłe jaja! Ja rozumiem, że matematyka jest dla niektórych trudna, ale ten poziom podstawówki każdy powinien ogarnąć. Jeszcze długa droga do DSP przed tobą!

  • #23 25 Lut 2017 16:42
    Piotrus_999
    Poziom 39  

    A po co te dywagacje - po to masz timer aby wyzwalać w odpowiednich okresach czasu.

  • #24 25 Lut 2017 17:15
    michalko12
    Specjalista - Mikrokontrolery

    Piotrus_999 napisał:
    A po co te dywagacje - po to masz timer aby wyzwalać w odpowiednich okresach czasu.

    A co tu maja czasy wyzwalania, jak człowiek nie rozumie o co chodzi w FFT? 102400Hz to dla niego 1MHz, nie może pojąć, że do obliczenia 32 harmonicznej w sieci 50Hz potrzebne jest tylko 3200Hz.

  • #25 25 Lut 2017 17:36
    zdzisek999
    Poziom 7  

    No rozumiem, że 3200Hz to minimalna częstotliwość do spróbkowania sygnału 1600Hz, ale w praktyce fpr=2*f sygnału to chyba za mało

  • #26 25 Lut 2017 17:42
    Piotrus_999
    Poziom 39  

    dodaj "minimum" - większa ilość nie przeszkadza (poza czasem oblizeń)

  • #27 25 Lut 2017 17:47
    zdzisek999
    Poziom 7  

    No tak dokładnie, dlatego nie wiem skąd to wzburzenie u kolegi michalko12. Tym bardziej, że pisze

    Cytat:
    Częstotliwość próbkowania powinna wynosić dokładnie 64x50 = 3200Hz.
    :D

  • #28 25 Lut 2017 18:40
    michalko12
    Specjalista - Mikrokontrolery

    zdzisek999 napisał:
    No tak dokładnie, dlatego nie wiem skąd to wzburzenie u kolegi michalko12. Tym bardziej, że pisze


    Chcesz liczyć 32 harmoniczne to częstotliwość powinna tyle wynosić. Jeśli weźmiesz częstotliwość 6400 to będziesz liczył widmo 64 harmonicznych itp. FFT potrzebuje konkretną ilość próbek, więc nie możesz sobie przyjąć dowolnej ich liczby, np 5000/okres. Jeśli weźmiesz liczby próbek inne niż n=2^k *100 to będziesz liczył interharmoniczne, a nie harmoniczne 50Hz.

  • #29 25 Lut 2017 19:07
    zdzisek999
    Poziom 7  

    Hm no cóż. Ciekawa informacja i przyznam, nie widziałem, że jest górne ograniczenie narzucone na częstotliwość próbkowania. Dla przykładu, korzystałem z analizatora firmy a eberle, miał częstotliwość próbkowania ok. 42kHz, a wcale nie mierzył do 420-ej harmonicznej tylko co najwyżej do 100-ej. Zawsze jestem wdzięczny za to, jeśli ktoś chce się podzielić wiedzą.

  • #30 25 Lut 2017 19:33
    michalko12
    Specjalista - Mikrokontrolery

    zdzisek999 napisał:
    miał częstotliwość próbkowania ok. 42kHz, a wcale nie mierzył do 420-ej harmonicznej

    Decymacja to raz, a dwa, jeśli będziesz miał widmo harmonicznych liczone co 5Hz to nadal jest dobrze bo co 10 prążek to wieloktrotność 50Hz. Trzy, są większe możliwości korekcji przecieku.

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Wyszukaj w ofercie 200 tys. produktów TME