Skocz do zawartości

Wyliczanie średniej napięcia za pomocą kondensatora dużej pojemności


BTL00

Pomocna odpowiedź

Witam!

Dziś podczas długotrwałej walki z językiem C (staram się przerzucić z BASCOM'a) uczyłem się obsługi ADC. Przeraziła mnie filtracja zasilania, średnie i filtr Kalmana. Jako, że używam czujnika odległości Sharp (analog.) jest dla mnie to niezwykle ważne. W moim projekcie dodałem nawet fototranzystor zmieniający odczyty zależnie od oświetlenia, gdyż wpływa ono na wartość ADC.

W pewnym momencie mnie olśniło 💡 . Wpadłem na pomysł naładowania dużego kondensatora przez ok. 3 sekundy prądem z czujnika, a potem zmierzenia napięcia z jakim się rozładowywuje (bądź czasu rozładowania) w celu wyliczenia prawidłowej wartości bez użycia matematyki i obliczeń w µC. Zrobiłem symulację przy użyciu prostej androidowej apki (której nie ufam) i udało się 😉 . Niestety nie mogłem przeprowadzić wielu doświadczeń praktycznych, ponieważ nie posiadam kondensatora większego niż 470µF, ani pewnych napięć odniesienia.

Czy schemat który wymyśliłem ma prawo działać? Czy mógłby go ktoś przetestować na realnych urządzeniach?

Ostrzegam, że jestem początkującym elektronikiem samoukiem.

Link do komentarza
Share on other sites

Owszem, rozwiązania typu ładowanie kondensatora w czasie się stosuje, ale raczej w celu mierzenia bardzo małych prądów i ładuje się małe kondensatory o bardzo małym prądzie upływu typu COG albo NP0 (prąd upływu można opisać jako szybkość samoczynnego rozładowywania się kondensatora). Pamiętaj też, że nawet bardzo dokładne napięcie na kondensatorze nic nie da jak ADC wprowadza swoje szumy i błędy (szczególnie przy błędach w schemacie i prowadzeniu ścieżek na płytce).

W Twoim przypadku powinieneś raczej zsumować wiele pomiarów z ADC jak interesuje Ciebie odległość. Weź też poprawkę na to, że analogowe sharpy jakoś bardzo dokładne nie są i nie wiem czy uda się pomierzyć coś powtarzalnie z dokładnością lepszą niż 1mm (nie mylić z rozdzielczością).

Przykładowy program:

unsigned long wartoscSumaryczna=0;
unsigned int iloscPomiarow;

for IiloscPomiarow = 0; iloscPomiarow < 10000; iloscPomiarow ++)
{
 wartoscOstatnia += PobierzPomiarADC();
}
float napiecieADC = (float)iloscPomiarow *5.0f / 1024.0f/10000.0f;

Czyli pobieramy 10000 probek z ADC (zakladam napiecie ref 5.0V i 10bitowa konwersje) i następnie obliczamy z tego rzeczywiste napięcie.

Kilka uwag:

- Kumulacja bardzo wielu próbek przy słabym ADC za dużo nie da. Dostaniesz kilka dodatkowych bitów dokładności, ale w nieskończoność to nie idzie. Wiele też zależy od rodzaju szumu, który jest w pomiarach

- Oczywiście wszystko też zależy od schematu i layoutu płytki - jak masz zanieczyszczone napięcia i/lub zgarniasz pełno zakłóceń to konwersja ADC zawsze będzie słaba...

- Jest też inne, alternatywne rozwiązanie takiego problemu (znowu niekoniecznie dla Twojego przypadku) - możesz rozładowywać kondensator a następnie mierzyć czas jego ładowania z pomocą np. komparatora. W tym momencie nie używasz ADC a tylko mierzysz czas ładowania kondensatora do określonej wartości napięcia - co oczywiście jest zależne od prądu na wejściu...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Poza tym pomieszałeś dwie rzeczy i szczerze mówiąc nie bardzo wiem o której myślałeś. Po pierwsze powinieneś odróżnić błędy i szumy samego czujnika od błędów i szumów przetwornika A/C.

Rozumiem, że o błędach związanych z nieliniowością czujnika, stabilnością napięcia odniesienia i przetwarzaniem A/C nie ma co dyskutować - tego żaden prosty układ wstawiony pomiędzy nie naprawi.

Szumów i przypadkowych zakłóceń pochodzących z czujnika może pozbyć się przez filtrowanie, uśrednianie sygnału w czasie. Do tego potrzebny jest w najprostszym przypadku jeden opornik i jeden kondensator. Oczywiście nie o tak ogromnej pojemności bo ten ma tak wielkie problemy "własne", że do tego zastosowania jest zupełnie chybiony. Filtr RC odcina pewne wyższe częstotliwości a zakładamy, że tam właśnie kryje się większość szumu. Uśrednianie możesz też zrobić poprzez długie całkowanie sygnału i potem np. jeden pomiar ale ta metoda wymaga bardziej skomplikowanego układu. Musisz mieć możliwość wstępnego wyzerowania (rozładowania) kondensatora, posiadać źródło prądowe ładujące go prądem wprost proporcjonalnym do sygnału wejściowego (czujnik sharp daje sygnał napięciowy - to nie to samo co prąd) a po odmierzeniu pewnego czasu zmierzone na kondensatorze napięcie będzie średnią sygnału za czas całkowania. Po wykonaniu pomiaru napięcia znów rozładowujesz kondensator i cykl się powtarza. To najprostsza metoda tzw. "pojedyńczego całkowania". Poczytaj trochę o tym bo są nawet gotowe przetworniki A/C korzystające z tej - choć trochę rozbudowanej, metody. Uśrednianie sygnału jest jakby wbudowane w ideę tego pomiaru a dobranie okresu całkowania np. zgodnie z największymi występującymi zakłóceniami (np. 50Hz z sieci energetycznej) daje od razu "za darmo" ogromne tłumienie tych zakłóceń.

Twój pomysł, co warte odnotowania, należy do klasy układów z tzw. przełączanymi pojemnościami (switched capacitor filter). Upraszczając do granic możliwości, zastępczym układem Twoich dwóch kluczy i kondensatora jest właśnie dolnoprzepustowy filtr RC. Nie ma sensu - gdy nie ma takiej potrzeby - robienia takiego układu, gdy możesz go zastąpić prostym opornikiem i kondensatorem.

Acha i jeszcze na koniec - co to za aplikacja? Co chcesz mierzyć i w jakich warunkach? To bardzo dużo nam powie o możliwych czy wartych do użycia układach. Być może niepotrzebnie się martwisz a być może już na wstępie brniesz w ślepą uliczkę. Więc?

Link do komentarza
Share on other sites

Wszystko ok. Ale moim zdaniem rozwiązanie proponowane przez was służy do detekcji napięcia szczytowego a nie wyliczenia średniej. Na kondensatorze odłoży się maksymalne napięcie jakie pojawi się na wyjściu sharpa.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dlaczego tak uważasz? Możesz to jakoś uzasadnić?

W filtrze RC kondensator jest zarówno ładowany jak i rozładowywany przez rezystor. Zakładając, że impedancja wyjściowa źródła jest symetryczna to i procesy ładowania/rozładowania będą symetryczne. Nawet gdyby tak nie było (np. przy wyjściu typu open-collector) to odpowiednio duży rezystor sprowadzi tę różnicę do minimum.

Wciąż nic nie wiemy o aplikacji więc być może dyskusja o filtrowaniu i dmuchaniu na zimne jest bezprzedmiotowa.

EDIT: Prostownik szczytowy to zupełnie inny układ.

Link do komentarza
Share on other sites

Wiesz, że nie chodzi mi o konkretny czujnik (choć tu wybór jest nieduży i w końcu też będzie ważny) ale przede wszystkim o to, co będzie mierzone i po co. Czy to jest pomiar gdzie odległość jest naprawdę ważna (np. jakaś maszyna coś produkująca albo wycinająca/obrabiająca jakieś detale), jak bardzo dokładnie i w jakich warunkach, czy jednak jest to hobbystyczny robot/zabawka, która ma coś widzieć i oceniać (a nie mierzyć) odległość do przeszkody/ściany.

To będą dwa zupełnie różne podejścia, prawda?

Link do komentarza
Share on other sites

Ok. Dzięki za wszystkie odpowiedzi.

Próby z kondensatorem dotyczyły robota robiącego mapy pomieszczeń, dlatego odległości musiały być dokładne. Wykorzystałem metodę od użytkownika MirekCz i dodanie prostego filtra. Robot niedługo będzie skończony, a temat o nim dorzucę do Spisu Robotów.

Teraz moim nowym eksperymentem elektronicznym, będzie dokładne zmierzenie napięcia podczas rozładowania kondensatora i próba zrobienia zegarka. Tak dla czystej przyjemności...

Link do komentarza
Share on other sites

Poruszająca zapowiedź. Jak rozumiem sednem problemu zegarka jest dla Ciebie zrobienie generatora taktującego, bo dalej to już łatwizna - łańcuch liczników, czy tak?

Hm, układ ze sprzężeniem zwrotnym w postaci członu opóźniającego z kondensatorem zrobiono zaraz po tym jak udało się wykonać pierwszy element aktywny - triodę ale nie przeczę, że i wcześniej to działało, choćby na przekaźnikach. Teoria dotycząca takich układów jest jeszcze starsza.

Co w Twoim rozwiązaniu będzie zabawnego albo może chociaż odkrywczego? Jakoś nie mogę się domyślić więc tym bardziej czekam z niecierpliwością, naprawdę. A może mógłbyś wcześniej uchylić rąbka tajemnicy?

Link do komentarza
Share on other sites

Nie, nie, nie... Mówię tu o niewykorzystywaniu generatora, a przynajmniej dla samego zegara (minutnika właściwie). Może to i głupie, i nienormalne, i nienadające się do powszechnego stosowania, ale można czasem dla zabawy sprawdzić pomysły z kosmosu.

Idea jest taka: ADC w przerwaniu mierzy poziom rozładowani kondensatora i co np. zmianę o 0.1V odejmuje od ilości sekund 1. + filtracja, średnie itp.

Jak się domyślam wykres napięcia nie będzie liniowy, ani nawet równomiernie zakrzywiony(nie wiem jak to się fachowo nazywa), ale sądzę, że na początku połączę zwykły RTC i ADC, co sekundę będę sprawdzał napięcie na kondensatorze i wysyłał wartość do kompa. Następnie odwrócę proces i zobaczę co wyjdzie. Po drodze wrzucę dane do Excela i zobaczę jakiś obrazek. Dokładność takiego zegara będzie minimalna, ale może przynajmniej będzie działać.

Co da mi taki eksperyment: kolejne ćwiczenie z ADC, naukę obsługi układów RTC w C, trochę liczenia (szkoła się zaczęła - trzeba potrenować) i śmiania się z nieudanych prób.

Link do komentarza
Share on other sites

Jak to nie generatora? A to co chcesz zrobić, to co niby jest? Tak naprawdę Twój układ będzie wykrywał dwa progi: górny i dolny. Przy najwyższym napięciu (np. 1V poniżej zasilania) dalej kondensatora ładować się już nie da więc trzeba zmienić kierunek na rozładowywanie. Przy najniższym napięciu (np. 1V) dalsze rozładowywanie nia ma sensu, bo niewiele już się zmienia czyli znów zmienisz kierunek na przeciwny. Tak więc będzie to typowy generator z przełączaną asymptotą - kondensator zawsze będzie "gonił" napięcie podawane z wyjścia procesora. Reszta punktów, wszystkie te pomysły związane z liczeniem czasów pośrednich sprowadzą się do analitycznego wyznaczenia poziomów napięć odpowiednich dla np. sekund. Żebyś nie musiał zgadywać, albo co gorsza od nowa odkrywać stałej e (a tu się przyda bardzo bo to typowy proces wylewania wody z basenu albo kumulacji składek na koncie) podaję Ci stronę, na której masz to na talerzu:

http://hyperphysics.phy-astr.gsu.edu/hbase/electric/capdis.html

Układ opisany powyżej (generator z kondensatorem) można zrobić na mnóstwo sposobów. Najprostsze to komparator, bramka cyfrowa z histerezą (np. 74HC14) a nawet słynny 555 który działa właśnie w ten sposób, ale pomysł z pomiarem napięcia przez ADC też będzie działał, choć do błędów związanych z samym kondensatorem i zmianą jego parametrów w czasie i w temperaturze dojdą też niedeterministyczne opóźnienia działania samego przetwornika i programu.

Prównując rozwiązania "sprzętowe" z Twoim to powiem Ci, że prosty komparator nie mówiąc już o naprawdę dopracowanym 555 dadzą co najmniej o rząd wielkości lepsze stabilności.

Mi by się nie chciało tak rzeźbić, bo problem jest opisywalny jednym wzorem a wyniki są do przewidzenia - układ jest praktycznie bezużyteczny - ale to Twój czas więc.. powodzenia.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.