Skocz do zawartości

Stoper Arduino dla napięcia wyprostowanego dwupołówkowo - jak wykonać?


Pomocna odpowiedź

Napisano

Cześć.

Mam jedno pytanie, szukałem ale nie znalazłem odpowiedzi. Otóż mam problem z użyciem jakiegokolwiek timera w Arduino (korzystałem już z kilku bibliotek). W skrócie chodzi o to, że program ma mierzyć czas trwania napięcia na rezystorze. Innymi słowy, w momencie pojawienia się napięcia powyżej 0,5 V na rezystorze, Arduino odpala stoper i wysyła dane - napięcie od czasu. Gdy tylko napięcie spadnie poniżej 0,5V, stoper powinien się zatrzymać i wyświetlić czas końcowy na LCD. Chodzi o to, by wyznaczyć charakterystykę zmiany napięcia w czasie. I przy prądzie stałym to jeszcze pewnie nie problem. Sprawa się komplikuje, gdyż muszę to zrobić dla napięcia wyprostowanego dwupołówkowo, czyli przechodzącego przez magiczną granicę 0,5V dość często. Jak to zrobić? Wszelkie podpowiedzi i sugestie będą mile widziane.

Pozdrawiam

mzmudek

Komparator i wejście na przerwanie sprzętowe a potem odczyt z micros()?

A czy to w ogóle zadziała w takiej sytuacji? Przykładowy przebieg napięcia pokazany jest na załączonym rysunku (wybaczcie jakość, ale sens da się odczytać). Wstępnie stoper startował gdy napięcie przekroczyło 0,45 V w górę (zbocze narastające), a zatrzymywał się, gdy spadło poniżej 0,45 V. I to było ok przy prądzie stałym. Jak widać, przy wyprostowanym jest problem, bo sygnał przechodzi kilka razy.

Jeżeli to ułatwi sprawę, chodzi o to, żeby sprawdzić po jakim czasie spali się bezpiecznik przy przekroczeniu prądu.

EDIT: Nie mogę użyć kondensatora wygładzającego, bo wprowadza on stałą czasową, która znacznie zaburza odczyt

Na czym dokładnie ma polegać pomiar? Między czym a czym chcesz mierzyć czas?

Bezpiecznik pali się od skumulowanego ciepła a to generowane jest przez RMS prądu.

Może narysuj schemat? To zwykle wiele tłumaczy i pozwala ocenić czy idziesz dobrą drogą. Często założenia są złe i rozwiązujesz nie ten problem który trzeba.

Jak rozumiem, masz jakiś układ prostownika dwupołówkowego na wyjściu którego jest jakieś obciążenie (rezystor?) i szeregowo włączony z tym bezpiecznik. Rezystor obciążenia (ponieważ jest rezystorem a prawo Ohma nie zostało jeszcze odwołane) pokazuje w bezpośredni sposób wielkość prądu. Mierząc na nim napięcie przetwornikiem ADC widzisz jaki prąd płynie. No i teraz jak to sobie wymyśliłeś? Czy chcesz włączać prąd (np. jakimś tranzystorem) od początku pełnej połówki AC żeby zawsze mieć powtarzalne warunki pomiaru? A może włączasz zasilanie w przypadkowym momencie żeby lepiej symulować rzeczywiste warunki pracy? Czy chcesz mierzyć (co? prąd? napięcie?) żeby liczyć skumulowaną ilość energii (całkując od startu kolejne, częste pomiary ADC) czy po prostu by wiedzieć kiedy proces się zaczął i skończył? O jakich napięciach mówimy? Czy pracujesz na 230VAC czy coś po transformatorze separującym(np. 24V/10A)? W przypadku wysokich napięć masz jeszcze wyładowanie (łuk) w bezpieczniku przedłużający prąd aż do naturalnego wygaśnięcia w zerze sieci? jakie to bezpieczniki? Topikowe czy automatyczne? Jakiego rzędu czasy chcesz mierzyć? W jakich jednostkach chcesz mieć wynik? Czy w liczbie okresów/półokresów sieci 50Hz czy w ms? Napisz coś więcej, może warto to przedyskutować.

Detekcja niskiego poziomu napięcia jest niefajna, bo masz obszar nieoznaczoności. To już lepiej zrób detektor przejścia przez zero napięcia AC przed prostownikiem. Wtedy dostajesz prostokąt synchroniczny z siecią: nastające zbocze to przejście napięcia AC w górę a opadające - w dół przez zero. Procesorowi wszystko jedno jakie zdarzenia ma wykrywać.

Na czym dokładnie ma polegać pomiar? Między czym a czym chcesz mierzyć czas?

Bezpiecznik pali się od skumulowanego ciepła a to generowane jest przez RMS prądu.

Może narysuj schemat? To zwykle wiele tłumaczy i pozwala ocenić czy idziesz dobrą drogą. Często założenia są złe i rozwiązujesz nie ten problem który trzeba.

Może zacznę od tego, że konstruuję studenckie stanowisko do badań bezpieczników samochodowych. Topikowych, automatycznych oraz polimerowych. Chodzi o to, żeby na podstawie badań wyznaczyć PRZYBLIŻONE charakterystyki podaję w kolejności oś X-oś Y):

•prądowo-czasowe (przykładowo bezpiecznik 5A wystawić na działanie 5, 10, 15, 20, 25 amperów i na podstawie tego wyznaczyć charakterystykę)

•czasowo-prądowe (wiem, że wygląda podobnie, ale chodzi o pokazanie charakterystyki jak przebiega wyłączanie, czyli narastanie prądu, a potem jego wyłączenie)

•czasowo-temperaturowe, czyli jak zmienia się temperatura topika (bo pozostałych rodzajów bezpieczników mierzyć nie będę)

Czyli to co musi być zmierzone - czas, napięcie na rezystorze pomiarowym (przeliczy się to później na prąd), temperatura. Każdy tem pomiar musi być wysłany na komputer. Najlepiej z dokładnością do mikrosekundy, ale zdaję sobie sprawę, że to może być ciężkie, więc po prostu im mniejszy interwał pomiaru, tym lepiej 🙂

Przybliżony schemat działania programu jaki wymyśliłem pokazany jest na rysunku:

Włączanie bezpiecznika przy prądzie zmiennym ma przebiegać losowo. Chodzi tylko o wykazanie, że samochodowe bezpieczniki nie nadają się do pracy z prądem zmiennym. Ten pomiar nie musi być perfekcyjny co do mikrosekundy, ale nie może też mieć jakiegoś olbrzymiego błędu.

Schemat układu zaś jest tutaj:

Dysponuję zasilaczem, który jest w stanie dać prąd do 250A. Jednakże w moich założeniach maksymalny prąd jaki będzie puszczany wynosi 50A. Napięcie będzie ustawiane w zakresie 8-18V DC oraz AC (MAX, RMS≈12V).

Mam nadzieję, że to jest jasne. Czuję, że porwałem się z motyką na słońce, ale chcę już to dociągnąć do końca 🙂 Pozdrawiam serdecznie i bardzo dziękuję za wszystkie porady.

EDIT: Schemat działania programu ma szansę sprawdzić się przy prądzie stałym. Przy prądzie zmiennym już nie jest tak kolorowo :/

OK, rozumiem pomysł. Teraz pytania kontrolne i luźne uwagi:

1. Przetwornik w Arduino może pracować z częstotliwością próbkowania nawet i 70kHz, ale masz do zmierzenia kilka kanałów co obniża znacznie prędkość. Jeśli wystarczy okres w jednym kanale rzędu 200us (5kHz), to masz to z głowy. ADC może być wyzwalany timerem więc chwile startu przetwarzania mogą być wyznaczane z dokładnością kwarcu procesora.

2. Jeden procesor bardzo upraszcza myślenie więc byłoby dobrze gdybyś wszystkie wielkości mierzone łapał jego wewnętrznym ADC. Musisz zatem do jego wejść doprowadzić kilka napięć którymi zajmiemy się po kolei. To pozwala na zachowanie synchronizmu, ułatwia przechowywanie i późniejszą obróbkę danych.

3. Bezpiecznik może żyć w zależności od % przeciążenia od dziesiątek milisekund do wielu sekund. Jeśli będziesz łapał powiedzmy 4 kanały (prąd, napięcie, temperatura i jakiś zapas) co 200us każdy, to dostajesz strumień danych o przepływności 40kbajtów/s (5kHz x 4 kanały x 2 bajty). Tego nie pomieści pamięć RAM żadnego Arduino więc musisz przewidzieć jakiś RAM zewnętrzny. Zwykłe pamięci równoległe są szybkie (za szybkie tutaj), ale zabierają mnóstwo nóżek procesora. Na szczęście dostępne są bardzo fajne pamięci szeregowe na SPI, np:

https://www.tme.eu/pl/details/23lcv1024-i_sn/pamieci-sram-szeregowe/microchip-technology/

Jedna taka kostka to 128Kbajtów czyli 3 sekundy zapisu z pełną prędkością. W czasie dłuższych pomiarów możesz próbkować wolniej lub dospawać więcej takich kostek. Nie są drogie a każda następna to jeden pin wyboru układu. Nie możesz moim zdaniem schodzić poniżej 1kHz bo wtedy nic ciekawego nie złapiesz. Będzie długo dobrze (prąd płynie) a potem nagle przerwa i koniec.

4. Musisz się zastanowić jak te dane obrabiać. Nie pokażesz przecież wszystkiego na LCD więc jakiś algorytm powinien przeszukać sample w poszukiwaniu ciekawego miejsca, potem ew. dobrać skalę czasu tego fragmentu i dopiero to pokazać. Trzeba przewidzieć też zrzut wszystkiego (binary RAW) np. do PC lub na kartę SD do późniejszej obróbki lub porównywania wyników z różnych pomiarów.

5. Jeśli masz korzystać z jednego ADC to musisz wszystkie mierzone wielkości sprowadzić do sygnałów napięciowych odniesionych do jednej, wspólnej masy GND Arduino. To determinuje schemat. Masz zatem napięcie na bezpieczniku, jego prąd i temperaturę. Zakładając, że chcesz uzyskać pomiary bipolarne przynajmniej dwóch pierwszych wielkości, musisz "postawić" bezpiecznik na masie Arduino i teraz:

- napięcie zdjęte bezpośrednio z bezpiecznika dzielisz prostym dzielnikiem a potem dodajesz składową stałą równą połowie przyjętego Vref ADC co pozwoli na pomiar napięć dodatnich i ujemnych (ADC mierzy tylko od swojego GND do Vref),
- prąd z LEMa zdjęty na oporniku pomiarowym podłączasz jednym końcem do napięcia Vref/2 a drugi koniec mierzysz i już masz pomiar bipolarny,
- jak chcesz mierzyć szybkozmienną temperaturę?

Wszelkie prostowniki w torze pomiarowym są źródłem nieliniowości i problemów - zapomnij tym bardziej, że tu nie wydają się konieczne, prawda?

6. Pozwól komputerkowi włączać główny przekaźnik - przynajmniej ADC będzie wiedział kiedy zacząć akwizycję i zawsze starczy pamięci na startowe przebiegi nieustalone np. z transformatora/zasilacza AC. Po prostu zrób wielki czerwony przycisk START, który poprzez Arduino włącza przekaźnik i odpala ADC.

7. Oddziel w swoim myśleniu pomiary od wyświetlania. Niech procesor (po starcie sekwencji i załączeniu przekaźnika) skupia się w czasie akwizycji tylko na obsłudze ADC, wysyłaniu wyników do RAMu i badaniu warunku zatrzymania. Dopiero potem na spokojnie, już na gotowych danych możesz odpalać dowolne algorytmy obróbki (np. liczenie całkowitej energii, czasów), skalowania i wyświetlania.

8. To nie wydaje się trudne więc spokojnie rozwiązuj po kolei problemy i staraj się mieć wszystko ułożone w głowie zanim cokolwiek kupisz. Motyka raczej się nie przyda.

9. Jeśli powyższe jakoś do Ciebie trafia, narysuj nowy schemat. Zasilacze mogą być blokami, ale skoncentruj się na szczegółach wokół bezpiecznika, ADC i Arduino. Po kilku iteracjach na papierze układ będzie gotowy. Czekamy 🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...