Skocz do zawartości
bluzman

L293D sterowanie kierunku i szybkości obrotów

Pomocna odpowiedź

Witam wszystkich. Poznaję dopiero programowanie AVR w C. Tematy o sterowaniu silnikami przez mostek H były już na forum ale nie znalazłem konkretnej odpowiedzi na pytania. Używam uC Atmega8 i mostka L293D. Chciałbym zaprogramować uC tak żeby można było sterować kierunkiem obrotów silnika i jednocześnie prędkością obrotów. Moje pytania:

  • Czy jest to możliwe przy użyciu tego mostka?
  • W dokumentacji L293D jest napisane w tabeli na stronie 3: "Driver inputs, noninverting". Czy to oznacza, że nie ma w ogóle możliwości odwrócenia kierunku obrotów podpinając do nóżek 2, 7, 10, 15?  

l293d_tabela.thumb.png.deec67456eb59f553db1c9f1f34cf3db.png
 

Napisałem już post w tym temacie tylko z innym pytaniem ale chodzi mi dokładnie o podłączenie wszystkiego tak jak na schemacie w temacie poniżej. Może to mój kod jest źle napisany, więc prosiłbym o korektę czy inny schemat? Dziękuję z góry za pomoc.

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Da się tym sterować silnikiem w obie strony łącznie z prędkością obrotów (mocą podawaną na silnik) za pomocą pwm. Wygląda mi na to, że Twoim problemem nie jest sprzęt tylko program.

Driver inputs, noninverting w dosłownym tłumaczeniu oznacza że "wejścia nie są negowane" czyli jak H to na wyjściu H jak L to L.

W programie masz takie babole:

#define 	W1		(1<<PD5)
#define 	W2		(0<<PD6)

  .
  .
  .
  
DDRD |= (W1|W2);
  .
  .
  .
PORTD |= (W2);

Zerowanie bitów powinno wyglądać inaczej. Sugeruję na przyszłość stosować zapis

PORTD &= ~(1<<PD6);

Lub napisać sobie wygodne makra:

#define BV(bit) (1<<(bit))

 

#define NBV(bit) ~BV(bit)

i stosować je w zależności od tego czy chce się bit zerować czy ustawiać:

PORTD &= NBV(PD6);

PORTD |= BV(PD5);

i nie mieszać w jednym przypisaniu ustawiania i zerowania. Można natomiast ustawić lub wyzerować kilka bitów na raz:

PORTD |= BV(PD1)|BV(PD2)|BV(PD3);

PORTD &= NBV(PD1)&NBV(PD2)&NBV(PD3);

Edytowano przez atMegaTona

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

"Driver inputs, noninverting" oznacza dokładnie to co napisane: że wejścia nie odwracają fazy sygnału względem wyjść. To znaczy, że jeśli na wejście nA podasz stan niski, to ok. 0V dostaniesz na odpowiadającym mu wyjściu nY i odwrotnie: stan wysoki na wejściu przejdzie jako wysokie napięcie na wyjście. A to jak podłączysz silnik i co te napięcia będą dla niego oznaczały to piszącego te słowa w ogóle nie obchodziło. To opis działania scalaka. W Twoim przypadku silnik będzie stał gdy na obu jego liniach (np. 1Y i 2Y w przypadku SILNIK1) będzie to samo, nie ważne czy dużo czy mało. A jeśli jedno wejście zapodasz stan wysoki a na drugie niski to silnik zacznie się kręcić w stronę zależną od tego na którą stronę  podasz stan wysoki. Oczywiście to wszystko "modulo" stan sygnału PWM podawanego na osobne wejście drivera. Stan niski na tym pinie wyłącza drivery danej pary niezależnie co wysyłasz do ich wejść. Zwyczajnie zmierz woltomierzem co z procesora wysyłasz do mostka i zaraz się okaże.

1 godzinę temu, bluzman napisał:

ale nie znalazłem konkretnej odpowiedzi na pytania

Szkoda. Tematów o mostkach (i tym konkretnie) jest tu chyba więcej niż zarejestrowanych użytkowników..

Edytowano przez marek1707
Pisaliśmy razem :)

Udostępnij ten post


Link to post
Share on other sites

i jeszcze jedno, oba piny do sterowania kierunkiem powinny być ustawione jako wyjście czyli

DDRD |= BV(PD5)|BV(PD6);

Udostępnij ten post


Link to post
Share on other sites

Makro "Bit Value" ma podkreślenie w nazwie: _BV()

Udostępnij ten post


Link to post
Share on other sites

Oj ta, oj tam, czepiasz się ;) co za różnica jak kto sobie makro zdefiniuje, ważne, że działa jak powinno.

Udostępnij ten post


Link to post
Share on other sites

Nie piszesz tego dla mnie (i mam nadzieję, że także nie dla siebie) tylko dla Kolegi, który ma problem z wysterowaniem dwóch wyjść. Jeżeli robisz to niechlujnie to lepiej na chwilę odpuść - nie musisz być obecny w każdym wątku i świat się od tego nie zawali. Odpowiedzi na Forum to jak komentarze w programie: złe są gorsze od ich braku a ilość nie przechodzi automatycznie w jakość. Już Ci zwracano na to uwagę więc pilnuj się, bo na reputację pracuje się ciężko a stracić ją łatwo. To nie wyścig, zanim wyślesz czytaj swoje posty dwa razy, koniecznie z punktu widzenia osoby czekającej na pomoc.

  • Lubię! 1
  • Nie zgadzam się! 1

Udostępnij ten post


Link to post
Share on other sites
7 minut temu, marek1707 napisał:

Nie piszesz tego dla mnie (i mam nadzieję, że także nie dla siebie) tylko dla Kolegi, który ma problem z wysterowaniem dwóch wyjść. Jeżeli robisz to niechlujnie to lepiej na chwilę odpuść - nie musisz być obecny w każdym wątku i świat się od tego nie zawali. Odpowiedzi na Forum to jak komentarze w programie: złe są gorsze od ich braku a ilość nie przechodzi automatycznie w jakość. Już Ci zwracano na to uwagę więc pilnuj się, bo na reputację pracuje się ciężko a stracić ją łatwo. To nie wyścig, zanim wyślesz czytaj swoje posty dwa razy, koniecznie z punktu widzenia osoby czekającej na pomoc.

Ale czy ta kreska to jakaś niekwestionowana reguła? w avr libc zdaje się nie ma nawet makra _NBV() które jest jednak wygodniejsze od ~_BV() więc równie dobrze jeśli będzie to BV() i NBV() (czyt. negative bit value) niż na sztywno W1 i W2. Nie mam pojęcia po co ten komentarz, tym bardziej, że próba ponownego zdefiniowania makra _BV() skończyła by się co najmniej warnem i kolega @bluzman musiałby się nad nim niepotrzebnie zastanawiać. Nie twierdzę też oczywiście, że to podkreślenie nie ma sensu bo jak najbardziej ma, program dzięki niemu jest bardziej czytelny, ale dla kolegi ważniejsza jest chyba kwestia poprawnego działania niż niuanse sementyczne i zgodność z konwencją przyjętą w pliku takim a takim o której kolega @bluzman nie ma zapewne bladego pojęcia i która zapewne mało go interesuje.  🙂

Udostępnij ten post


Link to post
Share on other sites
17 godzin temu, atMegaTona napisał:

Da się tym sterować silnikiem w obie strony łącznie z prędkością obrotów (mocą podawaną na silnik) za pomocą pwm. Wygląda mi na to, że Twoim problemem nie jest sprzęt tylko program.

Driver inputs, noninverting w dosłownym tłumaczeniu oznacza że "wejścia nie są negowane" czyli jak H to na wyjściu H jak L to L.

W programie masz takie babole:


#define 	W1		(1<<PD5)
#define 	W2		(0<<PD6)

  .
  .
  .
  
DDRD |= (W1|W2);
  .
  .
  .
PORTD |= (W2);

Zerowanie bitów powinno wyglądać inaczej. Sugeruję na przyszłość stosować zapis

PORTD &= ~(1<<PD6);

Dziękuję wszystkim za szybką odpowiedź. Tutaj trochę ja namieszałem bo wkleiłem kod w wersji "testowej" nie zmieniając 0 na 1. Normalnie mam ustawione W1 i W2 na (1<<PD5) i (1<<PD6). Już przetestowałem wcześniej to jak opisałeś - PORTD &= ~(1<<PD6); oraz jak poradził @marek1707 sprawdziłem napięcie na nóżkach PD5 i PD6 qC. Wszystko jest zasilane napięciem 5V. Wygląda to tak:

PORTD &= ~(1<<PD5);  // 0,6V
PORTD |= (1<<PD6);     // 5V
Silnik obraca się przyjmijmy że w lewo

PORTD |= (1<<PD5);  // 0,6V
PORTD &= ~ (1<<PD6);  // 0V
Silnik stoi

PORTD |= (1<<PD5);  // 0,5V
PORTD |=  (1<<PD6);  // 5V
Silnik obraca się w lewo

PORTD &= ~(1<<PD5);  // 0,7V
PORTD &= ~ (1<<PD6);  // 0V
Silnik stoi

Jak na schemacie, przypominam jeszcze raz
PD5 idzie do 4A
PD6 idzie do 3A

Bity W1 i W2 zostały oczywiście zmienione jak wyżej napisałem
#define     W1        (1<<PD5)
#define     W2        (1<<PD6)

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Jeśli Twój silnik nie zmienia obrotów po zamianie biegunowości, to nic nie poradzimy 😐 Żaden mostek tu nie pomoże. Sprawdź może w ostateczności jego pracę bezpośrednio z baterią.

Moim zdaniem:

  • Silnik masz podłączony inaczej niz sobie to wyobrażasz, np. jednym końcem do masy lub do plusa a nie każdy drut do osobnego wyjścia mostka.
  • W trzeciej sekwencji masz ustawianie obu linii w stan 1, silnik się kręci a pomiary wskazują co innego. Coś tu pokręciłeś.
  • Wyjście sterowane przez PD5 nie działa - tam zawsze jest <1V co wskazuje na uszkodzony postek albo połączenia inne niż chciałeś. 

A co Ty o tym sądzisz? Napięcia mierzysz na pinach mostka czy na silniku? Sprawdź wszystkie połączenia i/lub przejdź na drugą stronę scalaka.

Edytowano przez marek1707

Udostępnij ten post


Link to post
Share on other sites

Po zamianie PD5 na PB7 wszystko jest OK, kręci się w lewo i w prawo 🙂 Czyli złym wyborem był wybór pinu. Dzięki bardzo za pomoc.

Udostępnij ten post


Link to post
Share on other sites

Ale to nie jest odpowiedź na pytanie "Dlaczego to nie działało?". Nie widzę powodów dla których PD5 w tej aplikacji jest gorszy od PB7 więc nie udawaj, że rozwiązałeś problem tylko pochyl się nad tym. Sprawdź, czy możesz dowolnie machać pinem PD5 bez podłączonego mostka a potem podłącz go z powrotem i sprawdź, czy napięcie na pinie zmienia się gdy jest on czymś obciążony. Nawet jeśli dojdziesz do wniosku, że kiedyś tam spaliłeś tę linię (albo miałeś zwarcie kabelka albo brak kontaktu na płytce albo kosmici wysłali impuls EM), to też będzie ważna nauka. Obecnie wiesz tylko, że z jakichś magicznych powodów z pinem PD5 mostek L293 nie współpracuje a to nieprawda. Pomierz wszystko i zapodaj dalsze wyniki. Ciekaw jestem (i Ty zapewne też) prawdziwej przyczyny.

@atMegaTona A minusuj sobie chłopcze jeśli to Ci pomaga 🙂 "Moja prawda jest najmojsza", co? Kiedyś będziesz się tego wstydził, ale musisz jeszcze trochę latek uzbierać na karku żeby to zrozumieć. Chęci do błyszczenia masz spore, owszem - widać po przyrostach licznika, ale musisz się jeszcze wiele nauczyć. I tak z ręką na sercu: każda Twoja porada jest poprawna merytorycznie czy niektóre wyglądają jak nieprzemyślany słowotok w stylu "muszę coś napisać bo już 10 minut minęło"? Niestety, nie chęć szczera zrobi z Ciebie itd.. Chciałem zwrócić tylko uwagę na pewną powierzchowność Twoich postów ale widzę, że masz jakiś problem z krytyką. Krytykować to my, ale nie nas? Myślisz, że jak piszesz do początkującego to nikt mądrzejszy (niespodzianka: są tacy, dopuszczasz taką myśl?) nie potrafi obiektywnie ocenić Twoich słów? Także: spokojniej (szklanka zimnej wody? - podobno pomaga w pewnych sytuacjach), więcej zastanowienia i empatii dla tych do kogo piszesz. Ja, mimo Twoich potknięć widzę między wierszami zarówno dobre intencje jak i sporą (choć bardzo dziurawą) wiedzę, ale oni - nie mając kompetencji do oceny Twoich rad są bezbronni i łykają wszystko literalnie jak masło. Nie wykorzystuj tego do prezentacji swojej elokwencji, to zwyczajnie nie fair. Nie ja pierwszy to piszę, nie zastanawia Cię to? Łatwiej przyjąć, że Cię nie lubimy lub że się uwzięliśmy i rozdawać grymaśne buźki? Naprawdę?

  • Lubię! 1
  • Nie zgadzam się! 2

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, bluzman napisał:

Po zamianie PD5 na PB7 wszystko jest OK, kręci się w lewo i w prawo 🙂 Czyli złym wyborem był wybór pinu. Dzięki bardzo za pomoc.

Może pomyliłeś nóżki, spróbuj przełączyć do tego PD5 i ustawić w programie jak było to będziesz wiedział czy to zwyczajna pomyłka. Zdarzają się takie rzeczy i trzeba mieć to na uwadze. Gdybyś miał jakieś jeszcze kłopoty z tą atmegą, pisz śmiało. Pomożemy.

9 minut temu, marek1707 napisał:

@atMegaTona A minusuj sobie chłopcze jeśli to Ci pomaga 🙂 "Moja prawda jest najmojsza", co? Kiedyś będziesz się tego wstydził, ale musisz jeszcze trochę latek uzbierać na karku żeby to zrozumieć. Chęci do błyszczenia masz spore, owszem - widać po przyrostach licznika, ale musisz się jeszcze wiele nauczyć. I tak z ręką na sercu: każda Twoja porada jest poprawna merytorycznie czy niektóre wyglądają jak nieprzemyślany słowotok w stylu "muszę coś napisać bo już 10 minut minęło"? Niestety, nie chęć szczera zrobi z Ciebie itd.. Chciałem zwrócić tylko uwagę na pewną powierzchowność Twoich postów ale widzę, że masz jakiś problem z krytyką. Krytykować to my, ale nie nas? Myślisz, że jak piszesz do początkującego to nikt mądrzejszy (niespodzianka: są tacy, dopuszczasz taką myśl?) nie potrafi obiektywnie ocenić Twoich słów? Także: spokojniej (szklanka zimnej wody? - podobno pomaga w pewnych sytuacjach), więcej zastanowienia i empatii dla tych do kogo piszesz. Ja, mimo Twoich potknięć widzę między wierszami zarówno dobre intencje jak i sporą (choć bardzo dziurawą) wiedzę, ale oni - nie mając kompetencji do oceny Twoich rad są bezbronni i łykają wszystko literalnie jak masło. Nie wykorzystuj tego do prezentacji swojej elokwencji, to zwyczajnie nie fair. Nie ja pierwszy to piszę, nie zastanawia Cię to? Łatwiej przyjąć, że Cię nie lubimy lub że się uwzięliśmy i rozdawać grymaśne buźki? Naprawdę?

Panie Marku kochany, uprzejmie proszę o zaprzestanie przy każdej okazji tego typu "wycieczek osobistych" pod moim adresem. Przecież doskonale zdaje Pan sobie sprawę, że powód pańskiego sporu w tym temacie jest co najmniej przesadzony i nie ma zasadniczego związku z meritum problemu z jakim zmagał się autor wątku. Rozumiem, że może mnie Pan nie lubić z jakichś powodów ale PPF obowiązuje zarówno mnie jak i Pana, tak więc nie musimy się lubić, nie musimy się zgadzać ale powinniśmy się szanować. Tym czasem pańskie wypowiedzi świadczą jedynie o Panu samym, nie o mnie i z mojej perspektywy nie świadczą one o Panu najlepiej.

Aby nie zostawiać potomności takich  niesmacznych pamiątek proszę szanowną moderację ( @Gieneq ) o uprzątnięcie zbędnych wypowiedzi i pozostawienie tylko tych związanych z tematem.  🙂

  • Nie zgadzam się! 1

Udostępnij ten post


Link to post
Share on other sites

Obawiam się że jednak pierwszy dolałeś oliwy do ognia. Niekoniecznie patrząc na formę i kulturę przekazu ale na estetykę wiadomości. Zachęcam do starannego pisania, bo niezrozumienie wynika z tego, że masz w treści fragment kodu, w którym definujesz własne makro, do którego później się odwołujesz. Gdyby umieścić to w wyraźnej ramce (tak jak to zrobiłeś z fragmentem kodu) nie byłoby problemów 🙂

23 godziny temu, atMegaTona napisał:

Lub napisać sobie wygodne makra:

#define BV(bit) (1<<(bit))

 

#define NBV(bit) ~BV(bit)

Fakt faktem _BV jest jednak bardziej popularne i tworzenie podobnego makra może być mylące, a dla uporządkowania tematu czy mógłbyś poprzeć dokumentacją to co zacytowałem poniżej? Nie znam się na tym tak dobrze, a komuś może się przydać taki konkret 😉 

14 godzin temu, atMegaTona napisał:

w avr libc zdaje się nie ma nawet makra _NBV() które

Poza tym, zachęcam do trzymania się sedna tematu, nie zamykam go, gdyż również chciałbym dowiedzieć się w czym tkwi istota problemu autora tematu, gdyż jak zauważył @marek1707 nie jest on do końca rozwiązany.

  • Nie zgadzam się! 1

Udostępnij ten post


Link to post
Share on other sites

Cóż, mogę napisać dokumentację do makra _NBV();  tylko nie wiem po co :D Nie ma tego makra w avr libc ale jest ono na prawdę wygodne w połączeniu ze stosowaniem makra _BV() , wygodniejsze od ~_BV() ponieważ dużo szybciej się je z klawiatury wprowadza ( litery znajdują się w jednej linii obok siebie ).  Samo podkreślenie też nie jest krytyczne w tym kontekście, jeśli komuś zależy na prędkości wprowadzania tekstu kosztem czytelności programu, która natomiast jest większa dzięki stosowaniu podkreślenia. Całe to "halo" o jedną kreskę, której stosowanie ma porównywalny sens z jej niestosowaniem a sama nazwa "negative byte value" najlepiej tłumaczy pełnioną przez nie funkcję.

Jeśli chodzi o dokumentację makra _BV() i reszty avr libc to polecam zainteresowanym do wglądu: https://www.microchip.com/webdoc/avrlibcreferencemanual/group__avr__sfr_1ga11643f271076024c395a93800b3d9546.html

 

Co do samego problemu z mostkiem, to wszystko wskazuje na to, że @bluzman pomylił po prostu pin do którego podłączył mostek i po przestawieniu sterowania na pin do którego go podłączył problem się rozwiązał.

Udostępnij ten post


Link to post
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!

Gość
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...