e-cma Napisano Styczeń 11, 2014 Udostępnij Napisano Styczeń 11, 2014 Witam, jestem początkującym konstruktorem robotów, i mam niemały problem z moją pierwszą konstrukcją... Otóż nie mam żadnej kontroli nad silnikami sterowanymi poprzez mostek H, nie mogę ich włączyć, nie mówiąc o sterowaniu obrotami. Program aktualnie wygląda tak: #include <avr/io.h> typedef struct { unsigned int bit0:1; unsigned int bit1:1; unsigned int bit2:1; unsigned int bit3:1; unsigned int bit4:1; unsigned int bit5:1; unsigned int bit6:1; unsigned int bit7:1; } _io_reg; #define REGISTER_BIT(rg,bt) ((volatile _io_reg*)&rg)->bit##bt //######################### CZOJNIKI #define CZ1_PORT REGISTER_BIT(PORTC,4) #define CZ1_PIN REGISTER_BIT(PINC,4) #define CZ1_DDR REGISTER_BIT(DDRC,4) #define CZ2_PORT REGISTER_BIT(PORTC,5) #define CZ2_PIN REGISTER_BIT(PINC,5) #define CZ2_DDR REGISTER_BIT(DDRC,5) #define CZ3_PORT REGISTER_BIT(PORTD,0) #define CZ3_PIN REGISTER_BIT(PIND,0) #define CZ3_DDR REGISTER_BIT(DDRD,0) #define CZ4_PORT REGISTER_BIT(PORTD,1) #define CZ4_PIN REGISTER_BIT(PIND,1) #define CZ4_DDR REGISTER_BIT(DDRD,1) #define CZ5_PORT REGISTER_BIT(PORTC,0) #define CZ5_PIN REGISTER_BIT(PINC,0) #define CZ5_DDR REGISTER_BIT(DDRC,0) #define CZ6_PORT REGISTER_BIT(PORTC,1) #define CZ6_PIN REGISTER_BIT(PINC,1) #define CZ6_DDR REGISTER_BIT(DDRC,1) #define CZ7_PORT REGISTER_BIT(PORTC,2) #define CZ7_PIN REGISTER_BIT(PINC,2) #define CZ7_DDR REGISTER_BIT(DDRC,2) #define CZ8_PORT REGISTER_BIT(PORTC,3) #define CZ8_PIN REGISTER_BIT(PINC,3) #define CZ8_DDR REGISTER_BIT(DDRC,3) #define M_AIN1_PORT REGISTER_BIT(PORTD,2) #define M_AIN1_PIN REGISTER_BIT(PIND,2) #define M_AIN1_DDR REGISTER_BIT(DDRD,2) #define M_AIN2_PORT REGISTER_BIT(PORTD,3) #define M_AIN2_PIN REGISTER_BIT(PIND,3) #define M_AIN2_DDR REGISTER_BIT(DDRD,3) #define M_BIN1_PORT REGISTER_BIT(PORTD,4) #define M_BIN1_PIN REGISTER_BIT(PIND,4) #define M_BIN1_DDR REGISTER_BIT(DDRD,4) #define M_BIN2_PORT REGISTER_BIT(PORTD,5) #define M_BIN2_PIN REGISTER_BIT(PIND,5) #define M_BIN2_DDR REGISTER_BIT(DDRD,5) #define M_PWMA_PORT REGISTER_BIT(PORTB,1) #define M_PWMA_PIN REGISTER_BIT(PINB,1) #define M_PWMA_DDR REGISTER_BIT(DDRB,1) #define M_PWMB_PORT REGISTER_BIT(PORTB,2) #define M_PWMB_PIN REGISTER_BIT(PINB,2) #define M_PWMB_DDR REGISTER_BIT(DDRB,2) int main(void){ CZ1_DDR = 0; CZ1_PORT = 0; CZ2_DDR = 0; CZ2_PORT = 0; CZ3_DDR = 0; CZ3_PORT = 0; CZ4_DDR = 0; CZ4_PORT = 0; CZ5_DDR = 0; CZ5_PORT = 0; CZ6_DDR = 0; CZ6_PORT = 0; CZ7_DDR = 0; CZ7_PORT = 0; CZ8_DDR = 0; CZ8_PORT = 0; M_AIN1_DDR = 1; M_AIN1_PORT = 0; M_AIN2_DDR = 1; M_AIN2_PORT = 0; M_BIN1_DDR = 1; M_BIN1_PORT = 0; M_BIN2_DDR = 1; M_BIN2_PORT = 0; M_PWMB_DDR = 1; M_PWMB_PORT = 0; M_PWMA_DDR = 1; M_PWMA_PORT = 0; //obroty silnikow M_AIN1_PORT=1; M_AIN2_PORT=0; M_BIN1_PORT=1; M_BIN2_PORT=0; /*#############PWM################### */ TCCR1A |= (1<<WGM10); TCCR1B |= (1<<WGM12); TCCR1A |= (1<<COM1A1)|(1<<COM1B1) ; TCCR1B |= (1<<CS10)|(1<<CS11); OCR1A = 100; //kanał A = 0 OCR1B = 100; //kanał B = 0 } i wydaje się być poprawny a schemat wygląda tak:
marek1707 Styczeń 11, 2014 Udostępnij Styczeń 11, 2014 A możesz w ogóle zrobić cokolwiek? Możesz zaprogramować procesor? Możesz zapalić którąś diodkę na liniach sterujących mostkiem? Jeżeli na którekolwiek pytanie odpowiesz "tak" to znaczy, że przysłałeś nie ten schemat. Na tym zamieszczonym powyżej diody na zasilaniu VCC włączone są odwrotnie, procesorowi brakuje zasilania AVCC, dioda D4 na wyjściu stabilizatora jest zupełnie niepotrzebna (chyba, że o czymś nie wiem) a złącze programatora ma jakąś pokopaną numerację pinów. Podeślij prawdziwy, schemat to można będzie zacząć myśleć nad pomocą w oprogramowaniu. Przy okazji: oporniki szeregowe przy diodach mogą być 5-10 razy większe chyba, że masz LEDy z wykopalisk archeologicznych.
e-cma Styczeń 11, 2014 Autor tematu Udostępnij Styczeń 11, 2014 Nie mogę zapalić diód na sterowaniu mostkiem (podejrzewam że przylutowałem je na odwrót :/ ), przy stabilizatorze nie lutowałem diód prostowniczych, ponieważ powodują spadki napięcia (i udało mi się znaleźć złącze, które wyklucza możliwość odwrotnego podłączenia zasilania). Na początku wgrałem trochę inny program działał jeden z silników, ale po modyfikacji programu nie działa :/ mogę jeszcze dorzucić płytkę:
BlackJack Styczeń 11, 2014 Udostępnij Styczeń 11, 2014 Na twojej płytce nie widzę ani jednego elektrolita, do filtrowania zasilania. Istnieje możliwość, że kiedy próbujesz ruszyć dwiema silnikami naraz, bo piszesz że z jednym działało, to następuje taki chwilowy spadek napięcia, że ci się restartuje procesor.
e-cma Styczeń 11, 2014 Autor tematu Udostępnij Styczeń 11, 2014 Problem w tym, że powinny wtedy działać dwa silniki, a działał jeden z nich Chyba jest źle... po zmianie OCR1A = 0; //kanał A = 0 OCR1B = 100; //kanał B = 0 na wyjściach jest po 0.22V jak zmienię na OCR1A = 100; //kanał A = 0 OCR1B = 0; //kanał B = 0 nadal jest to samo...
marek1707 Styczeń 11, 2014 Udostępnij Styczeń 11, 2014 Jeśli masz tak podstawowe kłopoty, to zacznij od rzeczy podstawowych. Po co zrobiłeś te diodki na sygnałach sterujących mostkiem? Dla ozdoby? Co to ma być, choinka czy robot? Przecież to te diodki właśnie byłyby niezastąpione w tej sytuacji. Wlutuj je dobrze i sprawdź, czy sygnały są OK. Dopiero wtedy masz prawo narzekać. Sam doprowadź do tego, że możesz dobrze wysterować mostek łącznie z prawidłowym PWM (będzie się zmieniać jasność odpowiedniej LEDy). Załączaj pojedyncze sygnały i sprawdzaj świecenie diodek. Po to je masz, prawda? Tobie nie chce się ich wlutować prawidłowo a my mamy zgadywać gdzie zrobiłeś błąd? Nie przesadzaj. I nie wrzucaj tu płytek, bo one mogą być tak samo poprawne i prawdziwe jak poprzedni rysunek, tylko daj prawdziwy schemat a nie jakąś bajkę o diodach i złączach. Masz taki schemat czy nie? Nikt za Ciebie nie uporządkuje bałaganu w projekcie.
e-cma Styczeń 11, 2014 Autor tematu Udostępnij Styczeń 11, 2014 Świeci się BIN1 i PWMB, tak jak powinno być według programu Schemat mam jedynie rozrysowany w ten sposób, ponieważ jest czytelniejszy,a o prawidłowość połączeń dba program. Więc czy pod pojęciem prawdziwy rozmiecie taki w którym rozrysowane są wszystkie połączenia (poza posiadaniem takich samych nazw i etykiet)? #edit Udało mi się uzyskać kontrolę nad silnikiem sterowanym z PWMB, ale jedynie przy: BIN1=1 BIN2=0 bo przy BIN1=0 BIN2=1 nic się nie dzieje
marek1707 Styczeń 11, 2014 Udostępnij Styczeń 11, 2014 Prawdziwy, to znaczy zgodny z rzeczywistością. Jeżeli na schemacie diody na zasilaniu są odwrotnie a Ty twierdzisz, że układ działa to albo zmyślasz albo przedstawiłeś nieprawdziwy schemat. A jeżeli jest nieprawdziwy w tym miejscu, to może być w każdym innym, rozumiesz? A wracając do rzeczy, to po każdej zmianie programu/układu/schematu podawaj pełny stan urządzenia i opisuj problem. Bo teraz to co ja mam myśleć? Masz dwie świecące diody i co z tego? Jak ma być a jak jest? Co ma się kręcić a co nie? Zmierz miernikiem i podaj napięcia na szynie 5V i na VCC oraz na liniach z zapalonymi diodkami i na tych ze zgaszonymi. Zweryfikuj działanie każdej diodki (od tego trzeba było zacząć) - czy każda umie zaświecić gdy dostaje stan wysoki. Napięcia na wyjściu mostka (masz w sumie cztery) mierz na każdym wyjściu osobno względem masy i podawaj je. Nie łap się za klawiaturę tyko za multimetr. Często przy takich pomiarach sam wyczaisz co jest nie tak, ale musisz wiedzieć, jak być powinno.
e-cma Styczeń 11, 2014 Autor tematu Udostępnij Styczeń 11, 2014 ok, więc przy stabilizatorze diód nie ma wlutowanych, gdyż okazało się, że otworki w płytce są za małe na diody 3A 40V, o czym nie wiedziałem. kod wygląda teraz tak: include <avr/io.h> typedef struct { unsigned int bit0:1; unsigned int bit1:1; unsigned int bit2:1; unsigned int bit3:1; unsigned int bit4:1; unsigned int bit5:1; unsigned int bit6:1; unsigned int bit7:1; } _io_reg; #define REGISTER_BIT(rg,bt) ((volatile _io_reg*)&rg)->bit##bt //######################### CZOJNIKI #define CZ1_PORT REGISTER_BIT(PORTC,4) #define CZ1_PIN REGISTER_BIT(PINC,4) #define CZ1_DDR REGISTER_BIT(DDRC,4) #define CZ2_PORT REGISTER_BIT(PORTC,5) #define CZ2_PIN REGISTER_BIT(PINC,5) #define CZ2_DDR REGISTER_BIT(DDRC,5) #define CZ3_PORT REGISTER_BIT(PORTD,0) #define CZ3_PIN REGISTER_BIT(PIND,0) #define CZ3_DDR REGISTER_BIT(DDRD,0) #define CZ4_PORT REGISTER_BIT(PORTD,1) #define CZ4_PIN REGISTER_BIT(PIND,1) #define CZ4_DDR REGISTER_BIT(DDRD,1) #define CZ5_PORT REGISTER_BIT(PORTC,0) #define CZ5_PIN REGISTER_BIT(PINC,0) #define CZ5_DDR REGISTER_BIT(DDRC,0) #define CZ6_PORT REGISTER_BIT(PORTC,1) #define CZ6_PIN REGISTER_BIT(PINC,1) #define CZ6_DDR REGISTER_BIT(DDRC,1) #define CZ7_PORT REGISTER_BIT(PORTC,2) #define CZ7_PIN REGISTER_BIT(PINC,2) #define CZ7_DDR REGISTER_BIT(DDRC,2) #define CZ8_PORT REGISTER_BIT(PORTC,3) #define CZ8_PIN REGISTER_BIT(PINC,3) #define CZ8_DDR REGISTER_BIT(DDRC,3) #define M_AIN1_PORT REGISTER_BIT(PORTD,2) #define M_AIN1_PIN REGISTER_BIT(PIND,2) #define M_AIN1_DDR REGISTER_BIT(DDRD,2) #define M_AIN2_PORT REGISTER_BIT(PORTD,3) #define M_AIN2_PIN REGISTER_BIT(PIND,3) #define M_AIN2_DDR REGISTER_BIT(DDRD,3) #define M_BIN1_PORT REGISTER_BIT(PORTD,4) #define M_BIN1_PIN REGISTER_BIT(PIND,4) #define M_BIN1_DDR REGISTER_BIT(DDRD,4) #define M_BIN2_PORT REGISTER_BIT(PORTD,5) #define M_BIN2_PIN REGISTER_BIT(PIND,5) #define M_BIN2_DDR REGISTER_BIT(DDRD,5) #define M_PWMA_PORT REGISTER_BIT(PORTB,1) #define M_PWMA_PIN REGISTER_BIT(PINB,1) #define M_PWMA_DDR REGISTER_BIT(DDRB,1) #define M_PWMB_PORT REGISTER_BIT(PORTB,2) #define M_PWMB_PIN REGISTER_BIT(PINB,2) #define M_PWMB_DDR REGISTER_BIT(DDRB,2) int main(void){ CZ1_DDR = 0; CZ1_PORT = 0; CZ2_DDR = 0; CZ2_PORT = 0; CZ3_DDR = 0; CZ3_PORT = 0; CZ4_DDR = 0; CZ4_PORT = 0; CZ5_DDR = 0; CZ5_PORT = 0; CZ6_DDR = 0; CZ6_PORT = 0; CZ7_DDR = 0; CZ7_PORT = 0; CZ8_DDR = 0; CZ8_PORT = 0; M_AIN1_DDR = 1; M_AIN2_DDR = 1; M_BIN1_DDR = 1; M_BIN2_DDR = 1; M_PWMB_DDR = 1; M_PWMA_DDR = 1; //obroty silnikow M_AIN1_PORT=1; M_AIN2_PORT=0; M_BIN1_PORT=0; M_BIN2_PORT=1; // PWM TCCR1A |= (1<<WGM10); TCCR1B |= (1<<WGM12); TCCR1A |= (1<<COM1A1)|(1<<COM1B1) ; TCCR1B |= (1<<CS10)|(1<<CS11); OCR1A = 100; //kanał A = 0 OCR1B = 100; //kanał B = 0 } napięcia to AIN1=2,01 ! AIN2=2,52 ! PWMA=1,96 BIN1=0,96 BIN2=4,67 PWMB=1,89 Silnik A 1,97 0,00 Silnik B 0V 3,04V Nie mam pojęcia skąd takie wartości AIN1 i AIN2, Jest szansa że tb6612fng to przetrwał? Sprawdziłem teraz bez uC, i wtedy też mam niewielkie (rzędu 0.2V) napięcia na wejściach mostka. Temat do zamknięcia, podejrzewam, że mój problemom leżał w sposobie przylutowania mostka. Parokrotne przejechanie po stykach lutownicą rozwiązało problem. Dzięki za odpowiedzi, następnym razem będę wiedział od czego zacząć (zanim zacznę zawracać gitarę).
marek1707 Styczeń 11, 2014 Udostępnij Styczeń 11, 2014 Wejścia mostka praktycznie nie obciążają wyjść procesora więc dziwne napięcia muszą brać się z czegoś między procesorem a mostkiem. Na razie zapomnij o PWM i badaj wyjścia stanami statycznymi. Po pierwsze sprawdź zwarcia. Zobacz, czy np. wypuszczając stan wysoki na któryś pin, na pozostałych jest co najwyżej 0.2V. Napisz sobie program testowy wysyłający wolno, po kolei jedynki na wszystkie używane piny (a masz ich 6) i sprawdź woltomierzem, czy nie ma przejść do innych wyjść tzn. czy któreś wyjście nie podniosło się np. do 2V a powinno być na 0V. Możesz też oczywiście na sucho (bez zasilania!) sprawdzić to omomierzem. Po drugie diodki. Bez podłączonego mostka sprawdź jakie napięcia masz na poszczególnych pinach gdy zapalasz po kolei każą diodkę LED. Jedynki logiczne nie powinny być mniejsze od 3V a zera większe od 0.2V. Jeżeli oporniki są rzeczywiście tak małe jak na schemacie (150Ω?), to mogą bardzo obciążać wyjścia procesora. Daj wszystkie oporniki szeregowe LEDów po 1k. To ograniczy prąd do pojedynczych mA i nie powinno tak dusić wyjść portów. Dopiero wtedy podłącz mostek i badaj dalej. Jemu nie szkodzą żadne napięcia wejściowe pod warunkiem, że są w granicach 0-5V. Najwyżej będzie głupio działał, ale się nie popsuje. Znajdź dane katalogowe tego mostka a w nich "tabelę prawdy" i sprawdź, czy wyjścia przyjmują takie stany jak tam opisane przy danej kombinacji stanów wejściowych. Kilka prostych ruchów, tu nie ma za bardzo nad czym medytować. Bezwzględnie zaczynasz od uzyskania prawidłowych stanów logicznych na wyjściach procesora podłączonego jedynie do diodek. EDIT: Pisaliśmy razem Cieszę się, że sam rozwiązałeś problem.
Pomocna odpowiedź
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ę »