Spisu treści:

Pomiar częstotliwości i napięcia zasilania za pomocą Arduino: 6 kroków
Pomiar częstotliwości i napięcia zasilania za pomocą Arduino: 6 kroków

Wideo: Pomiar częstotliwości i napięcia zasilania za pomocą Arduino: 6 kroków

Wideo: Pomiar częstotliwości i napięcia zasilania za pomocą Arduino: 6 kroków
Wideo: Jak programować Arduino? Instrukcja warunkowa, pętle, typy zmiennych 2024, Lipiec
Anonim
Pomiar częstotliwości i napięcia zasilania za pomocą Arduino
Pomiar częstotliwości i napięcia zasilania za pomocą Arduino

Wstęp:

Celem tego projektu jest zmierzenie częstotliwości i napięcia zasilania, które w Indiach wynosi od 220 do 240 V i 50 Hz. Użyłem Arduino do przechwytywania sygnału i obliczania częstotliwości i napięcia, możesz użyć dowolnego innego mikrokontrolera lub płytki, którą masz. Obwód wymaga kilku elementów i jest dość dokładny dla wszystkich praktycznych celów.

Krok 1: Wymagane komponenty

  • Arduino Uno
  • Układ scalony LM358
  • Transformator obniżający napięcie (220 V do 12 V)
  • Kondensatory:

    • 0.1uF
    • 2x1uF
  • Rezystory:

    • 3x1kOhm
    • 2x100kOhm
    • 1,5kOhm
    • 3,3kOhm
    • 6,8 kΩ
  • 3 x dioda 1N4148
  • Deska do chleba i przewód połączeniowy (opcjonalnie)

Krok 2: Schemat ideowy

Schemat
Schemat
Schemat
Schemat

W powyższym obwodzie uzwojenie pierwotne transformatora jest podłączone do sieci zasilającej, a uzwojenie pierwotne jest podłączone do naszego obwodu pomiarowego

Krok 3: Zrozumienie obwodu

Zrozumienie obwodu
Zrozumienie obwodu
Zrozumienie obwodu
Zrozumienie obwodu
Zrozumienie obwodu
Zrozumienie obwodu

Zgodnie z funkcjonalnością obwód ten można podzielić na cztery części:

Odp.: obwód detektora przejścia przez zero

Obwód ten generuje impuls prostokątny 5 V, gdy fala sinusoidalna przechodzi z dodatniej na ujemną. Rezystor R1 w połączeniu z D1 i D2 ogranicza wahania napięcia wejściowego na złączu diody do -0,6 V do + 5,6 V (przy założeniu, że napięcie przewodzenia diody wynosi 0,6 V). Ponadto można zwiększyć zakres napięcia wejściowego obwodu, zwiększając wartość R1.

Rezystory R2 i R3 tworzą dzielnik napięcia, aby ograniczyć ujemne wahania napięcia do -0,24 wolta, ponieważ wejściowe napięcie w trybie wspólnym LM358 jest ograniczone do -0,3 wolta.

Rezystor R4, R5, kondensator C1 i wzmacniacz operacyjny (tutaj używany jako komparator) tworzą obwód wyzwalacza Schmitta, w którym rezystory R4 i R5 ustawiają histerezę na wejściu +49,5mV nad ziemią. Wyjście wyzwalacza Schmitta jest podawane do Arduino PIN2 w celu dalszego przetwarzania.

B: Izolacja i obniżanie napięcia

Jak sama nazwa wskazuje, ta część izoluje i obniża napięcie do około 12Vrms. Obniżone napięcie jest dalej podawane do obwodu oprzyrządowania.

C: obwód detektora szczytów

Obwód ten określa maksymalne napięcie szczytowe sygnału wejściowego. Dzielniki rezystorowe R6 i R7 zmniejszają napięcie wejściowe o współczynnik 0,23 (12Vrms jest zredukowane do 2,76Vrms). Dioda D3 przewodzi tylko dodatnią połowę cyklu sygnału. Napięcie na C2 wzrasta do wartości szczytowej wyprostowanego sygnału, który jest podawany na analogowy pin A0 Arduino w celu dalszego obliczenia napięcia.

Ponadto możesz zastąpić ten obwód precyzyjnym obwodem wykrywającym szczyty, takim jak te wymienione tutaj. Ale dla moich celów demonstracyjnych powyższy obwód będzie wystarczający.

D: Arduino

W tej części Arduino przechwytuje kwadratowe impulsy generowane przez obwód Schmitt Trigger i odczytuje napięcie analogowe z obwodu detektora szczytów. Dane są dalej przetwarzane w celu określenia okresu czasu (stąd częstotliwość) impulsu prostokątnego (który jest równy czasowi zasilania AC) i napięcia zasilania.

Krok 4: Obliczanie częstotliwości i napięcia

Obliczanie częstotliwości:

Za pomocą Arduino możemy zmierzyć okres czasu T sygnału. Impulsy fali prostokątnej z detektora przejścia przez zero są podawane na pin 2, skąd możemy mierzyć okres czasu każdego impulsu. Możemy użyć wewnętrznego timera Arduino (w szczególności Timer1), aby obliczyć okres czasu między dwoma narastającymi krawędziami impulsu prostokątnego za pomocą przerwań. Timer zwiększa się o 1 na cykl zegara (bez preskalera = 1), a wartość jest zapisywana w rejestrze TCNT1. Stąd zegar 16 MHz zwiększa licznik o 16 co mikrosekundę. Podobnie dla preskalera = 8 licznik czasu jest zwiększany o 2 co mikrosekundę. Stąd okres czasu między dwoma zboczami narastającymi

T = (wartość TCNT1) / czas potrzebny na każde zliczenie

Gdzie, czas potrzebny na każde zliczenie = preskaler / (taktowanie Arduino (16MHz)

Stąd częstotliwość f = 1/T = (szybkość zegara Arduino (16 MHz) / (preskaler * wartość TCNT!)

Stąd prędkość zegara (Hz) jest dana przez = (szybkość zegara Arduino (16 MHz)) / preskaler

a częstotliwość sygnału jest podana przez = (szybkość zegara Arduino

Odpowiednio, możemy obliczyć częstotliwość f z zależności f = 1/T.

Obliczanie napięcia:

Wbudowany ADC Arduino ma rozdzielczość 10 bitów (możliwe wartości = 2^10 = 1024), zwraca wartości z zakresu 0-1023. Aby obliczyć odpowiednie napięcie analogowe V, musimy użyć następującej zależności

V = (odczyt ADC) * 5/1023

Aby obliczyć napięcie zasilania Vs(rms) musimy wziąć pod uwagę przełożenie transformatora, dzielnik rezystorowy R6R7 oraz obwód detektora szczytów. Możemy po prostu zestawić różne czynniki/współczynnik jako:

Przekładnia transformatora = 12/230 = 0,052

Dzielnik rezystorowy = R7/(R6 + R7) = 0,23

Obwód detektora szczytowego = 1,414

Vs(rms) = V/(1,414*0,052*0,23) = (odczyt ADC) * 0,289

Należy zauważyć, że wartość ta jest daleka od wartości rzeczywistej, głównie ze względu na błąd rzeczywistej przekładni transformatora i spadek napięcia przewodzenia diody. Jednym ze sposobów na obejście tego jest określenie współczynnika po złożeniu obwodu. Czyli mierząc napięcie zasilania i osobno napięcie na kondensatorze C2 za pomocą multimetru, a następnie obliczając Vs(rms) w następujący sposób:

Vs(rms) = ((Napięcie zasilania * 5)/(Napięcie na C2 *1023))*(Odczyt ADC)

w moim przypadku Vs(rms) = 0,33*(Odczyt ADC)

Krok 5: Kod Arduino

#define volt_in A0 // pin odczytu napięcia analogowego

niestabilny uint16_t t_okres; uint16_t ADC_value = 0; wolt pływakowy, częst.; void isr() { okres_t = TCNT1; //zapisz wartość TCNT1 w t_period TCNT1 = 0; //resetuj Timer1 ADC_value = analogRead(volt_in); //odczytaj napięcie analogowe } float get_freq() { uint16_t timer = t_period; if(timer==0) zwraca 0; // aby uniknąć dzielenia przez zero w przeciwnym razie return 16000000.0/(8UL*timer); // częstotliwość określa f = clk_freq/(prescaler*timeperiod)} void setup() { TCCR1A = 0; TCCR1B = bit (CS11); //ustaw preskaler na 8 TCNT1 = 0; //resetuj wartość Timera1 TIMSK1 = bit(TOIE1); //włącz przerwanie przepełnienia Timera1 EIFR |= bit(INTF0); // wyczyść flagę przerwania INT0 Serial.begin(9600); } void loop() { attachInterrupt(0, isr, ROSING); //włącz przerwanie zewnętrzne (INT0) delay(1000); odłączPrzerwanie(0); częst = pobierz_częst(); wolt = wartość_ADC*0,33; Bufor ciągów; buf += Ciąg(częst, 3); buf += F("Hz\t"); buf += Ciąg(wolt); buf += F("Wolty"); Serial.println(buf); }

Krok 6: Wniosek

Wniosek
Wniosek
Wniosek
Wniosek

Możesz zmontować obwód w płytce prototypowej i dostosować kod oraz dodać kartę SD do przechowywania danych, które można później przeanalizować. Jednym z takich przykładów jest analiza napięcia i częstotliwości w godzinach szczytu.

Obwód, który zmontowałem w płytce prototypowej, używał LM324 (quad opamp) zamiast LM358 (dual opamp), ponieważ nie miałem tego układu scalonego w tym momencie, a ogólnokrajowa blokada z powodu pandemii COVID-19 utrudniła mi zdobycie nowego układu scalonego. Niemniej jednak nie wpłynęłoby to na działanie obwodu.

Zachęcamy do komentowania poniżej wszelkich sugestii i zapytań.

Zalecana: