Skocz do zawartości

Pomiar napięcia przetwornikiem ADC - Pytania


cebaM

Pomocna odpowiedź

Witajcie, chciałbym zadać kilka pytań związanych z moim układem. Głównym zadaniem jest pomiar zmiany rezystancji dwóch małych oporników w formie drucików. Oporniki te są w pewnym momencie podgrzewane i zadaniem jest zmierzyć różnice czasu pomiędzy tym jak ich rezystancja zaczyna rosnąć. Postanowiłem użyć do tego przetwornik ADC który mierzy spadek napięcia na opornikach. Program wygląda tak:

void loop() {
 #define d_nisko_pin A0
#define d_wysoko_pin A1

double d_nisko, d_wysoko;
double V_nisko, V_wysoko;
unsigned long czas;

void setup() {
 Serial.begin(9600);
}

void loop() {
 czas = millis();

 d_nisko = analogRead(d_nisko_pin);
 d_wysoko = analogRead(d_wysoko_pin);

 V_nisko = d_nisko * (5.0/1023.0);
 V_wysoko = d_wysoko * (5.0/1023.0);

 Serial.print(czas);
 Serial.print(" ");
 Serial.print(V_nisko, 4);
 Serial.print(" ");
 Serial.println(V_wysoko, 4);

 delay(1);
}

dane z portu szeregowego zapisuje za pomocą programu CoolTerm, a następnie analizuje w excelu. I teraz mam pytania.

1.Czy w środowisku arduino dostępne są funkcje które pozwalają na zapis danych do pliku txt. bez użycia programów zewnętrznych?

2.Chciałbym dokonywać pomiaru z częstotliwością 1kHz, czy arduino leonardo się do tego

nadaję?

3.W danych wyjściowych chciałem otrzymać pomiar co 1ms ale funkcja millis() chyba nie synchronizuje się z funkcją delay() co powoduje przeskoki.Wygląda to tak:

czy da się to jakoś zsynchronizować?

4.Z jaką dokładnością można mierzyć spadki napięcia za pomocą przetwornika ADC.

Link do komentarza
Share on other sites

Jestem na wakacjach a internet donoszą tu wiadrami, raz dziennie, i to co piszę może na Forbota nie dolecieć, ale gdyby się udało to:

1. O ile wiem to nie, ale program terminalowy zapisujący strumień znaków na dysk to całkiem niezłe rozwiązanie. Możesz też pomyśleć o jakimś przetwarzaniu danych w samym procesorze, np: puszczasz ADC i na bieżąco sprawdzasz czy zaszedł warunek startu procesu (np. wykryłeś jakąś zmianę rezystancji itp), łapiesz ileśtam próbek do RAMu, kończysz próbkowanie, przetwarzasz dane (jakieś 1000 pomiarów zmieści się na pewno a to jest 0.5 sekundy przy dwóch kanałach i 1ms) a wysyłasz już jedną, konkretną liczbę. Opisz co tam z tymi pomiarami robisz.

2. Skoro przetwornik w typowym AVR może pracować z prędkością kilkunastu tysięcy pomiarów/s to sam ADC wyrobi spokojnie. Teraz procesor, jeśli nie obrabiasz danych "na miejscu", musi to przesłać dalej i tu pojawia się problem. Nie możesz oczekiwać, że sam pomiar, konwersja jego wyniku na ciąg znaków i samo wysyłanie odbędzie się w zerowym czasie. A tak właśnie zakładasz pisząc pętlę w której masz wiele operacji i jeszcze opóźnienie 1ms. Takie rzeczy robi się w mikrokontrolerach inaczej. Zaczynasz od początku: wyzwalania pomiarów dokładnie co 1ms. To będzie podstawą czasu całości i wszystko inne musi się w tym czasie zmieścić. Poszukaj i poczytaj coś o timerach - to jest hardware, który masz w procesorze właśnie do takich celów. Do ich obsługi są specjalne biblioteki dzięki który możesz np. wywoływać jakąś funkcję w bardzo precyzyjnie zadanych odstępach czasu.

3. To proste: skoro pełna skala ADC to Twoim wypadku 5V a wynik ma 10 bitów, to najmniej znaczący bit (LSB) ma wagę ok. 4.88mV. Takie zmiany napięcia możesz teoretycznie odróżniać. Oczywiście w praktyce tak nie będzie. Przetwornik ma swoje problemy i błędy więc proponuję oczekiwać raczej 8-9 "pewnych" bitów przy jednorazowych pomiarach. A to oznacza jakieś 10mV rozdzielczości. Zawsze przed ADC możesz postawić jakiś wzmacniacz i wtedy czułość rośnie. Może napisz jakiego rzędu zmiany (rezystancji/napięć) Cię interesują i jak samo zjawisko jest szybkie, a chcąc uzyskać dużą precyzję musisz zapewnić także np. stałość napięcia/prądu zasilającego te druciki. Czy jest to pomiar jakichś przepływów, gdzie czynnik chłodzi/grzeje termistor? Czy musisz znać bezwzględne wartości napięć z obu drucików, czy wystarczy znać np. różnicę? Jakiego rzędu rezystancje mają te druty? Jak bardzo się ona zmienia? Od takich podstawowych rzeczy zależy dobór toru pomiarowego. Daj więcej szczegółów.

Link do komentarza
Share on other sites

Jest to dosyć niestandardowy problem, próbuje oszacować prędkość czoła spalin w planiku Bunsena. Prędkość ta wynosi ok. 3 m/s. Chodzi o znalezieni piku kiedy spadek napięcia zaczyna rosnąc na pierwszym druciku, potem piku na drugim i znając ten czas można oszacować prędkość czoła. Są to cieniutkie druciki oporowe, każdy połączony szeregowo z opornikiem 50 om i zasilane 5 V z arduino (z zasilaczem). Druty zimne mają rezystancję bliską zeru a po podgrzaniu z tego co przed chwilą sprawdziłem to skacze do ok. 200 om. Więc nie trzeba znać wartości bezwzględnych, chodzi tylko o obserwację kiedy się ono zmienia.

Na razie chciałbym otrzymać wyniki w txt., a jak okaże się,że wychodzi ok to spróbuje napisać program który będzie tą prędkość liczył.

Jeżeli chodzi o timer to nie do końca rozumiem jedną kwestię. Jeżeli wyzwolę próbkowanie timerem co 1 ms to jeżeli wysyłanie pomiarów będzie się odbywało w głównej pętli loop() to i tak zajmie to za dużo czasu.

Link do komentarza
Share on other sites

Rozumiem, czyli ADC jest używany tylko jako interfejs do wejść analogowych lecz nie jest to pomiar sensu stricte a raczej próba detekcji pewnego progu. Hm, w tej sytuacji nie jestem pewien czy przyjąłeś dobrą strategię. ADC w AVR jest jednak stosunkowo wolny a tu mamy do czynienia z przebiegami szybkozmiennymi. O ile pamiętam ze szkoły, to palnik Bunsena jest dość małym sprzętem. Wysokość/długość płomienia może mieć kilka cm - przyjmijmy, że 3cm. Przy prędkości spalania 3m/s czoło pokona ten dystans w 10ms. Jak chcesz w miarę poprawnie mierzyć czasy tego rzędu przy prędkości próbkowania 1kHz (1ms)? Już na starcie masz rozmycie 10%.

Ponieważ głównym ograniczeniem prędkości jest w Twoim pomyśle transmisja - trzeba ją po prostu wyrzucić. Nikomu wartości wyników z ADC nie są przecież potrzebne. Do głowy przychodzą mi takie rozwiązania:

1. Używasz tak jak do tej pory ADC, ale nigdzie nie wysyłasz strumienia próbek. Algorytm pracy wygląda tak:

a. Odpalasz ADC z prędkością powiedzmy 10kHz wybierając wejście z drucika 1.

b. Odczytujesz każdy wynik i sprawdzasz czy przekroczył zadany z góry próg.

c. Przełączasz wejście ADC na drucik 2 oraz zerujesz i uaktywniasz licznik programowy liczący próbki ADC. Ponieważ pomiary wykonywane są co 10us (lub inny znany i zdeterminowany czas), to jest twój stoper.

d. Znów odczytujesz wyniki z ciągle pracującego ADC, ale tym razem oprócz sprawdzania przekroczenia progu inkrementujesz licznik.

e. Po przekroczeniu progu na druciku nr 2 zatrzymujesz ADC i wysyłasz wynik w postaci zawartości licznika. Możesz go od razu w procesorze przeliczyć na czas w np. w us znając okres działania ADC.

2. Nie bawisz się w żaden ADC tylko wstawiasz dwa najprostsze komparatory (patrz projekty linefollowerów), które porównują napięcie - każdy ze swojego drucika ze wspólnym poziomem odniesienia ustawionym potencjometrem. Do procesora doprowadzasz dwa sygnały cyfrowe i mierzysz odstęp czasu między np. narastającymi lub opadającymi zboczami jakąś trywialną metodą.

3. Używasz metody optycznej. Dwie fotokomórki z diodek IR powinny załatwić sprawę. Odpada opóźnienie grzania drucików oraz konieczność wstawiania ich w strumień gazu. Pomiar można robić np. w szklanej rurce.

"jeżeli wysyłanie pomiarów będzie się odbywało w głównej pętli loop() to i tak zajmie to za dużo czasu."

Tak, masz rację. I dlatego napisałem:

"wszystko inne musi się w tym czasie zmieścić"

Albo będziesz gromadził wyniki w RAMie procesora i wyślesz je później albo musisz mieć szybką transmisję albo niczego nie wysyłasz bo tego nie potrzebujesz. Niech procesor robi cały pomiar jak w moich powyższych propozycjach.

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

Przestudiowałem trochę temat pomiaru za pomocą drucików, i sprawdzanie czy opór przekroczył ustalony próg raczej nie będzie dobrym sposobem. Charakterystyka drucika jest bardziej złożona i może się wahać jeszcze przed dotarciem czoła płomienia, dodatkowo są też drgania i wybór odpowiedniego momentu najlepiej byłoby zrobić manualnie, przynajmniej na początku.

Myślę, że błędem może być stosowanie arduino do tego celu. Czy jest jakiś mikro-kontroler za pomocą którego dałbym radę próbkować sygnał z częstotliwością większą niż 1kHz, i nie z 2 tylko np. z 6 czujników i zapisywać dane? Może powinno się to robić w jakiś w ogóle inny sposób?

Będę wdzięczny też za polecenie jakiś artykułów w tej dziedzinie bo w temacie mikro-kontrolerów jestem raczej świeży.

A poza tym dziękuje za wszystkie pomysły.

Link do komentarza
Share on other sites

Rodzinka AVR ma dość stare ADC a poza tym prędkość peryferiów dopasowuje się do przewidywanych aplikacji i możliwości obliczeniowych samego procesora. Przetwornik w Arduino może próbkować nawet i kilkadziesiąt kHz a po zjechaniu rozdzielczością do 8 bitów to i 200kHz wyciśniesz. Zauważ jednak, że jest to 400kbajtów danych na sekundę. Musisz to albo gdzieś przesłać (jak?) albo obrobić na miejscu. Na każdą nową liczbę masz wtedy tylko 5us - to mało czasu.

Szybsze przetworniki są w XMEGAch i oczywiście w STM32. Możesz oczekiwać tam nawet kilku 12-bitowych ADC pracujących równolegle plus programowanie sekwencji kanałów pomiarowych dla każdego z osobna i DMA do bezbolesnych transmisji wyników do RAMu. Któreś Arduino jest zrobione na 32-bitowym ARMie od ATMELa. Tam na pewno jest lepszy ADC niż w UNO. Niestety system Arduino jest pomyślany jako zabawka dla początkujących. Kilka wywołań prostych funkcji z gotowych bibliotek i mamy stację pogodową, podlewamy kwiatki albo robimy woltomierz. Żeby wycisnąć z procesora wszystko co on potrafi, musisz zakasać rękawy i zacząć grzebać bezpośrednio w rejestrach peryferiów.

Pomyśl o gotowych kartach pomiarowych podłączanych do PC przez szybkie USB. Tam rozpiętości prędkości są od kHz (zastosowania w automatyce przemysłowej) do setek MHz (aparatura do eksperymentów naukowych, radary itp). To są właśnie rozwiązania dla ludzi którzy muszą coś zmierzyć, ale nie chcą budować wszystkiego samemu.

Możesz też rozważyć skorzystanie z dwóch kanałów audio wbudowanych w kartę dźwiękową komputera. Ma ona typowe dla sprzętu audio ograniczenie pasma od dołu (nie przenosi składowej stałej), ale jeśli chcesz wykrywać kształt i miejsce zboczy, nada się. Masz tu za darmo 16 bitów i min. 48kHz/kanał plus mnóstwo gotowego oprogramowania do nagrywania, wyświetlania i analizy plików wav.

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.