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.

atmega8515 - program do obracania silnika krokowego

Pawel.2112 27 Sty 2008 21:12 1425 3
  • #1 27 Sty 2008 21:12
    Pawel.2112
    Poziom 9  

    Witam wszystkich ostatnio bawiłem się w sterowanie silnikiem krokowym. Do sterowania używam mikrokontrolera atmega8515 i chciałbym napisać program który po naciśnięciu przycisku nr 1 obracał by silnikiem w prawo, a po naciśnięciu przycisku nr 2 w lewo. Z silnika wyprowadzone jest 5 przewodów 1 do VCC a 4 pozostałe pod wyjścia mikrokontrolera PC0, PC1, PC2, PC3. Trochę posiedziałem przed monitorem i w C napisałem coś takiego:


    Code:
    #include <avr/io.h>
    

    int main(void)
    {

    if(warunek){
    while (1){
    PORTC=0xFE;
    PORTC=0xFD;
    PORTC=0xFB;
    PORTC=0xF7;
    PORTC=0xEF;
    }}

    if(warunek){
    while (1){
    PORTC=0xEF;
    PORTC=0xF7;
    PORTC=0xFB;
    PORTC=0xFD;
    PORTC=0xFE;
    }}

    }


    I tu nasuwa się moje pytanie, co wstawić za warunek w instrukcjach if?
    I czy taki program będzie dobry do sterowania tego typu silnikiem?

    0 3
  • #2 30 Sty 2008 18:36
    koleszka
    Poziom 24  

    Więc może tak:

    • Po spełnieniu warunku wskakujesz do pętli nieskończonej i już z niej nie wychodzisz, więc instrukcje będą się powtarzały bez końca i program się zapętli.
    • Po wystawieniu sygnału na odpowiednią nóżkę portu pasowałoby odczekać jakiś czas żeby silnik mógł zareagować, czas ten można dobrać eksperymentalnie.
    • W jaki sposób masz podłączone przyciski do μC?
    • W jaki sposób chcesz podłączyć uzwojenia silnika do μC?
    • Silnik ma się kręcić czy tylko obrócić o jakiś kąt?


    Dodano po 41 [minuty]:

    Przykładowy program mógłbym wyglądać tak:

    Code:
    #include <avr/io.h>
    
    #include <util/delay_basic.h>

    int main(void)
    {

    DDRC=0xFF;  //ustawianie portu C jako wyjście
    PORTC=0xFF; //ustawianie wartości początkowej portu C

    while (1)
    {
       if(Warunek1)
       {
       while (1)
          {
          PORTC=0xFE; _delay_loop_1(czas);
          PORTC=0xFD; _delay_loop_1(czas);
          PORTC=0xFB; _delay_loop_1(czas);
          PORTC=0xF7; _delay_loop_1(czas);
          PORTC=0xEF; _delay_loop_1(czas);
          if (warunek3) break;
          }
       }

       if(Warunek3)
       {
       while (1)
          {
          PORTC=0xEF; _delay_loop_1(czas);
          PORTC=0xF7; _delay_loop_1(czas);
          PORTC=0xFB; _delay_loop_1(czas);
          PORTC=0xFD; _delay_loop_1(czas);
          PORTC=0xFE; _delay_loop_1(czas);
          if (warunek4) break;
          }
       }
    }

    }


    Gdzie w miejsce „czas” wstawisz liczbę cykli jaka kontroler ma odczekać przed zmianą wartości wystawionej na piny portu (tu masz odpis biblioteki avr/delay.h). Natomiast to, co wstawisz w miejsce warunków będzie zależało od tego jak i gdzie masz podłączone przyciski, oraz w jaki sposób chcesz sterować silnikiem.

    0
  • #3 30 Sty 2008 20:30
    Pawel.2112
    Poziom 9  

    A więc tak przycisk nr.1 mam podlączony do pinu 38/PA1 a przycisk nr.2 do 34/PA5. Silnik ma za zadanie obracać anteną czyli gdy nacisne przycisk antena ma się powoli obracać. A silnik jest podpiety pod wyjścia mikrokontrolera 21/PC0, 22/PC1, 23/PC2, 24/PC3 i jeden kabelek pod VCC.
    Z góry dziękuje za pomoc.

    0
  • #4 30 Sty 2008 20:44
    koleszka
    Poziom 24  

    Oki rozumie, tylko brakuje mi jeszcze trochę informacji żeby ostatecznie Ci pomóc. Mianowicie, jakich sygnałów potrzebuje ten silnik do obracania się e którąś ze stron? I czy to ma się obracać przez cały czas jak będziesz trzymał przycisk, czy po wciśnięciu ma się obrócić w którąś położenie? Mam nadzieje, że pamiętasz o tym, że wydajność jednej końcówki portu to tylko 20mA i pewnie będziesz musiał zastosować jakiś tranzystor żeby podłączyć uzwojenie? Jeśli już trochę Ci się rozjaśniło i znacz C/C++ to zerknij tutaj. Może to ci w czymś pomoże.

    0