Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Arduino (Nano) - Obrotomierz - brak stabilności odczytu

111lisu 14 Dec 2016 00:38 2208 11
  • #1
    111lisu
    Level 16  
    Witam
    Potrzebuję zrobić obrotomierz do silnika oraz
    w zależności od obrotów odmierzać cykle impulsów,
    ale mam problem z samym układem pomiarowym obrotów.
    (optycznym) wprawdzie sprawdzam to wiertarką na razie
    ale skacze to +- 200 obrotów to masakra.

    Znalazłem 2 podobne projekty:
    1. http://www.instructables.com/id/Measure-RPM-DIY-Portable-Digital-Tachometer/
    2. http://arduinoprojects101.com/arduino-rpm-counter-tachometer/
    ( http://www.instructables.com/id/Measure-RPM-DIY-Portable-Digital-Tachometer/step3/Making-the-sensor-board/ )

    Z tym, że wyświetlacz LCD mam po i2c jednak pomiar strasznie pływa.
    Najpierw wykorzystałem czujniki ze starej myszki,
    a później z czujnika sczelinowego papieru z FAXu.
    Jednak pomiar wcale się nie poprawił. Wprawdzie zrezygnowałem
    z włączania zasilania do czujnika z pinów procesora, ale to chyba jest bez znaczenia .

    Tak się zastanawiam czy problem leży w układzie pomiarowym? (2 rezystory 2 diody)
    Czy może moje chińskie arduino jakoś nie stabilnie działa?
    Może ma ktoś sprawdzone jakieś rozwiązanie.

    Code: c
    Log in, to see the code
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    Anonymous
    Anonymous  
  • #4
    Slawek K.
    Level 35  
    Musisz usredniac odczyty, czyli np. sumowanie 100 odczytow podzielone przez 100, wtedy eliminujesz piki. Oczywiscie liczba odczytow podana przykladowo,musisz dostosowac do czestotliwosci i czasu odswiezania.

    Pozdr
  • #6
    111lisu
    Level 16  
    Czyli coś jak tutaj?

    Code: c
    Log in, to see the code


    Najlepsze jest to, że później planowałem włączyć "coś" policzyć np: 200 obrotów i wyłączyć, jak to uśrednię to nie bardzo mi to wyjdzie.

    Mariusz
  • #7
    111lisu
    Level 16  
    Słuchaj wiem, że masz rację, ale powiem Ci jedno gdybym maił w tym wprawę to bym tu nie skrobał i nie narażał na uwagi takie jak Twoja. kolejny temat to nie pytam o cały program tylko o mały fragment, czyli poprawny odczyt obrotów z wału silnika sterowanego falownikiem, więc wszelkie czujniki typu hall odpadają a i nie ma pewności czy coś się przy opto nie wy-indukuje. zastanawia mnie skąd taka rozbieżność w pomiarach że skacze +- 200 obr, jakby "środowisko" w Arduino miało jakieś bóle. A tak na marginesie Arduino to takie coś (baza bibliotek) że można nic nie umieć a jednak coś naskrobać może to nie wydajne i zawodne ale hardware jakiś jest i soft też - wiem wiem mało profesjonale. Jednak jak się nie zacznie to się nie nauczy.
  • #8
    Anonymous
    Anonymous  
  • #9
    Ture11
    Level 38  
    Kolego, a ile kolega łapie impulsów na obrót wału? Może miałoby sens, zamiast mnożyć małą ilość obrotów przez duże liczby, zrobić inaczej - zbierać dużą ilość impulsów na obrót, a w mnożeniu będziesz miał małe liczby.

    Być może obecnie jest tak, że różnica jednego impulsu w trakcie obrotu daje Ci różnicę +/-200 obr/min, ze względu na mnożenie przez duże liczby... (a taką różnicę łatwo złapać, gdy startu pomiaru nie synchronizuje się z impulsami pomiarowymi).


    Sam się z tym zetknąłem (gdy jeszcze nie istniało Arduino...), jak jest tylko możliwe, trzeba stosować jak najprecyzyjniejszą wiedzę o obrocie mierzonego obiektu i jak najmniej mnożyć...
  • #10
    namok
    Level 25  
    Może zamiast mierzyć ilość impulsów w czasie lepiej będzie mierzyć czas pomiędzy impulsami z użyciem micros().
    111lisu wrote:
    zastanawia mnie skąd taka rozbieżność w pomiarach że skacze +- 200 obr, jakby "środowisko" w Arduino miało jakieś bóle.
    Daj na wejście sygnał o stałej częstotliwości i będziesz wiedział czy to "arduino ma jakieś bóle" czy problem jest gdzie indziej.
  • #11
    111lisu
    Level 16  
    Ture11 wrote:
    Kolego, a ile kolega łapie impulsów na obrót wału? Może miałoby sens, zamiast mnożyć małą ilość obrotów przez duże liczby, zrobić inaczej - zbierać dużą ilość impulsów na obrót, a w mnożeniu będziesz miał małe liczby.
    Być może obecnie jest tak, że różnica jednego impulsu w trakcie obrotu daje Ci różnicę +/-200 obr/min, ze względu na mnożenie przez duże liczby... (a taką różnicę łatwo złapać, gdy startu pomiaru nie synchronizuje się z impulsami pomiarowymi).
    Sam się z tym zetknąłem (gdy jeszcze nie istniało Arduino...), jak jest tylko możliwe, trzeba stosować jak najprecyzyjniejszą wiedzę o obrocie mierzonego obiektu i jak najmniej mnożyć...


    Z tego co mi znajomy zawracacz ... mówił to wystarczy mu tylko jeden impuls na obrót wału.
    A jaka liczba impulsów na obrót byłaby wystarczająca? Bo w podobnym starym urządzeniu było 60 oczek w tarczy optycznej.

    namok wrote:
    Daj na wejście sygnał o stałej częstotliwości i będziesz wiedział czy to "arduino ma jakieś bóle" czy problem jest gdzie indziej.

    Qrcze, że ja na to nie wpadłem.
  • #12
    namok
    Level 25  
    111lisu wrote:
    namok wrote:
    Daj na wejście sygnał o stałej częstotliwości i będziesz wiedział czy to "arduino ma jakieś bóle" czy problem jest gdzie indziej.

    Qrcze, że ja na to nie wpadłem.
    I zapomniałeś o tym napisać. Bo nam tu płacą za domyślanie się jakie testy przeprowadziłeś.

    Mimo że program z pierwszego postu mnie odrzuca to wgrałem go i otrzymałem następujące wyniki:
    Quote:
    Aktualne obroty14455obr./min.
    Trwa Pomiar
    Aktualne obroty14455obr./min.
    Trwa Pomiar
    Aktualne obroty14455obr./min.
    Trwa Pomiar
    Aktualne obroty14700obr./min.
    Trwa Pomiar
    Aktualne obroty14396obr./min.
    Trwa Pomiar
    Aktualne obroty14396obr./min.
    Trwa Pomiar
    Aktualne obroty14455obr./min.
    Trwa Pomiar
    Aktualne obroty14700obr./min.
    Trwa Pomiar
    Aktualne obroty14455obr./min.
    Trwa Pomiar
    Aktualne obroty14455obr./min.

    Sygnał na wejściu miał częstotliwość 1kHz.
    Ten sam sygnał podany na arduino z poniższym programem przerwania
    Code: c
    Log in, to see the code

    pokazuje dokładne wartości czasu trwania impulsu(z rozdzielczością 4us - tak liczy micros()) i liczby impulsów przy czasie pomiaru =1s liczonym z millis(). Oczywistym jest że gdzieś źle liczysz.
    Nie wiem po co takie kombinacje w liczeniu.
    Jeśli zliczasz ilość impulsów w czasie 1 sek. to obroty/min = ilosc *60.
    Jeśli mierzysz czas pomiędzy impulsami to obroty/min = 60000000 / roznicaCzasu.
    Oczywiście sygnał w rzeczywistym układzie nie będzie stały(częstotliwość) i trzeba będzie zastosować jakiś filtr, np. uśrednianie ale najpierw opanuj całość na idealnym sygnale.