Skocz do zawartości

Obrotomierz z pamięcią


Pomocna odpowiedź

Napisano

Witam - chciałbym zrobić bo zawsze to fajniej niż kupić gotowe - Obrotomierz, który dodatkowo zapisywałby łączną ilość obrotów wykonanych przez urządzenie, którego pomiar się odbył.
Tzn. sam obrotomierz np. w oparciu o Halla ogarniam.
Wyświetlanie wyniku pomiaru również - czy to ilość w jednostce czasu czy sumaryczna.
Poległem natomiast przy próbie rozkminienia jak ową wartość (sumaryczną) zapamiętać żeby nie znikła przy przerwie w zasilaniu (np. resecie) i doliczała kolejne po ponownym starcie.
Czy Arduino umożliwia w jakikolwiek sposób takie rozwiązanie?
Czy szukać innej drogi - ew w czym/gdzie?

 

10 minut temu, andris napisał:

Czy Arduino umożliwia w jakikolwiek sposób takie rozwiązanie?

Tak... EEPROM, ale masz limit zapisów (powiedzmy bezpieczny to ok. 100 000 razy), więc musisz zrobić detekcję zaniku napięcia i podtrzymanie zasilania Arduino do momentu aż zapis na pamięci EEPROM się dokona.

Najlepszą opcją jest zapis w pamięci RAM/PSRAM, która ma podtrzymanie (dodatkowe zasilanie) bateryjne, dzięki czemu nie gubi danych. Wtedy limitu zapisów zwykle nie ma.

1 godzinę temu, andris napisał:

Czy Arduino umożliwia w jakikolwiek sposób takie rozwiązanie?

Która płytka, tj: z jakim mikrokontrolerem?

3 godziny temu, andris napisał:

Czy szukać innej drogi - ew w czym/gdzie?

Na zasilanie dajesz diodę i za nią duży (1000uF) kondensator.

Z przed diody dajesz sygnał na przerwanie kontrolera. Zanik napięcia wyzwala przerwanie, a procesor (podtrzymywany przez moment przez kondensator) zapisuje bieżące dane w eeprom.

  • Lubię! 1

Eeee - podtrzymanie bateryjne mnie nie zadowala (o ile dobrze zrozumiałem). W takim przypadku nie musiałbym nic qńbinować tylko "cod" chodziłby cały czas a zmienna zwiększała wartość.
Chodzi mi o jakieś zachowanie jej wartości w "codzie" aby po ponownym podłączeniu zasilania startował z nią i dalej dodawał.
Mam podstawowe UNO ale to nie problem dokupić coś innego jeśli potrzeba taka zaistnieje.
Nie mam nic napisane - to na razie jedynie pomysł ale odczyt z Halla, przypisanie kolejnych wartości zmiennej i ich wyświetlenie nie stanowi dla mnie problemu. Nie wiedziałem jedynie czy z Arduino można się na coś takiego porwać.
Może doprecyzuję co chcę uzyskać zamiast teoretyzowania to będzie łatwiej rozmawiać:
Potrzebuję "ustrojstwo", które będzie liczyć ilość obrotów wykonywanych przez silniki spalinowe w różnych moich maszynkach takich jak samochody traktorki, rębak, agregat itp. i zapamiętywać je sumując kolejne etapy pracy.
Chodzi o realne zużycie elementów w stosunku do ilości wykonach "cykli" pracy.
Coś jak licznik motogodzin ale w odróżnieniu od niego nie uwzględniające jednostki czasu ani obrotów "znamionowych" tyko dokładnie konkretnie wykonane.

 

9 minut temu, kostuch napisał:

Na zasilanie dajesz diodę i za nią duży (1000uF) kondensator.

Z przed diody dajesz sygnał na przerwanie kontrolera. Zanik napięcia wyzwala przerwanie, a procesor (podtrzymywany przez moment przez kondensator) zapisuje bieżące dane w eeprom.

Ooo! Coś wygląda obiecująco.
Rozwiniesz? Tzn. podrzucisz schemat podłączenia i jak to zapisać w codzie bo ja za cienki żeby załapać po ogólnym zarysie pomysłu 😞 

Ja myślę że nic nie trzeba kombinować tylko proste zapisywanie zmiennej po zmianie wartości i tyle...100k zapisów to tak teoretycznie, w praktyce ponoć dużo więcej wytrzymuje

@andris chcesz zapisywać każde wykrycie halka czy jakoś to inaczej na być jeszccse przeliczone? Wrzuć kod z hallem to się dopisze resztę...
 

2 godziny temu, andris napisał:

podstawowe UNO

czyli mega328, ten kontroler ma wbudowany komparator, na podstawie jego stanu - odczytanego w przerwaniu lub polling - u  zapisujesz swoją strukturę do eeprom, czas zapisu liczy się w milisekundach więc AVR spokojnie zdąży 

Dnia 26.12.2025 o 19:36, andris napisał:

Ooo! Coś wygląda obiecująco.
Rozwiniesz? Tzn. podrzucisz schemat podłączenia i jak to zapisać w codzie bo ja za cienki żeby załapać po ogólnym zarysie pomysłu 😞 

    |----------- przerwanie

0---I>|------- zasilanie mcu

               |

             == 1000uF

               |

              _

 

Schemat u góry 😁

W kodzie definiujesz pin jako wejście z pull-up generujący przerwanie na opadającym zboczu. W przerwaniu zapisujesz obroty czy co tam chcesz do eeprom i zatrzymujesz kod.

Przerwanie najlepiej jak najkrótsze, bo masz tylko tyle czasu ile ładunku w kondensatorze. Może być zdefiniowane jako ISR_NAKED.

Jak używasz innych przerwań, to definiuj je jako ISR_NOBLOCK.

 

Przykład:

ISR(INT1_vect, ISR_NAKED)                                                                    // Power fail
{
    SFIOR = (1 << PUD);                                                            // Blokada Pull-up
    eeprom_write_block((pulses_t *)&pulses, &ee_pulses, sizeof(pulses_t));        // Zapis ilosci impulsow do EEPROM
    while (1);                                                                    // Stop - czekaj na calkowity zanik zasilania
}

  • Lubię! 1
Dnia 26.12.2025 o 21:54, _LM_ napisał:

czyli mega328, ten kontroler ma wbudowany komparator, na podstawie jego stanu - odczytanego w przerwaniu lub polling - u  zapisujesz swoją strukturę do eeprom, czas zapisu liczy się w milisekundach więc AVR spokojnie zdąży 

To raczej nie o zdążanie z zapisem chodzi.

Jak ma być zapamiętywana w miarę dokładna ilość jakichś tam cykli, to w silniku kręcącym się 1000obr/min jak zapiszesz co sekundę stan, to masz dokładność 1000/60=16 obrotów

A 100tys cykli zapisów eeprom to tylko jakieś 27 godzin zapisów co sekundę.

Nawet zakładając że pamięć wytrzyma 10x więcej, to i tak niecałe 2 tygodnie życia...

 

Jest to dokładnie to samo co ty przedstawiłeś w swojej odpowiedzi z tą różnicą że ja zaproponowałem komparator jako wyzwalacz zapisu po wyłączeniu zasilania co jest stabilnym rozwiązaniem gdyż nie jesteśmy zależni od histerezy io wejścia przerwania. Wbudowany w up komparator możesz wewnętrznie podłączyć do napięcia odniesienia 1.1V a w wejście dodatnie wyprowadzić na gpio i przez dzielnik napięcia robić pomiar. No i przede wszystkim musisz zdążyć przed uruchomieniem modułu BOD bo ten w pewnym momencie zresetuje mikrokontroler. 

8 godzin temu, _LM_ napisał:

Jest to dokładnie to samo co ty przedstawiłeś w swojej odpowiedzi

Fakt. Nie złapałem koncepcji 👍

Ale i tak musisz rozdzielić diodą zasilanie mcu od wejścia komparatora jak na moim "schemacie", żeby zdążyć przed BOD.

Z moich eksperymentów wyszło, że dla atmega328p z wewnętrznym zegarem 8MHz, kondensator 1000uF wystarcza do zapisu bloku kilkudziesięciu bajtów w eeprom, zanim napięcie na nim spadnie poniżej progu. Przy wolniejszym zegarze pobór prądu będzie mniejszy, ale z kolei czas zapisu będzie dłuższy.

  • Lubię! 1
(edytowany)

To już trzeba by sprawdzić wg katalogu, no i nie wiem jaki próg BOD jest ustawiony domyślnie w arduino. Jeśli miałbym to robić aby było pewne to w pierwszej kolejności po wykryciu spadku zasilania należałoby wyłączyć to co obciąża GPIO czyli ledy, wejścia w Hi-Z to kilka cykli zegara, potem można liczyć na bezpieczny zapis, w ogóle jeśli kolega chce to w miarę często aktualizować to warto by było zapoznać się z  wear leveling ale nie wiem czy to nie za dużo jak na jeden raz dla początkującego

 

Edytowano przez _LM_

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...