Strona 1 z 1

avr zaprogramowanie ruchu

: 19 wrz 2006, 18:30
autor: pit202
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 ) { }; 
}; 

: 19 wrz 2006, 21:07
autor: webserver
nie rozumie zwszystkiego co napisales bo ja pisze w bascom ale proponuje rozwiazac rozpedzanie na zasadzie petli i zmiejszania czasu wraz ze zwiekszeniem "i"

: 19 wrz 2006, 21:28
autor: 251mz
a moze stworzysz jakas tablice......... wg której to silnik bedzie sie rozpedzał, lub wg jakiegos ciagu

: 19 wrz 2006, 22:33
autor: Adalber
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 .

: 19 wrz 2006, 22:36
autor: 251mz
genialnosc w swojej prostocie:)

: 20 wrz 2006, 08:30
autor: Adalber
Rzeczywiście troche prościej możnaby to wytłumaczyć.

: 20 wrz 2006, 16:07
autor: pit202
wiec biorę się za czytanie ze zrozumieniem :D

: 21 wrz 2006, 15:10
autor: anjak
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ć