Skocz do zawartości
Wrona

AS7263 - pomiar NIR - trzeba wyciągnać maksymalną częstotliwość

Pomocna odpowiedź

Korzystam z czujnika NIR i biblioteki jemu dedykowanej ze strony  producenta https://learn.sparkfun.com/tutorials/as726x-nirvi/all .Komunikacja z Arduino poprzez I2C.

Pierwsze pytanie. Mamy w bibliotece funkcje "void setIntegrationTime(byte integrationValue); --- This sets the time over which samples are taken. Takes a value between 0 and 255. Integration time will be 2.8 ms * integrationValue."
Zrozumiałem to tak że jeśli w nawiasie podam wartość "0" czyli napisze "sensor.setIntegrationTime(0);" to czas pobierania próbki wynisie 0,0025s a jeśli napisze "sensor.setIntegrationTime(255);" to czas pobierania próbki wyniesie 0,714s. Niezależnie jednak co tam wpisuje odstęp między pomiarami wynosi 0,031s dla jednego kanału i 0,193 dla wszystkich kanałów łącznie. Czegoś tutaj na pewno nie zrozumiałem. Pomijając na razie kwestie opóźnień transmisji (czyli najkrótsze czasy) dziwi mi to że dla wartośći 255 czas między kolejnymi próbkami jest mniejszy od 0,714s. Czy może czas pobierania próbek to kwestia niezależna od częstotliwości z jaka można zapytań czujnik o wynik a ta jest w okolicy 0,031s dla jednego kanału.

Drugie pytanie. Mam taką funkcje:

void NIR()                                                               
{
Serial.print(sensor.getCalibratedR(), 2);        Serial.print("\t");            
Serial.print(sensor.getCalibratedS(), 2);        Serial.print("\t");
Serial.print(sensor.getCalibratedT(), 2);        Serial.print("\t");
Serial.print(sensor.getCalibratedU(), 2);        Serial.print("\t");
Serial.print(sensor.getCalibratedV(), 2);        Serial.print("\t");
Serial.print(sensor.getCalibratedW(), 2);        Serial.print("\t");
Serial.print(sensor.getTemperature(), 1);        Serial.print("\t");
}

Tak jak pisałem najwięcej co z niej wyciągam to pomiar co 0,186s a jeśli wybiorę jeden kanał to pomiary mogę robić co 0,031s.
Początkowo myślałem że wywalę pomiar temperatury (przypuszczając ze jest spowalniaczem) ale on jest ekspresowy i jego cykl to jedyne 0,02s.
Właśnie ta wartość czyli 0,02s to jest to co muszę osiągnąć dla całego czujnika. Czy jest to możliwe?
Jeśli to niemożliwe to pozostanie mi ustawianie pomiaru tylko jednego kanału jednocześnie i zadowolenie się wynikiem 0,031s.

Z góry dziękuje za pomoc.

Udostępnij ten post


Link to post
Share on other sites

Rozumiem, że Serial.print() trwa dokładnie 0 milisekund?

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
35 minut temu, ethanak napisał:

Rozumiem, że Serial.print() trwa dokładnie 0 milisekund?

Chyba nie do końca zrozumiałem intencje pytania gdyż ty na pewno znasz odpowiedz na to pytanie które brzmi "Nie". Chciałeś chyba zasugerować (odnośnie mojego pytania 2) by spróbować wysłać wszystko za jednym podejściem. Właśnie w tym kierunku kombinuje. Szukam jednak jeszcze innych ewentualności,  bo skoro dla samego kanału R wynik to 0,032s a dla samego kanału Temperatury wynik to 0,011s, to być może jest tu jakiś ukryty potencjał na oszczędności. I tu, wracamy do mojego pytania 1 co z tym "byte integrationValue"?

Edit:

Wysłanie wszystkiego za pośrednictwem jednego Serial.println() nie zmienia czasu który nadal wynosi 0,2s a chciałbym by było 0,02s.

 

Edytowano przez Wrona

Udostępnij ten post


Link to post
Share on other sites

Chciałem zasugerować, że Twój "czas pomiaru" to nie żaden czas pomiaru, a czas pomiaru + czas 10 printów na Serialu.

Co do pytania 1 - nie wiem. Ale na razie skupiłbym się na wyeliminowaniu innych czasów oprócz czasu pomiaru.

Za jednym podejściem mówisz... to będzie N bajtów, tak?. Ile czasu trwa przesłanie N bajtów przez Serial? Powiedzmy, że jeden bajt wymaga czasu tyle co ok. 10 bitów. Jaki będzie wynik działania N * 10 * 1000 / prędkość_serial?

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, ethanak napisał:

Chciałem zasugerować, że Twój "czas pomiaru" to nie żaden czas pomiaru, a czas pomiaru + czas 10 printów na Serialu.

To to ja oczywiście wiem. W praktycznym zastosowaniu "czas pomiaru" to cały okres zawierający zarówno sam czas dokonywania pomiaru jak i czas związany z jego drogą do monitora portu szeregowego. Właśnie dlatego pytam o możliwości zaoszczędzenia na wszystkim co można ograniczyć na tej drodze. 

Próbowałem eksperymentować np. z "printMeasurements(); --- Fetches data from memory and outputs calibrated measurements " ale dostaje komunikat o niezdefiniowaniu takiej funkcji. Spróbuje się dobrać do biblioteki ale raczej jestem za cienki  by tam coś gmerać.

 

Udostępnij ten post


Link to post
Share on other sites
29 minut temu, Wrona napisał:

dlatego pytam o możliwości zaoszczędzenia na wszystkim co można ograniczyć na tej drodze

Jaka prędkość Serial i dlaczego nie 115200? Dlaczego transmisja tekstowa a nie binarna?

Udostępnij ten post


Link to post
Share on other sites
2 minuty temu, ethanak napisał:

Jaka prędkość Serial i dlaczego nie 115200? Dlaczego transmisja tekstowa a nie binarna?

"Jak nie, jak tak", "Chroniczny Pytajniku" 🙂

Ale pisząc wprost a nie dziwnym kodem odpowiadam. Ustawiona prędkość to właśnie 115200. A co do kwestii rodzaju transmisji to ... jest to konstruktywna sugestia i zaraz zainteresuje się tematem.

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wykonanie funkcji Serial.print w Arduino nie trwa istotnie długo w porównaniu do szukanego czasu, bo to tylko przepisanie danych z bieżącej zmiennej do bufora nadawczego, a prędkość 9600 czy 115200 ma znaczenie tylko w sensie przepełnienia tego bufora - jeśli będzie to 9600 jest większe prawdopodobieństwo, że zapełnimy bufor zanim zostanie to wystukane na UART.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@kaczakat Tak, przeprowadziłem pomiary dla konkretnego mojego przypadku. Czas wykonania funkcji Serial.print() jest zaniedbywalny w stosunku do tego że funkcja sensor.takeMeasurements() potrzebuje około 0,05s a odczyt wszystkich 6 kanałów to 0,20s czyli razem pomiar 0,25s. Tego chyba nie przeskoczę i muszę wybrać albo pomiary jednokanałowe ale częściej albo wszystkie kanały równocześnie ale w "ślimaczym tempie". Jakoś to przeżyje ale jakby ktoś ... coś ... w temacie miał do zaproponowania ... to ja chętnie. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
24 minuty temu, kaczakat napisał:

Wykonanie funkcji Serial.print w Arduino nie trwa istotnie długo w porównaniu do szukanego czasu, bo to tylko przepisanie danych z bieżącej zmiennej do bufora

Owszem. Problem powinienem sformułować nieco inaczej ale nie chciałem komplikować sprawy... po prostu jeśli bufor ma skończony rozmiar nie mniejszy niż rozmiar paczki, a wysłanie jednej paczki rezultatów trwa N milisekund to raczej nie będzie możliwe, aby wysyłać to częściej niż te nieszczęsne N...

16 minut temu, Wrona napisał:

Czas wykonania funkcji Serial.print() jest zaniedbywalny

Pojedynczej tak. Kilku już nie (patrz wyżej).

16 minut temu, Wrona napisał:

jakby ktoś ... coś ... w temacie miał do zaproponowania

Tak mi teraz do głowy wpadło - jaką prędkość I2C masz ustawioną? jeśli 100 kHz to spróbuj ustawić 400:

Wire.setClock(400000);

Tylko uwaga: nie wszystko ruszy na 400 kHz (np. PCF8574 nie).

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
5 minut temu, ethanak napisał:

Pojedynczej tak. Kilku już nie (patrz wyżej).

Robiłem testy różnorodne. Wypełniałem Serial.print() a w zasadzie ich całe zespoły tekstami by miału co wysyłać zamiast pomiarów NIR. Wykonywałem pomiary ale ich nie wysyłałem. Wysyłałem teksty zastępcze jednocześnie wykonując nie wysyłane pomiary. Włączałem i nie włączałem sensor.takeMeasurements() w przebiegu funkcji pomiarowej i mnóstwo innych kombinacji. Za każdym razem skrupulatnie notowałem uzyskane wyniki by potem porównać i wnioskować co pożerało najwięcej czasu. Same wielokrotne Serial.print(), nawet wypełnione dziesiątkami znaków pozwalały mi osiągać wymarzone 0,02s a nawet spokojnie 0,01s a niżej to już nie sprawdzałem bo żadna to pociecha gdy sam sensor.takeMeasurements() którego potem nawet nie wysyła się w Serial.print() potrzebuje około 0,05s a odczyt wszystkich 6 kanałów nawet bez wysyłania to 0,20s czyli nie ma przeproś i pomiar to 0,25s.

17 minut temu, ethanak napisał:

 


Wire.setClock(400000);

Tylko uwaga: nie wszystko ruszy na 400 kHz (np. PCF8574 nie).

Ustawiłem i niczego to w wynikach czasu nie zmieniło. Co dziwne LCD16x2 z konwerterem śmiga, może dlatego że to PCF8574AT (ale nie znam się tylko zmyślam).

Ale dzięki za pomysł bo właśnie pokazałem mi kolejne ustawienie którego nie znałem.

Udostępnij ten post


Link to post
Share on other sites

Biblioteki arduino kiepsko się nadają do szybkiej transmisji przez uart ale jakby napisać własne funkcje do transmisji to nawet 2Mbps da się wycisnąć z avr tylko konwerter trzeba kupić zewnętrzny (ok. 4zł na allegro) bo te na płytkach arduino są zazwyczaj za wolne i zastosować krótki kabel podłączeniowy.

Będziesz miał wtedy komunikację wielokrotnie szybszą niż pobieranie próbek co pozwoli na analizowanie wyników w czasie rzeczywistym.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
37 minut temu, atMegaTona napisał:

Biblioteki arduino kiepsko się nadają do szybkiej transmisji przez uart ale jakby napisać własne funkcje do transmisji to nawet 2Mbps da się wycisnąć z avr tylko konwerter trzeba kupić zewnętrzny (ok. 4zł na allegro) bo te na płytkach arduino są zazwyczaj za wolne i zastosować krótki kabel podłączeniowy.

Będziesz miał wtedy komunikację wielokrotnie szybszą niż pobieranie próbek co pozwoli na analizowanie wyników w czasie rzeczywistym.

Toś mnie bracie uradował wiadomością że nie jest to nie możliwe. Gorsza wiadomość jest taka że na razie to "dukam" kodem w Arduino więc pisanie własnych funkcji do transmisji brzmi przerażająco. Tematem się jednak zainteresuje, choć w tym momencie mam wrażenie że jakbym sam napisał te funkcje to byłyby jeszcze gorsze pod względem wydajności od Arduinowskich 🙂

Edytowano przez Wrona

Udostępnij ten post


Link to post
Share on other sites

Ale próbować można a nawet powinno się. Korzystając z frameworka arduino można śmiało korzystać jednocześnie z avr libc i pisać bezpośrednio po rejestrach. Same funkcje sprowadzają się jedynie do załadowania bufora nadawczego i odczytania odbiorczego przed wysłaniem i po odebraniu. To kilkanaście linijek w c lub niewiele więcej w asm. wystarczy w przerwaniu jedynie inkrementować wskaźnik do kolejnych bajtów i przepisywać je do rejestru TX albo z RX do pamięci. Pobaw się tym to ogarniesz w jedno popołudnie.

Albo napisz temat na forum to pomoże kto potrafi.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Wrona mam jeszcze jedno pytanko.

Bo skupiliśmy się na Arduino, pomiarach i prędkościach seriala... a kto odbiera wyniki tych pomiarów na tym serialu i czy naprawdę lecą one z pełną prędkością 24godziny na dobę? Bo jeśli potrzebne są wyniki pomiarów np. z kilku sekund raz na jakiś czas to można je sobie w jakiś sposób szybciutko pomierzyć i zbuforować, a potem w majestatycznym tempie przesłać do jakiegoś peceta (czy co tam potem te dane obrabia)...

1 godzinę temu, Wrona napisał:

Co dziwne LCD16x2 z konwerterem śmiga, może dlatego że to PCF8574AT

A to ciekawe bo nie ma prawa śmigać. Na pewno zegar I2C się przestawił na 400 MHz? Pokaż ten kawałek kodu w którym przestawiasz zegarek...

Miałem swego czasu taki problem z połączeniem MPU6050, VL53L1X i wyświetlacza przez I2C do Pro Mini. Na 100 kHz było to za wolne, na 400 wyświetlacz nie miał najmniejszego zamiaru zareagować...

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...