Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR jako licznik motogodzin.

21 Maj 2009 12:06 2721 7
  • Poziom 24  
    Witam.

    Muszę zrobić licznik motogodzin na atmega 8 i wyświetlaczu led.

    potrzebuje pomocy jak to mam obliczać.
    Dostaje 2 impulsy na obrót wału.

    Wzór do obliczenia motogodzin M=RPM*t/RPM nom
    Gdzie RPM to aktualna liczba obrotów
    T - czas pracy w godzinach
    RPM nom- nominale obr biegu jałowego tu zakładam 400.

    Wiem jak zliczać impulsy obrotów ale jak przy tym zliczać jego całkowity czas pracy tak by później otrzymać jednostkę w motogodzinach???

    Dodatkowo istnieje możliwość zaniku zasilania więc przydałaby się jakaś pamięć gdzie będzie zapisywany stan licznika (tu chciałem wykorzystać pamięć 24c02)
  • Pomocny post
    Poziom 33  
    Jesli chodzi o zanik zasilania, o mozesz zrobic prosty ukladzik na tranzystorze ktory wykryje zanik zasilania. Jesli to wykryjesz to zapisujesz dane we WBUDOWANYM eepromie.
  • Pomocny post
    Poziom 17  
    znaczy się że jak nominalnie ma 400 i godzinę się kręci 400 to masz zliczyć 1 'jeden' a jak godzinę się kręci z obrotami 200, to masz zliczyć 0,5? pół motorogodziny?
    Jeśli tak to musisz mierzyć czas między kolejnymi impulsami i potem to uśrednić, tyle że ci ramu nie starczy, więc musisz uśredniać na bieżąco.
    Zanik zasilania zgodnie z radą kolegi, masz tam ze 128 bajtów eeproma w środku.
  • Pomocny post
    Poziom 31  
    Licznik motogodzin ? czyli jak długo pracuje silnik bez zliczania obrotów (zwykłe mechaniczne tak mają). Biorąc pod uwagę twój wzór to silnik pracujący na wolnych obrotach będzie nabijał mniej motogodzin i odwrotnie jeśli będzie hulał na full to w tej samej jednostce czasu nabije więcej motogodzin .

    Jeśli wiesz jak zliczać impulsy z wału to dorób sobie przerwanie co 1s , i co kilka/kilkanaście sekund wykonaj działanie wg podanego przez ciebie wzoru .
  • Pomocny post
    VIP Zasłużony dla elektroda
    Zależy od wymaganej dokładności. Można pomiary zrobić tak:
    Code:

    uint32_t motogodziny;
    const uint8_t precyzja = 10;         /* 10 bitów ułamkowych = ok. 1/32 motominuty */
    const uint16_t nominalne_rpm = 400;
    for (;;) {
        uint16_t impulsy = 0;

        while (!minela_minuta) {
            /* zliczaj_impulsy */
        }
        /* zeruj licznik impulsów i odliczanie minuty */

        /* uwaga na przepełnienie!
         * 60 << precyzja musi być <= 2^16 */
        motogodziny += (((uint32_t)impulsy << precyzja) * 60 + nominalne_rpm/2) / nominalne_rpm;
        /* zapisz motogodziny do eepromu */
    }

    W ten sposób zliczasz motogodziny z określoną dokładnością. Zapis 4 bajtów co minutę do eepromu na kolejnej komórce pozwala na nieprzerwaną pracę urządzenia przez (ilosc_bajtow_eeprom/4) * (zywotnosc_eeprom) sekund = ok. 6 lat dla atmega8.

    Edit: poprawka w zaokrąglaniu.

    Pozdrawiam,
    Dr.Vee
  • Poziom 24  
    Zapomniałem dodać że chciałbym to pisać w bascomie.

    Wykorzystać 5 wyświetlaczy 7segmentowych.


    Jak rozwiązać opcje zapisywania do wewnętrznej pamięci??

    Silnik będzie pracował z obrotami większymi niż 400, te 400 to obroty biegu jałowego.

    Co do wymaganej dokładności to +/- 5% błędu szkody żadnej nie zrobi.
  • VIP Zasłużony dla elektroda
    Heroses napisał:
    Zapomniałem dodać że chciałbym to pisać w bascomie.

    No to sobie przetłumacz na bascoma.

    Pozdrawiam,
    Dr.Vee
  • Poziom 24  
    Łatwo się mówi..
    Nie mam zienonego pojęcia na temat tego co powyżej napisałeś więc jak mam sobie to przetłumaczyć??