Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - Sterowanie Silnikami Krokowymi

11 Lut 2013 10:34 2424 16
  • Poziom 7  
    Napisałem program do sterowania silnikami krokowymi. Który pobiera dane z RS232 przez MAX232 . Wysyłam mu w terminalu liczbę Obrotów jaka ma wykonać lecz silnik kręci się bardzo długo zamiast wykonać np 2 obroty . Silnikiem steruje przez uln2003. Poniżej wklejam kod jeśli ktoś ma pomysł lub może mnie nakierować na błąd jaki zrobiłem bardzo był bym wdzięczny.


    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 32  
    Popraw najpierw kod, bo coś się bardzo źle wkleiło. ;)
  • Poziom 7  
    ok już poprawione ;)
  • Specjalista - Mikrokontrolery
    Co ty nadajesz z tego terminala?
  • Poziom 7  
    Wpisuje liczbę i daje wyślij jako liczba lub jako ASCII i jest to samo. Używam RealTerm jako terminala
  • Specjalista - Mikrokontrolery
    Jeśli wysyłasz cyfrę 2 jako znak ASCII, to powinieneś wykonać 50*50, czyli 2500 sekwencji kroków. Czy coś się nie zgadza?
  • Poziom 7  
    Czyli jeśli wyśle mu 2 jako znak ASCII to będzie 50 obrotów bo jeden obrót ustawiłem jako 50 kroków . Czyli jesli wyśle mu np "!" to będzie 32 obroty tak ? . Aby wszystko działało muszę my wysłać liczbę w systemie liczbowym DEC . Sprawdzę wszystko jak będę w domu . Jeśli coś źle zrozumiałem to mnie poprawcie :)
  • Specjalista - Mikrokontrolery
    Chyba JEST dobrze, nie?
  • Poziom 7  
    Mam problem wysyłam mu znak zmieniłem program na Hyper Terminal dużo lepszy niż poprzedni. Zrobiłem funkcje która wysyła tablice ASCII i jest ok dochodzi ładnie. Lecz gdy zrobiłem Wyslij_Znak(Odbierz()); to podaje mu znak a on zwraca co innego co zrobiłem źle ?
  • Specjalista - Mikrokontrolery
    Póki co nie wiemy nawet, dlaczego uważasz, że Twój program działa nieprawidłowo.
    Terminal wysyła znak, czyli 8 bitów. Twój program odbiera ten znak i interpretuje go jako liczbę 8-bitową, wykonując 50 * x sekwencji kroków, gdzie x - to wartość odebranego bajtu. Co wg. Ciebie jest tu źle?
  • Poziom 7  
    W HyperTerminalu wysyłam mu #001 opcja Transmit macros. on zwraca :ááńÁÁůÁń . Jak mu wyślę prosto z klawiatury w tym okienku jego np kilkakrotnie literę 'A' to raz zwróci a raz nie . Głównie zamiast 'A' wyskakuje :ááńÁÁůÁń . Chodzi o to że wysyłam mu to samo a w tabelce gdzie sa Hex, Dec , Bin są różne wartości a nie jedna i ta sama.
  • Specjalista - Mikrokontrolery
    Jakiej tabelce? Wysyłasz bajt, odbierasz bajt. To, co wyśle mikrokontroler - to wyświetli terminal.

    Jaką masz częstotliwość procesora? żeby uzyskać szybkość transmisji 19200 musi być całkiem spora.
  • Poziom 17  
    Przyjrzyj się linią, które oznaczyłem <-XXX.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    edit.
    (1<<RXCIE) bit włącza przerwania rx, nie widzę w kodzie jego obsługi.
  • Poziom 7  
    Częstotliwość to : 12Mhz
  • Poziom 17  
    Podaj jeszcze jakie parametry transmisji chcesz uzyskać, mam na myśli długość słowa w ramce, bit parzystości i ilość bitów stopu.
  • Poziom 7  
    Chce przesyłać w końcowej fazie programu tak : L_300_50 Nie wiem jakie maja być do tego ustawienia . Gdzie L to jest kierunek , 300 to szybkośc max 2500 , 50 to liczba obrotów silnika nie wiem ile jeszcze maxymalnie
  • Poziom 17  
    Ważne jest ustawienie takiego samego formatu transmisji w procesorze jak i w terminalu.
    Skorzystaj z ustawień 8N1, czyli 8 bitów danych, bez bitu parzystości, 1 bit stopu.
    Sprawdź w dokumentacji atmegi jakie wartości wpisać do rejestrów UCSRB UCSRC aby uzyskać dany format transmisji.