logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega32, Programowanie C - ATmega32, RTC, pcf8563, solar track,

krystian_m 21 Sty 2014 19:44 1752 0
  • #1 13207304
    krystian_m
    Poziom 1  
    Witam,

    Jestem na etapie tworzenia kodu programu sterującego układem nadążnym typu solar track. Wykonałem już całą mechanikę systemu oraz fizyczną warstwę układu sterującego (obwód drukowany z wszystkimi elementami). Układ sterować ma mostkiem H (silnik DC) oraz podawać trzy sygnały sterujące do zewnętrznego sterownika silnika skokowego (CLK, DIR, EN). Układ oparty jest o mikrokontroler ATmega32, który współpracować ma z zewnętrznym układem czasowym pcf8563 po magistrali I2C (sprzętowo - wejścia SCL i SDA w ATmedze 32 podpięte są pod wyprowadzenia RTC). Wejściami są wejście impulsatora siłownika oraz czujnika indukcyjnego, wejście INT1. Wyjściami dwa wyjścia sterujące mostkiem H, 3 wyjścia sterujące sterownikiem silnika skokowego i we/wy I2C (SDA, SCL). System ma wykonywać ruchy nadążne co godzinę (tryb start-stopowy)


    Jako, że kod programu jest dość długi wyjaśnię w punktach ideę jego działania:
    1. Inicjalizacja programu (układ w pozycji bazowej)
    2. Zliczanie przerwań zewnętrznych (sprzętowe INT1 od RTC) do 3600 (jedna godzina).
    3. Po zliczeniu następuje odczyt aktualnej godziny i daty z RTC.
    4. Po odczytaniu danych (ustawienie case 2) algorytm ma przejść do funkcji "almanac", która wylicza aktualny azymut oraz elewację Słońca. (funkcja działa poprawnie)
    5. Po wyliczeniu położenia Słońca układ ma przejść do wykonania ruchu siłownikiem (case 3). Warunkiem ruchu jest wartość elewacji większej od 0 (praca od wschodu do zachodu Słońca). Procedura ruchu siłownikiem obsługiwana jest w przerwaniu Timer0. Na siłownik (z mostka H) podawane jest napięcie o konkretnej polaryzacji - podczas tego stanu zliczane są impulsy z wbudowanego w siłowniku impulsatora (procedura impulsator).
    6. Po zliczeniu odpowiedniej wyliczonej ilości impulsów program kończy pracę siłownika i obsłużyć ma ruch silnikiem skokowym.
    7. Obsługa ruchu jest realizowana w przerwaniu Timer0 w procedurze "skokowy" - generowanie CLK i zliczanie impulsów.
    8. Kiedy zliczone zostaną wyliczone impulsy program wraca do main. Program czeka kolejną godzinę.
    9. Procedura bazowania załącza się po zachodzie (kiedy elewacja jest mniejsza od 0). Bazowanie polega na czasowym ruchu siłownika w określoną stronę oraz ruchu silnikiem aż do napotkania czujnika indukcyjnego.

    Mam duży problem z kwestią połączenia się z RTC - nie wiem czy robię to właściwie. Nie wiem także, czy mikrokontroler podźwignie taką formę obsługi przerwań oraz czy gdzieś się nie zapętli. Proszę o pomoc - rozpatrując konkretne funkcje i procedury - czy są właściwie realizowane i czy nie ma w nich błędu. W szczególności procedury obsługi przerwań - wykonywania ruchów. Będę wdzięczny za wszelką pomoc i chętnie wyjaśnię jakiekolwiek niejasności w
    programie.

    Proszę wybaczyć możliwy "chaos" początkującego. Starałem się opisać wszystko w komentarzach.

    Kod programu w C:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA