Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
Ważna
informacja!
Pisanie postów i komentowanie jest już włączone! W przypadku problemów z działaniem forum/bloga proszę o kontakt na adres web@forbot.pl lub na forum w odpowiednim temacie.

Pomiar napięcia przetwornikiem ADC - Pytania

Autor Wiadomość
cebaM 



Posty: 2
Wysłany: 12-08-2017, 18:11   Pomiar napięcia przetwornikiem ADC - Pytania

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:

Kod programu: Zaznacz cały
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.

Warto przeczytać » Druk połączeń na nieregularnych powierzchniach


Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4007
Pomógł: 429 razy
Otrzymał 579 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 13-08-2017, 17:32   

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.

Postaw piwo autorowi tego posta
 
 
antar.kt 



Posty: 1
Wysłany: 15-08-2017, 22:17   
Post wygaśnie: 08.22, 22:17

marek1707, Witam. Jestem nowy. Zlecę napisanie programu do pomiaru:
1/ napięcia pojedyńczych pików napięciowych około 100 - 400mV czas trwania 10 - 20 mikrosekund z przetwornika piezoelektrycznego z wystawieniem na wyjściu sygnału binarnego. Przetwarzanie 2 kanałowe z nastawą 3 progów napięciowych.
2/ Pomiar i rejestracja przyspieszenia w jednej osi. Czas pojedynczej rejestracji 400ms. Odtwarzanie na laptopie lub smartfonie.
3/ Pomiar odległości 0- 1,5m przy użyciu modułu ultradźwiękowego lub optycznego.
Do dyspozycji Raspberry Pi 3, ADS1256 / DAC8552 - przetwornik A/C i C/A 24/16-bit SPI - nakładka dla Raspberry Pi, płytka z przekaźnikami i inne wg wskazań. Proszę o kontakt 503364913

Postaw piwo autorowi tego posta
 
 
cebaM 



Posty: 2
Wysłany: 17-08-2017, 21:31   

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.

Popularny artykuł » Kurs STM32 - #13 - Podsumowanie, QUIZ


Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4007
Pomógł: 429 razy
Otrzymał 579 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 18-08-2017, 10:48   

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.

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Arduino ATmega 328-k... Arduino, problem z o... Arduino i programowa... Arduino Mega pliki d...
lub przeszukaj forum po wybranych tagach: adc, napiecia, pomiar, przetwornikiem, pytania


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki