RAMPA na ARDUINO

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

Yogi_
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 16
Posty: 759
Rejestracja: 13 sty 2010, 08:07
Lokalizacja: Braniewo

#101

Post napisał: Yogi_ » 30 kwie 2012, 01:31

Witam :-)
Panowie, czytam z uwagą, ale chwilowo zmieniłem główny profil hobby, więc tylko czytam. Pitsa ciekawość wielka czy wymyśliłeś to samo (źródła nie znam):
This algorithm was designed for floating point mathematics and in this
form it works faster than in the integer form that requires division.
z LeibRamp.pdf. Ten integer znaczy się.
W zasadzie wątek wypączkował z dyskusji o prostym sterowniku do timelapse. Do bardziej skomplikowanych to można linuxcnc zaprząc przecież.
I w związku z tym powtarzając upierdliwie: czy Twoje obliczenia są równoważne dla kompaktu 0,2 kg i lustrzanki 3kg? Może przerwę startową liczyć od masy poruszanej? Tzn. przy jakiej masie zaczyna gubić kroki? I nie mówcie, że rampa nie zależy od masy - owszem max prędkość zależy od silnika, sterownika jego, oraz układu przeniesienia napędu, ale start od masy. Proponuję potrenować z ciężarem o masie ≈ 80kg i 800kg wiszącymi na dźwigu. :-)


Pozdrawiam
Krzysiek

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 21
Posty: 4698
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#102

Post napisał: pitsa » 30 kwie 2012, 07:05

Film z tą nową rampą: http://youtu.be/9pyRgWdDvBE dla współczynnika łagodności 18 i od pierwszego kroku poniżej 0.5 obr/min.
Algorytm wymyśliłem sam na podstawie doświadczeń z poprzednimi wersjami i przemyśleń nad rampami w programach, które używam do sterowania maszynami (nie tylko cnconv).
Pierwszy sposób skojarzyłem ze sklejaniem funkcji. W kolejnych skorzystałem z różnych sugestii, o których piszę na forum lub zamieściłem w arkuszu kalkulacyjnym. Dla lepszego zrozumienia rampy osie poziome powinny być czasem nie krokiem. Można te przyspieszenia kątowe przeliczyć sobie na przyspieszenia liniowe dla danego układu i wyliczyć siłę bezwładności i moment bezwładności. Może w kolejnej wersji. :)
Które przeliczenia są szybsze jeszcze nie wiem.
Ostatnio zmieniony 30 kwie 2012, 08:10 przez pitsa, łącznie zmieniany 1 raz.
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ

Awatar użytkownika

Yogi_
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 16
Posty: 759
Rejestracja: 13 sty 2010, 08:07
Lokalizacja: Braniewo

#103

Post napisał: Yogi_ » 30 kwie 2012, 08:01

pitsa pisze:Algorytm wymyśliłem sam
To wiem :-) , ciekawość tylko czy wyważyłeś otwarte? ;-) Tamten pdf nadaje się tak jak jest dla kolegów, którzy robią rampę na cortex'ie.

[ Dodano: 2012-04-30, 08:08 ]
pitsa pisze: Brakuje jedynie sprawdzenia "czy warto się rozpędzać" gdy podana liczba kroków jest za mała do wejścia na pełne obroty.
Rampa/2 - jakiś_procent?
Znaczy jest tak /\ a sztucznie robimy tak /-\ (nie ma górnej kreski)? Żeby nie przekombinować i używać takich samych obliczeń?
Pozdrawiam
Krzysiek

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 21
Posty: 4698
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#104

Post napisał: pitsa » 30 kwie 2012, 08:13

Jak zwykle ciekawość, bo "procesor" jest od tego żeby pracował. :)
Yogi_ pisze: Rampa/2 - jakiś_procent?
Znaczy jest tak /\ a sztucznie robimy tak /-\ (nie ma górnej kreski)? Żeby nie przekombinować i używać takich samych obliczeń?
Zgadza się, kroki/2 minus kilka sztuk na wykonanie poziomu. Wystarczy jedna instrukcja warunkowa zatrzymująca dalsze przyspieszanie w części startowej. W niektórych przypadkach ryzykuje się jednak dużym zrywem.
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ

Awatar użytkownika

Yogi_
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 16
Posty: 759
Rejestracja: 13 sty 2010, 08:07
Lokalizacja: Braniewo

#105

Post napisał: Yogi_ » 30 kwie 2012, 08:17

pitsa pisze:Które przeliczenia są szybsze jeszcze nie wiem.
Tu (wg mnie) nie tyle chodzi o szybkość, bo na odcinku 1 - 2m sekunda w tę czy we w tę to rybka. Bardziej o łatwiejsze i czasami w ogóle możliwe dźwignięcie sprzętu do góry. I niewyrywanie sprzętu z mocowań przy starcie i stopie.

Hm.. liczyć czy wstawiać dodatkowe krańcówki dla rampy?
Pozdrawiam
Krzysiek

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 21
Posty: 4698
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#106

Post napisał: pitsa » 30 kwie 2012, 08:48

Chodziło mi o płynność działania programu. To co zrobiłem jest jeszcze wrażliwe na czas wykonania operacji arytmetycznych. Zakończenie pętli, instrukcje przed pętlą, dodatkowe instrukcje przy spełnieniu jakiegoś warunku mogą wydłużyć przerwę między krokami i rampa przestaje być gładka. Trzeba na niższym poziomie kontrolować czas. delayMicroseconds() ma ograniczenie do 16383 i przy wolniejszej jeździe trzeba dołożyć użycie delay() lub oprzeć się na millis() i mocros().

Przydałoby się sprawdzić jak wygląda cała rampa przy pomocy jakiejś szybkiej akwizycji danych. Dla mnie to co już mam na ucho jest ok.

Przy okazji testów przyłapałem sterownik silnika krokowego (albo to sam silnik tak ma?) na jakieś stuki (200 cichych "tupnięć" na obrót) na każdy fizyczny krok niezależnie od ustawionego mikrokoku. Ciekawe czy są silniki krokowe lepsze i znacznie gorsze w danej serii biorąc pod uwagę płynność ich pracy przy wysokich mikrokokach.

Gdyby ktoś potrzebował bardzo ładnej delikatnej dłuuugiej rampy, to tak wygląda gotowiec z użyciem AccelStepper.

Kod: Zaznacz cały

#include <AccelStepper.h> 
// pobierz i wgraj do libraries stąd: 
// http://www.open.com.au/mikem/arduino/AccelStepper/
// 

AccelStepper osX(1, 6, 5);  //   pin 6 - STEP, pin 5 - DIR
int goX = 16000;                //   idź do wsp. X
int ile = 1; 
void setup() {  
  osX.setMaxSpeed(10000);    // do pierwszej próby długiej rampy daj: 1000  
  osX.setAcceleration(1500);  // oraz maleńkie przyspieszenie: 10 i mikrokrok 16.
} 

void loop(){ 
  if (osX.distanceToGo() == 0) { 
  //  idź do współrzędnej po przeciwnej stronie początku układu wsp.
    goX = -goX; 
    osX.moveTo(goX); 

    for (int k=1; k < ile ; k++) { delay(200); } ; 
    ile = int ( ile * 5 / 4 ) + 1; // wydłużacz przerw między ruchami w lewo i w prawo.
  } 
  osX.run(); 
} 
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ

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:

#107

Post napisał: markcomp77 » 16 maja 2012, 16:46

jaką maksymalną częstotliwość pulsu udało się uzyskać?

na arduino 16MHz -- (rampa liniowa) - wychodzi na max ok. 13..15KHz

[ Dodano: 2012-05-17, 11:03 ]

Kod: Zaznacz cały

digitalWrite(STEP_PIN, HIGH); 
//    delayMicroseconds(3); 
digitalWrite(STEP_PIN, LOW); 
hehe.. samo generowanie impulsu STEP nie wymaga robienia dodatkowego ostępu czasowego
bo digitalWrite wywołuje podprogram... i czas trwania impulsu STEP wychodzi 5.2us (mierzone)

[ Dodano: 2012-05-17, 11:08 ]

Kod: Zaznacz cały

PORTB |= 1;        //włącz bit 0000001 (czyli STEP_PIN - 8 w/g arduino) 
delayMicroseconds(3); 
PORTB &= 0xfe;  //wyłączenie bit 0000001
teraz impuls STEP ma 2.88us... i prędkośc max może nieco wzrosnąć -- dużo zaoszczędziś się niestety nie dało :(

[ Dodano: 2012-05-17, 12:02 ]

Kod: Zaznacz cały

    PORTB |= 1;                        
    PORTB &= 0xfe;
czas 124ns - za mało dla sterownika ;)

[ Dodano: 2012-05-17, 12:06 ]
z polecenia

Kod: Zaznacz cały

mark@hpecik:/tmp/build4624808108323397664.tmp$ avr-objdump -S RAMP04.cpp.elf > RAMP4.lst
można wyczytać, jaki kod jest generowany...

Kod: Zaznacz cały

    PORTB |= 1; 
3b0:	28 9a       	sbi	0x05, 0	; 5
    PORTB &= 0xfe; 
 3b2:	28 98       	cbi	0x05, 0	; 5
SpotkanieCNC: STOM-TOOL Marzec 2014
http://www.cnc.info.pl/topics79/spotkan ... t55028.htm

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 21
Posty: 4698
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#108

Post napisał: pitsa » 22 maja 2012, 12:10

markcomp77 pisze:czas trwania impulsu STEP wychodzi 5.2us (mierzone)
Da się takie rzeczy pomierzyć jakąś tanią metodą? Na przykład: wiem, że impuls szybko osiąga 5V. Podłączam kondensator xx pF lub xnF, który gromadzi ładunek i załączy jakiś układ gdy czas trwania impulsu będzie większy niż np. 1us i ten czas dałoby się regulować jakimś precyzyjnym potencjometrem? Układem wzorcowym kalibrowałoby się punkt graniczny i potem sprawdzanie czasu impulsu. Kilka prób i wiem jaki jest czas impulsu.
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ

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:

#109

Post napisał: markcomp77 » 22 maja 2012, 13:26

pitsa pisze:Da się takie rzeczy pomierzyć jakąś tanią metodą? Na przykład: wiem, że impuls szybko osiąga 5V. Podłączam kondensator xx pF lub xnF, który gromadzi ładunek i załączy jakiś układ gdy czas trwania impulsu będzie większy niż np. 1us i ten czas dałoby się regulować jakimś precyzyjnym potencjometrem? Układem wzorcowym kalibrowałoby się punkt graniczny i potem sprawdzanie czasu impulsu. Kilka prób i wiem jaki jest czas impulsu.
można i tak...
ale ja robię pomiary tradycyjnie - oscyloskopem...
ostatnio nawet cyfrowym -- więc wyrzuca mi wszystkie parametry jakie się da :)

do pomiaru czasu - to można by atmegę zapędzić ;)

--
wracając do tematu..
ja męczę dwa sposoby realizacji -- oba na przerwaniach

1) -- przerwanie o czasie programowanym... wyliczonym w samym przerwaniu - i STEP (obliczenia niestety zawierają dzielenie)
2) -- przerwanie o stałym czasie... i badanie czy już czas na STEP (dość proste obliczenia dla rampy liniowej)

niby oba algorytmy trochę działają... tzn. niestety są pewne ograniczenia i problemy...

metoda 1) zapewne będzie lepsza dla czegoś szybszego niż AVR... bo m i się marzy generowanie STEP o większej częstotliwości niż 10KHz....

a... kształt rampy --- w jakimś artykule przeczytałem, że celowym wydaje się stosowanie rampy parabolicznej w przypadku krokowców -- dlaczego?... bo są mocniejsze przy mniejszej prędkości a słabną przy większej -- dlatego rampa zaczyna się szybciej, wręcz od jakiejś prędkości startowej... a dochodzi łagodniej do prędkości max i dadatkowo
http://www.pmdcorp.com/news/articles/ht ... ofiles.cfm

Step motors, however, do not have flat torque/speed curves. Torque output is non-linear, sometimes having a large drop at a location called the 'mid-range instability', and generally having drop-off at higher velocities. Figure 3 gives examples of typical torque/speed curves for servo and step-motor systems.

Obrazek

Mid-range instability occurs at the step frequency when the motor's natural resonance frequency matches the current step rate. To address mid-range instability, the most common technique is to use a non-zero starting velocity. This means that the profile instantly 'jumps' to a programmed velocity upon initial acceleration, and while decelerating. This is shown in figure 4. While crude, this technique sometimes provides better results than a smooth ramp for zero, particularly for systems that do not use a microstepping drive technique.

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

#110

Post napisał: jarekk » 22 maja 2012, 13:34

markcomp77 pisze:2) -- przerwanie o stałym czasie... i badanie czy już czas na STEP (dość proste obliczenia dla rampy liniowej)
Ja używam tego sposobu. Tyle że faktycznie - obliczenia może nie są skomplikowane (tylko dodawanie), ale jak podzielić 16MHz na 100kHz kroku to nie ma wiele czasu .

ODPOWIEDZ Poprzedni tematNastępny temat

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