avr zaprogramowanie ruchu

Na tym forum rozmawiamy o elektronice nie związanej bezpośrednio z tematem CNC

Autor tematu
pit202
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 2
Posty: 863
Rejestracja: 02 lip 2004, 23:38
Lokalizacja: --

avr zaprogramowanie ruchu

#1

Post napisał: pit202 » 19 wrz 2006, 18:30

witam , potrzebuje pomocy , musze zaprogramowac uklad, ktory bedzie w stanie obrócić silnikiem krokowym jako taki pośrednik miedzy uart`em a sterownikiem silnika krokowego, jego rola bedzie sie ograniczala do przekrecania silnika o zadana liczbe krokow , ale zeby uzyskac wieksze predkosci maksymalne chcialbym zrealizowac rozpedzanie i hamowanie i tu wlasnie mam problem ( brak pomysłów ) jak zakodowac rozpedzanie i hamowanie , jak obliczyc ile ( czegoś ) ma trwać rozpedzanie i ile hamowanie przy okreslonej dlugosci ruchu, nie zawsze uklad bedzie sie calkowicie rozpedzał, przy krótkich odcinkach tylko czesciowo rozpedzał i czesciowo hamował - zrobilem szkielet programu ktorym w tej chwili moge ustawiac predkosc silnika i wygaszania sygnalu STEP a teraz ............... tak pustka , pomysłu brak , ktos moze realizowal to i moze mnie jakos naprowadzic ? moj kod wyglada tak , moze poprostu od zlej strony zaczelem ?

Kod: Zaznacz cały

#define AVR_AT90S8535
#include <avr/io.h> 
#include <avr/interrupt.h> 
#include <avr/signal.h> 
unsigned char imp=0; 
unsigned char speed=100; 
unsigned int  pozycja=0; 
char* buf; 

SIGNAL(SIG_OVERFLOW0) { 
  if (imp) { 
     PORTB|=0x01; 
     outp(speed, TCNT0); 
  } else { 
     PORTB&=~0x01; 
     outp(255, TCNT0); 
  }; 
  imp=1-imp; 
} 

SIGNAL(SIG_UART_RECV) { 

} 

int main ( void ) { 
  outp(0xff, DDRB);       // port B jako wyjscie
  outp(0xff, PORTB);      // wymuszenie jedynki
  outp(0x01, TIMSK);     // przepelnienie licznika
  outp(0x03, TCCR0);     // prescaler set to 64
  outp(255, TCNT0); 
  sei(); 
  while ( 1 ) { }; 
}; 


PiteR

Tagi:

Awatar użytkownika

webserver
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 1
Posty: 989
Rejestracja: 01 sty 2005, 17:48
Lokalizacja: Bełchatów
Kontakt:

#2

Post napisał: webserver » 19 wrz 2006, 21:07

nie rozumie zwszystkiego co napisales bo ja pisze w bascom ale proponuje rozwiazac rozpedzanie na zasadzie petli i zmiejszania czasu wraz ze zwiekszeniem "i"
Pozdrawiam PlotComplex.com


251mz
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 4478
Rejestracja: 27 sie 2004, 21:59
Lokalizacja: Polska

#3

Post napisał: 251mz » 19 wrz 2006, 21:28

a moze stworzysz jakas tablice......... wg której to silnik bedzie sie rozpedzał, lub wg jakiegos ciagu


Adalber
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 2
Posty: 694
Rejestracja: 10 lip 2005, 15:13
Lokalizacja: Polska

#4

Post napisał: Adalber » 19 wrz 2006, 22:33

Sprawa jest trochę skomplikowana do łatwego wytłumaczenia
Może coś takiego
Złożenia :
droga -s- jest w krokach ,prędkość -v- w krokach na sekundę a przyspieszenie -a- w krokach na sekunde kwadrat.
Parametry które podajesz na początku to prędkość maksymalna -v max- oraz przyspieszenie (akceleracja) -a max-
na bieżąco podajesz procesorowi wielkość przesunięcia w krokach - S - ,które ma wykonać po wykonaniu ruchu będzie czekał na następną wartość

Z dwóch podstawowych wzorów v=a*t oraz s=at^2/2 wyliczy procek na początku dla v max i a max ilość kroków -Sp- potrzebnych do osiągnięcia maksymalnej prędkości,
jeśli założysz że przyspieszenie i opóżnieni będzie takie same to jest prościej:

Przykład :
v max=300 kroków na sekunde
a max=100 kroków na sekunde kwadrat

t=v/a =300/100 =3 s maksymalny czas akceleracji
mając t podstawiamy
Sp=100*3^2 /2= 450 kroków

Mając to policzone na początku procek po otrzymaniu S czyli założonej ilości kroków do przesunięcia musi rozpatrywać dwa przypadki
1. Jeżeli S<=2*Sp to znaczy,że silnik nie może rozpędzić się do maksymalnych obrotów ponieważ nie zdąży zachamować (lub rozpędzi się aby natychmiast hamować )
obliczamy potrzebny czas t=sqr(4S/a) przez który będziemy przyspieszać a następnie opóżniać silnik
2.Jeżeli S>2Sp silnik przejedzie określony kawałek drogi z prędkością maksymalną.

Z tych samych wzorów można obliczyć czas między kolejnymi krokami które ma wykonać silnik .
Można też pójść inną drogą i przyjąć jakieś stałe przyspieszenie i na tej podstawie stworzyć tablicę która będzie zawierała np.czasy opóżnienia między kolejnymi krokami ,dla przyspieszenia czytamy kolejno w górę a dla opóżnienia w dół .Wielkość indeksu maxymalnego liczysz podobnie jak w punkcie 1

Nie chce mi sie wgłębiac dalej może to cos pomoże .
Ostatnio zmieniony 19 wrz 2006, 22:38 przez Adalber, łącznie zmieniany 2 razy.


251mz
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 4478
Rejestracja: 27 sie 2004, 21:59
Lokalizacja: Polska

#5

Post napisał: 251mz » 19 wrz 2006, 22:36

genialnosc w swojej prostocie:)


Adalber
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 2
Posty: 694
Rejestracja: 10 lip 2005, 15:13
Lokalizacja: Polska

#6

Post napisał: Adalber » 20 wrz 2006, 08:30

Rzeczywiście troche prościej możnaby to wytłumaczyć.


Autor tematu
pit202
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 2
Posty: 863
Rejestracja: 02 lip 2004, 23:38
Lokalizacja: --

#7

Post napisał: pit202 » 20 wrz 2006, 16:07

wiec biorę się za czytanie ze zrozumieniem :D
PiteR


anjak
Znawca tematu (min. 80)
Znawca tematu (min. 80)
Posty w temacie: 1
Posty: 86
Rejestracja: 16 lip 2004, 18:13
Lokalizacja: Ostrołęka

#8

Post napisał: anjak » 21 wrz 2006, 15:10

Skomplikuj sobie program dodając/odejmując tarcie oraz z powodu że to silnik krokowy to bym jeszcze uwzględnił malejący moment a w tym procku całkiem sporo sinusów się zmieści więc można by z nich skorzystać

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Elektronika ogólna”