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

[ATMEGA8/16][C] - Projekt sterownika nastawnika z wyświetlaniem stanu

27 Paź 2013 14:54 2568 19
  • Poziom 19  
    Witam, jestem aktualnie studentem Mechatroniki PW, jako zadanie z koła naukowego dostałem zaprojektować i zaprogramować oraz oczywiście wykonać sterownik pewnego nastawnika. Generalnie całą konstrukcję pomijam, nastaw jest realizowany za pomocą 2 elektromagnesów którymi chcę sterować.

    Założenia projektu:
    2 przyciski- wyżej, niżej
    7-segmentowy wyświetlacz LED wskazujący ile razy naciśnięto wyżej bądź niżej. Co to znaczy? Ano tylko tyle, że gdy naciskamy + na wyświetlaczu dostajemy 1,2,3,4,5 gdy minus 5,4,3,2,1. Oczywiście gdy np jesteśmy na stanie wyświetlacza 3 i naciskamy - to otrzymamy 2 i analogicznie gdy mamy 3 i naciśniemy + dostaniemy 4. Zakres to 1-5.
    2 elektromagnesy załączające się w zależności który przycisk naciśniemy
    jeden elektromagnes przypisany do +
    drugi elektromagnes przypisany do -

    Problem:
    Program staram się napisać w języku C ponieważ tego języka uczyłem się używać lecz tylko w świetle programów działających w konsoli linux. Po raz pierwszy zająłem się pisaniem programu do mikrokontrolera, swoje wypociny opieram o pare książek- książkę pana Kardasia oraz pana Witkowskiego.
    Do tej pory udało mi się napisać część odpowiadającą za obsługę wyświetlacza przy naciskaniu przycisków lecz teraz muszę do tego dodać sterowanie elektromagnesami. Tutaj jest mój problem- w jaki sposób napisać że przy naciśnięciu danego przycisku załączy się stan wysoki na PB0 lub PB1 lecz tylko na określony czas znajdujący się w zakresie 0,2s-1s po czym znów pin powróci do stanu wyjściowego- 0?
    Czy ktoś mógłby mi pomóc?
    Serdecznie prosze również o sprawdzenie programu ponieważ pisałem go do tej pory w notatniku ;)
    [ATMEGA8/16][C] - Projekt sterownika nastawnika z wyświetlaniem stanu

    Kod: C
    Zaloguj się, aby zobaczyć kod
  • Computer ControlsComputer Controls
  • Computer ControlsComputer Controls
  • Poziom 19  
    Czy te zmiany są obligatoryjne? słyszałem właśnie, że są dwa obozy za i przeciw używaniu delay'ów. Wydaje mi się jednak, że ze względu na małe skomplikowanie programu można ten jeden delay zostawić?
    Szczerze powiem, że nie rozumiem jaki będzie też cel nie wykonywania żadnych czynności w pętli głównej, mam w main'ie tylko usypiać uC a resztę czynności testowania przycisków itd przenieść do innej funkcji czy jak? Nie będę ściemniał, że jest mi to bardzo nie na rękę, by coś zmieniać bo wiem jakie katusze przeszedłem by to stworzyć a teoretycznie powinno spełniać swą rolę :]
  • Specjalista - Mikrokontrolery
    Nie, te zmiany są niezbędne tylko w sytuacji, gdybyś chciał mieć poprawnie działający program. Jeśli nie ma takiej potrzeby - zostaw pętlę główną i delay.
  • Poziom 21  
    Kolega BlueDraco dobrze radzi, bo jak się człowiek za coś bierze, to powinien to zrobić dobrze :D. A wracając do tematu, to czym podyktowany jest czas załączenia wyprowadzeń PB0 i PB1. Czy stan wysoki na tych wyprowadzeniach może być z takiego zakresu jak podałeś (0.2 - 1.0 s)? Wydaje mi się, że to urządzenie powinno działać troszkę inaczej, bo przede wszystkim brakuje mi tu informacji o tym, w jakiej pozycji znajduje się element sterowany elektromagnesami.
  • Poziom 1  
  • Poziom 19  
    Cytat:
    Czy stan wysoki na tych wyprowadzeniach może być z takiego zakresu jak podałeś (0.2 - 1.0 s)?

    Stan wysoki na tych wyprowadzeniach ma się utrzymywać przez czas dobrany doświadczalnie po stworzeniu całego układu. Lecz będzie on wybrany z przedziału 200ms-1s. Prąd cewek elektromagnesu ma być dobrany tak by magnesy zawsze działały z pełną, możliwą do uzyskania siłą/mocą przyciągania.
    Cytat:
    Wydaje mi się, że to urządzenie powinno działać troszkę inaczej, bo przede wszystkim brakuje mi tu informacji o tym, w jakiej pozycji znajduje się element sterowany elektromagnesami.

    O tym akurat można zapomnieć ponieważ to urządzenie- nastawnik po wyłączeniu i ponownym uruchomieniu zawsze powraca do pozycji 1 samoczynnie tak więc biorąc pod uwagę, że zasilanie układu będzie sprzężone z zasilaniem nastawnika pomijamy odczyt takiego parametru.

    Mam kolejne pytanie, rozpocząłem za waszymi namowami pisanie kodu od nowa używając przerwań. Na ten moment wygląda on tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    #1 Czy właściwie skonfigurowałem porty konsolidując to z moim schematem?
    #2 W jaki sposób zdefiniować przerwanie INT1 na stan niski tak jak INT0?
    #3 Czy da się przestawić wektor przerwań zewnętrznych INT0, INT1 z domyślnych pinów PD2, PD3 na piny PC0, PC1 ?
    #4 Podobno makrodefinicje SIGNAL to przeżytek, czy zamiast SIGNAL(SIG_INTERUPT0) mogę beztrosko napisać ISR(SIG_INTERUPT0) ?
  • Poziom 25  
    Drobna uwaga do schematu, napięcie zasilania jest określone w przedziale 5,5-12V, regulator 7805 nie będzie działał w okolicach dolnej granicy. Należałoby zwiększyć minimalne napięcie zasilania lub zastosować lepszej klasy stabilizator, typu LDO.
    Nie, nie można przestawić przerwań na inne pin-y, a co za tym idzie bez sensowne jest konfigurowanie przerwań przy aktualnym schemacie. Do obsługi przycisków nie musisz używać przerwań. Wystarczy, że ich stany będziesz próbkował w przerwaniu, przy okazji możesz wtedy wygodniej napisać obsługę eliminacji odbić styków. Chociaż sugerując "przestawienie" przerwań na PC0 i PC1 wskazuje to, że chciałbyś coś odczytywać z bramek MOSFET-ów, czemu?
    Ja bym jeszcze dodatkowo zabezpieczył szybką diodą te MOSFET-ty.
    Może warto nowy schemat narysować.
    Jak najbardziej, należ stosować makra ISR(). Tu masz Link listę wektorów przerwań dla AVR-ów obsługiwanych przez avr-libc.
    Wyrzuć stąd definicję F_CPU, zdefiniuj częstotliwość zegara w Makefile. Poza tym, samo "ustawienie oscylatora na 1MHz", budzi moje wątpliwości. Częstotliwość taktowania, dobierasz sam, wstawiając odpowiedni rezonator/generator zewnętrzny lub używając wewnętrznego generatora RC, korzystając z FuseBit-ów oraz rejestru OSCCAL. F_CPU to jedynie stała informująca kompilator (kod) o twoim wyborze.
    W procedurze ShowOnLED: Co to za ciekawa liczba 0x7FJ (sic!)? Co to za tajemnicza stała DP. Poza tym, brakuje zamykającego nawiasu w IF-ie.
    Dalej w kodzie w kodzie widzę następne takie kwiatki.
    Co do konfiguracji INT1 tak jak INT0. Odpowiedź brzmi, tak samo tylko korzystając z analogicznych bitów konfiguracyjnych dla INT1.
    Dobrze by było abyś przed pokazaniem kodu próbował go sam skompilować i stosując się do komunikatów kompilatora próbował sam wcześniej usunąć jak najwięcej błędów w miarę swoich możliwości.

    Pozdrawiam,
    GSM
  • Pomocny post
    Poziom 14  
    Prosze ...
    Dla kolegi gotowiec.
    Kompiluje sie pod WinAvr
    Być może jakiejś drobnej poprawki wymaga.

    Dzialanie.

    Cyfra na wyswietlaczu nastawia sie w granicy 1 - 6
    Nacisnięcia przycisów odpowiedno w góre lub w dół powoduje zwiekszenie lub zmniejszenie tej wartości.
    Przy każdorazowej modyfikacji wartości w górę uaktywniany jest jeden elektromanges na 500 ms, i odpowiednio w dół to drugi elektromanges.
  • Poziom 19  
    Postarałem się poprawić schemat. Kolega Kociejsko podesłał program za co serdecznie dziękuję! Nie zmienia to jednak faktu, że postawiłem sobie za punkt honoru napisanie go również samemu w celach edukacyjnych, ewentualnej podmiany :)

    Do schematu zakradł mi się błąd- stabilizator zostaje 7805, napięcie zasilania będzie wyższe.
  • Poziom 14  
    oki .. widze ze sie rozdzielil port displeja, ale da sie zrobic.
    takze plik konfiguracyjny zrobie dla kwarca 16MHz .. ale to juz jutro
  • Specjalista - Mikrokontrolery
    1. Przeczytaj linkowany tiu co chwial artykuł nt. kondensatorów blokujących zasilanie i zastosuj się do niego.

    2. Wyrzuć szkodliwe diody D1 i D2, przesadź diody D3 i D3 na właściwe miejsca - antyrównolegle do elektromagnesów.

    3. Podłącz zasilanie AVCC.

    4. Dodaj na wyjściach uC rezystory np. 47k ściągające bramki tranzystorów do masy.
  • Moderator Mikrokontrolery Projektowanie
    1. Nie rysuj połączeń przez elementy (GND mikrokontrolera).

    2. Masz sporo niepołączonych elementów. Przyglądnij się swojemu schematowi i zastanów się, dlaczego kondensator C2 jest podłączony do wyjścia regulatora napięcia (czyli VCC), a rezystor R2, pin AVCC i anody wyświetlacza nie. Następnie popraw wszystkie tego typu błędy.

    3. W przyszłości realizuj schematy w taki sposób: http://mikrokontrolery.blogspot.com/2011/04/jak-projektowac-czytelne-schematy.html

    4. Sprawdzałeś, czy nie przekraczasz:

    datasheet napisał:
    The sum of all IOL, for ports C0 - C5 should not exceed 100 mA.

    Ja nie sprawdzałem, ponieważ nie znalazłem datasheet tego wyświetlacza.

    5. C1 i C3 wartości ok, ale symbol -do bani :)
  • Poziom 19  
    Witam.
    Poprawiłem połączenia zgodnie z zaleceniami oraz przeniosłem układ na atmegę16 ponieważ kiedyś zapewne będzie rozbudowywany. Jak nie przezemnie to przez rówieśnika. Mam jedynie taką zagwostkę czy jak mam np wyjścia z uC do wyświetlacza to muszę stawiać kropki połączeń przy rezystorze itd? Czy kropki tylko stosować tam gdzie mam jakiś węzeł np?
  • Moderator Mikrokontrolery Projektowanie
    Najprościej zobaczyć to tak, że chwytasz dany element i przesuwasz go. Wtedy widzisz które połączenia są wykonane poprawnie (trzymają się elementu) lub nie (pozostały w miejscu choć element przesunąłeś).

    Np. GND przy kondensatorach kwarcu nie potrzebuje symbolu połączenia (kropki). usuń ją i podnieś GND - zobaczysz, że połączenie będzie się go trzymało. Podobnie z C6 i C7, rezystorami i wyświetlaczem, itp.

    Ale już np. kwarc jest prawidłowo.

    Poćwicz nieco.


    EDIT:
    Przykład:

    [ATMEGA8/16][C] - Projekt sterownika nastawnika z wyświetlaniem stanu
  • Poziom 19  
    Ok, starałem się przestrzegać zasad o których mówiliście wyżej.
    Do układu dodany został czujnik biegu. Zrealizowany na transoptorach by uzyskać separację od zakłóceń panujących w zasilaniu maszyny.
    Dodatkowo, układ zasilania został nieco zmodyfikowany by zapewnić lepszą filtrację/stabilizację przy większym poborze prądu. Zmiany wynikły z faktu, iż maszyna posiada wiele elementów mogących zakłócać pracę uC- wiele przekaźników, sieć WN etc.
    Scalak w układzie zasilacza to A8498, stworzony w sposób trywialny ale nie mogłem znaleźć w bibliotekach eagle ani w internecie.

    Urodziło się pare pytań:
    1) Czy L2 ma jakiekolwiek znaczenie czy mogę ją pominąć?
    2) Czy kondensatory C10, C11 pomogą jeżeli w programie użyję eliminacji drgań czy też zaszkodzą/ nic nie zmienią?
    3)Czy przy transoptorach powinienem również stosować kondensatory spinające piny uC do masy?
  • Poziom 25  
    lewytolewy napisał:

    Urodziło się pare pytań:
    1) Czy L2 ma jakiekolwiek znaczenie czy mogę ją pominąć?
    2) Czy kondensatory C10, C11 pomogą jeżeli w programie użyję eliminacji drgań czy też zaszkodzą/ nic nie zmienią?
    3)Czy przy transoptorach powinienem również stosować kondensatory spinające piny uC do masy?


    ad 1) Znaczenie ma - wstępnie filtruje zasilanie razem z C1, C2, ale większą indukcyjność mogłaby mieć, chociażby żeby śmieci na zewnątrz nie wychodziły.
    ad 2) C10 i C11 nie zaszkodzą, acz dobra sprzętowa eliminacja drgań styków powinna być trochę inaczej zrealizowana. http://lite.easyeda.com/iRL3XfxP7
    ad 3)
    Nie. Za to R9 i R10 powinny być podłączone do bramek MOSFET-ów bezpośrednio a nie przed R11 i R12.

    Pozdrawiam,
    GSM
  • Specjalista - Mikrokontrolery
    GSM napisał:

    ad 2) C10 i C11 nie zaszkodzą, acz dobra sprzętowa eliminacja drgań styków powinna być trochę inaczej zrealizowana. http://lite.easyeda.com/iRL3XfxP7
    ad 3)
    Nie. Za to R9 i R10 powinny być podłączone do bramek MOSFET-ów bezpośrednio a nie przed R11 i R12.


    C10 i C11 nie pomogą, więc są zbędne. Programowe ignorowanie drgań to 2 linie kodu w C.
    R9 i R10 powinny być podłączone tak, jak na schemacie (przed R11 i R12), a zdecydowanie NIE pomiędzy bramkami MOS i masą.
  • Poziom 19  
    Witajcie!
    Powstało PCB do mojego schematu. Może znajdą się jakieś trafne uwagi? Niestety na pcb niepodpisane są elementy ponieważ schemat rysowałem w wersji 6.3 lite która ma ograniczone pole płytki dlatego płytka powstała w 5.8pro.