Projektuję urządzenie, które automatycznie dostosowuje swoją fizyczną pozycję wraz ze zmianami temperatury. Jeśli urządzenie się wyłączy lub zasilanie zostanie odłączone, urządzenie musi zapamiętać swoją ostatnią temperaturę i położenie. Mam możliwość przechowywania tych wartości w pamięci EEPROM, ale problem polega na tym, że pozycja i temperatura mogą się bardzo szybko zmieniać. Gdybym miał zapisać temp i pos do EEPROM po każdej zmianie, to (1) nieco spowolniłoby oprogramowanie i (2) prawdopodobnie zabiłoby EEPROM po roku lub dwóch. Tak więc widzę, że moje opcje są następujące ...
1) użyj kondensatora / baterii, aby utrzymać zasilanie urządzenia przez krótki czas po zaniku zasilania, aby móc zapisać wartości tylko w tym momencie w pamięci EEPROM. Nie podoba mi się to, ponieważ plansza jest trochę energochłonna, a to wymagałoby dużego ograniczenia. I nie mam dużo wolnego miejsca. I nie chcę dodatkowych kosztów baterii i uchwytu baterii / lub dużej czapki.
2) użyj F-RAM zamiast EEPROM, abym mógł pisać do niego tryliony razy bez zużycia. Nie podoba mi się ta opcja, ponieważ FRAM jest nieco droższy niż EEPROM i dotyczy produktu produkcyjnego (nie tylko jednego).
3) Zapisz pozycję i temperaturę tylko co około 5 minut. W ten sposób zawsze mam dość aktualną pozycję / temp, ale nie piszę co sekundę, więc mój program nie jest spowolniony, a pamięć EEPROM nie umrze tak szybko. To wydaje się być moją najlepszą opcją.
Czy ktoś jeszcze ma jakieś sugestie, o których nie myślę?
źródło
Odpowiedzi:
Potrzebujesz techniki zwanej wyrównywaniem zużycia . Nie zapisuje danych za każdym razem w tej samej lokalizacji w pamięci EEPROM, ale wykorzystuje pewien algorytm do użycia różnych lokalizacji. Czytałem o złożonych algorytmach wyrównywania zużycia, ale nie wiedziałbym, dlaczego następująca prosta metoda nie zadziała.
Dodaj do swoich danych 24-bitowy licznik, aby blok danych miał na przykład długość 8 bajtów. Strony w 24AA64 mają 32 bajty, więc pamięć EEPROM o pojemności 64 kb mieści 256 stron. Z arkusza danych:
więc nie ma sensu używać bloków danych mniejszych niż strona o wielkości 32 bajtów.
Spójrz na licznik pierwszej strony. Jeśli jest zero, użyłeś maksymalnej liczby cykli zapisu dla tej strony, więc przechodzisz do następnej strony i sprawdzasz licznik. Powtarzaj, aż znajdziesz licznik> zero. To jest strona, której obecnie używasz. EEPROM Microchip mają wytrzymałość 1 miliona cykli, którą można zwiększyć do 256 milionów w podanym przykładzie maksymalnie 32 bajtów na blok w EEPROM 64kb. To powinno wystarczyć, aby przetrwać Twój produkt: 40 lat, jeśli piszesz raz na 5 sekund (!).
Będziesz chciał zainicjować swoją pamięć EEPROM przy pierwszym użyciu. Skąd wiesz, kiedy to jest. Użyj ostatniej strony, aby napisać unikalny podpis podczas inicjalizacji. Sprawdź przy każdym włączeniu, czy podpis jest tam. Jeśli nie, urządzenie musi zostać zainicjowane. Możesz wstępnie ustawić licznik na każdej stronie z 0xF4240 (dla 1 miliona) lub wyczyścić wszystko do 0xFF i zapisać 0xF4240 przy pierwszym użyciu strony.
Inicjowanie pamięci EEPROM jest potrzebne, ponieważ czasami w procesie produkcyjnym / testowym zapisywany jest określony wzorzec.
edytuj
Wyrównanie zużycia powinno rozwiązać twoje problemy, ale nadal chcę skomentować rozwiązanie kondensatora. Mówisz, że płytka jest dość energochłonna, ale być może możesz odizolować moc mikrokontrolera / pamięci EEPROM od reszty płytki za pomocą diody. Prawdopodobnie będziesz potrzebować tylko kilku mA, gdy zniknie główne zasilanie. 24AA64 zapisuje stronę w czasie krótszym niż 5 ms, a następnie przy 10 mA i dopuszczalnym spadku napięcia 100 mV będziesz potrzebować
Łatwo dzięki małej superkapce.
dalsze czytanie
arkusza danych 24AA64
EEPROM Endurance Tutorial
źródło
1) Po rozpoczęciu procesu zapisu wystarczy tylko zasilić MCU / EEPROM i upewnić się, że linie kontrolne się nie usterki - prawdopodobnie I2C jest lepszy niż SPI. Potrzebujesz tylko kilku mA na kilka milisekund, więc nie powinieneś być wielkim ograniczeniem, a MCU możesz uśpić po zainicjowaniu zapisu. 3) prawdopodobnie możesz zastosować pewną inteligencję, np. Opóźnienie - po napisaniu zawsze zawiera określony czas, może nastąpić inny zapis. Lub poczekaj, aż wartość będzie stabilna przez chwilę przed zapisaniem.
Możesz także zwiększyć wytrzymałość, rozkładając dane w wielu lokalizacjach. Microchip ma kilka narzędzi i adnotacji do obliczania wytrzymałości swoich eepromów, które mogą być przydatne.
źródło
Sugerowałbym użycie urządzenia flash zorientowanego na bloki i użycie jednego bajtu z każdego bloku jako flagi trybu. Zachowaj jako niezmiennik, że prawie wszystkie flagi trybu zostaną zaprogramowane; będzie tylko jeden blok, w którym flaga trybu nie jest zaprogramowana, ale poprzedni blok (zawijanie, jeśli to konieczne). Blok ten będzie zawierał najnowsze dane. Gdy ten blok się zapełni, usuń następny blok (zwróć uwagę, że usuwany blok może przechowywać dowolną kombinację danych podczas cyklu kasowania, a niezmiennik nadal będzie się utrzymywał), a następnie po zakończeniu kasowania zaprogramuj flagę trybu na tym, co kiedyś być ostatnim blokiem.
Konieczne będzie wystarczające zabezpieczenie zasilania pamięci flash, aby zapewnić, że każda próba zaprogramowania bajtu zakończy się powodzeniem lub niepowodzeniem w całości, ale nie będzie miało znaczenia, czy cykl kasowania zostanie przerwany, pozostawiając blok pełen dowolnych danych, ponieważ kolejna próba wpisania danych spowoduje skasowanie tego bloku.
Jeśli twoje dane mają 16 bitów, układ 64Kx8 pomieści ponad 32 000 wpisów. Pisanie jednego wpisu na sekundę wypełniłoby układ około 2,7 razy. Nawet czip o wytrzymałości „tylko” 10 000 cykli kasowania trwałby ponad 10 lat. Zastosowanie większego układu lub takiego o wytrzymałości 100 000 proporcjonalnie wydłużyłoby żywotność.
źródło
1) Prawdopodobnie najprostsza opcja, chociaż może wymagać zmian sprzętowych. Osiągnąłem to wcześniej bez modyfikacji PBC, po prostu zwiększając pułapki odsprzęgania i przerywając przerywnik.
2) Jak już zauważyłeś, problemem z FRAM jest cena!
3) W zależności od zmienności danych temperatury i pozycji zwiększysz wytrzymałość, pisząc tylko, jeśli wartość się zmieniła. Możliwe, że próbkujesz temperaturę raz na sekundę, ale jeśli zmienia się ona tylko co 5 minut, problem został rozwiązany.
źródło
Oto jak rozwiązałem ten problem w moim projekcie:
Zarezerwuj 1 sektor pamięci flash, aby pomieścić maskę bitową nieużywanych miejsc i liczbę miejsc dla wartości.
Użyłem maski bitowej o długości 16 bajtów, więc miałem 128 miejsc do wprowadzenia wartości.
Maska bitowa jest inicjowana dla wszystkich, co w ujęciu flash jest stanem wymazanym.
Jeśli chcesz napisać nową wartość, przeczytaj maskę bitów i znajdź pierwszy bit, który jest jednym. Jest to numer gniazda, w którym zapiszesz wartość. Zmień ten bit na zero, aby oznaczyć go jako użyty, i zapisz maskę bitów z powrotem do flashowania bez uprzedniego usunięcia. Następnie zapisz wartość w gnieździe po masce bitów również bez kasowania pamięci flash.
W ten sposób wydłużysz cykle zapisu flash o 128 razy, pisząc nową maskę bitową, zmieniając tylko z jednego na zero.
Jeśli cała maska bitowa ma wartość 0, usuń sektor pamięci flash i zacznij od nowa.
źródło