Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ATMEGA32 - Awaryjny zapis do pamięci po odłączeniu zasilania

kris_jr 14 Feb 2008 21:41 2762 23
Altium Designer Computer Controls
  • #1
    kris_jr
    Level 10  
    Witam,
    czy ktoś z szanownych kolegów wie może jak poradzić sobie z problemem konieczności zapisania do pamięci stałej informacji o tym w którym dokładnie momencie wykonywania programu zostało w skutek np. awarii odcięte zasilanie, tak aby po ponownym dostarczeniu zasilania program mógł się wykonać dalej od miejsca przerwania go?

    Chodzi o sytuację w której jeżeli mamy manipulator z zaprogramowaną sekwencją ruchów (do określenia położenia wykorzystujemy sygnał z enkoderów) i jeżeli zabraknie prądu w połowie programu to po wznowieniu program powinien się wykonać do końca od momentu przerwania. Np. zapisanie stanów liczników, program countera i co tam jeszcze będzie potrzebne.

    Nie wiem czy jest możliwość po wykryciu przez procesor spadku napięcia zapisać jeszcze taką informację do pamięci czy już od razu się procek zresetuje.
    Jeżeli jednak jest możliwość zapisu jeszcze czegoś do pamięci to w jaki sposób to wykonać- tzn. jak, to że procek wykrył spadek napięcia przełożyć na to aby wykonał jeszcze przed resetem procedurę obsługi takiej awaryjnej sytuacji.

    Myślałem jeszcze nad takim łopatologicznym rozwiązaniem że po każdym impulsie z enkodera i każdej fazie ruchu jest zapisywana jakaś zmienna do pamięci (taki rejestr) i po starcie procka zawsze byłby sprawdzany ten niby rejestr. Proszę zwrócić uwagę na problem gdy tak niefortunnie się złoży, że zasilanie zostanie odcięte w momencie kiedy sygnał z enkodera dociera już do procka, ale jeszcze nie zostało to zapisane w pamięci.

    Myślałem jeszcze o możliwości opóźnienia resetu procka dodając prosty układ (taki jak na rysunku) gdzie odpowiednio duży kondensator mógłby podtrzymać zasilanie dostatecznie długo aby procek wykonał jeszcze parę instrukcji, a układ z opornikami i odprowadzeniem sygnału np. pod wejście INT0 powoduje na tym odprowadzeniu szybszy spadek i informuje procesor że spada napięcie zanim się sprzętowo zorientuje. Dałoby to trochę cennego czasu, ale nie wiem czy to w ogóle ma sens.

    Będę bardzo wdzięczny za wszelką pomoc.
  • Altium Designer Computer Controls
  • #2
    adamusx
    Level 27  
    Profesjonalne manipulatory posiadją enkodery dające pozycje bezwzględną więc nie ma takiego problemu. W Twoim przypadku chyba najlepszym rozwiązaniem będzie bazowanie ramion po resecie sterownika. Oczywiscie możesz zapisywac stany enkoderów i innych potrzbnych danych zaraz po odłączeniu zasilania ( podtrzymanie napięcia procesora za pomoca małej baterii albo kondensatora na czas zapisu), ale raczej nie unikniesz sytuacji w której zguisz impulsy z enkoderów a tym samym wlasciwa pozycję. Najprostrzy przykład - robot wykonuje ruch - nastepuje zanik zasilania i ramie przesuwa się jeszcze w wyniku bezwładnośc... i już pozycja zapamiętana nie będzie się zgadzac z pozycją ramion po resecie .
  • #3
    Xaveri
    Level 17  
    Ja to widze tak:
    Procesor ma do jednego przerwania zewnetrznego (o najwyzszym priorytecie) podpiety przez zewnetrzny pullup +5V czy ilestam zaleznie od tego jak jest zasilany. Przerwanie to wywoywane jest sanem niskim na porcie. Pullup wpiety jest przed diode prostowanicza. Za dioda jest duzy kondensator i wlasnie procek.
    W momencie zaniku zasilania, przed dioda nie bedzie napiecia i nastapi sygnal przerwania. W obsludze przerwania procek zapisuje wszystko co musi do jakiejs pamieci eeprom czy tez flash korzystajac z pradu z kondensatora, ktorego pojemnośc trzeba odpowiednio dobrac zeby proc zdazyl...

    Ups! Nie doczytałem Twojego posta :/...
  • #4
    elektryk
    Level 42  
    Wydaje mi się że nie ma rozwiązania tego problemu, dopóki nie jesteś w stanie stwierdzić bezwzględnego położenia mechanizmu to nic te sztuczki nie dadzą. Zobacz choćby na taki przypadek że zasilanie padnie w "połowie" ruchu. To czy ruch jest zapisany w systemie jako wykonany czy jako niewykonany nie gra to już roli, bo zawsze o te pół kroku będzie błąd.
  • #5
    MarasK
    Level 18  
    Zawsze możesz zastosować akumulatorek - w moim układzie 'migacz diodowy' na ATTiny podtrzymuje ponad 30min (nie sprawdzałem dokładnie ile). A zastosowałem zwykły aku 3,6V 60mAh
  • Altium Designer Computer Controls
  • #6
    kris_jr
    Level 10  
    Dziękuję za wszelkie wskazówki.
    Chciałem jeszcze kilku rzeczy się dowiedzieć.
    Chodzi o dobór elementów w tym układzie, który zamieściłem na początku tematu, zakładając, że jest on poprawny. Czy kondensator 1000uF jest wystarczający do tego aby podtrzymać procek odpowiednio długo by mógł sobie wszystko zapisać. Dodam, że oprócz procka mogą być zasilane ze 3-4 scalone zestawy bramek logicznych (po 4 w paczce).

    Drugie rozwiązanie to z akumulatorkiem lub baterią podtrzymującą wydaje się jeszcze pewniejsze, ale też mam do Was pytanie czy ktoś wie jak w maksymalnie prosty sposób zrobić taki układzik?
    Chodzi o to aby dostatecznie szybko mogło być załączone zasilanie z baterii przy spadku napięcia (pewnie na jakiejś diodzie czy coś w tym stylu).
    Drugi problem to sytuacja w której celowo odłączamy zasilanie nie podczas pracy układu, tylko w spoczynku i tu przydałoby się aby się bateria sama nie włączała na siłę (żeby na dłużej starczyła).

    Akumulatorek jest o tyle fajny, że się nie wyczerpie po jakimś czasie jak bateria, ale pod warunkiem, że będzie doładowywany kiedy zasilanie będzie działać poprawnie. I tu pytanie czy ktoś wie jak zrobić układ, który będzie doładowywał akumulator w czasie gdy jest zasilanie (aby zawsze był naładowany na wypadek awarii) tak aby nie zużyć zbyt szybko akumulatora, a w dodatku żeby działał tak jak to powyżej było powiedziane, czyli aby kiedy nie potrzeba nie dostarczał na siłę zasilania. Pewnie jakiś przekaźnik czy coś w tym stylu trzeba będzie zastosować, ale może ktoś ma lepsze pomysły to bardzo wdzięczny będę za wszelkie sugestie.
  • #7
    submariner
    Level 32  
    istnieja kondensatory do podtrzymania pamieci RAM 0,1-1F /5V taki kondensator to praktycznie akumulator pod warunkiem, ze nie pobierasz duzego pradu i stale moze byc doladowywany wiec jesli podasz zasilanie przez diode o zanik napiecia nie rozladuje kondensatora a w przypadku poboru pradu rzedu kilkudziesieciu mA energii powinno wystarczyc na bardzo dlugo - rzedu godzin.
  • #8
    kris_jr
    Level 10  
    Z tymi kondensatorkami to ciekawy pomysł- nie wiedziałem, że są o takiej dużej pojemności w rozsądnej cenie.
    A ile czasu zajmie naładowanie się takiego kondensatora 1F po załączeniu zasilania?
    Czy ten układ który zamieściłem na początku jest OK i wystarczy tylko podmienić ten kondensator na taki 0,1-1F?
  • #9
    MarasK
    Level 18  
    ja użyłem akumulatorka 3,6V NiMh 60mAh
    Podłączyłem go pod VCC 5V przez dwie diody szeregowo (powinien być jeszcze rezystor ograniczający prąd, ale nie miałem odpowiedniego w wersji SMD, a taką płytkę przygotowałem).

    W skrócie - prąd nie powinien przekraczać 0,1C (czyli dla 60mAh 6mA).
    Obliczasz: 5V - 2x0,65V = 3,7V
    3,7V - 3,6V (napięcie na aku) = 0,1V
    R= U/I = 0,1/6*10-3 = 10^2/6 ~ 15Ohm

    Jasne? :)
  • #10
    kris_jr
    Level 10  
    Ok zdobyłem taki kondensator podtrzymujący 0,22F i planuję go włączyć do mojego układu w sposób podany na załączonym schemacie.
    Ta dodatkowa część związana z tym backupem jest zaznaczona w czerwonym kółku.

    Bardzo proszę bardziej doświadczonych kolegów o wypowiedzenie się czy to jest poprawnie zrobione i czy ma sens oraz o ewentualne uwagi co poprawić lub z czego zrezygnować.

    Zasilanie do układu podawane będzie z zasilacza komputerowego i poprzez filtr widoczny na górze będzie wchodzić na płytkę z kilkoma elementami takimi jak ATmega32, układ do transmisji radiowej 433MHz i 2-3 scalaki z bramkami logicznymi oraz zasilanie enkoderów. Dołączony do tego został ten backup z kondensatorem 0,22F w celu awaryjnego podtrzymania zasilania, aby spokojnie można było dokonać zapisu do pamięci w razie awarii.
  • #11
    elektryk
    Level 42  
    Pokarz cały schemat, co tam jeszcze jest zasilane z kondensatora. Uważaj jeszcze na częstotliwość taktowania, bo przy wysokiej (paru MHz) to atmega pobiera z 10mA.
  • #12
    kris_jr
    Level 10  
    Ok w załączniku cały schemat sterownika (bez kilku dołączanych modułów, ale one nie są zasilane z tego samego źródła i nie wymagają podtrzymania zasilania). Nie wiem czy ten printscreen jest wystarczająco wyraźny, ale większy mi się nie mieści w całości.
    Schemat jest trochę pogmatwany bo robiłem poprawki i nie zawsze mi się chciało ładnie prowadzić połączenia (to tylko schemat).

    Taktowanie jest 16MHz
  • #13
    elektryk
    Level 42  
    Wygląda OK, mam tylko taką uwagę że musisz się śpieszyć z uśpieniem procesora, bo po kilku sekundach zabraknie mu prądu z kondensatora. Nie widzę na schemacie dokładnie, ale te negatory (chyba IC2) jeśli mają stan wysoki na wyjściu to popłynie prąd z kondensatora i skróci czas podtrzymywania. To samo jeśli do procesora są podpięte jakieś diody LED, albo podobne układy. Podobna uwaga dotyczy przekaźnika.

    Zastanawia mnie też po co w tym układzie tak dużo bramek.
  • #14
    kris_jr
    Level 10  
    Tak negatory to IC2. Służą one do sterowania silnikami DC poprzez mostki STA434A. Jeśli zabraknie prądu to silniki przestaną pracować i w zasadzie obojętne jest jaki będzie wówczas stan na wyjściach negatorów. Nie wiem też czy mostek pobierałby wtedy prąd czy nie, ale z tego co zrozumiałem to sam negator by pobierał dla utrzymania takiego stanu? Jeśli to jest problem to mogę spróbować albo przepiąć na inne zasilanie te negatory, albo w obsłudze takiej sytuacji w której brakuje zasilania ustawić tak piny procka aby na wyjściu był stan niski, ale nie wiem czy ma sens taka zabawa. W gruncie rzeczy to ja potrzebuję podtrzymać procek na tyle długo aby nie zgubił impulsów z enkoderów i mógł zapisać do pamięci stałej informację o miejscu zatrzymania programu. Kilka sekund to zdaje się być wystarczający czas (chyba ułamek z tego powinien wystarczyć)

    Przekaźnik załącza zasilacz stabilizowany, który zasila pozostałe moduły i silniki więc jeśli braknie prądu to też przekaźnik może być zwolniony- jeśli trzymanie go włączonym poważnie skróci czas pracy na kondensatorze.

    Te wszystkie bramki to takie moje kombinejszyn. Po pierwsze to są dwa, no w zasadzie trzy scalaki, a po drugie to one realizują pewną logikę sterowania przyciskami. Sterować można z klawiatury lub radiowo, a naciśnięcie przycisku to wywołanie przerwania i jego obsługa więc wszystkie muszą być jakos połączone aby to przerwanie wywołać i zająć tylko jedno miejsce na zewnętrzne przerwanie. W dodatku nie wszystkie we szystkich okolicznościach mają wywoływać to przerwanie i stąd ta kombinacja na bramkach.

    Dziękuję za wszelkie uwagi i nadal jestem otwarty na ciekawe sugestie.
    Pozdrawiam
  • #15
    elektryk
    Level 42  
    kris_jr wrote:
    Tak negatory to IC2. Służą one do sterowania silnikami DC poprzez mostki STA434A. Jeśli zabraknie prądu to silniki przestaną pracować i w zasadzie obojętne jest jaki będzie wówczas stan na wyjściach negatorów. Nie wiem też czy mostek pobierałby wtedy prąd czy nie, ale z tego co zrozumiałem to sam negator by pobierał dla utrzymania takiego stanu? Jeśli to jest problem to mogę spróbować albo przepiąć na inne zasilanie te negatory, albo w obsłudze takiej sytuacji w której brakuje zasilania ustawić tak piny procka aby na wyjściu był stan niski, ale nie wiem czy ma sens taka zabawa.
    Negator sam z siebie nie pobiera dużo prądu (kilka uA) ale jeśli się go obciąży (choćby diodą LED) to ten prąd obciążenie doda się do prądu zasilającego negator. I teraz najlepsze ;) jeśli weźmiesz układ logiczny (zwykły CMOS) nie podłączysz mu zasilania (VCC) a podasz napięcie dodatnie (wystarczy stan logiczny) na którekolwiek z wejść logicznych, to ten układ "ożyje" ;) Wynika to z tego że prawie każdy pin ma diodę zabezpieczającą podpiętą do masy i do zasilania. W przypadku braku zasilania, napięcie na pinie zasilania będzie niższe niż napięcie na wejściu i przez diodę popłynie prądu (i układ się uaktywni). Co gorsze jeśli układ się uaktywni to może się też uaktywnić jego obciążenie i popłynie jakiś prąd przez obciążenie. Źródłem tego prądu będzie ostatni zasilany układ i w tym przypadku ten prąd dodałby się do prądu zasilającego procesor i okoliczne scalaki. Znam dwa rozwiązania tego problemu (może jest ich więcej). Pierwsze to zastosować bufory 3stanowe i przełączać je w stan wysokiej impedancji, a drugie tak wysterowywać liniami na czas ograniczonego zasilania że na wyjściach (w tym przypadku negatorów) będzie stan logiczny zero.

    Dodatkowo w swoim układzie musisz przewidzieć co się będzie działa po włączeniu zasilania (głównego). Bo być może konieczna jest jakaś "procedura". Wynika to ze stanów nieustalonych i może spowodować że mechanika wykona jakiś drobny krok ruchu.
  • #16
    Dr_DEAD
    Level 28  
    kris_jr wrote:
    Ok zdobyłem taki kondensator podtrzymujący 0,22F i planuję go włączyć do mojego układu w sposób podany na załączonym schemacie.

    Widzę kilka niebezpieczeństw.

    A jakiej wartości ESR ma ten kondensator co go kupiłeś? Jeżeli ESR będzie za duże to będziesz miał sproy spadek napięcia przy rozładowywaniu kondensatora. A jeżeli ESR będzie za małe, to prąd ładowania kondensatora może uszkodzić Ci diodę, dławik, a nawet zasilacz.

    Druga sprawa to detekcja zaniku napięcia. Pieszesz że masz zasilacz komputerowy, zdaje się że są tam duże elektrolity + elektrolity tóre masz w swoim filtrze. Cała ta pojemność będzie w chwili zaniku napięcia rozładowywana tylko przez rezystancję 10k + 1k. I może się zdarzyć że w chwili gdy wykryjesz zanik zasilania twój SuperKondensator będzie już na wykończeniu. Osobiście wolałbym zasilić całość z 12V i dać dodatkowy stablizator na 5V, a zanik napięcia sprawdzany byłby po stronie 12V.
  • #17
    User removed account
    User removed account  
  • #18
    kris_jr
    Level 10  
    Jeżeli chodzi o inwertery to stosunkowo prosto mogę po awarii wymuszać na nich stan niski na wyjściu (takie inwertery już mam więc chcę je wykorzystać).
    Co do tych stanów nieustalonych to nie mam pewności jak się to wszystko zachowa, ale wydaje mi się że po prostu silniki się wyłączą i ewentualnie mogą się przemieścić na tyle na ile pozwoli bezwładność. Enkodery będą podtrzymane więc w razie czego można jeszcze po awarii monitorować przez tą krótką chwilę czy się pozycja nie zmieniła. Mam tylko nadzieję, że się nagle kierunek obrotu nie zmieni bo wtedy lipa :/

    Jeżeli chodzi o wątpliwości jakie przedstawił Dr_DEAD to nie wiem jaką wartość ESR ma kondensator, ale jest to typowy kondensator do takich zastosowań, czyli do podtrzymywania pamięci, zegarów itp. Jest to kondensator 0,22F i 5,5V (oznaczenie jakieś 7N3 ale nie wiem co to oznacza)

    Jeżeli chodzi o detekcję tego spadku napięcia to mógłbym to tak przerobić, że to odejście z rezystorkami mogłoby być zrobione przed filtrem, a dioda z kondensatorem za filtrem (jeżeli ma to sens), lub zrezygnować nawet z filtra jeżeli nie jest konieczny. Mógłbym też zrobić tak, że ten spadek byłby mierzony na osobnym kablu z zasilacza niezależnym od filtru i tego co się dzieje w układzie.
    Układ zasilany jest z ATX, ale z napięcia standby, a tu mógłby być pomiar na wyjściu 5V.
    Czy któraś z tych opcji jest sensowna i mogłaby znacząco wpłynąć na poprawne zadziałanie awaryjne?

    Dodano po 6 [minuty]:

    odp. do "djFoBoS"
    J
    eżeli chodzi o ładowanie przez rezystor to jaki powinien to być rezystor i w którym miejscu i jak wpięty?

    Jeżeli chodzi o wykrywanie spadku napięcia to chętnie bym może wykorzystał lepszy sposób np. ten z wykorzystaniem komparatora z uC, ale nie bardzo wiem jak to zrobić (jestem nowicjuszem w tych sprawach) i dlatego poradziłem sobie w taki łopatologiczny sposób.
    Zastanowię się nad tym sposobem, ale gdyby ktoś mógł mnie naprowadzić, a najlepiej powiedzieć jak to zrobić to byłbym wdzięczny, bo przyspieszyłoby mi to pracę.

    Pozdrawiam
  • #19
    nsvinc
    Level 35  
    Pomysł z komparatorem jest njlepszy i najpewniejszy. Moduł komparatora pięknie potrafi zwrócic przerwanie gdy napięcie bedzie zanizone/zawyzone i to przerwanie może w programie szybko zapisać wszystkie potrzebne dane. A komparator działa tak samo jak komparator na wzmaku operacyjnym, tyle ze zamiast napięcia na wyjsciu masz 0 lub 1
  • #20
    Dr_DEAD
    Level 28  
    Na Twoim miejscu przyjżał bym sie wyraźnie zasilaczowi ATX. Największy kondensator filtrujący jest tam przy napięciu 3.3V i wynosi 4700uF. Gdyby udało sie przerobić zasilanie 3.3V na 5V to nie potrzebowałbyś SuperKondensatora. ATX ma też taki kabelek jak PG (Power Good) być może już niesie on informację o zanku napięcia zasilania, a jeżeli nie to jego funkcjonowanie oparte jest na komparatorze i możesz to łatwo przerobić, tak by monitorować inne napięcie (najszybciej zanikające).
  • #21
    kris_jr
    Level 10  
    Jeżeli chodzi o ten sygnał Power Good to z tego co się orientuję to on jest wykorzystywany do startu płyty głównej i pojawia się po ustaleniu się napięć na wyjściach zasilacza. Robi się to w celu uniknięcia stanów nieustalonych.
    Po pierwsze ja w sterowniku korzystam z napięcia stand-by (nie ma wtedy sygnału Power Good) a poza tym wydaje mi się że on wolniej narasta niż napięcia na wyjściu żeby już wszystko było cacy zanim się pojawi Power Good, ale nie jest powiedziane że szybciej spada od pozostałych napięć, ale mogę się mylić.

    Zrobiłem poprawkę w tym moim schemacie (jest w załączniku).
    Wpiąłem odejście z rezystorkami przed filtrem i podłączyłem do jednego wejścia komparatora analogowego w ATmedze (AIN0) a do drugiego wejścia (AIN1) komparatora podłączyłem VCC, a dokładniej napięcie zasilające już po przejściu przez filtr i układ z diodą i kondensatorem podtrzymującym.

    Powiedzcie proszę czy to jest prawidłowe podejście.

    Ktoś tam wspominał jeszcze o ładowaniu wspomnianego kondensatora przez rezystor, ale powiedzcie prosze jaki powinien to być rezystor i gdzie go teraz wpiąć? Szeregowo z diodą? Przed czy po diodzie? Czy jeszcze jakoś inaczej?

    Pozdrawiam
  • #22
    Dr_DEAD
    Level 28  
    Przeniesienie tego za filtr praktycznie nie zmienia sytuacji. Widzę że sie strasznie palisz z robotą, w zawiązku z tym mam dla ciebie dwa rozwiązania:
    1. Zbuduj układ prototypowy, aby zabadać awaryjne zapisywanie.
    2. Rozdziel płytki. Zrób dwie - jedna do zasilacza i awaryjnego zasilania, druga dla procka i reszty.
    Unikniesz w ten sposób projektowania całej płytki od nowa.

    Zerknołem przelotem na pozostałą część schematu a tam same byki:
    1. Kondensatory kwarcu nie podłączone do masy.
    2. VCC niepodpięte.
    3. GND niepodpięte.
  • #23
    kris_jr
    Level 10  
    He he, masz rację troszkę mnie czas goni bo to ma być prezent, a przy okazji czegoś się nauczę :)

    Dziękuję, że skontrolowałeś resztę układu.
    To jest moja pierwsza przygoda z elektroniką i dlatego mogą pojawiać się dziwne, banalne, a czasem po prostu śmieszne błędy :)
    Faktycznie zapomniałem podłączyć kwarc do masy- fajnie, że to zauważyłeś.
    Co do VCC i GND to nie wiem, o które Ci dokładnie chodziło, ale ja używam Eagle'a i zauważyłem, że on sobie niektóre rzeczy podłącza sam, jak np. VCC i GND procka. Na schemacie nie jest to podłączone, ale już na płytce jest poprowadzony sygnał. Chyba, że chodziło o coś innego to jeszcze się przyglądnę.

    Z tym rozdzieleniem zasilania to jest oczywiście bardzo dobry pomysł, ale myślałem, że ktoś już tego typu doświadczenia miał i mógłby udzielić wskazówki jak z tym trafić za pierwszym razem. Zwłaszcza, że jak już wspomniałem czas mnie bardzo goni.
    Poza tym chciałem uniknąć nadmiernego kablowania i zmieścić się na jak najmniejszej ilości płytek- już teraz mam trzy płytki + dwa piloty, a w obudowie mam ograniczone miejsce.
    Jak nie będzie innego wyjścia to oczywiście skorzystam z tego pomysłu.
  • #24
    Dr_DEAD
    Level 28  
    kris_jr wrote:

    Z tym rozdzieleniem zasilania to jest oczywiście bardzo dobry pomysł, ale myślałem, że ktoś już tego typu doświadczenia miał i mógłby udzielić wskazówki jak z tym trafić za pierwszym razem. Zwłaszcza, że jak już wspomniałem czas mnie bardzo goni.

    Jest jeden pewny sposób, ale bardziej rozbudowany. Trzeba zastosować transoptor. Diodę transoptora poprzez rezystor (lub kondensator) wpinasz bezpośrednio w sieć 220V. W ten spsób transoptor daje ci impulsy co 20ms o tym że zaslanie jest. No i wiadomo, brak impulsów oznacza brak zasilania. Najszybszy i najpewniejszy sposób wykrycia.