Skocz do zawartości

Sterowanie silników przez mostek H


Pomocna odpowiedź

Napisano

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.

W C nie ma pętli: do, jest pętla: do while

Napisz które piny odpowiadają za działanie silnika i kiedy silnik działa: jak są w stanie niskim czy wysokim.

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ł.

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.

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).

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.

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ą.

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 😉

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 🙂

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 😋

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.

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...