Skocz do zawartości

Sterowanie silników przez mostek H


matrix760

Pomocna odpowiedź

Witam serdecznie:)

Mój problem jest następujący. Jak zrobić w języku C działanie silników przez np 1 sekundę.

Prosiłbym o jakiś przykładowy program.

Napisałem taki program i silniki działają cały czas.... a chce żeby tylko przez chwile działały

      x=0;

	 do

	 {

	 x=x+1;

	 PORTD &= ~(1<<PD1); 
         PORTD &= ~(1<<PD3);
         PORTD |= (1<<PD0);
         PORTD |= (1<<PD2);

        PORTC |= (1<<PC0);
        PORTC |= (1<<PC1);

	 _delay_ms(100);

                  }

Z góry dziękuję za pomoc.

Link do komentarza
Share on other sites

Najprościej to tak:

while(1){
silnikiStart();
_delay_ms(1000); // zatrzymanie programu na sekunde
silnikiStop();
_delay_ms(1000);
}

Musisz tylko napisać dwie funkcje które będą włączały i wyłączały silniki. Bez schematu/opisu połączenia nie jest możliwe aby ktoś Ci pomógł.

Link do komentarza
Share on other sites

tak sorry tam niżej jest while(x<10) . To jest układ L293d

[ Dodano: 03-12-2011, 22:47 ]

 
            PORTD &= ~(1<<PD1);
            PORTD &= ~(1<<PD3);
            PORTD |= (1<<PD0);
            PORTD |= (1<<PD2);

           PORTC |= (1<<PC0);
           PORTC |= (1<<PC1);

piny PC0 i PC1 są podłączone do pinów enable w układzie l293d, pozostałe sterują kierunkiem obrotów. Mnie chodzi tylko o to, żeby np w tej konfiguracji jak jest wyżej działały przez np 2 sekundy i pózniej chciałbym zmienić kierunek obrotów albo skręcić robotem.

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

void lewy_wlacz(void)
{
PORTD |= (1<<PD0); 
PORTD &= ~(1<<PD1); 
PORTC |= (1<<PC0);
}

void lewy_wylacz(void)
{
PORTC &= ~(1<<PC0);
}

Podobnie robisz z prawym silnikiem i tylko potem:

lewy_wlacz();
_delay_ms(1000);
lewy_wylacz();
_delay_ms(1000);

Zamiast delay możesz użyć w petli for 10x _delay_ms(100).

Link do komentarza
Share on other sites

Jeszcze lepiej byłoby zaprzęgnąć do tego jakikolwiek Timer, zrobić na nim zegar czasu rzeczywistego, i w przerwaniach zarządzać czasami pracy silników. Wtedy każdy silnik ma swoja zmienną określającą czas pracy w Sek lub ms.

Link do komentarza
Share on other sites

Widać,że kolega jest początkujący. delay spełnia tutaj swoją rolę w 100%. Więc nie rozumiem, po co namawiasz go do użycia timerów w tak prostym programie. Rozumiem, że Ty ze swoim doświadczeniem brzydzisz się delay'iami ale pozwól je również nabyć innym. Ja uważam, że delay'ie zupełnie tu wystarczą.

Link do komentarza
Share on other sites

bartek1333 napisał/a:

Zamiast delay możesz użyć w petli for 10x _delay_ms(100).

W jakim celu?

Funkcja _delay przyjmuje maksymalną wartość trochę ponad 260. Powyżej jest trochę mniej dokładna.

Dlatego zasugerowałem pętle for 10x, gdzie będzie _delay_ms(100);

Żeby nie zaczynać off topa, piszę że z użyciem pętli for będzie tylko trochę dokładniejsze odmierzanie czasu 😉

Link do komentarza
Share on other sites

Funkcja _delay przyjmuje maksymalną wartość trochę ponad 260. Powyżej jest trochę mniej dokładna.

Dla tego celu jaki ma autor to nie ma najmniejszego znaczenia 🙂

Link do komentarza
Share on other sites

Dla tego celu jaki ma autor to nie ma najmniejszego znaczenia

Dlatego też napisałem że tylko trochę 🙂 Może to być różnica kilkadziesiąt milisekund ale zawsze jakaś różnica będzie, jednak do tego zastosowania to rzeczywiście nie ma najmniejszego znaczenia 🙂

Swoją drogą kiedyś wpisałem do funkcji _delay_ms(10000) i zamiast 10s opóźnienie trwało 6s 😋

Link do komentarza
Share on other sites

Swoją drogą kiedyś wpisałem do funkcji _delay_ms(10000) i zamiast 10s opóźnienie trwało 6s 😋

Bo przekroczyłeś granicę 65535 (o ile dobrze pamiętam definicję funkcji).

[ Dodano: 04-12-2011, 22:40 ]

A konkretnie 6,5sek:

When the user request delay which exceed the maximum possible one,

_delay_ms() provides a decreased resolution functionality. In this

mode _delay_ms() will work with a resolution of 1/10 ms, providing

delays up to 6.5535 seconds (independent from CPU frequency). The

user will not be informed about decreased resolution.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.