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

Zapis do eeprom podczas awarii zasilania.

lotnick 28 Cze 2010 17:25 3700 21
  • #1 28 Cze 2010 17:25
    lotnick
    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]

    0 21
  • Sklep HeluKabel
  • #2 28 Cze 2010 18:35
    Krauser
    Poziom 26  

    Są rozwiązania, gdzie wykrywa się spadek napięcia na kondensatorze przed stabilizatorem i takie polecam.

    0
  • #3 28 Cze 2010 19:36
    tmf
    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.

    0
  • Sklep HeluKabel
  • #4 28 Cze 2010 20:10
    kemot55
    Poziom 30  

    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.

    0
  • #5 28 Cze 2010 20:33
    lotnick
    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]

    0
  • #6 28 Cze 2010 20:43
    tmf
    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 :)

    0
  • #7 28 Cze 2010 21:29
    lotnick
    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.

    0
  • #8 28 Cze 2010 21:36
    landy13
    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.

    0
  • #9 28 Cze 2010 23:25
    marek_Łódź
    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)

    0
  • #10 29 Cze 2010 07:42
    lotnick
    Poziom 15  

    Czy z tą diodą to tak? :
    Zapis do eeprom podczas awarii zasilania.

    0
  • #11 29 Cze 2010 09:21
    marek_Łódź
    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

    0
  • #12 29 Cze 2010 10:10
    lotnick
    Poziom 15  

    Dzięki, popróbuję i się odezwę.

    0
  • #13 29 Cze 2010 10:29
    marek_Łódź
    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.

    0
  • #14 29 Cze 2010 12:18
    mpo
    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

    0
  • #15 08 Lip 2010 09:12
    lotnick
    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.

    0
  • #16 10 Lip 2010 18:55
    Fajfer2
    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.

    0
  • #17 15 Lip 2013 19:30
    brzoza900
    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)

    0
  • #18 15 Lip 2013 20:08
    tmf
    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.

    0
  • #19 15 Lip 2013 20:41
    BlueDraco
    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.

    0
  • #20 15 Lip 2013 20:47
    tmf
    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ę.

    0
  • #21 16 Lip 2013 18:50
    robiw
    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

    0
  • #22 27 Lip 2013 15:08
    brzoza900
    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?

    0