Skocz do zawartości

Kurs Arduino - #8 - Sterowanie silnikami DC, pętla for


Komentator

Pomocna odpowiedź

Mam takie pytanko jako początkujący w tej dziedzinie:

Posiadam zasilacz podłączany do arduino 12V 1A i teraz czy mógłbym do opisanego w kursie mostku podłączyć np. silniczek posiadający parametry 6V 350mA? czy muszę koniecznie szukać jakiegoś na 12V?

Link do komentarza
Share on other sites

woodoopl, jeśli nie zależy Ci na tym silniku i chcesz go podłączyć tylko dla testu to możesz go podłączyć. Nie jest to zbyt poprawne, ale jest spora szansa, że nic się nie stanie. Na tym mostku jest dość duży spadek napięcia, więc silnik dostanie pewnie mniej niż 10V. Dodatkowo możesz ustawić niskie wypełnienie sygnału PWM, aby nie przekraczać 6V. Ogólnie zachęcam do eksperymentów - weź tylko pod uwagę, że istnieje szansa na uszkodzenie tego silnika 😉

Link do komentarza
Share on other sites

Treker, Dziękuję bardzo za informacje.

Tak przy okazji dodam że jest to niesamowity kurs i już wciągam w niego kolegów 🙂 Bardzo fajnie że są gotowe zestawy przygotowane od razu pod niego.

Pozdrawiam i zachęcam do zabrania się za III część bo naprawdę poznawanie Arduino z tym kursem to czysta przyjemność.

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

zadanie 8.1

void setup() {
 pinMode(6, OUTPUT);
 digitalWrite(6, HIGH); // Prędkość silnika 1

 pinMode(7, OUTPUT); // Lewo
 pinMode(8,OUTPUT);  // Prawo

 pinMode(10 ,OUTPUT);
 digitalWrite(10, HIGH); // Prędkość silnika 2

 pinMode(11, OUTPUT); // Lewo
 pinMode(12, OUTPUT); // Prawo 


}

void loop() {
 digitalWrite(7, LOW); // oba silniki do przodu
 digitalWrite(8, HIGH);
 digitalWrite(11, LOW);
 digitalWrite(12, HIGH);
 delay(3000);
 digitalWrite(11,HIGH);// skręcenie silnika w prawo
 digitalWrite(12, LOW);
 delay(3000);
 digitalWrite(7, HIGH);// oba silniki wstecz
 digitalWrite(8, LOW);
 digitalWrite(11, HIGH);
 digitalWrite(12, LOW);
 delay(3000);
 digitalWrite(7, LOW); //oba silniki do przodu
 digitalWrite(8, HIGH);
 digitalWrite(11, LOW);
 digitalWrite(12, HIGH);
 delay(3000);
 digitalWrite(7, HIGH);// skrecenie silnika w lewo
 digitalWrite(8, LOW);
 delay(3000);
 digitalWrite(11, HIGH);// oba siliki wstecz
 digitalWrite(12, LOW);
 delay(3000);
}

zadanie 8.2.1

void setup() {
 pinMode(6, OUTPUT);// prędkość silnika
 digitalWrite(6, HIGH);

 pinMode(7, OUTPUT); 
 pinMode(8,OUTPUT);  
 for (int zliczanie = 0; zliczanie < 5; zliczanie ++){// zlicza i sprawdza czy nie jest większe od 5
 digitalWrite(7, LOW);// świecenie na zmianę
 digitalWrite(8, HIGH);
 delay(1000);
 digitalWrite(7, HIGH);
 digitalWrite(8, LOW);
 delay(1000);
 }
}
void loop() {


}

8.2.2

void setup() {
 int zmiana = 0;
 pinMode(6, OUTPUT);// prędkość silnika
 digitalWrite(6, HIGH);

 pinMode(7, OUTPUT); // dioda 1
 pinMode(8,OUTPUT);// dioda 2  
 while (zmiana < 5){// sprawdź czy zmienna nie jest większa od 5
   zmiana = zmiana + 1;//jeśli nie dodaj 1 do zmiennej  
   digitalWrite(7, LOW);// świecenie na zmianę diod
   digitalWrite(8, HIGH);
   delay(1000);
   digitalWrite(7, HIGH);
   digitalWrite(8, LOW);
   delay(1000);
 }
}
void loop() {


}

zadanie 8.3

void setup() {
 Serial.begin(9600);// połączenie z komputerem
 for(int a = 0; a <= 9; a++){// zliczanie a do 9
   Serial.print(a);// wypisanie a
   Serial.println("*");// wyswietlenie gwiazdki
 }

}

void loop() {


}

zadanie 8.4

void setup() {
pinMode(6, OUTPUT);// predkosc silika
pinMode(7, OUTPUT);// krecenie w lewo (hamowanie)
pinMode(8, OUTPUT);// krecenie w prawo przyspieszanie 

}

void loop() {
 for(int a = 0; a <= 255; a++){// przyspieszamy silnik
   analogWrite(6, a);
   digitalWrite(7, LOW);
   digitalWrite(8, HIGH);
   delay(25);
 }
 for(int a = 255; a >= 0; a--){// hamujemy silnik
   analogWrite(6, a);
   digitalWrite(7, HIGH);
   digitalWrite(8, LOW);
   delay(25);
 }
}
Link do komentarza
Share on other sites

Hej, czy ktoś jest mi w stanie powiedzieć dlaczego zasilanie logiki pobiera prąd aż 40mA? Natomiast same diody ~9mA?

Poza tym, dlaczego po odłączeniu zasilnia od logiki...układ dalej działa?

Dzięki wielkie z góry

Link do komentarza
Share on other sites

Cześć!

Chciałbym zapytać o kwestię hamowania silnika przy użyciu mostka L293D. Otóż z opisu wynika, że podanie dwóch stanów wysokich na wejścia ustawiające kierunek, powinno doprowadzić do zahamowania silnika. No i faktycznie, silnik się zatrzymuje, ale płynnie wytracając swoją bezwładność. Rozumiem, że z tego wynika, że mostek ten nie pozwala na pracę silnika "na zwarciu"?

Niestety, ja potrzebuję nagłego zatrzymywania silnika, w związku z czym na razie radzę sobie poprzez uruchamianie na ułamek sekundy przeciwnych obrotów, niemniej przypuszczam że ta metoda doprowadzi do szybkiego spalenia mostka.

Link do komentarza
Share on other sites

Wszystko zależy od tego jak podłączyłeś mostek do procesora tzn. które wejścia mostka używasz. Jeżeli EN jest zawsze włączone (stan L) a PWM podajesz raz na jeden a raz na drugi driver w zależności od kierunku obrotów, to silnik z definicji hamuje gdy oba PWM są ustawione na 0%.

Natomiast jeśli pojedynczy PWM podłączyłeś do EN a dwa pozostałe wejścia służą tylko do ustawiania kierunku, to hamowanie uzyskasz przy obu wejściach w tym samym stanie tj. oba na H lub - lepiej - oba na L, ale przy niezerowym PWM. W tym stanie wypełnienie PWM jakie ustawisz na EN będzie określało "siłę" hamowania i 100% da czyste zwarcie a 0% swobodny dobieg.

Link do komentarza
Share on other sites

Ja podałem sygnał PWM na EN, a inputami steruję kierunkiem. Próbowałem różnych konfiguracji z tym samym stanem na inputach i różnym wypełnieniem EN, natomiast za każdym razem nie dało to efektu nagłego zatrzymania. Może powinienem jakoś rozładować energię, którą silnik oddaje przy wyhamowywaniu?

Link do komentarza
Share on other sites

Zobacz, jeżeli dałeś PWM na EN a kierunek ustawiasz wejściami powiedzmy A i B to masz dwa stany mostka:

• EN=0 w którym obydwa drivery A i B obu końców silnika są zupełnie wyłączone - nic nie możesz zrobić, silnik biegnie luzem cokolwiek podasz na wejścia,
• EN=1 gdy każdy driver ciągnie "swój" koniec silnika w swoją stronę.

W tej drugiej sytuacji, zapodanie stanów przeciwnych na A i B powoduje podanie napięcia do silnika i jego pracę. Podanie stanów takich samych - nieważne czy 0 czy 1 powoduje zwarcie silnika, bo oba jego końce są wtedy podłączane jednocześnie odpowiednio - do masy lub do plusa zasilania. Ponieważ drivery są mocniejsze w stanie niskim, dla lepszego hamowania powinieneś zapodać stany 00.

No i teraz, gdy jedziesz w którąś stronę masz jakiś PWM na EN i jakieś przeciwne stany na A i B. Żeby natychmiast zahamować, musisz podać A=0 i B=0 oraz EN=1. To ostatnie sprowadza się do ustawienia PWM na maxa. Zwarcie silnika jest właśnie wytracaniem mechanicznej energii kinetycznej w ciepło. Silnik pracuje jako prądnica, w jego uzwojeniach płynie prąd który produkuje ciepło we wszystkim przez co przepływa proporcjonalnie do rezystancji danego elementu. W obwodzie hamowania masz uzwojenie silnika, dwa tranzystory dwóch driverów i jakieś kable ew. złącza. Największym "hamulcowym" jest w tym układzie sam silnik, bo rezystancja jego uzwojeń to kilka-kilkanaście omów więc to w nim wydzieli się najwięcej ciepła. Na szczęście nie jest tego dużo - dokładnie tyle poczujesz gdybyś po odłączeniu prądu próbował zatrzymać wał palcami. Możesz się sparzyć, ale tutaj ciepło jest wytwarzane punktowo w miejscu styku skóry z osią więc temperatura w tym obszarze rośnie szybko. Wirnik i uzwojenia są duże i masywne, ta sama energia tam wydzielona spowoduje wzrost temperatury może o 2 stopnie. Trochę energii wydziela się też w tranzystorach mostka a ponieważ są one o wiele mniejsze niż silnik tam temperatura może rosnąć szybciej. Ważne jest też co masz na wirniku. Jeżeli kręcisz samym silnikiem albo jakimś kółkiem z małą oponką, zgromadzona energia mechaniczna jest nikła, ale gdybyś założył duże koło zamachowe albo tym silnikiem rozpędził ciężki pojazd, to wtedy wytracenie tej długo zbieranej energii dynamicznym hamowaniem silnikiem/mostkiem mogłoby się skończyć tragicznie. W poważniejszych konstrukcjach mostki są tak projektowane, by podczas hamowania odzyskiwana energia kinetyczna pojazdu była kierowana z powrotem do akumulatorów.

Daj znać co wyszło z tych prób hamowania. Powinna być bardzo wyraźna różnica między dobieganiem luzem z wysokich obrotów (>2s) a hamowaniem zwarciowym (<0.5s). Wydaje się proste, więc musisz coś źle sterować mostkiem, skoro to nie działa. Albo opory ruchu są tak duże (jakaś przekładnia itp?), że silnik i tak jest mocno hamowany samą mechaniką.

  • Lubię! 1
Link do komentarza
Share on other sites

Fakt, na silniku mam założoną przekładnię redukcyjną. Spróbowałem różnych konfiguracji, faktycznie "na zwarciu" wał wyhamowuje szybciej, ale jego bezwładność wciąż jest dla mnie zbyt duża. Rozumiem, że - w związku z poprzednią odpowiedzą - od hamowania metodą uruchomienia przeciwnego kierunku obrotów nie powinienem zrobić krzywdy układowi? Będzie to trochę trudniejsze do dostrojenia, ale powinno ostatecznie dać zamierzony efekt: docelowo na wale ma być założona rolka, która będzie odwijać przewód na określoną długość. Stąd, po zliczeniu odpowiedniej liczby impulsów z enkodera, potrzebuję nagłego zatrzymania wału.

Link do komentarza
Share on other sites

Nie potrzebujesz. Odwracanie kierunku to jeszcze większy stres dla mostka i silnika. Ja bym w to nie wchodził. Takie rzeczy robisz raczej w sytuacjach awaryjnych, gdy już naprawdę nic innego nie uratuje mechaniki. Hamowanie zwarciem startuje od jakiegoś prądu, ale maleje on bardzo szybko. Tutaj prąd szczytowy może być dwukrotnie większy bo na tę samą rezystancję uzwojeń/obwodu pracują dwa źródła połączone szeregowo: zasilanie + backEMF silnika. Jak na pewno pamiętasz ciepło powstaje z mocy I²R, więc o ile mostek przeżywał moc P przy zwarciu to wcale nie jest powiedziane, że przeżyje 4P przy przeciwnapięciu.

To nie jest przypadek stania pod ścianą i ratowania układu tylko - nie obraź się - roboty po najmniejszej linii oporu. Przecież w odczytach enkodera nie ma nic zaskakującego. A skoro masz tutaj zupełnie przewidywalne zdarzenie - przecież wskazania enkodera/licznika rosną monotonicznie - zrób to z głową a nie na siłę. Możesz np. liczyć różnicę wskazań między wartością aktualną a zadaną i wtedy:

a. traktować to jak wielkość błędu doprowadzoną do regulatora PD,
b. zwyczajnie przewidywać programowo kiedy należy zmniejszyć obroty by zatrzymać się w punkcie wyłącznie dzięki hamowaniu zwarciem a może nawet i bez tego.

Obie metody korzystają z inteligencji procesora i pośrednio Twojej. Nie robisz tego na bramkach i cyfrowych licznikach TTL gdzie każda kolejna funkcjonalność kosztuje nowe kostki, druty i płytkę, tylko na układzie który może odwalić naprawdę kawał roboty analitycznej i wciąż jest sprzętowo taki sam. Jako driver silnika nie masz głupiego przekaźnika, tylko mostek sterowany w zasadzie "analogowo". Zapłaciłeś za to wszystko więc korzystaj.

Zacznij od wykonania kilku eksperymentów i dobrania momentu w którym będziesz prewencyjnie zmniejszał PWM np. skokowo ze 100% do jakiegoś przyjętego poziomu (znajdź go doświadczalnie) albo wręcz po jakiejś łagodnej rampie tak by stanąć w celu. Zaimplementuj to i sprawdź jak dobrze trafiasz. Być może za chwilę z nudów napiszesz kod, który po kilku próbach sam dobierze optymalne wyprzedzenie czasowe i/lub poziom PWM do poprawnego zatrzymania i zapamięta to sobie (np. w EEPROMie) dla danej rolki, przekładni itp.

Gdyby wszyscy szli na taką łatwiznę, to winda przy starcie z parteru zgniatałaby ludziom jajka (w siatach z zakupami oczywiście) a po dojechaniu na 10 piętro miałbyś chwilową nieważkość lub guza na głowie.

Napisz co postanowiłeś zrobić i dlaczego nie jest to hamowanie przeciwnapięciem 🙂

Link do komentarza
Share on other sites

Serdeczne dzięki za odpowiedź 🙂

W takim razie - póki co zawieszam strojenie układu do momentu, kiedy całą część mechaniczną będę miał już poskładaną. Tak naprawdę dopiero wtedy będę mógł zbadać inercję całego układu i dobrać odpowiednie parametry. Zapewne będzie tak jak mówisz, czyli stanie na zrobieniu regulatora, który wraz ze spadkiem różnicy między wartością zadaną, a aktualną, będzie stopniowo zmniejszał prędkość obrotową. Niemniej przypuszczam, że jeszcze wiele niespodzianek mnie czeka 🙂 Podjąłem się dość rozległego projektu, a ponieważ w programowaniu tak naprawdę dopiero raczkuję, chwila minie zanim dam znać, jak rozwiązałem problem 🙂

Link do komentarza
Share on other sites

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.