Skocz do zawartości

[Atmega8][PWM][C] Problem ze sterowaniem mostkiem H


e-cma

Pomocna odpowiedź

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:

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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ę:

Link do komentarza
Share on other sites

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.

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

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Ś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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

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.