Skocz do zawartości

[C] Sterowanie silnikiem krokowym bipolarnym przez AVR


caporeira

Pomocna odpowiedź

Witam , jestem początkującym elektronikiem jak i programistą dlatego proszę o wyrozumiałość.

Schemat elektroniczny już mi ktoś sprawdził i powinien być dobrze ale w skrócie to chcę sterować za pomocą Atmegi8 poprzez układ L293 silnikiem krokowym dwufazowym bipolarnym.

Tyle udało mi się napisać i nie wiem co zrobić dalej (proszę o rady,wskazanie błędów), co teraz zrobić aby to zadziałało i proszę o wyrozumiałość (pisząc program wzorowałem się na jednym z kursów ale nie wszystko tam było)

Pisane w języku C

/* sterowanie silnikiem bipolarnym "krokowy.c" */
/* 2 przyciski przyłączone do portu D(PD0,PD1); 4 zaciski silnika do portu C(PC5,PC4,PC3,PC2); 4 diody led do portu B (PB0,PB1,PB2,PB3) */
/* ATmega 1MHz */

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{   
  /* 4 linie portu C będą wyjściami na L293NE (PC2,PC3,PC4,PC5) */
  DDRC = 0x3C;  /* 0x3C binarnie 000111100 */

   /* 2 linie portu D będą wejściami z podciągnięciem do VCC (PD0,PD1) */
   DDRD  = 0xFC;   /*11111100*/
PORTD = 0x03;  /*00000011*/
/* 4 linie portu B będą wyjściami na diody led (PB0,PB1,PB2,PB3)*/
DDRB = 0x0F;  /*00001111*/
PORTB = 0x0F; /*00001111*/

   /* Początek nieskończonej pętli */
   for(;;)
   {
       /* Przepisanie zawartości PIND do PORTC */
       PORTC = PIND;
	/* Przepisanie zawartości PIND do PORTB */
	PORTB = PIND;

/* Początek nieskończonej pętli */
 while(1)
 {
   /* Jeśli pierwszy przycisk wciśnięty */
   if(!(PIND & 0x01)) PORTC = 0x14; /*00010100;(PC4,PC2);  I krok*/ 
if(!(PIND & 0x01)) PORTB = 0x01; /*00000001;(PB0) pierwsza dioda led świeci*/
_delay_ms(200);
if(!(PIND & 0x01)) PORTC = 0x18; /*00011000;(PC4,PC3); II krok*/
if(!(PIND & 0x01)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/
_delay_ms(200);
if(!(PIND & 0x01)) PORTC = 0x28; /*00101000;(PC5,PC3);III krok*/
if(!(PIND & 0x01)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/
_delay_ms(200);
if(!(PIND & 0x01)) PORTC = 0x24; /*00100100;(PC5,PC2); IV krok*/
if(!(PIND & 0x01)) PORTB = 0x08; /*00001000;(PB3) czwarta dioda led świeci*/
_delay_ms(200);

   /* Jeśli drugi przycisk wciśnięty */ 
   if(!(PIND & 0x02)) PORTC = 0x24; /*IV krok*/
if(!(PIND & 0x02)) PORTB = 0x08; /*00001000;(PB3) czwarta dioda led świeci*/
_delay_ms(200);
if(!(PIND & 0x02)) PORTC = 0x28; /*III krok*/
if(!(PIND & 0x02)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/
_delay_ms(200);
if(!(PIND & 0x02)) PORTC = 0x18; /*II krok*/
if(!(PIND & 0x02)) PORTB = 0x04; /*00000100;(PB2) trzecia dioda led świeci*/
_delay_ms(200);
if(!(PIND & 0x02)) PORTC = 0x14; /*I krok*/
if(!(PIND & 0x02)) PORTB = 0x01; /*00000001;(PB0) pierwsza dioda led świeci*/
_delay_ms(200);

 }
}
}

Program się kompiluje ale czy ma prawo działać ? Nie jestem pewny czy dobrze zrobiłem te pentle ?

Wyskakiwało mi ostrzeżenie : warning: "F_CPU" redefined

Link do komentarza
Share on other sites

Zastanawiają mnie dwie rzeczy... Mianowicie po pierwsze stylistyka twojego kodu trochę boli i przy większych programach sam się zgubisz i myślał będziesz co się gdzie zaczyna, a co gdzie kończy...

Po drugie po co w pętli nieskończonej robisz kolejną pętlę nieskończoną? (mam na myśli for(;😉 a potem while(1)). Co do pętli nieskończonych to staraj się ich unikać. daj sobie zmienną np. Włączony albo coś takiego, i jak ona się zmieni to żeby program się wyłączył a, nie brutalnie odcinać mu zasilanie jak to się zazwyczaj stosuje 😉

Co do ostrzeżenia to kompilator mówi ci, że masz już wcześniej zdefiniowaną zmienną "F_CPU", a definiujesz ją ponownie. O ile się nie mylę nic się nie powinno dziać, ale pewnie jest jakiś "ładniejszy" sposób na zrobienie tego.

Link do komentarza
Share on other sites

Dziękuje za uwagi.

W związku z tym dodałem dwie linijki kodu po IV krokach:

if(!(PIND & 0x00)) PORTC = 0x00 /*Po zwolnieniu przyciku silnik się zatrzymuje*/

Skasowałem wpis :

 /* Początek nieskończonej pętli */ 
   for(;;)
/* Przepisanie zawartości PIND do PORTC */
       PORTC = PIND;
	/* Przepisanie zawartości PIND do PORTB */
	PORTB = PIND;

Co do przypisania zmiennej to chodzi o to i czy to poprawne ? :

przycisk1 =(!(PIND & 0x01)) PORTC
dioda11 = (!(PIND & 0x01)) PORTB
przycisk2 = (!(PIND & 0x02)) PORTC
dioda21 = (!(PIND & 0x02)) PORTB

Nie mam w tej chwili możliwości zaprogramować uC (kłopoty z programatorem) tym samym sprawdzenia działania programu - chciałem zapytać czy dobrze po przypisywałem porty wejścia,wejścia z przyłączeniem do Vcc, wyjścia i czy silnik ma prawo się kręcić ?

Czy te "if" dobrze napisałem i faktycznie będą wykonywane kroki silnika w odstępach czasu 200 ms ?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.