Pomiar średniego prądu za pomocą UC i bocznika prądu

12

To jest mój pierwszy post. Jestem facetem od oprogramowania, który próbuje robić sprzęt, więc bądź delikatny :)

Obwód

Projektuję mały obwód (patrz zdjęcie i przepraszam za niechlujny schemat), który jest prosty i po prostu jest zbiorem MOSFETÓW i sterowników bram zaprojektowanych do przełączania obciążeń rezystancyjnych (w tym przypadku podkładek grzewczych) z mikrokontrolera. Elementy grzejne często mają bardzo niską rezystancję, a aby utrzymać moc na pożądanym poziomie, MOSFETY są przełączane za pomocą PWM.

Pomiary

Oprócz aspektu czysto funkcjonalnego, istnieje również nacisk edukacyjny. Chcę mieć możliwość uzyskania informacji zwrotnej na temat bieżącego zużycia. A moim naiwnym podejściem było po prostu wrzucenie kilku obecnych układów scalonych czujnika bocznika. Używając multimetru do pomiaru napięcia wyjściowego z czujnika, faktycznie otrzymuję coś, co wygląda jak średni prąd (z przełączaniem PWM) z powodu „powolności” amperomierza. Ale kiedy podłączam to samo wyjście do np. ADC atmega328p, otrzymuję złe odczyty - prędkość tutaj powoduje odczyt w dowolnym miejscu na fali prostokątnej PWM.

Moje pytanie brzmi: jak przejść do pomiaru (średniego) prądu podczas przełączania z PWM?

Wygląda na to, że projekt jest w porządku, ale mogłem coś przeoczyć zarówno w projekcie, jak iw tym, jak należy używać ADC uC w tym kontekście.

schematyczny

ltj
źródło
Myślę, że można by użyć filtra do podania średniego napięcia z PWM. Ciekawym artykułem, który wyjaśnia taki filtr i wartości zastosowane na podstawie częstotliwości PWM jest ten .
alexan_e
Istnieje kilka powiązanych odpowiedzi na to pytanie . Ale tylko wspominają o użyciu boczników i układów scalonych do pomiaru prądu. Jednak nie ma wzmianki o PWM.
Ricardo
Dziękuję za komentarze. @alexan_e: TI pokazuje filtr wejściowy w arkuszu danych INA197, ale nie byłem pewien jego zastosowania. Może to być droga, gdy nie ma stabilnego napięcia.
ltj
Myślę, że jest to rozwiązanie twojego problemu, ale wolę, aby ktoś bardziej doświadczał tego w szczegółowej odpowiedzi, dlatego opublikowałem to jako komentarz.
alexan_e
Ponieważ wyjściem jest PWM o zmiennym obciążeniu, można użyć obwodu detektora szczytowego i zmierzyć go za pomocą ADC.
Martin

Odpowiedzi:

6

Czasami to, co wygląda prosto, nie jest takie proste. Masz dość skomplikowany pomiar, ale potrzebujesz prostego wyniku. To, co chcesz zmierzyć, nie jest stałe, zmienia się w czasie. W zależności od poziomu wymagań można obliczyć jedną lub wiele właściwości bieżącego zużycia. Te właściwości pomogą ci lepiej monitorować system. Proponuję ci 3 różne rozwiązania w rosnącej złożoności.

Rozwiązanie 1: Średnia

Chcesz uzyskać wynik jednej wartości -> uzyskać średnią w czasie. Jak już zaproponował @akellyirl, użyj filtra dolnoprzepustowego. Oblicz float y = alpha*input + (1-alpha)*ydla każdej próbki, gdzie alphajest współczynnik wygładzania. Szczegóły w Wikipedii .

Rozwiązanie 2: Maks. + Średnia

Jesteś ciekawy w uzyskaniu średniej i wartości maksymalnej. Monitorowanie wartości maksymalnej może być interesujące na przykład dla wymiarowania komponentu.

if (y > max)
  max = y;

Rozwiązanie 3: Odchylenie standardowe + maks. + Średnia

Dlaczego?

Zobacz poniższe wykresy. Istnieją 3 sygnały o różnych kształtach. Trójkąt , A sinus i skok sygnału. Wszystkie są okresowe z tym samym okresem, tą samą amplitudą , tą samą średnią i tymi samymi wartościami minimalnymi i maksymalnymi . Ale mają różne kształty i rzeczywiście mają zupełnie inną historię ...

Sygnały i ich histogram

Jedną z różnic jest odchylenie standardowe. Dlatego proponuję rozszerzyć swoje pomiary i uwzględnić odchylenie standardowe. Problem polega na tym, że standardowy sposób jego obliczania zajmuje procesor. Mamy nadzieję, że jest jedno rozwiązanie.

W jaki sposób?

Użyj metody histogramu . Zbuduj histogram wszystkich pomiarów i wydajnie wyodrębnij statystyki (min., Maks., Śr., Odchylenie standardowe) zestawu danych. Histogram grupuje wartości, które mają tę samą wartość lub zakres wartości. Zaletą jest uniknięcie przechowywania wszystkich próbek (zwiększenie liczby w czasie) i szybkie obliczenia na ograniczonej liczbie danych.

Przed rozpoczęciem pobierania pomiarów utwórz tablicę do przechowywania histogramu. Jest to jednowymiarowa tablica liczb całkowitych o rozmiarze 32, na przykład:

int histo[32];

W zależności od zakresu amperomierza, dostosuj poniżej funkcji. Na przykład, jeśli zakres wynosi 256 mA, oznacza to, że przedział 0 histogramu zostanie zwiększony o wartość między 0 a 8 mA, przedział 1 o wartość między 8 a 16 mA itd. Tak więc, aby reprezentować, potrzebujesz liczby całkowitej numer pojemnika histogramu:

short int index;

Za każdym razem, gdy otrzymasz próbkę, znajdź odpowiedni indeks bin:

index = (short int) floor(yi);

I zwiększ ten kosz:

histo[index] += 1;

Aby obliczyć średnią, uruchom następującą pętlę:

float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
  mean = i * histo[i]; // sum along the histogram
  N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.

Aby obliczyć odchylenie standardowe, uruchom następującą pętlę:

float std_dev = 0;

for (i=0; i < 32 ; i++) {
  std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.

Strategia metody histogramu polega na wykonywaniu powolnych operacji na kilku przedziałach, zamiast na wszystkich zebranych próbkach sygnału. Im dłuższy rozmiar próbki, tym lepiej. Jeśli chcesz uzyskać więcej informacji, przeczytaj tę interesującą stronę Histogram, Pmf i Pdf .

RawBean
źródło
bardzo dokładne i jasne wyjaśnienie. Na poziomie praktycznym, w jaki sposób zapewniasz, że próbkowanie ADC jest dystrybuowane „w dobry sposób”, tj. Nie jest w żaden sposób zablokowane sygnałem PWM? Muszę przyznać, że teraz używam Arduino (hw + sw) do próbkowania PWM i ADC. Możliwe, że sam powinienem skonfigurować wbudowane timery. Myślę, że częstotliwość próbkowania powinna być nieco wyższa niż częstotliwość PWM, prawda?
ltj
1
Gdy tylko zaczniesz próbkować, wszystko się komplikuje. Pierwszą rzeczą do zrobienia jest zapamiętanie twierdzenia Nyquista-Shannona. Intuicyjne jest to, że im wyższa częstotliwość próbkowania, tym więcej masz informacji. Ale to, co nie jest intuicyjne, choć fundamentalne, polega na tym, że przed próbkowaniem na częstotliwości Fs należy bezwzględnie filtrować dolnoprzepustowy (w dziedzinie analogowej / elektronicznej) sygnał na Fs / 2. W przeciwnym razie aliasing będzie miał wpływ na Ciebie. Proponuję wybrać najwyższą częstotliwość próbkowania. Coś w przybliżeniu ~ 10 razy częstotliwość PWM, jeśli to możliwe.
RawBean
Jest to powszechne nieporozumienie z twierdzeniem Nyquista-Shannona, które faktycznie stwierdza, że ​​trzeba próbkować z dwukrotnie większą przepustowością. Aliasing może być pomocny. Nie zamierzano lekceważyć, ale wydaje się to odpowiedzią z texbooka. Sugerowanie ~ 10-krotnego próbkowania PWM w tym scenariuszu, gdy szczegóły wysokiej częstotliwości są najprawdopodobniej nieistotne, to przesada.
akellyirl
1

Prawidłowo rozumiesz problem: musisz uzyskać „średnią” PWM, podobnie jak miernik używany do pomiarów.

Możesz użyć filtra RC dla sygnałów A1,2,3, których stała czasowa jest co najmniej dziesięć razy większa niż okres PWM. Oznacza to, że jeśli okres PWM wynosił 10 mikrosekund, to stała czasowa RC powinna wynosić 100 mikrosekund. Na przykład 10kOhm x 10nF = 100us

Lepszym rozwiązaniem jest cyfrowa filtracja sygnałów w mikrokontrolerze:

float y = (1-0.99)*input + 0.99*y; 

Zmień wartość „0,99”, aby zmienić stałą czasową tego filtra cyfrowego.

akellyirl
źródło
1
Uważaj na aliasing, jeśli robisz to w kodzie.
Andy alias
Aliasing niekoniecznie stanowi problem. Wszyscy wiemy, że aby odtworzyć sygnał, częstotliwość próbkowania musi być co najmniej dwa razy wyższa od częstotliwości. Ale gdy sygnał jest ograniczony pasmem, musisz próbkować tylko z dwukrotnie większą przepustowością . Nazywa się to undersamplig. Ponieważ sygnał ma prawdopodobnie niską częstotliwość, ponieważ napędza podkładkę grzewczą, rozsądne częstotliwości próbkowania w zakresie od 100 do 1000 SPS powinny być w porządku. Zobacz: ni.com/newsletter/50078/en
akellyirl
Rozsądnie byłoby upewnić się, że częstotliwość PWM i częstotliwość próbkowania są wzajemnie pierwsze, jeśli stosuje się próbkowanie pośrednie.
akellyirl
Dokładnie moje przemyślenia - przy pomiarze za pomocą ADC i generowaniu PWM w tym samym MCU może istnieć tendencja do blokowania się obu na czas.
Andy alias
Sygnał ma częstotliwość PWM, a nie niską częstotliwość. Gdyby miał niską częstotliwość, prawdopodobnie mniej wymagałoby zasobów, by po prostu próbkować w jednym okresie i średnio, niż w ten sposób używać matematyki zmiennoprzecinkowej.
Scott Seidman