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

ATmega - Potrzebny pomysł na 6 kanałowe urządzenie liczące

lukasixthm 15 Kwi 2016 21:18 681 14
  • #1 15 Kwi 2016 21:18
    lukasixthm
    Poziom 23  

    Witam.
    Buduję urządzenie na jakimś AVR (chyba m8) które ma posiadać 6 wejść do których podłączone będą czujniki optyczne - fotokomórki. Sygnał na jednej takiej fotokomórce zmienia się maksymalnie 50 razy na sekundę (0V i 5V).

    Urządzenie ma sygnalizować awarię. Przez awarię rozumie się zanik zmian sygnału na którejkolwiek fotokomórce - przy uszkodzeniu będzie ciągle 5V z fotokomórki. Po wystąpieniu awarii ma być ona zasygnalizowana tylko zapaleniem się diody 1-6, zależnie od wejścia z awarią.

    Nie wiem czemu, ale mam jak nigdy jakąś pustkę w głowie... Może ktoś o przytomniejszym umyśle podrzuci pomysł na zasadę działania..?

    Program w Bascomie. Kwarc zewnętrzny 16MHz

    Dzięki za jakiekolwiek wskazówki.

    0 14
  • #2 15 Kwi 2016 21:28
    radex324
    Poziom 22  

    Sprawdzasz stan pinu i zapalasz odpowiednią diodę, w czym problem?

    0
  • #3 15 Kwi 2016 21:42
    arecoag
    Poziom 19  

    A jak wykorzystasz przerwanie będziesz miał pewność że awaria nastąpiła

    0
  • Pomocny post
    #4 15 Kwi 2016 21:43
    M. S.
    Poziom 34  

    Sprawdzasz stan końcówek w pętli głównej i za każdym razem porównujesz stan ze stanem poprzednim. Jeśli zgodny i wysoki inkrementujesz zmienną np Czas. Jeśli przeciwny zerujesz zmienną Czas. Sprawdzasz wartość zmiennej czas i jeśli zmienna osiągnie zadaną wartość uC wystawia na swoim pinie wyjściowym określony stan. Jak widać ustalenie błędu musi nastąpić po pewnym czasie szczególnie jeśli częstotliwość jest zmienna. Można też obliczać częstotliwość na danym pinie i dobierać graniczną wielkość zmiennej czas.

    0
  • #5 15 Kwi 2016 22:13
    lukasixthm
    Poziom 23  

    Na szybko napisałem algorytm kolegi M.S. i działa. To ustalenie błędu na szczęście nie musi się odbywać natychmiast - powiedzmy 10 sekund będzie zadowalającym czasem. Gdyby coś jeszcze nie grało to będę się odzywał :)

    0
  • #6 16 Kwi 2016 08:33
    BlueDraco
    Specjalista - Mikrokontrolery

    Ten algorytm zupełnie nie działa, bo nie posługuje się jakimkolwiek wiarygodnym wzorcem czasu. Nie wiesz więc, czy masz częstotliwość 5, 50 czy 500 Hz. WIszy tylko, że są jakieś zmiany stanu wejścia.

    0
  • #7 16 Kwi 2016 18:02
    perlon
    Poziom 19  

    Proponuję zmianę m8 na m88 wtedy każde z wejść może wyzwalać przerwanie zewnętrzne. Częstotliwość przebiegu albo zadać na stałe a raczej na stałe ustalić czas przy jakim ma nastąpić co najmniej jedna zmiana stanu. Jeżeli nie nastąpi to ALARM. Można by też próbować rozpoznawać częstotliwość za pomocą średnich kroczących. Pozwoli to "rozpędzić" urządzenie, a gdy średnia częstotliwość spadnie poniżej np. 2/3 max-a to ALARM.

    0
  • #8 16 Kwi 2016 18:17
    arecoag
    Poziom 19  

    Nie do końca podałeś warunek alarmu, bo wiadomo że maksymalna częstotliwość wynosi 50Hz a ile wynosi minimalna częstotliwość? Określenie tej wartości da podstawę do wyliczenia czasu pomiaru czyli określenia czy jest to normalna praca czy stan awaryjny. Reszta to test stanu wejścia po określonym czasie.

    0
  • #9 17 Kwi 2016 01:33
    lukasixthm
    Poziom 23  

    Panowie dzięki za odpowiedzi. Dzisiaj napisałem sobie już kompletny kod. Jutro planuję zrobić płytkę.

    Kod na płytce ewaluacyjnej działa tak jak powinien. Co do minimalnej częstotliwiści... hmm... Myślę że około 3Hz na kanał. Nie chodzi tu tyle o liczenie przychodzących impulsów co o wykrycie ich braku (ciągły stan wysoki). W takim wypadku alarm po 10 sekundach od ostatniej zmiany wystarcza mi w zupełności. Ciągle bazuję na pomyśle kolegi M.S. Wszystkie porównania sprowadziłem do jednego parametru definiowanego na początku programu. Przy ewentualnej kalibracji urządzenia w układzie docelowym wystarczy zmienić tylko jedną liczbę.

    0
  • #10 17 Kwi 2016 12:05
    atom1477
    Poziom 43  

    lukasixthm napisał:
    Nie chodzi tu tyle o liczenie przychodzących impulsów co o wykrycie ich braku (ciągły stan wysoki).

    Ale musowo coś liczyć żeby wiedzieć że są impulsy a nie ciągły stan wysoki.
    Przecież podczas trwania impulsów też są momenty gdzie stan wysoki jest przez jakiś czas ciągły.
    Dlatego było pytanie o minimalną częstotliwość.
    Jeżeli ma wynosić ona 3Hz to czas trwania stanu wysokiego w impulsach może wynosić od praktycznie 0 do 1/3 s. Wszystko zależy od wypełnienia impulsów.
    Więc liczyć coś trzeba. Jak nie ilość impulsów to czas od ostatniej zmiany stanu na wejściu.

    0
  • #11 17 Kwi 2016 21:24
    lukasixthm
    Poziom 23  

    Siema atom :) tak tak. Jest liczone. I ten licznik to w zasadzie liczba przejść przez pętlę główną programu. Zamontuję urządzenie tam gdzie ma pracować i wtedy będe dokładnie wiedział ile razy ta pętla przeleci (ile naliczy licznik) dla normalnej pracy. Wynik powiedzmy x5 i mamy parametr porównawczy dla rozpoznania alarmu.

    0
  • #12 17 Kwi 2016 21:28
    atom1477
    Poziom 43  

    To bardzo złe rozwiązanie.
    To już lepiej wstawić tam jakiegoś delaya. To przynajmniej czas trwania będzie przewidywalny w zakresie kilkunastu %. Przy samej pętli głównej czas wykonywania może się mocno zmieniać w zależności od optymalizacji kodu choćby (o całe rzędy wielkości).

    0
  • #13 17 Kwi 2016 22:18
    arecoag
    Poziom 19  

    Pętla główna to bzdura, ale można to zrobić następująco, do portu PC0 do PC5 podłączamy czujniki optyczne, następnie piny PC0 do PC5 łączymy z katodami diod impulsowych, anody diod łączymy do pinu PD2 (INT0), teraz opadający poziom na wejściu PC0 do PC5 wywoła przerwanie INT0. W obsłudze przerwania testujemy poziom 0 na wejścich PC0 do PC5 i w zadeklarowanych wcześniej zmiennych np. int Zmienna_PC0,Zmienna_PC1,.....Zmienna_PC5, wpisujemy wartość 350. Budujemy timer odliczający 1ms i w przerwaniu od timera odejmujemy 1 od Zmienna_PC0 do Zmienna_PC5, jeżeli którakolwiek zmienna osiągnie wartość "0" Zapalamy diodę LED podłączoną do portu np. PB0 do PB5. Kasowanie alarmów jest ręczne ( jakiś przycisk zwierający pin np PB6 bo kwarc jest tu niepotrzebny), albo automatycznie po pojawieniu się kolejnych impulsów na pinach PC0 do PC5.

    0
  • #14 18 Kwi 2016 00:17
    lukasixthm
    Poziom 23  

    atom1477 napisał:
    To bardzo złe rozwiązanie.
    To już lepiej wstawić tam jakiegoś delaya. To przynajmniej czas trwania będzie przewidywalny w zakresie kilkunastu %.


    A kto mówi że go tam nie ma :). Są delaye po 25us pomiędzy sprawdzaniem wejść i po 10us pomiędzy porównywaniem odliczonych impulsów z parametrem stałym. Łączny czas opóźnienia przy przejściu przez całą petlę to coś około 750 us + czas na wykonanie ifów itp. To daje sprawdzanie wszystkich wejść z częstotliwością około 1kHz o ile się nie mylę. Mogę jutro na końcu pętli wstawić toggle portx.y i miernikiem na końcówce sprawdzić jak odświeża.

    Pomysł z przerwaniami także niezły. Urządzenie jest niestety potrzebne na wczoraj. Płytka zaprojektowana. Jutro montaż elementów.

    0
  • #15 19 Kwi 2016 10:34
    kamyczek
    Poziom 34  

    Tego typu urządzenie można zrealizować na elementach dyskretnych , ttl-ce lub mikrokontrolerze . W pierwszym poście nie umieściłeś informacji jaki jest maksymalny czas pomiędzy impulsami na wejściu , tzn co ile czasy najwolniej będą występować impulsy i jaki jest minimalny czas ich trwania . To co można osiągnąć to w takim urządzeniu zależy właśnie od takiego czasu tzn. musi upłynąć czas w trakcie którego musi wystąpić impuls na wejściu. Inaczej nie można stwierdzić że takiego impulsu nie było . Można oczywiście dodać jakieś mechanizmy weryfikacji wybrać różne czasy dla kilku wejść . A jak będziesz bardzo leniwy to taki układ można zbudować na 3 rezystorach i 2 tranzystorach i kondensatorze i oczywiście 1 diodzie led dla kanału . Jeśli chcesz realizować układ na mikrokontrolerze to attiny z 16 wyprowadzeniami I/0 kwarc jest zbędny wystarczy wewnętrzny generator rc ATTINY2313 , ATTINY26 obojętne na upartego można zrobić układy 2 kanałowe na attiny10 ...

    0
  Szukaj w 5mln produktów