Błąd pomiaru prądu przekładnikiem prądowym?

Na tym forum rozmawiamy o elektronice nie związanej bezpośrednio z tematem CNC

atom1477
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 3775
Rejestracja: 21 kwie 2011, 10:58
Lokalizacja: ::

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#21

Post napisał: atom1477 » 29 lip 2024, 16:04

Myślę że wystarczy takie coś:

Kod: Zaznacz cały

static uint8_t start_adc(uint8_t adc_channel)
{
	ADMUX = _BV(REFS0) | _BV(ADLAR) | adc_channel;
	ADCSRA = _BV(ADEN) | 0x04;
	ADCSRA |= _BV(ADSC);
}

static uint16_t read_adc()
{
	return ADCW;
}
Zobaczy czy się skompiluje w Arduino.




Autor tematu
oprawcafotografii
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 35
Posty: 6354
Rejestracja: 29 kwie 2009, 10:11
Lokalizacja: Kraków / Jaworzno / Kopanka

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#22

Post napisał: oprawcafotografii » 29 lip 2024, 16:21

Tak, kompiluje się. Dwa słowa opisu? :)
„Największym wrogiem wolności jest najedzony niewolnik.”


atom1477
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 3775
Rejestracja: 21 kwie 2011, 10:58
Lokalizacja: ::

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#23

Post napisał: atom1477 » 29 lip 2024, 16:29

Jak tylko dwa to niech będą takie:
"Super funkcje!"

A tak na poważnie to pierwsza wyzwala pomiar, potem powinno być oczekiwanie ale go nie będzie (nie w kodzie programu), a druga odczytuje wynik.

Żeby to zadziałało z poprzednim kodem to trzeba zmodyfikować ten fragment:

Kod: Zaznacz cały

    switch (Co_mierzyc)
    {
        case 0:        //Pomiar UI_offset
            UI_offset = read_adc();    //Wyjdzie z zakresu -511...511
            
            start_adc(1);
            break;
        case 1:        //Pomiar I1
            I_1 = read_adc() - UI_offset;    //Wyjdzie z zakresu -511...511
            I1_buffer = I1_buffer + (I_1 * I_1);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
        
            start_adc(2);
            break;
        case 2:        //Pomiar I2
             I_2 = read_adc() - UI_offset;    //Wyjdzie z zakresu -511...511
             I2_buffer = I2_buffer + (I_2 * I_2);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
        
            start_adc(3);
             break;
        case 3:        //Pomiar I3
             I_3 = read_adc() - UI_offset;    //Wyjdzie z zakresu -511...511
             I3_buffer = I3_buffer + (I_3 * I_3);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
        
            start_adc(4);
             break;
        case 4:        //Pomiar U1
             U_1 = read_adc() - UI_offset;    //Wyjdzie z zakresu -511...511
             U1_buffer = U1_buffer + (U_1 * U_1);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
             P1_buffer = P1_buffer + (I_1 * U_1);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)

             start_adc(5);
             break;
        case 5:        //Pomiar U2
             U_2 = read_adc() - UI_offset;    //Wyjdzie z zakresu -511...511
             U2_buffer = U2_buffer + (U_2 * U_2);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
             P2_buffer = P2_buffer + (I_2 * U_2);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)

             start_adc(6);
             break;
        case 6:        //Pomiar U3
             U_3 = read_adc() - UI_offset;    //Wyjdzie z zakresu -511...511
             U3_buffer = U3_buffer + (U_3 * U_3);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
             P3_buffer = P3_buffer + (I_3 * U_3);    //Wyjdzie z zakresu -26112100...26112100 (25 bitów)

             break;
        case 7:
             start_adc(0);
             
             Licznik_100ms++;

             if (Licznik_100ms >= 100)    //Co 100ms
		        {
    	                Licznik_100ms = 0;


		        I1_buffer_irq_main = I1_buffer;
		        I2_buffer_irq_main = I2_buffer;
		        I3_buffer_irq_main = I3_buffer;

		        U1_buffer_irq_main = U1_buffer;
		        U2_buffer_irq_main = U2_buffer;
		        U3_buffer_irq_main = U3_buffer;

		        P1_buffer_irq_main = P1_buffer;
		        P2_buffer_irq_main = P2_buffer;
		        P3_buffer_irq_main = P3_buffer;


		        New_meassurments = 1;


		        I1_buffer = 0;
		        I2_buffer = 0;
		        I3_buffer = 0;

		        U1_buffer = 0;
		        U2_buffer = 0;
		        U3_buffer = 0;

		        P1_buffer = 0;
		        P2_buffer = 0;
		        P3_buffer = 0;
		        }
        
             break;
    }
}
Czyli konwersja jest wyzwalana w jednym przerwaniu timera, a odczyt jest dopiero w kolejnym.
Jakieś przerwanie od Timera to sobie sam zrobisz?
Masz oscyloskop?


Autor tematu
oprawcafotografii
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 35
Posty: 6354
Rejestracja: 29 kwie 2009, 10:11
Lokalizacja: Kraków / Jaworzno / Kopanka

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#24

Post napisał: oprawcafotografii » 29 lip 2024, 18:44

Jaki ja jestem głupi :)
Przez cały czas brałem za wynik ostatni pomiar chwilowy napięcia a nie maksymalną wartość ;)
Po poprawce programu trzy pomiary < 5A zaczynają trzymać się kupy. Jest błąd przy wyższym prądzie ale akceptowalny.
Odjeżdża dopiero pomiar prądu 6.5A. Moje przekładniki mają niby max 5A ;) Nasycają się rdzenie?

Zamówiłem jeden moduł ACS758...
„Największym wrogiem wolności jest najedzony niewolnik.”


atom1477
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 3775
Rejestracja: 21 kwie 2011, 10:58
Lokalizacja: ::

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#25

Post napisał: atom1477 » 29 lip 2024, 18:46

oprawcafotografii pisze:
29 lip 2024, 18:44
Nasycają się rdzenie?
Przy jakimś dużym prądzie tak (niekoniecznie przy 6.5 A).


Autor tematu
oprawcafotografii
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 35
Posty: 6354
Rejestracja: 29 kwie 2009, 10:11
Lokalizacja: Kraków / Jaworzno / Kopanka

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#26

Post napisał: oprawcafotografii » 29 lip 2024, 19:13

No to zobaczymy co pan Hall pokaże :)
„Największym wrogiem wolności jest najedzony niewolnik.”


Autor tematu
oprawcafotografii
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 35
Posty: 6354
Rejestracja: 29 kwie 2009, 10:11
Lokalizacja: Kraków / Jaworzno / Kopanka

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#27

Post napisał: oprawcafotografii » 01 sie 2024, 18:56

Odpaliłem tego ACS758 ale jakieś herezje wychodzą.

Tam są dwa wyjścia - bezpośrednie z przez bufor cokolwiek to znaczy.
Ma to jakieś znaczenie, czy wyniki powinny być z grubsza równe?

Idę cierpieć ;)

Dodane 2 minuty 3 sekundy:
PS. Ta suszarka do włosów to niezły numer - grzałka przy najniższej mocy zasilana chyba połową przebiegu, na wyższym też ale trochę większy pobór, przy najwyższej dwie połówki. I jak to zmierzyć???

Dodane 50 minuty 10 sekundy:
Poprawka odnośnie suszarki - na 1 biegu bierze zasilanie z połowy przebiegu, na drugim z obu amplituda bez zmian, na trzecim więcej z jednej strony :) Efekt - Hall pokazuje na pierwszym i drugim biegu taki sam pobór :)

Dodane 1 minuta 7 sekundy:
Ps. A tak w ogóle to Hall zwraca wartość 100 przy braku przepływu prądu... średnio ładnie.

Dodane 6 minuty 47 sekundy:
ostatni PS :)

Zamieszanie w suszarce powoduje wentylator. Gdy jest puszczony na pierwszym biegu to zmiana mocy grzałki nie jest rejestrowana (a inny watomierz ją wskazuje). Ale gdy puszczę silnik na full to już przełączanie grzałki jest mierzone, wydaje się, że poprawnie.

Czy można się spodziewać w domu więcej urządzeń powodujących takie problemy???
„Największym wrogiem wolności jest najedzony niewolnik.”


atom1477
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 3775
Rejestracja: 21 kwie 2011, 10:58
Lokalizacja: ::

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#28

Post napisał: atom1477 » 01 sie 2024, 20:08

Hall nie może pokazywać tego samego. To Twój miernik na Arduino tak pokazuje, bo on szuka wartości maksymalnej.
No to znajduje, albo z tego co mu Hall wysyła. Hall daje albo jedną połówkę albo dwie (i ujemne prostuje, tzn. przerabia na dodatnie), ale dla tego programu na Arduino liczy się tylko maksymalna wartość, więc wybierze z tego większą i poda jako wynik. Stąd nie masz różnic dla wersji jedno i dwupołówkowej, bo wartości szczytowe one mają takie same, tylko jedna ma je częściej a druga rzadziej.

Po to się produkowałem i Ci podawałem kod żeby to mogło mierzyć poprawnie :D

Wyjście z buforem dla Twoich zastosowań jest lepsze.


Autor tematu
oprawcafotografii
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 35
Posty: 6354
Rejestracja: 29 kwie 2009, 10:11
Lokalizacja: Kraków / Jaworzno / Kopanka

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#29

Post napisał: oprawcafotografii » 02 sie 2024, 20:49

Sprawdziłem przekładnik i Halla z gotową biblioteką EmonLib - z czujnikiem Halla wydaje się wszystko grać, ale przekładnik pokonuje algorytm :) Oczywiście w kontakcie z suszarką ;)

Napisałem taki kod jak poniżej - odczyt przetwornika jest robiony około 30000x/s
Robię pomiar 100x, odejmuję offset i obliczam średnią, żeby wygładzić wyniki.
Powtarzam to 100x wpisuję dane do tablicy, potem sumuję zawartość tablicy (tablica oczywiście nie jest tu konieczna).

No i suszarka z przekładnikiem nie działa poprawnie! Dlaczego? Na wykresie wydać ładnie pobór prądu w obu połówkach, po wyprostowaniu wszystko jest sumowane a mimo to wynik jest zły...

Kod: Zaznacz cały

void loop()
  {
      for (int p=0 ; p<pomiarow ; p++)    // seria pomiarów wyprostowana i zapisana do tablicy (około 1s total)
        {
          licznik = 0;
          msSTOPER_1 = micros();
          for (int pom=0 ; pom<razy ; pom++)      // pomiaru 100x
            {
              licznik++;
              prad+=analogRead(0)-505.02;         // offset wyniku
            }
            prad/=licznik;                        // uśrednianie wyników
            pomiary[p] = sqrt(prad*prad);         // prostowanie i zapis do tablicy
            prad = 0; licznik = 0;
        }

        float pobor = 0;
        for (int pom=0 ; pom<pomiarow ; pom++)    // sumowanie zebranych pomiarów
          {
            pobor+=pomiary[pom];
          }

      Serial.print("A: "); Serial.print(pobor*korekta); Serial.println(); 
  }
„Największym wrogiem wolności jest najedzony niewolnik.”


atom1477
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 29
Posty: 3775
Rejestracja: 21 kwie 2011, 10:58
Lokalizacja: ::

Re: Błąd pomiaru prądu przekładnikiem prądowym?

#30

Post napisał: atom1477 » 02 sie 2024, 20:53

To normalne że przekładnik nie działa. Wcześniej już wyjaśniałem dlaczego.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Elektronika ogólna”