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

Równoległa praca przerwań w Atmega16

12 Lip 2012 12:49 2673 22
  • Poziom 13  
    Witam,

    Mam pytanie odnośnie obsługi przerwań w mikroprocesorze Atmega16.
    Procesor ten ma możliwość pracy z trzema przerwaniami zewnętrznymi. Powiedzmy, że aktywuję wszystkie trzy przerwania. Występować one będą średnio co 3,33ms i będą spowodowane detekcją zera na trzech kolejnych fazach zasilania trójfazowego. Czas trwania przerwania będzie się wahać od minimum do nawet blisko 10ms (przy czym czas trwania będzie dla poszczególnych faz taki sam w danej chwili). Nie trudno zauważyć, że przerwania (a właściwie wykonywane w nich funkcje) będą się na siebie nakładały. I tu pytanie: Jeśli podczas trwania jednego przerwania nr1 pojawi się przerwanie nr2 i np do tego w skrajnym przypadku dołoży się przerwanie nr3 to czy wszystkie te przerwania wykonają się poprawnie (równolegle)?
    Czy może jeśli w momencie trwania funkcji wywołanej w przerwaniu nr1 pojawi się przerwanie nr2 procesor zakończy (przerwie wykonywanie) przerwanie nr1 i zacznie realizować funkcje umieszczone w przerwaniu nr2?

    Dodam, że we wszystkich trzech przerwaniach będzie funkcja odliczająca konkretną ilość impulsów timera i ustawiająca na chwilę stan wysoki na danym pinie.

    Z góry dziękuję za pomoc. Zabieram się za nowy projekt i muszę najpierw ustalić czy taki algorytm jaki sobie założyłem jest wykonywalny na jednym procesorze.
  • Poziom 27  
    Co prawda nie wiem jak jest w atmega16, ktoś się zaraz na pewno wypowie, ale jeśli procesor obsługuje wywłaszczanie przerwań to wtedy w takcie wykonywania jednego, jeśli nastąpi drugie, to wcześniejsze zostaje wywłaszczone.
    U Ciebie taki mechanizm spowodowałby zatkanie procka, który i tak nie wyrabiałby się z wykonywaniem bo ciągle nadchodziłyby nowe przerwania. Funkcje przerwań powinny być możliwie krótkie, być może da się zrobić tak, aby taka funkcja nie przekraczała tego czasu 3.33ms. Przerwania się nie będą wykonywać równolegle bo i w jaki sposób na 1nym rdzeniu.
    Taką funkcjonalność jak Ty masz na pewno da się wykonać w taki sposób, żeby te funkcje przerwań były możliwie krótkie a timery działałyby sobie niezależnie od tego i tylko ustawiały coś w w momencie zmiany jakichs flag w przerwaniach.
  • Poziom 40  
    Przerwania nie mogą wykonać się jednocześnie bo architektura procesora na to nie pozwala. Musisz napisać program tak aby przerwania wykonywały się najkrócej jak to tylko możliwe. Przerwania mogą ustawiać jakieś flagi a ich obsługę możesz zrobić w programie głównym. Możesz też w przerwaniu uruchamiać tylko timer i wychodzić z przerwania.
    Jeśli chcesz pracować z przerwaniami i wszystkie muszą działać jednocześnie i dodatkowo być wykonywane bez zbędnych opóźnień to musisz przemyśleć algorytm programu. Weź pod uwagę czas wykonania każdego przerwania.
  • VIP Zasłużony dla elektroda
    PJimi napisał:
    Jeśli podczas trwania jednego przerwania nr1 pojawi się przerwanie nr2 i np do tego w skrajnym przypadku dołoży się przerwanie nr3 to czy wszystkie te przerwania wykonają się poprawnie (równolegle)?
    1. Każde ze zdarzeń generuje praktycznie natychmiast tylko ustawienie flagi odpowiedniego zdarzenia. Jeśli wybrano obsługę programową zdarzenia przez przerwanie, to jednocześnie wykona się tylko jedna sztuka przerwana, pozostałe będą czekać na jego koniec. Dlatego najlepiej procedury obsługi przerwań ograniczać do nieskomplikowanego i krótko trwającego minimum. Przy częstotliwości sieci różnice w opóźnieniach w wykonaniu dobrze napisanych procedur przerwań nie będą praktycznie robić różnicy.
    2. Skoro detekcja zera na trzech różnych fazach, to trudno o taki przypadek, w którym detekcja przejścia przez zero zachodzi jednocześnie.
    stanleysts napisał:
    ale jeśli procesor obsługuje wywłaszczanie przerwań to wtedy w takcie wykonywania jednego, jeśli nastąpi drugie, to wcześniejsze zostaje wywłaszczone.
    W AVR 8-bit(pomijam ATxmega), a więc i w ATmegach producent nie przewidział wywłaszczeń z przerwań, mozna to robić tylko programowo( ISR z atrybutem NO_BLOCK). Trzeba wtedy jedna wiedzieć co się robi, bo łatwo iść programowi w/na maliny... ;)

  • Poziom 28  
    Kolego co Ty chcesz osiągnąć?
    3 fazy... hmmm
    Sterowanie fazowe... hmmm

    Jaki typ obciążenia chcesz sterować? Bo zaraz się okaże, że nie potrzebujesz sterowania fazowego tylko grupowe.
  • Moderator Mikrokontrolery Projektowanie
    PJimi napisał:
    Witam,

    Mam pytanie odnośnie obsługi przerwań w mikroprocesorze Atmega16.
    Procesor ten ma możliwość pracy z trzema przerwaniami zewnętrznymi. Powiedzmy, że aktywuję wszystkie trzy przerwania. Występować one będą średnio co 3,33ms i będą spowodowane detekcją zera na trzech kolejnych fazach zasilania trójfazowego. Czas trwania przerwania będzie się wahać od minimum do nawet blisko 10ms (przy czym czas trwania będzie dla poszczególnych faz taki sam w danej chwili). Nie trudno zauważyć, że przerwania (a właściwie wykonywane w nich funkcje) będą się na siebie nakładały. I tu pytanie: Jeśli podczas trwania jednego przerwania nr1 pojawi się przerwanie nr2 i np do tego w skrajnym przypadku dołoży się przerwanie nr3 to czy wszystkie te przerwania wykonają się poprawnie (równolegle)?
    Czy może jeśli w momencie trwania funkcji wywołanej w przerwaniu nr1 pojawi się przerwanie nr2 procesor zakończy (przerwie wykonywanie) przerwanie nr1 i zacznie realizować funkcje umieszczone w przerwaniu nr2?

    Dodam, że we wszystkich trzech przerwaniach będzie funkcja odliczająca konkretną ilość impulsów timera i ustawiająca na chwilę stan wysoki na danym pinie.

    Z góry dziękuję za pomoc. Zabieram się za nowy projekt i muszę najpierw ustalić czy taki algorytm jaki sobie założyłem jest wykonywalny na jednym procesorze.


    Wykonywalny na jednym MCU to on zapewne jest, tylko musisz go przebudować. Zakładając, że to silnik zasilany prądem przemiennym 50Hz to pomiędzy przerwaniami z danej fazy masz 20 ms. Nie jest więc możliwe poprawne obsłużenie sytuacji w której nałożą się 3 przerwania, których obsługa będzie trwała po 10 ms - w takiej sytuacji następne przerwanie z danej fazy zostanie zgubione - procesor ma bufor na zapamiętanie tylko jednego przerwania danego typu. To można ominąć, zakładając, że w następnym cyklu obsługa przerwań będzie krótka i uda się "nadrobić" stracony czas. W efekcie średni czas obsługi przerwania nie może być dłuższy niż 20ms/3 lub suma czasów obsługi musi być na tyle mała, aby nie doszło do ich gubienia. Oczywiście przy takich czasach obsługi będziesz miał masakryczny jitter, co stawia pod znakiem zapytania sens takiej realizacji.
    Napisz może co chcesz uzyskać, będzie łatwiej doradzić, niewykluczone, że przynajmniej częściowo problem da się rozwiązać sprzętowo z odpowiednim wykorzystaniem timerów.
  • Poziom 40  
    W sumie przy zasilaniu 3-fazowym nie musisz mieć przerwań z każdej fazy bo zero pojawia się w stałych odstępach czasu i wystarczy po pierwszym przerwaniu mierzyć czas. Od przerwania liczysz 3,33 ms i masz przejście przez 0 kolejnej fazy i po kolejnych 3,33 masz trzecią fazę w zerze.
  • Poziom 13  
    Rzeczywiście ma być to urządzenie realizujące fazowe sterowanie mocą obciążenia zasilanego z sieci trójfazowej 3x400V. Dedykowane obciążenie to wentylatory z silnikiem trójfazowym.
    Regulacja grupowa niestety odpada - testowałem ją na jednofazowych wentylatorach (strasznie buczy i szarpie). Ale może trzebaby przeprowadzić testy na trójfazówce...
    Głównym założeniem jest jednak sterowanie fazowe trzech faz.

    Wracając do samego programu:
    Tego się właśnie obawiałem, że Atmega nie obsłuży równoległych przerwań. Ale też wpadłem na pomysł (a koledzy to potwierdzili), że w danych przerwaniach można jedynie startować timery, które będą już liczyły poza przerwaniem. Rozumiem, że jeśli będę używał trzech różnych timerów to ich równoległa praca nie będzie problemem. Po przepełnieniu się danego timera zostanie ustawiony odpowiadający mu pin.
  • VIP Zasłużony dla elektroda
    Jeśli jest to standardowa sieć 50Hz, to ja nie widzę potrzeby używania 3 timerów, wystarczą 3 zmienne odliczające w przerwaniu tyknięcia timera w CTC. A same tyknięcia muszą być co najwyżej wielkości połowy zakładanej rozdzielczości kroku załączania fazy. Nie można też zapomnieć o odliczeniu czasu do końca impulsu wyzwalającego. Przy zegarze procesora 16MHz 3⅓ms to jak przerwa na obiad(53333 cykle procesora)... ;)
    Byle bzdur nie popełniać w rodzaju używania <util/delay.h>
  • Poziom 13  
    LordBlick, sugerujesz, że wystarczy wykryć jedno zero jednej fazy i potem tylko po odliczeniu 3,33ms startować timery na wyjściach sterujących kolejnymi fazami.
    Faktycznie - rozwiązanie bardzo proste. Boję się tylko czy nie za proste, ale spróbować można. Być może niepotrzebnie pcham się w 3 detektory zera i trzy przerwania...
  • VIP Zasłużony dla elektroda
    Bezpośrednio nie sugerowałem tego, ale też tak można. Bardziej mi chodziło o to, że nie ma potrzeby używania na każdą fazę oddzielnych timerów. Do niezbyt skomplikowanych zadań, to nawet ATtiny2313 ujdzie albo jakiś inny "cienias" z 1 licznikiem...
  • Poziom 40  
    Sterowanie fazowe do silników trójfazowych? Co to ma robić?
  • VIP Zasłużony dla elektroda
    Dar.El napisał:
    Sterowanie fazowe do silników trójfazowych? Co to ma robić?
    Przede wszystkim ślicznie brzęczeć... ;) Myślę, że cel bardziej edukacyjny...

  • Poziom 28  
    Oczywiście w Twoim przypadku sterowanie grupowe całkowicie odpada. Przeznaczone ono jest do sterowania zasilaniem grzałek.
    Już bardziej pasowałoby mi tutaj coś oparte na zasadzie działania softstartu elektronicznego:
    - 2 fazy na stałe załączone
    - 3 faza ma regulowane napięcie
    Ale nie potrafię powiedzieć jak w pracy długoterminowej takie traktowanie "non stop" zniesie silnik.

    PJimi - 3x400V to nie są żarty. Czemu uparłeś się, że sam to "zdiełasz"? Pomyślałeś choć przez chwilę o zakłóceniach jakie możesz generować do sieci i w eter? Pomyślałeś o zabezpieczeniu silników przed utykami itp.?
    Proponowałbym Ci jako drivera użyć gotowego falownika. Fabryczny falownik ma szereg zabezpieczeń czyniących go prawie (za przeproszeniem) "idiotoodporym". A jak już się upierasz przy Atmedze to użyj jej do sterowania falownikiem. Chociaż to moim zdaniem taka sztuka dla sztuki.
  • Poziom 13  
    LordBlick - Udało mi się już zrealizować jednofazowy regulator fazowy na Atmedze8. Silnik buczy - wiadomo, jak to przy regulacji fazowej.
    Teraz po prostu chciałem to rozwiązanie zaadaptować do wentylatorów trójfazowych. Wiem, że prawdopodobnie będzie buczeć i brzęczeć, ale zobaczymy jak to będzie w praktyce. Nawet jeśli cel sam w sobie jest bardziej edukacyjny to też dobrze. Dopiero si w zasadzie uczę :)

    tehaceole - Wiem, że 3x400 to nie są żarty. Zadbam o odpowiednie filtry na wejściach i wyjściach. Może to złe podejście, ale na chwilę obecną interesuje mnie bardziej żeby taki sterownik po prostu odpalić :)
    O falowniku też myślałem, ale wydaje mi się, że to jak dla mnie w tym momencie zbyt skomplikowany projekt. Sterowanie fazowe jednak ogarniam i wiem, że jeśli tylko uda mi si napisać program to będę w stanie takie urządzenie wykonać.
    O falownikach chyba muszę się jeszcze sporo dowiedzieć. Ale nie ukrywam, że to moja kolejna ambicja...

  • Poziom 28  
    PJimi napisał:
    O falowniku też myślałem, ale wydaje mi się, że to jak dla mnie w tym momencie zbyt skomplikowany projekt
    Ale jak broń Boże nie sugerowałem Koledze budowy falownika! Tylko zastosowanie fabrycznego urządzenia - co będzie dużo bezpieczniejsze od samodzielnych eksperymentów.
    PJimi napisał:
    na chwilę obecną interesuje mnie bardziej żeby taki sterownik po prostu odpalić
    To dobrze, że lubisz eksperymentować, ale:
    PJimi napisał:
    Wiem, że prawdopodobnie będzie buczeć i brzęczeć, ale zobaczymy jak to będzie w praktyce
    Po co robić coś co już dawno przez mądrych ludzi zostało opracowane koncepcyjnie? Tzn. żebyśmy się dobrze zrozumieli - chodzi mi o sterowanie prędkością obrotową silnika.

    Tak na marginesie: jak realizujesz sterowanie fazowe jednej fazy? Pytam o sposób generowania opóźnień do załączania triaka po przejściu przez zero. Używasz stablicowanych wartości opóźnień czy poprostu czas trwania półokresu dzielisz przez liczbę kroków? Odpowiedz na te pytania to zdradzę Ci dlaczego je zadałem. :)
  • Poziom 13  
    Wiem, co ewentualnie chcesz mi "zdradzić" :) Używam oczywiście tablicy z wartościami opóźnień. Dzielenie czasu półokresu np. na 100 równych części w celu uzyskania procentowego podziału mocy wyjściowej przynosi nieliniową charakterystykę. Jest to związane z tym, że gdyby podzielić sinusoidę na 100 równych kawałków od zera do pi to pola pod wykresem (a więc i procentowe przyrosty mocy) byłyby nierówne.
    Taka nieliniową charakterystykę przerabiałem już przy analogowym regulatorze fazowym.
    Chęć uzyskania liniowej charakterystyki i dodatkowo inne opcje związane z cyfryzacją sterowania spowodowały, że zainteresowałem się zbudowaniem podobnego urządzenia na mikroprocesorze.

    Co masz na myśli pisząc:
    Cytat:
    Po co robić coś co już dawno przez mądrych ludzi zostało opracowane koncepcyjnie? Tzn. żebyśmy się dobrze zrozumieli - chodzi mi o sterowanie prędkością obrotową silnika.


    Jednofazowe regulatory fazowe istniej na rynku i z tego co wiem dobrze sobie radzą, choć wiadomo, że buczą i sieją do sieci, ale wyposażone w odpowiednie filtry spełniają normy. A jeśli chodzi o ich trójfazowe odpowiedniki to nie wiem.
    Na pewno falownik jest znaną i stosowaną metodą sterowania silnikami trójfazowymi. Nie wiem czy fazowe sterowanie wentylatorem trójfazowym się sprawdzi. Ale myślę, że spróbować można.

  • Poziom 28  
    PJimi napisał:
    Dzielenie czasu półokresu np. na 100 równych części w celu uzyskania procentowego podziału mocy wyjściowej przynosi nieliniową charakterystykę. Jest to związane z tym, że gdyby podzielić sinusoidę na 100 równych kawałków od zera do pi to pola pod wykresem (a więc i procentowe przyrosty mocy) byłyby nierówne
    Dokładnie o to mi chodziło. :) Jest taki sympatyczny wzór całkowy z którego po przekształceniu wyznacza się dolną granicę całki - jest to wartość, która po przeskalowaniu dla konkretnego timera i taktowania jest bezpośrednio związana z kątem załączenia triaka. Trochę zamotałem, ale reasumując - w ten sposób uzyskuje się charakterystykę liniową.

    Swego czasu zostałem poproszony o napisanie kodu, który działał jeszcze finezyjniej:
    - optotriak nie był połączony bezpośrednio z nogą uP. Był dołączony przez niewielki kondensator.
    - wyzwolenie triaka nie polegało na podaniu stanu wysokiego lub niskiego na pin uP - tylko na podaniu sygnału prostokątnego.

    Dzięki temu, w przypadku awarii pinu nie dojdzie do sytuacji w której obwód wykonawczy zostanie załączony na stałe.

    PJimi napisał:
    Jednofazowe regulatory fazowe istniej na rynku i z tego co wiem dobrze sobie radzą, choć wiadomo, że buczą i sieją do sieci, ale wyposażone w odpowiednie filtry spełniają normy. A jeśli chodzi o ich trójfazowe odpowiedniki to nie wiem
    Istnieją, mam nawet taki w piecu CO do regulacji obrotów wentylatora nawiewu. Jednak nie spotkałem się z zaproponowanym przez Ciebie sposobem w regulacji silników 3f. Jak do tej pory na mojej drodze stawały tutaj wyłącznie falowniki. Jedyne co przychodzi mi do głowy a będące technicznie zbliżone do Twojego rozwiązania to właśnie softstarty elektroniczne. Oczywiście biorę pod uwagę to, że być może moja wiedza w tym zakresie jest zbyt uboga. :)
  • Poziom 33  
    >>> autor
    jeżeli nie musi to być ATmega16 to zobacz na ATtiny261...861 który ma piękny zestaw liczników do sterowania 3-fazowego z czasami martwymi, multiplexerem komparatora itp. potrzebnymi bajerami. Plus noty aplikacyjne w temacie.

    To co potrzebujesz to 100 wierszy w asemblerze.

    N.
  • Poziom 40  
    Można zrobić falownik "prostokątny", trzeba tylko dodać prostowanie napięcia sieci, filtrowanie i mostek na tranzystorach. Trochę terkoczą wentylatory przy małych obrotach, ale na pewno będzie lepiej od sterowania fazowego.
  • Poziom 13  
    Oczywiście zdaje sobie sprawę, że falownik byłby bardziej eleganckim i odpowiednim rozwiązaniem. Tyle tylko, że o falownikach na daną chwilę zbyt dużo nie wiem i ciężko jest mi się zabrać za taki projekt. Sterowanie fazowe natomiast mam rozpracowane harware'owo i software'owo więc mówić krótko "ogarniam" ten temat i jestem w stanie zbudować takie urządzenie na 3f. Pytanie tylko czy będzie działało.
    I drugie pytanie czy warto coś takiego budować czy od razu doczytać, douczyć się i zabrać za konstruowanie falownika, nawet na początek takiego dającego falę prostokątną.
    Czy ma ktoś może dostęp do jakichś schematów prostych falowników?