Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek 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

lewytolewy 27 Paź 2013 14:54 2424 19
  • #1 27 Paź 2013 14:54
    lewytolewy
    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

    0 19
  • Arrow Multisolution Day
  • Arrow Multisolution Day
  • #3 27 Paź 2013 17:14
    lewytolewy
    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ę :]

    0
  • #4 27 Paź 2013 17:42
    BlueDraco
    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.

    0
  • #5 27 Paź 2013 18:00
    Sparrowhawk
    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.

    0
  • #6 27 Paź 2013 18:10
    Marek_Skalski
    Moderator Projektowanie

    Może właśnie ze względu na niekoniecznie najlepsze podejście do sprawy przeżywałeś te katusze?
    1. Skonfiguruj jeden z timerów do pracy z przepełnieniem np. co 10ms (100Hz)
    2. W przerwaniu od timera odczytaj stan PB0/PB1 i porównaj z poprzednim.
    3. Jeżeli wykryłeś zmianę któregoś z nich i jeżeli val ma wartość >1 lub <5 (chyba nie ma sensu włączać elektromagnesów, które już osiągnęły skrajne pozycje), to możesz wysterować odpowiedni elektromagnes oraz załadować czas wysterowania elektromagnesu do drugiego licznika sprzętowego (musisz go skonfigurować i włączyć), albo do licznika programowego (np. wartością 40 -> 40x10ms = 400ms), który będziesz dekrementował w tym samym przerwaniu (co 10ms), gdzie obsługujesz przyciski.
    4. Zwiększ/zmniejsz wartość val i odśwież wyświetlacz.
    5. Zastanów się nad priorytetami przycisków w sytuacji jednoczesnego naciśnięcia obu z nich. Jeżeli jeden z poziomów wysterowania jest bezpieczniejszy (może 1), to powinien być nadrzędny.
    6. Pętla główna będzie pusta, ew. usypianie procesora. Budzić go będzie przerwanie od timera.
    7. Niezależnie od tego czy korzystasz z osobnego timera sprzętowego, czy wybierzesz programowe odliczanie czasu włączenia elektromagnesu, kiedy licznik odliczy założony czas (wygeneruje przerwanie lub wyzeruje wartość), wyłączasz sygnał sterujący elektromagnesem i tyle. Zadanie wykonane.

    Mam jednak pytanie czy elektromagnesem sterujesz tylko na zasadzie podania impulsu o dość szerokim zakresie czasu trwania, czy w oparciu o wartość skuteczną prądu cewki?
    Ogólnie, cały program to jakieś 50..70 linii, ale to jest Twoje zadanie, aby go napisać.
    Co do 'delay'... Jeżeli bardzo chcesz, to możesz pisać w ten sposób programy, ale miej świadomość ograniczeń jaki to nakłada: podczas wykonywania pętli delay, procesor nie robi nic użytecznego, jeżeli nie korzystasz z przerwań, to procesor nie może reagować w tym czasie na zdarzenia zewnętrzne. Będzie to wyglądać tak, że naciśnięciu dowolnego przycisku musisz cierpliwie poczekać na zakończenie pętli i dopiero możesz zadać kolejną wartość. O ile w Twoim układzie to jeszcze można zaakceptować, chociaż nie będzie to komfortowe, to w każdym bardziej złożonym układzie/urządzeniu takie marnowanie czasu jest błędem, żeby nie powiedzieć głupotą. Wyobraź sobie telefon komórkowy, który reaguje na każdy klawisz z opóźnieniem 1s, a po naciśnięciu przestaje odtwarzać muzykę ponieważ funkcja delay zajmuje procesor. Bateria w takim układzie też długo nie pożyje.
    Za chwilę będziesz być może chciał zrobić inne urządzenie, albo usprawnić to wyżej opisane i zauważysz, że delay blokuje uC permanentnie, przez co układ jest niemal bezużyteczny.

    0
  • #7 27 Paź 2013 23:27
    lewytolewy
    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) ?

    0
  • #8 28 Paź 2013 04:28
    GSM
    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

    0
  • Pomocny post
    #9 28 Paź 2013 18:04
    Kociejsko
    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.

    0
  • #10 28 Paź 2013 22:39
    lewytolewy
    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.

    0
  • #11 28 Paź 2013 22:56
    Kociejsko
    Poziom 14  

    oki .. widze ze sie rozdzielil port displeja, ale da sie zrobic.
    takze plik konfiguracyjny zrobie dla kwarca 16MHz .. ale to juz jutro

    0
  • #12 28 Paź 2013 22:57
    BlueDraco
    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.

    0
  • #14 29 Paź 2013 00:10
    dondu
    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 :)

    0
  • #15 29 Paź 2013 01:48
    lewytolewy
    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?

    0
  • #16 29 Paź 2013 01:58
    dondu
    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

    0
  • #17 30 Paź 2013 00:39
    lewytolewy
    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?

    0
  • #18 30 Paź 2013 03:44
    GSM
    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

    0
  • #19 30 Paź 2013 08:33
    BlueDraco
    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ą.

    0
  • #20 02 Lis 2013 11:24
    lewytolewy
    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.

    0