Skocz do zawartości

[C] Sterowanie PWM silnikami


Pomocna odpowiedź

Napisano

Witam,

mam problem z sterowanie silników przez mostek H, w układzie mam użytą Atmege 8

układ mam podłączony jak z przykładu:

https://www.forbot.pl/forum/topics20/przepis-na-robota-w-pelni-programowalny-line-follower-vt2356.htm

Jednak gdy stosuje kod by zobaczyc czy sie kreca silniki i zatrzymuja:

DDRD  = 0xff; 
 DDRB  = 0xff; 

PORTB |= _BV(1); 
   PORTB |= _BV(2); 


   PORTD |= _BV(0);   // lewy silnik w lewo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(0);  // lewy silnik w lewo OFF 


   PORTD |= _BV(1);   // lewy silnik w prawo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(1);  // lewy silnik w prawo OFF 


   PORTD |= _BV(2);   // prawy silnik w lewo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(2);  // prawy silnik w lewo OFF 


   PORTD |= _BV(3);   // prawy silnik w prawo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(3);  // prawy silnik w prawo OFF 

Tak sa podlaczone oba scalaki:

L293DNE AtMega8

z 1-2EN do PB1

z 1A do PD0

z 2A do PD1

z 3-4EN do PB2

z 3A do PD2

z 4A do PD3

Jednak na wyjscie do silników żadne napiecie nie jest dostarczane. Co jest źle ??

A czy na portach µkontrolera napięcie się zmienia?

Czy masz ustawioną zmienną

#define F_CPU 1000000L				/* Częstotliwość kwarcu */

standardowo ATmega8 ma ustawioną częstotliwość 1000000MHz, jeśli nie zmieniałeś fuse bitów.

I dla ułatwienia mierzenia blok zmieniający stany wyjść dałbym w nieskończoną pętle, bo tak przez 40 s masz różne stany, a potem już tylko 0 aż do resetu procka.

 DDRD  = 0xff; 
 DDRB  = 0xff; 

   PORTB |= _BV(1); 
   PORTB |= _BV(2); 

  while(1)
  {

   PORTD |= _BV(0);   // lewy silnik w lewo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(0);  // lewy silnik w lewo OFF 


   PORTD |= _BV(1);   // lewy silnik w prawo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(1);  // lewy silnik w prawo OFF 


   PORTD |= _BV(2);   // prawy silnik w lewo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(2);  // prawy silnik w lewo OFF 


   PORTD |= _BV(3);   // prawy silnik w prawo ON 
   _delay_ms(10000); 
   PORTD &= ~_BV(3);  // prawy silnik w prawo OFF
   }

Witam,

tak mam to w petli i mam zdefiniowaną częstotliwość kwarcu.

Co do mierzenia to teraz na obu pinach na wyjsciu do silniczków mam napiecie równe 0.1 ? co to oznacza powinno być okolo 6 V skoro mam 6 V zasilania

Mierzylem ten mostek i mam napiecie rowne 5.3 Volta na pinach które są połączone z Atmega czyli:

PORTB |= _BV(1);

PORTB |= _BV(2);

i na pinie który łączy mostek z zasilaniem. reszta pinów jest bez napiecia również te trzy pozostałe które są podłączone do Atmegi i którymi mam sterować CZEMU ??

Znalazłem coś takiego:

Dokumentacja biblioteki avr-libc, opis funkcji _delay_ms:

Cytat:

The maximal possible delay is 262.14 ms / F_CPU in MHz.

źródło:

http://www.elektroda.pl/rtvforum/topic843037.html

Znalazłem to w dokumentacji:

Function Documentation

void _delay_ms ( double __ms )

Perform a delay of __ms milliseconds, using _delay_loop_2().

The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).

The maximal possible delay is 262.14 ms / F_CPU in MHz.

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.

Czyli to opóźnienie może sprawiać problem, gdyż masz 10 sekund.

Można spróbować w pętli, powiedzmy:

for(char i = 0; i < 50; i++)
     _delay_ms(200);

może zadziała

NIestety dalej to samo zauwazylem ze te 0.1 Volta wyskakiwalo jak byl programator podlaczony gdy go odlaczylem to swieci niestety 0.0V

A jakbyś na chwile dla testów zamiast pętli wpisał

PORTD = 0xff;

i wtedy zmierzyć napięcie?

Teraz mam zasilenie idpowiednio na kazdym Pinie w Atmedze z PortuD

a na mostku H

Pin 1,7,8,15,10

z czego 8 bezposrendio do zasilania

1 i 9 do PB1 i PB2

a 7 i 10, 15 PD2 i PD1 PD0

wiec sie zgadza ale niestety zasilania na wyjsciu do silników nie ma

Mierzysz silniki napięcie na wyjściu do silników względem masy, czy pomiędzy jednym a drugim?

Bo jeśli hardware jest ok, to między nimi a masą (- zasilania) powinno być te 6V, natomiast między jednym a drugim powinno być zero:

jeden ma 6V drugi ma 6V wiec różnica potencjałów 0V,
ale jeśli względem masy jest 0, to coś nie tak z mostkiem chyba...

wszystkie napiecia sa na mostku te co maja byc polaczeniem z atmegi ale przy wyjsciu mostka h do silniczkow juz tych napiec nie ma

Witam,

zasilanie na mostku dochodzi wszystkie piny odpowiedzialne za polaczenie z Atmega maja takze napiecie. Tylko te piny ktore wychodza z mostka do zasilania silniczkami sa zerowe

w Programie mam ustalony tylko

DDRD = 0xff;

DDRB = 0xff;

while(1){

Portd=0xff

PORTB |= _BV(1)

PORTB |= _BV(2)

}

[ Dodano: 17-12-2010, 13:04 ]

Teraz znalazłem może błąd się wkradł w schemat ideowy, z przepisu na robota.

BO jak sprawdziłem mostek L293D

http://www.datasheetcatalog.org/datasheet/texasinstruments/l293d.pdf

To na 16 pinie jest zasilanie VCC2 i to nie jest podłączone (VCC1 jest podłączone do pinu 8)? może w tym błąd Bo w schemacie z artykułu przepis na robota 16 pin jest w ogole nie użyty.

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