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

Zapis do eeprom podczas awarii zasilania.

28 Cze 2010 17:25 3886 21
  • Poziom 15  
    Cześć.
    Mam urządzenie zasilane z sieci.
    Chciałbym zapisywać dane o nim do eepromu, żeby znać jego np czas pracy i może jakieś inne dane. Widziałem już jakieś sposoby, ale chciałbym abyście powiedzieli co sądzicie o następującym rozwiązaniu:
    Zapis do eeprom podczas awarii zasilania.

    Przerwanie INT pojawi się kiedy padnie zewnętrzne napięcie. Kondensator powinien wytrzymać kilkadziesiąt milisekund chyba. Dam diodę schottky. Dopuszczalne napięcia wejściowe podczas pracy to Vcc+0,5V więc powinno być OK.
    Procesor to ATMEGA32L - będzie miał więcej czasu na zapis jak przypuszczam , bo nie padnie tak od razu.
    To proste rozwiązanie, czy skuteczne? Widzicie minusy jakieś. Może czas startu się wydłuży i trzeba sprawdzić jaki skutek będzie miało ładowanie kondensatora na początku. Może dać jeszcze rezystor w szereg? Stabilizator jest 78L05. Nie wiem czy nie padnie przy takim prądzie na starcie.[/img]
  • flexghzflexghz
  • Poziom 26  
    Są rozwiązania, gdzie wykrywa się spadek napięcia na kondensatorze przed stabilizatorem i takie polecam.
  • Moderator Mikrokontrolery Projektowanie
    Weź pod uwagę, że nie masz do dyspozycji całej energii zgromadzonej w kondensatorze. Także 1mF może okazać się zbyt mały. Tak samo detekcja zaniku napięcia po stabilizatorze nic nie daje. Lepiej zrobić przed (np. po prostowniku), dzięki temu wcześniej uzyskasz informację o problemie i będziesz miał do dyspozycji energię zgromadzoną w kondensatorach stabilizatora (tu przydaje się wbudowany komparator). Można też dodać dodatkowy kondensator backupowy np. jakiś supercap, one mają po 1F i więcej. Zauważ, że zapis do EEPROM jest długi, jeśli masz kilka-kilkadziesiąt bajtów do zapisu to może wyjść, że potrzebujesz podtrzymanie na wiele ms. Nie zapominaj też o programie obsługi - odłączenie natychmiast niepotrzebnych podsystemów na płytce (być może zajdzie konieczność sterowania ich zasilaniem), wyłączenie podsystemów procesora, przełączenie pinów na wejścia, wyłączenie pullupów, przejście na inny zegar - np. z RTC.
  • Poziom 31  
    EEPROM AVR'a w ogóle nie bardzo nadaje się do takiego backup'u. Zrobiłem kiedyś urządzenie z zapisem przy zaniku zasilania. Zdecydowanie detekcja po stabilizatorze odpada. A poza tym:
    -może starczy energii w kondensatorze a może kondensator wyschnie i urządzenie padnie.
    -czas zapisu jest koszmarny (o ile pamiętam to około 5ms/bajt).
    No i kłopoty Atmela z programowaniem tej pamięci przy niewłaściwym zasilaniu (jeżeli kiedyś zabraknie energii na zapis to możesz mieć cały EEPROM wypełniony przypadkowymi wartościami -> ćwiczyłem to na MEGA32 co prawda przy wyłączonym resecie od poziomu zasilania).
    Może lepszym rozwiązaniem jest dołożenie pamięci FRAM (nie zużywa się tak szybko jak EEPROM i jest szybsza). Ale to tylko sugestia.
  • Poziom 15  
    W sumie to chodzi mi o zapis czasu pracy.

    Cytat:
    EEPROM AVR'a w ogóle nie bardzo nadaje się do takiego backup'u. Zrobiłem kiedyś urządzenie z zapisem przy zaniku zasilania. Zdecydowanie detekcja po stabilizatorze odpada.

    Czemu odpada po stabilizatorze? Jakiś pomysł jak podłączyć np 9V na pin INT1?
    Cytat:

    -może starczy energii w kondensatorze a może kondensator wyschnie i urządzenie padnie.

    Chyba każde takie rozwiązanie musi się opierać o częściowo zawodne źródło?
    Cytat:

    -czas zapisu jest koszmarny (o ile pamiętam to około 5ms/bajt).

    10 bajtów mi wystarczy, może mniej.
    Cytat:
    (jeżeli kiedyś zabraknie energii na zapis to możesz mieć cały EEPROM wypełniony przypadkowymi wartościami

    dlatego biorę AT32L i postaram się wziąć większy kondensator.

    Cytat:
    Może lepszym rozwiązaniem jest dołożenie pamięci FRAM

    Najchętniej wziąłbym ds1682- jest do mojego zadania bardzo dobry,ale tam też jest kondensator.

    Cytat:
    detekcja zaniku napięcia po stabilizatorze nic nie daje. Można też dodać dodatkowy kondensator backupowy np. jakiś supercap, one mają po 1F i więcej.

    Pojemność jest do ustalenia doświadczalnie, tylko miejsce na schemacie i sposób podłączenia budzi moje wątpliwości.
    Cytat:
    Nie zapominaj też o programie obsługi

    Kondensator dałem zaraz przy procesorze po to aby nie zasilał reszty układu, jest niezależny od programu.


    Będę wdzięczny za sposób umieszczenia kondensatora przed stabilizatorem.[/quote]
  • Moderator Mikrokontrolery Projektowanie
    Po stabilizatorze jak pisałem jest bez sensu, bo szkoda tracić pojemność kondensatorów stabilizatora. 9V czy ile tam masz możesz podłączyć do INT przez rezystor, ale to jest do kitu rozwiązanie, bo wyzwoli ci przerwanie przy V<0,3Vcc, czyli jak już będzie po ptokach. Do tego wykorzystaj komparator, w końcu po coś w tym procesorze go masz. Co do zasilania to pamiętaj, że jak odetniesz od reszty układu to ciągle może ta reszta być zasilana z pinu IO procesora... Temat nie jest taki banalny.
    kemot55 - dlatego, żeby nie było problemów z programowaniem EEPROM przy kiepski zasilaniu wymyślono BOD. Jeśli uda ci się skaszanić zapis przy włączonym BOD to jesteś mistrz :)
  • flexghzflexghz
  • Poziom 15  
    Z tym komparatorem to kłopot jest bo używam dwóch PWMów. Jeden z tych pinów to wejście komparatora.
    kondensator przed stabilizatorem ma 10uF. Dosyć mało w porównaniu z 1mF.

    I jeszzcze pytanie:
    Czy podawana wartość 100000 cykli zapisu dotyczy całej pamięci czy poszczególnych komórek.
    Mógłbym zapisywać co minutę czas działania gdyby dało się zapisać np 10bajtów po 90000 razy i potem następne dziesięć itd.
  • Poziom 29  
    lotnick napisał:
    Czy podawana wartość 100000 cykli zapisu dotyczy całej pamięci czy poszczególnych komórek
    Dopiero dwa dni minęły. Zobacz tu.
  • Poziom 36  
    Można zastosować dodatkowy komparator zewnętrzny,

    Wejście zasilania 9V można też podać na INT procesora przez diodę Zenera (np.4V) z rezystorem do masy (albo nawet i bez).

    Pojemność na wejściu stabilizatora można rozbić na dwie, małą na wejściu z dodatkowym równoległym rezystorem do szybkiego rozładowania, większą już na stabilizatorze, wstawiając między nie diodę, co zagwarantuje, że napiecie na mniejszej spadnie stosunkowo szybko, przy podtrzymanym na dłużej zasilaniu procesora. Niestety parametrem krytycznym jest okres sieci co w skrajnym przypadku wymaga 10ms na wykrycie zaniku (jeśli procesor będzie śledzić pulsacje), ew. czasu kilka razy większego w przypadku zastosowania prostego układu inercyjnego, a to oznacza stratę powiedzmy 30-50 ms.

    Co do zapisu, jak już wcześniej napisano pamięci z podtrzymaniem bezbateryjnym to np. FRAMy, które w wersji SPI zapewniają zapis bajtu w kilkudziesięciu cyklach SPI, co się przekłada na jakieś powiedzmy kilkanaście us przy jakimkolwiek braku ograniczeń na ilość cykli zapisu (można spokojnie pisać ile razy się chce, niekoniecznie co minutę , ale nawet i co sekundę, albo częściej).

    Z drugiej strony zakładając, że na procesorze mamy 1mF , a prąd pobierany jest rzędu 10mA, mamy jakieś 100ms na jeden wolt spadku napięcia na zasilaniu co z kondensatora po stronie pierwotnej przelicza się na jakieś 0,5s, co powinno spokojnie wystarczyć zarówno do zapisu w pamięci FRAM w wersji I2C np.FM24C04, jak w wewnętrznym EEPROM procesora. Generalnie zadanie jest trywialne, pod warunkiem odpowiedniego rozwiązania układu wykrywania zaniku przy odpowiednio długim podtrzymaniu. Zastosowanie pamięci na SPI skraca ten czas praktycznie do czasu reakcji detektora zaniku, czyli mniej więcej dziesięciokrotnie (wymagana pojemność redukuje się do 100uF)
  • Poziom 15  
    Czy z tą diodą to tak? :
    Zapis do eeprom podczas awarii zasilania.
  • Poziom 36  
    lotnick napisał:
    Czy z tą diodą to tak? :
    Dokładnie TAK. Całość może wyglądać jakoś tak:

    Zapis do eeprom podczas awarii zasilania.

    Układ nie był sprawdzony w praktyce
    . C1 dobrać jako kompromis między czasem reakcji detektora zaniku, a odpornością na chwilowe zaniki (zakłócenia) nie powodujące zatrzymania układu. Rezygnując z tej pojemnosci otrzymamy przerwanie w każdym cyklu sieci (zanik trzeba wykrywać programowo jako dłuższy brak przerwań).
    Jak wyżej napisano przy zastosowaniu szybszych pamięci lub/i przy niższym poborze pradu przez procesor, pojemność C2 można stosownie zmniejszyć (tu mówiliśmy o 10mA poboru i 1s czasu na zapis :!: )
    Kolejny element krytyczny to stabilizator szeregowy-korzystne by miał mały prąd własny
  • Poziom 15  
    Dzięki, popróbuję i się odezwę.
  • Poziom 36  
    Sorry, układ jest trochę przewalony. Problem dotyczy szczytów napięcia, inaczej mówiąc Zener musi być dobrany do szczytowej wartości napięcia na pojemności, która jest minimalnie większa (0,3-0,4V) od napiecia na C2. Oznacza to dokładnie tyle, że przy wzroście napięcia sieci, na porcie może się pojawić niepożądane przepięcie i popłynąć prąd niszczący procesor. Stąd konieczność dobrania diody z pewnym zapasem. Dla bezpieczeństwa można dać w szereg z Zenerem opornik rzędu 1k.
    Zresztą można by zrezygnować z tej diody i dać zwykły dzielnik oporowy na INT1 np 2 oporniki po 2,2k.
  • Poziom 12  
    Mam w swoim urządzeniu taki patent jak proponuje lotnick.
    Atmega8 na wewnętrznym oscylatorze 8MHz, dioda schotky za stabilizatorem 5V i kondensator podtrzymujący 100uF.
    Przy zaniku napięcia wywoływane jest przerwanie w którym zapisuję do eeprom cztery bajty (zmienna typu single). Nie przeprowadzam jakichś dodatkowych zabiegów programistycznych ograniczających pobór prądu przez avr.
    Działa (w samochodzie) stabilnie od kilku miesięcy.
    Planowałem zrobić próby, ile bajtów będzie można bezbłędnie zapisać przy takiej pojemności kondensatora, ale z braku czasu wyszło jak zwykle...

    Code:

    Brak_zasilania:                                                       'procedura zapisu biezacego stanu licznika do eeprom
    E_impulsy = Impulsy                                                   'przy zaniku zasilania
    Stop
    Return
  • Poziom 15  
    Skończyło się na następującym rozwiązaniu:
    Zapis do eeprom podczas awarii zasilania.
    Na zasilaniu głównym jest kondensator 100uF.
    Wcześniej wydawało mi się, że te piny wiążą się z wykorzystywanym przeze mnie PWMem ale myliłem się- dzięki TMF za sugestię!. Musiałem "tylko" przepiąć cały port sterujący LCD, narysować nową płytkę i już mogłem podłączyć się do komparatora.
    W przerwaniu od komparatora na razie zapisuję tylko jeden bajt.
    Jak potestuję to jeszcze coś napiszę.
    Dzięki za pomoc, pozdrawiam.
  • Poziom 20  
    Proponuję wykorzystać wewnętrzny komparator, pomiar napięcia oczywiście przed stabilizatorem za pomocą dzielnika. Potrzebną pojemność obliczyć tak jak by kondensator przed stabilizatorem był rozładowywany źródłem prądowym (właściwie to przeładowywany) od napięcia zasilania aż do napięcia 5+2.5V czyli około 7.5V (jeśli napięcie drop-out stabilizatora = 2.5V). Zatem jeśli przed wyłączeniem kond. był naładowany do około 9V, to mamy 1.5V zapasu.
    Należy jeszcze bezpiecznie obniżyć próg wyzwolenia przez dzielniki, tak by wyzwolenie nastąpiło dopiero przy napięciu około 8.5V (zapas napięcia niestety zmniejszy się a potrzebna pojemność zwiększy).
    Prąd tego "źródła" to oczywiście prąd pobierany przez uC + reszta elektroniki. Czas t będzie zależny od ilości zapisywanych zmiennych. Podsumowując pojemność kondensatora C = I*t / U
    Użycie stabilizatora low-drop pozwoli zmniejszyć potrzebną pojemność. Kondensator o niewielkiej pojemności dołączony między masę a wyjście dzielnika znacznie zredukuje zakłócenia. W każdym razie pożądane jest obliczenie wnoszonego opóźnienia przez tak utworzony filtr.
    Przerwania jednak muszą być odblokowywane przez sei(); bądź ich obsługa musi być pomijalnie krótka. Konfiguracja komparatora też musi uwzględniać dwa takty opóźnienia - włączenie przerwań zaraz po konfiguracji może spowodować generację przerwania.
    Dla przykładu:
    I = 50mA t = 150ms U = 1V (właściwie to powinno być ΔU)
    po wyliczeniu: C = 7.5 mF (dla drop-out = 2.5V Uwyzwolenia = 8.5V)
    Jeśli zastosujesz nowy ATmega32A, zmniejszysz troszkę pobór prądu, można by też zastosować stabilizator impulsowy.
    Wcześniejsze obliczenie i potem zapisanie kodu CRC z całego bloku przeznaczonego do zapamiętania zwiększy pewność że dane nie zostały uszkodzone, dodatkowo należałoby zdublować zapisywaną informację, bo zapis może wyjątkowo zostać przerwany przez samoistny reset uC.
    Struktura ta (bo najwygodniej umieścić zmienne w takim typie danej) powinna być również zdublowana w RAM-ie, gdyż wszelkie zmiany jej zawartości muszą być poprzedzone wyzerowaniem flagi (jest ona konieczna) ważności danych.
  • Poziom 14  
    Witam. Pozwolę sobie odświeżyć temat, ponieważ potrzebuję właśnie taki układ. Mam jednak pytanie:
    Czy konieczne jest wykorzystanie obu wejść analogowych?
    Nie wystarczy pomiar napięcia wejściowego (+5V) i jeśli spadnie ono poniżej jakiegoś progu to dać instrukcję do zapisania zmiennej do pamięci eeprom?
    (potrzebuję zapisać wartość jednej zmiennej do pamięci eeprom po wyłączeniu zasilania)
  • Moderator Mikrokontrolery Projektowanie
    W tym układzie potrzebne są oba wejścia. Bo zauważ, że tu komparator nie bada czy masz 5V, tylko czy anoda diody jest spolaryzowana dodatnio w stosunku do katody. A tak jest, kiedy jest zasilanie. Jak zasilanie zniknie, to anoda staje się spolaryzowana ujemnie i komparator się włącza. Wejść analogowych w AVRach jest tyle, że wykorzystanie dwóch to żaden problem.
  • Specjalista - Mikrokontrolery
    Niestety, to nie jest tak różowo. Jeżeli z przodu (przed diodą) zasilanie nie jest obciążone, to odłączenie zasilania spowoduje wyssanie energii z kondensatora przez mikrokontroler, a napięcie przed diodą będzie wciąż wyższe niż za nią - czyli nie wykryjemy zaniku. Musimy jakoś zagwarantować, że napięcie "z przodu" spadnie szybciej, niż "z tyłu", czyli np. dać rezystor do masy, który zapewni rozładowanie ew. pojemności, co i tak będzie dość niepewne. Ja w takich przypadkach stosowałem prosty detektor napięcia, np. w postaci tranzystora npn zwierającego wejście uC do masy, przy czym baza tranzystora była sterowana przez odpowiednio dobrany dzielnik, tak, aby tranzystor zatykał się przy spadku napięcia wejściowego poniżej dozwolonego zakresu nominalnego.
  • Moderator Mikrokontrolery Projektowanie
    Masz trację. Takim dodatkowym obciążeniem może być sam stabilizator. Ale też inne układy, które są zasilane sprzed diody. W praktyce jeśli kondensator przy procesorze będzie większy niż ten na wyjściu stabilizatora, to będzie się on rozładowywał wolniej i układ zadziała.Oczywiście, jak piszesz należy ten problem wziąć pod uwagę.
  • Poziom 26  
    Moje rozwiązanie zapisu danych (niewielkiej partii) do EEPROMa w czasie zaniku zasilania:

    Zasada działania jest prosta: wewnętrzny przetwornik ADC ustawiamy w taki sposób by mierzył napięcie wewnętrznego źródła napięcia odniesienia VBG (bandgap), które w przypadku ATmegi8 = 1.3V. Jako napięcie odniesienia dla wspomnianego przetwornika ADC ustawiamy napięcie na końcówce AVCC (odfiltrowane poprzez dławik do VCC i kondensator ceramiczny do masy, do tego AREF poprzez kondensator ceramiczny także do masy. Zasilanie mikrokontrolera (miejsce połączenia wyprowadzenia VCC z AVCC (przez dławik)) doprowadzamy poprzez diodę Schottky'ego (niskie napięcie drop) ze źródła napięcia zasilającego. Za diodą (w kierunku mikrokontrolera) kondensator tantalowy ok.100&micro;F pozwalający na podtrzymanie napięcia zasilającego sam mikrokontroler na czas niezbędny na zapis EEPROMa przy zaniku zasilania (dobrać eksperymentalnie). Układ BOD mikrokontrolera włączony (2.7V) by zapobiec błędom zapisu. Szkielet programu obsługi jak niżej (przykład dla ATmegi8):

    Kod: c
    Zaloguj się, aby zobaczyć kod


    robiw
  • Poziom 14  
    Witam.
    Męczę się już długo i cały czas nie mogę uzyskać rozwiązania. Zamieszczam schemat oraz fragmenty programu.
    Ogólnie przerwanie chyba działa, bo jak odłączałem jedynie napięcie na komparatorze, ale cały czas zasilałem mikroprocesor to przerwanie występowało.
    Wydaje mi się, że problem polega na odpowiednim podtrzymaniu napięcia mikroprocesora na odpowiednio długi czas, ale wydaje mi się, że kondensator 470uF powinien wystarczyć.
    Czy nie brakuje przy tych kondensatorach jakiegoś rezystora? Gdzie dokładnie powinien być dołożony?
    Bardzo proszę o pomoc.
    Zapis do eeprom podczas awarii zasilania.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 51 [minuty]:

    Dodam jeszcze, że jak próbuję w tym przerwaniu zapisać wartość 'a' do pamięci, to w pierwszych dwóch komórkach pojawia się najczęściej wartość "01". Raz była sytuacja, że wartość zapisała się prawidłowo, ale nie wiem od czego to jest zależne...
    Czytałem gdzieś, że pierwsza komórka pamięci nie zapisuje się prawidłowo. Jak zatem mogę tą wartość zapisać w innej komórce?