RAMPA na ARDUINO

Dyskusje na temat silników krokowych i sterowników silników krokowych.
Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3975
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#11

Post napisał: markcomp77 » 13 kwie 2012, 09:12

pitsa pisze:Czy takie urządzenie jest faktycznie potrzebne? Do testów można przecież zaprząc komputer z EMC/Machem.
można... i bardzo często właśnie w ten sposób korzystam linuxcnc... ale
-układzik na arduino będzie mniejszy niz cały komputer - przez co bardziej mobilny..
-moduł OSCYLATOR będzie przykładem dobrze testującym procedury ramp
GSM pisze:mój organizm nie toleruje Arduino
cóż... pobawmy się jednak arduino - aby go trochę poznać i dać mu szansę


SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm


jarekk
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 21
Posty: 1701
Rejestracja: 17 mar 2006, 08:57
Lokalizacja: Gdańsk

#12

Post napisał: jarekk » 13 kwie 2012, 10:37

Moja wersja to by chyba na Arduino już nie poszła :-(

////////////////////////////////////////////////////////////////////////////////
// xyz_GeometryCalculateAxis()
////////////////////////////////////////////////////////////////////////////////

void xyz_GeometryCalculateAxis(
U32 PulsesPer1000mm,
VectorSpeedType * VS
)
{
// Calculates (for single axis) its acc/const/dcc motion profile

if(VS->Distance != 0)
{
if( (VS->Acc != 0) && (VS->Dcc != 0))
{
VS->LineAcc.T = (VS->V-VS->Vstart) / VS->Acc;
VS->LineDcc.T = (VS->V-VS->Vstop) / VS->Dcc;


VS->LineAcc.S = VS->LineAcc.T * VS->Vstart + VS->Acc * VS->LineAcc.T * VS->LineAcc.T /2;
VS->LineDcc.S = VS->LineDcc.T * VS->Vstop + VS->Dcc * VS->LineDcc.T * VS->LineDcc.T /2;

if(VS->LineAcc.S + VS->LineDcc.S < VS->Distance)
{
VS->LineConst.S = VS->Distance - VS->LineAcc.S - VS->LineDcc.S;
VS->LineConst.T = (VS->LineConst.S / VS->V);

VS->LineAcc.PulseCnt = xyz_GeometryDist2Pulse(VS->LineAcc.S,PulsesPer1000mm);
VS->LineDcc.PulseCnt = xyz_GeometryDist2Pulse(VS->LineDcc.S,PulsesPer1000mm);
VS->LineConst.PulseCnt = xyz_GeometryDist2Pulse(VS->Distance,PulsesPer1000mm) - VS->LineAcc.PulseCnt - VS->LineDcc.PulseCnt;

assert( fabs(VS->V -( VS->Vstart + VS->Acc*VS->LineAcc.T)) < 0.001);

}
else
{
double WA,WB,WC;

VS->LineConst.T = 0;
VS->LineConst.S = 0;
VS->LineConst.PulseCnt = 0;

WA = VS->Acc/2 + VS->Dcc/2 *(VS->Acc/VS->Dcc)*(VS->Acc/VS->Dcc);
WB = VS->Vstart + (VS->Acc/VS->Dcc)*VS->Vstop;
WC = -(double)VS->Distance;


VS->LineAcc.T = (-WB+sqrt(WB*WB-4*WA*WC))/(2*WA);
VS->LineAcc.S = VS->Acc*VS->LineAcc.T*VS->LineAcc.T/2 + VS->LineAcc.T*VS->Vstart;
VS->LineAcc.PulseCnt = xyz_GeometryDist2Pulse(VS->LineAcc.S,PulsesPer1000mm);

VS->LineDcc.T = (VS->LineAcc.T*VS->Acc)/VS->Dcc;
VS->LineDcc.S = VS->Dcc*VS->LineDcc.T*VS->LineDcc.T/2 + VS->LineDcc.T*VS->Vstop;
VS->LineDcc.PulseCnt = xyz_GeometryDist2Pulse(VS->Distance,PulsesPer1000mm) - VS->LineAcc.PulseCnt;

VS->V = VS->Vstart + VS->Acc*VS->LineAcc.T;

}
}
else
{
VS->LineAcc.T = 0;
VS->LineAcc.S = 0;
VS->LineAcc.PulseCnt = 0;



VS->LineConst.T = (double)VS->Distance/VS->V;
VS->LineConst.S = VS->Distance;
VS->LineConst.PulseCnt = xyz_GeometryDist2Pulse(VS->Distance,PulsesPer1000mm);

VS->LineDcc.T = 0;
VS->LineDcc.S = 0;
VS->LineDcc.PulseCnt = 0;
}
}
else
{
VS->LineAcc.T = 0;
VS->LineAcc.S = 0;
VS->LineAcc.PulseCnt = 0;

VS->LineConst.T = 0;
VS->LineConst.S = 0;
VS->LineConst.PulseCnt = 0;

VS->LineDcc.T = 0;
VS->LineDcc.S = 0;
VS->LineDcc.PulseCnt = 0;

}
}

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#13

Post napisał: Zienek » 13 kwie 2012, 10:47

jarekk pisze:Moja wersja to by chyba na Arduino już nie poszła :-(

Kod: Zaznacz cały

Cannot run program "avr-g++": error=2. No such file or directory. 


jarekk
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 21
Posty: 1701
Rejestracja: 17 mar 2006, 08:57
Lokalizacja: Gdańsk

#14

Post napisał: jarekk » 13 kwie 2012, 12:02

Zienek pisze:
jarekk pisze:Moja wersja to by chyba na Arduino już nie poszła :-(

Kod: Zaznacz cały

Cannot run program "avr-g++": error=2. No such file or directory. 
No tu można by powalczyć :-), ale portowanie biblioteki której używam do końcowych przeliczeń chyba już się nie udało

http://www.mpir.org/

Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3975
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#15

Post napisał: markcomp77 » 13 kwie 2012, 12:42

można by przeanalizować kod linuxcnc odpowiedzialny za rampę...
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm


jarekk
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 21
Posty: 1701
Rejestracja: 17 mar 2006, 08:57
Lokalizacja: Gdańsk

#16

Post napisał: jarekk » 13 kwie 2012, 12:55

markcomp77 pisze:można by przeanalizować kod linuxcnc odpowiedzialny za rampę...
Dla jednej osi to stosunkowo prosta matematyka ( równania kwadratowe).

Schody zaczynają się dopiero gdy pracujesz z 3,4 lub więcej osiami gdzie każda na inne parametry ( prędkość maksymalną , przyspieszenie i hamowanie ).
Oraz gdy różnica w ilości kroków pomiędzy osiami jest na tyle duża, że błędy zaokrągleń wynikające z niezależnych dla osi przeliczeń dają np. różny czas "ruchu"

Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3975
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#17

Post napisał: markcomp77 » 13 kwie 2012, 13:02

jarekk pisze:Dla jednej osi to stosunkowo prosta matematyka
a jak generujesz krok?
z przerwania czasowego?... czy w pętli głównej?
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 6
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#18

Post napisał: Zienek » 13 kwie 2012, 13:03

Pozatym komputer o wiele szybciej sobie radzi z operacjami na Floatach i Doublach. Nie wiem, jak z wydajnością takich obliczeń na tak "podstawowej" platformie jak rodzina avr.

Awatar użytkownika

Autor tematu
markcomp77
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 64
Posty: 3975
Rejestracja: 18 wrz 2004, 12:51
Lokalizacja: k/w-wy
Kontakt:

#19

Post napisał: markcomp77 » 13 kwie 2012, 13:05

Zienek pisze: jak z wydajnością takich obliczeń na tak "podstawowej" platformie jak rodzina avr
cóż... już 20..30lat temu sprowadzano te bardziej złożone operacje (trygonometryczne itp) do operacji prostych (aproxymowanych).. lub wręcz tablicowanych
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm


jarekk
ELITA FORUM (min. 1000)
ELITA FORUM (min. 1000)
Posty w temacie: 21
Posty: 1701
Rejestracja: 17 mar 2006, 08:57
Lokalizacja: Gdańsk

#20

Post napisał: jarekk » 13 kwie 2012, 13:08

markcomp77 pisze:jarekk napisał/a:
Dla jednej osi to stosunkowo prosta matematyka

a jak generujesz krok?
z przerwania czasowego?... czy w pętli głównej?
Używam przerwania czasowego ( stałego - 100kHz ) oraz stałoprzecinkowej arytmetyki 64 bitowej ( 32 bity to trochę za mało jak chcemy przyspieszenia i opóźnienia)

U32 hal_step_ext(volatile axis_engine_t * axis)
{
U32 result = 0;
U64 tmp;
U64 tmp2;

if(axis->count > 0)
{
tmp = axis->acumulator;
tmp2 = axis->speed + axis->accelerator;
axis->acumulator += tmp2;
axis->accelerator += axis->acc;

if(tmp2 < axis->speed_limit)
{
axis->count = 0;
}
else if(tmp > axis->acumulator)
{
axis->coord += axis->delta;
result = axis->step_pin;
axis->count--;
}
}



return result;
}

Poszło by szybciej jakby użyć assemblera, ale na razie nie było jeszcze potrzeby - Cortex-M3 120Mhz śmiga :-)

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Silniki Krokowe / Sterowniki Silników Krokowych”