Spisu treści:

Pomiar napięcia True-RMS AC: 14 kroków
Pomiar napięcia True-RMS AC: 14 kroków

Wideo: Pomiar napięcia True-RMS AC: 14 kroków

Wideo: Pomiar napięcia True-RMS AC: 14 kroków
Wideo: UT139C woltomierz pomiar napięcia AC/DC 2024, Lipiec
Anonim
Image
Image
Demonstracja
Demonstracja

Dzisiaj użyjemy STM32 Maple Mini do odczytu AC. W naszym przykładzie otrzymamy wartość RMS sieci energetycznej. Jest to bardzo przydatne dla tych, którzy chcą monitorować sieć elektryczną pod kątem Internetu Rzeczy. Następnie stworzymy aplikację wykorzystującą moc obliczeniową Maple Mini, zastosujemy obwód elektroniczny umożliwiający akwizycję sygnału 127Vac, a także zastosujemy obliczenia średniej kwadratowej (RMS) na próbkach.

Krok 1: Demonstracja

W naszym dzisiejszym zespole mamy STM32, oprócz naszego obwodu analogowego, aby wprowadzić wejście 110. Aby uniknąć wstrząsów, izoluj rezystor, który wchodzi przez 110.

Obwód jest dość wrażliwy. Dostaję się z 110, ale zmniejszam go 168 razy za pomocą dzielnika napięcia i wkładam do wzmacniacza operacyjnego, który ma kilka funkcji.

Mamy też opcjonalne kondensatory do filtrowania źródła. Jeśli twoje źródło jest dobrej jakości, nie musisz ich używać.

Wejście AD jest obliczane przez oscyloskop, w którym widać sinusoidę, która nie wynosi 110 (ale jest dobrze uformowana). Inną rzeczą jest to, że napięcie w naszej sieci elektrycznej nie wynosi 110 (w rzeczywistości jest to 127 woltów). Ale jak przechodzimy przez stabilizator to dostosuje się do 115V.

Wartość wyświetlana na monitorze szeregowym jest obliczana w RMS, czyli wartością identyfikowaną przez Fluke Meter.

Krok 2: Wykorzystane zasoby

Wykorzystane zasoby
Wykorzystane zasoby

• Zworki

• klon mini

• Płyta prototypowa

• Wzmacniacz LM386

• Symetryczne źródło (+5V i -5V)

• Potencjometr wieloobrotowy 10k (lub potencjometr)

• Cztery kondensatory z poliestru 100nF

• Trzy rezystory 10k

• Cztery rezystory 470k

• Jeden rezystor 5k6

• Jedna dioda Zenera 1n4728A

Krok 3: Schemat blokowy

Schemat blokowy
Schemat blokowy

Krok 4: Schemat

Schemat
Schemat

Jest to obwód, który opracowałem na podstawie specyfikacji, które uważam za najlepsze do tego pomiaru, ale istnieje kilka innych przykładów, które można znaleźć w Internecie.

Krok 5: LM386 - Przypinanie

LM386 - Przypinanie
LM386 - Przypinanie

LM386 ma dwa wzmacniacze do kondycjonowania lub wzmacniania sygnału.

Krok 6: AmpOp - Dyferencjał (subtraktor)

AmpOp - Dyferencjał (subtraktor)
AmpOp - Dyferencjał (subtraktor)

Krok 7: AmpOp - sumator falowników

AmpOp - sumator falowników
AmpOp - sumator falowników

Krok 8: Klon Mini - Pinage

Klon Mini - Pinage
Klon Mini - Pinage

Piny zaznaczone na:

Czerwony >> Tolerancja 3V3

Zielony >> tolerancja 5V

Krok 9: Maple Mini - Przypinanie - a / D używane podczas przechwytywania

Maple Mini - Przypinanie - a / D używane w przechwytywaniu
Maple Mini - Przypinanie - a / D używane w przechwytywaniu

Podkreślam tutaj, że pin, którego użyłem to D11, który (w nomenklaturze STMicroelectronics) to PA0.

Krok 10: Montaż

montaż
montaż

Do naszego obwodu potrzebujesz źródła symetrycznego, takiego jak to, które stworzyliśmy dla tego projektu. W przeciwnym razie będziesz potrzebować dwóch źródeł.

Krok 11: Wykres z uzyskanymi danymi

Wykres z uzyskanymi danymi
Wykres z uzyskanymi danymi

Krok 12: Obliczanie wartości skutecznej

Obliczanie wartości skutecznej
Obliczanie wartości skutecznej

Krok 13: Kod źródłowy

Kod źródłowy - Definicje i stałe

Najpierw zdefiniowaliśmy odczyt pinów jako D11, a także różne stałe używane w obliczeniach.

#define leituraTensao D11 //AD CH0 no pino PA0 //valor teórico divisor de tensão = 168.85714285714285714286 const float fatorDivisor = 168.40166345742404792461; //valor teórico do ganho de amplificação = 1.0 const float fatorAmplificador = 1.0; //Valor usado na multiplicação da leitura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; //Valor teórico da Tensão de alimentação Vcc = 3.3V const float Vcc = 3.3; //valor teórico do offsetu do amplifikatora = Vcc / 2.0; const float offSet = 1,66; //fator teórico da conversão do AD = 3,3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; //resulta em 1, 027 segundos para cada atualização //const int amostras = 35715; //resulta em 0, 514 sekund para cada atualização

Kod źródłowy - zmienne globalne

Teraz definiujemy kilka zmiennych globalnych.

pływak Vrms = 0.0; //armazena o valor rms da tensãofloat Vmax = 0.0; //armazena o valor máximo detectado float Vmin = 10000.0; //armazena o valor minimo detectado float Vmed = 0.0; //armazena o valor médio entre Vmáx e Vmín

Kod źródłowy - konfiguracja ()

Uruchom port szeregowy z prędkością 1Mbps. Dostosowaliśmy port AD jako wejście i odczekaliśmy 5 sekund przed rozpoczęciem zbierania danych. Czas czuwania jest opcjonalny.

void setup() { Serial.begin(1000000); //zainicjuj port szeregowy em 1Mbps pinMode(leituraTensao, INPUT); //ajusta a porta do AD como entrada delay(5000); //aguarda 5s antes de iniciar a coleta. (opcjonalnie) }

Kod źródłowy - Pętla () - Uruchamia zmienne zbierania danych

W pętli mamy zmienną do iteracji. Tutaj również przechowujemy odczyty AD w 0.0 i ponownie uruchamiamy zmienną VRMS również w 0.0.

void loop() { int i = 0; //variável para iteração float leitura = 0.0; //armazena jako leituras do AD Vrms = 0.0; //reinicia a variável Vrms

Kod źródłowy - Przechwytuje i wykonuje indywidualne obliczenia dla każdej próbki

Na tym etapie, jeśli i jest mniejsze niż próbka, rozpoczynamy cykl próbkowania aż do osiągnięcia liczby próbek. Uruchamiamy analogRead, aby odczytać port analogowy i obliczyć sumę kwadratów odczytanych napięć. Na koniec zwiększamy iterator.

while (i < amostras) { //inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead(leituraTensao); //le a porta analógica //Serial.println(leitura); //Descomente se quiser ver o sinal bruto do AD Vrms = Vrms + pow(((leitura * fatorAD) - offset), 2.0); //oblicz a soma dos quadrados das tensões lidas i++; //przyrost o iterador }

Kod źródłowy - Ogólne obliczenia próbek i identyfikacja maksimum, minimum i średniej

Stosujemy fakt mnożenia do określenia rzeczywistej wartości napięć. Wykrywamy, czy wartość jest maksymalna czy minimalna i obliczamy średnią z aktualnych wartości maksymalnych i minimalnych.

//Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt(Vrms / amostras)) * fatorMultiplicacao; //detecta se é um valor é maximo if (Vrms > Vmax) { Vmax = Vrms; } //detecta se é um valor minimo if (Vrms < Vmin) { Vmin = Vrms; } //calcula a media dos valores maximo e minimo atuais Vmed = (Vmax + Vmin) / 2.0;

Kod źródłowy - opcje wyjściowe

Mamy trzy opcje „wykreślania” wartości wyjściowej. Mamy dane wyjściowe sformatowane do plotera szeregowego Arduino IDE, takie jak CSV lub Jason.

//podaj format dla plotera szeregowego IDE Arduino Serial.print(Vrms, 3); Serial.print(", "); Serial.print(Vmax, 3); Serial.print(", "); Serial.print(Vmin, 3); Serial.print(", "); Serial.println(Vmed, 3); /* //saída formatada como json Serial.print("{"instante(ms)\":"); Serial.print(millis()); Serial.print(", "); Serial.print("\"Vrms(V)\":"); Serial.print(Vrms, 3); Serial.print(", "); Serial.print("\"Vmax(V)\":"); Serial.print(Vmax, 3); Serial.print(", "); Serial.print("\"Vmin(V)\":"); Serial.print(Vmin, 3); Serial.print(", "); Serial.print("\"Vmed(V)\":"); Serial.print(Vmed, 3); Serial.println("}"); */ /* //w formacie CSV Serial.print(millis()); Serial.print(", "); Serial.print(Vrms, 3); Serial.print(", "); Serial.print(Vmax, 3); Serial.print(", "); Serial.print(Vmin, 3); Serial.print(", "); Serial.println(Vmed, 3); */ }

Krok 14: Pliki

Pobierz pliki:

PDF

JA NIE

Zalecana: