• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Niedokładność pomiarowa - problem z odczytywaniem impulsow
#11
(13-08-2018, 23:35)qbic napisał(a): Jedyne co mi przychodzi na myśl to zabezpieczenie przed zbyt wysokimi częstotliwościami.
Tylko jak? Miałem ten problem w praktyce i go rozwiązałem ale chciałbym poznać inne pomysły.
 
Odpowiedź
#12
Znając prędkość maksymalna mogę obliczyć maksymalna ilość impulsów na pół sekundy co tez zrobię.

Pojawia się jednak kolejny problem. Teraz musze zliczyć sumę długości impulsów wtryskiwaczy w ciągu pół sekundy. Zanim zabrałem się za prędkościomierz robiłem już taki program za pomocą funkcji millis() jednak nie robił on nic innego poza zliczaniem długości tych impulsów. Teraz zastanawiam się jak dodać taka funkcje do obecnego programu.

Wczoraj poźna porą dodałem taka funkcjonalność do programu - dodałem dwa przerwania. Pierwsze które rozpoczynało zliczanie czasu kiedy wykryło zmianę stanu z wysokiego na niski (FALLING) i drugie które które dodawało różnice czasów do zmiennej „impulsLengthInHalfSecond” kiedy wykryło zmianę stanu z niskiego na wysoki (RISING). Następnie wartość zmiennej wyswietlałem co pół sekundy, a potem ja zerowalem.

Niestety wartości które otrzymuje sa zupełnie oderwane od rzeczywistości - zbyt długie, czasem ujemne.
Zastanawiam się czy nie jest to konflikt przerwań. Nie sprawdzałem jeszcze czy sposób ten zadziała jeśli nie zaliczałbym prędkości za pomocą przerwań.
 
Odpowiedź
#13
(14-08-2018, 10:14)qbic napisał(a): dodałem dwa przerwania. Pierwsze które rozpoczynało zliczanie czasu kiedy wykryło zmianę stanu z wysokiego na niski (FALLING) i drugie które które dodawało różnice czasów  do zmiennej „impulsLengthInHalfSecond” kiedy wykryło zmianę stanu z niskiego na wysoki (RISING). Następnie wartość zmiennej wyswietlałem co pół sekundy, a potem ja zerowalem.

Niestety wartości które otrzymuje sa zupełnie oderwane od rzeczywistości - zbyt długie, czasem ujemne.
Zastanawiam się czy nie jest to konflikt przerwań. Nie sprawdzałem jeszcze czy sposób ten zadziała jeśli nie zaliczałbym prędkości za pomocą przerwań.

Jakie to sa czasy? Jesli krótsze niz 3,3E-5.....2e-5 to w ten sposób ich nie zmierzysz. Użyj sprzętowego przychwytywania przez timer.
 
Odpowiedź
#14
Sprzętowe przechwytywanie przez timer? Mógłbyś rozwinąć, ewentualnie podesłać jakieś materiały?
Ogolnie jeśli chodzi o mikrokontrolery jestem dość „zielony” i nie miałem styczności z tym tematem.
 
Odpowiedź
#15
(14-08-2018, 12:09)qbic napisał(a): Sprzętowe przechwytywanie przez timer? Mógłbyś rozwinąć, ewentualnie podesłać jakieś materiały?
Szukaj w nocie katalogowej uC pod hasłem ICP.

AVR mega nie jest zbyt dobry do tego, może przechwytywac albo zbocze narastające albo opadające. Jak chcesz mierzyć czas impulsu, to musisz w przerwaniu ICP zmienic zbocze, trochę uperdliwe i nie daje możliwości pomiaru bardzo krótkich impulsów. W STM32 nie ma z tym problemu, jak jest w Xmega nie wiem.
 
Odpowiedź
#16
W twoim projekcie są 2 głownie błędy i nigdy nie osiągniesz sukcesu mianowicie:
-Avr nie posiada trybu wielozadaniowego co, za tym idzie funkcje + odczyt prędkość jest nie możliwa.
-Avr to max 20Mhz to stosunkowo za mało.
Nawet jak byś rozdzieli odczyt na osobny uc nie wystarczy.
-Pomysł musisz przenieść co najmniej na cortexa (moim zdaniem i tak za wolny)
-Albo na coś mocniejszego na przykład rasspbery.
-Co do prędkości można ja ukraść z silnika krokowego licznika .
Pewnie zastanawia cie jak to zrobić?
A mianowicie tak -skoro silnik krokowy działa na sekwencji impulsów można te impulsy przełożyć na odczyt wartości.
Nie jet to proste ale wykonalne.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#17
(14-08-2018, 17:23)adix napisał(a): -Avr nie posiada trybu  wielozadaniowego co, za tym idzie funkcje + odczyt prędkość  jest nie możliwa.
-Avr to max 20Mhz to stosunkowo za mało.
Nawet jak byś rozdzieli odczyt na osobny uc nie wystarczy.
-Pomysł musisz przenieść co najmniej na cortexa (moim zdaniem i tak za wolny)
-Albo na coś mocniejszego na przykład rasspbery.

Przesadzasz kolego i to bardzo. Śmiem twierdzić, że masz mgliste pojecie o uC.
- Wielozadaniowość można osiągnąć, jest RTOS (uRTOS) na AVR
- Nie trzeba Cortexa. Na AVR 16MHz mierzę impulsy o czasach 50us a można i krótsze.

Da się zrobić to co autor potrzebuje ale musi zapomnieć o Arduino. Biblioteki Arduino bardzo mało używają sprzętu i większość funkcji realizują programowo. Przez to obsługa 1-Wire, pomiar czasu impulsu, sterowanie silnikiem krokowym, blokuje program. A wystarczy, w przypadku 1-Wire żyć USART, czas mierzyć timerem, silnikiem krokowym sterować przez timer.

Rasspbery czy Cortex choćby miliom GHz nic nie da jeśli nie używa się sprzętu. Uzyskaj na Cortexie 100MHz programowe SPI 50MHz. Da się? Nie. Jak szybki musiałby być Cortex? Jakieś 1GHz a i tak bedzie to funkcja blokująca. To samo na Rasspbery . Co innego, gdy użyje się sprzętu, 50MHz to nie problem a użycie DMA odciąży prawie całkowicie CPU.


Wypowiedź kolegi uświadomiła mnie dlaczego Windows działa tak wolno i potrzebuje ogromne ilości pamięci. Jest pisany nieoptymalnie i para idzie w gwizdek.
Pan Programista-Elektronik jest podobny do programistów z u$. Użyłby armaty na wróbla (Rasspbery - 4 rdzenie, 1,2GHz, 512k RAM i i tak pewnie program by kulał. Dzieciak z gimnazjum zrobił by to na AVR (16MHz, 2k RAM, 8k FLASH) , używając uC za 1..5% wartości tego co kolega (Rasspbery 100..200zł) i by działało dobrze.


(14-08-2018, 17:23)adix napisał(a): Jeśli pomogłem podziękuj punktem reputacji
Niestety negatywnych nie można wystawiać.
 
Odpowiedź
#18
Kolego poczekam na efekty .
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#19
(14-08-2018, 10:14)qbic napisał(a): Pojawia się jednak kolejny problem. Teraz musze zliczyć sumę długości impulsów wtryskiwaczy w ciągu pół sekundy. Zanim zabrałem się za prędkościomierz robiłem już taki program za pomocą funkcji millis() jednak nie robił on nic innego poza zliczaniem długości tych impulsów. Teraz zastanawiam się jak dodać taka funkcje do obecnego programu.
(...)
Niestety wartości które otrzymuje sa zupełnie oderwane od rzeczywistości - zbyt długie, czasem ujemne.
Zastanawiam się czy nie jest to konflikt przerwań. Nie sprawdzałem jeszcze czy sposób ten zadziała jeśli nie zaliczałbym prędkości za pomocą przerwań.
Wyczytałem, że impulsy do wtryskiwaczy sa rzędu ms (3..15ms). Jeśli tak faktycznie jest, to bez problemu można je mierzyć używając przerwań INT czy PCINT. Takie czasy bez problemu mierzy Z-80 4MHz z CTC i nie potrzeba armaty w rodzaju Cortex 48MHz czy tym bardziej Rasspbery 1GHz 4 rdzenie (jak ktoś nie potrafi to i 50 rdzeni nie pomoże)
Skoro mierzysz źle, to albo te impulsy sa krótsze (napisz jakie to czasy) albo źle napisałeś program - pokaż go, nie wstydź się. Jeśli się boisz, że ukradną program, to znaczy komercja a komercja oznacza, że za poradę musisz zapłacić.
 
Odpowiedź
#20
Oczywiscie, ze nie pisze komercyjnie - sam mam bardzo male pojęcie o mikrokontrolerach. Z programowania mam bardzo ogolną wiedzę zdobytą w liceum, jednak chce się rozwijać w tym kierunku. Zainteresowałem się Arduino, ponieważ wszystko na tej platformie wydawało się łatwiejsze - gotowe funkcje, biblioteki, dostępność materiałów.

Jak widać nie jest tak kolorowo jak się wydawało, jednak czuje się zmotywowany żeby dokonczyć ten projekt. Kod podeśle jutro, ponieważ nie mam dostępu do komputera na którym się znajduje, ponadto muszę poprawić jego czytelność.

Chętnie dowiem się więcej o warstwie sprzętowej (?) Arduino i mikrokontrolerów ogolnie, więc jeśli ktoś zna dobre materiały do nauki chętnie skorzystam.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości