 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3366 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Ned Sep 14, 2014 6:38 am Naslov sporočila: sistem z več koračnimi motorji - kako se to dela? |
|
|
Nekako sem naštudiral koračni motor in ga uspem voditi, kamor hočem. Za pravilno generiranje koračnih impulzov uporabim Timer AVR mikroprocesorja.
Vendar en sam koračni motor ne naredi veliko. Običajno jih je več, ki nekako orkestrirano premikajo, kar pač premikajo. Kako se to praktično naredi?
Ima vsak motor svoj mikroprocesor, ki se med sabo sporazumevajo, komunicirajo, ali pa se da generirati koračne impulze z enim timerjem za več motorjev? No, če bi bila samo dva koračna motorja, potem bi pač lahko uporabili še ne timer mikroprocesorja.
Problem ste vsekakor že rešili, saj ste si naredili CNC stroje za obdelavo. Kako?
Je kje kak pisani materijal, kjer bi se lahko o tem podučil? |
|
Nazaj na vrh |
|
 |
Tomazp Član


Pridružen-a: Sob 02 Feb 2008 13:24 Prispevkov: 559 Aktiv.: 2.63 Kraj: Ljubljana
|
Objavljeno: Ned Sep 14, 2014 10:09 am Naslov sporočila: |
|
|
Z enim kontrolerjem lahko brez težav krmiliš poljubno število motorjev. Za Bascom sicer ne vem točno glede same izvedbe. Rabiš pa naredit rutino, ki se izvaja v interaptu. V grobem imaš za vsak motor števec stanja + ostale parametre (hitrost, smer, pospeševanje...), ki glede na vrednost v interaptu generira oz. odšteva inpulze. Na ta način lahko vsi motorji delajo istočasno. Sam sem tako naredil pri neki svoji aplikaciji z dvema motorjema.
V kolikor pa bi delal cnc, pa bi raje uporabil namenski cnc krmilnik, kjer operiraš z G kodo in ne tratiš časa z nepotrebnimi stvarmi. |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3366 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Ned Sep 14, 2014 11:54 am Naslov sporočila: |
|
|
Hvala!
Praviš poljubno število motorjev z eno timer interrupt rutino?
Tako kot sem jaz zastavil, to ne bi šlo, saj sproti račanam in polnim Interrupt loadtime variablo glede na čas, ki mora preteči do sledečega impuza mojega koračnega motorja. In ko preteće ćas, ko se dogodi interrupt, tedaj pretaknem step-output pin mikroprocesorja. In spet raačunam in polnim novo Loadtimer variablo, če se pač motor pospešuje..
Lahko kaj več napišeš o tvojem konceptu?
Ne gre za CNC, je mi pa dobrodošla informacija, da o tem že obstoja programje. A veš za kakšne družine mikroprocesorjev gre v tem slučaju? Ah, to je verjetno v kompletu z hardwareom in je programje zaprto v krmilniku..
Pozdrav
VS |
|
Nazaj na vrh |
|
 |
BorisK Član

Pridružen-a: Sre 02 Apr 2008 23:43 Prispevkov: 278 Aktiv.: 1.32 Kraj: Ljubljana
|
Objavljeno: Ned Sep 14, 2014 12:25 pm Naslov sporočila: |
|
|
Sam uporabim recimo eno samo prekinitev na 0.1 sekunde (lahko tudi 0.01 ali pa 1ms..., odvisno od namembnosti), pa potem gor obesim poljubno število programskih števcev, vejanj... vsakega za svoje neodvisno dejanje.
V tvojem primeru si narediš torej primerno konstantno časovno bazo, potem pa krmiliš vsak motor posebej prek ustreznih medsebojno neodvisnih pogojev in programskih števcev.
Upam, da je razumljivo.  |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3366 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Ned Sep 14, 2014 12:46 pm Naslov sporočila: |
|
|
Če potrebujem impulze v rasponu od 20 Hz do 2kHz -a potem mora biti časovna baza vsaj 20 kHz, da bo najkrajši impulz štel tja do 10 interruptov in šele takrat generiral step impulz. Tako?
In pri vsakem interuptu porinem števec interruptov za ena naprej in primerjam, ali je že dosegel vrednost, ki predstavlja potreben interval za step impulz.
Če je dosegel vrednost, generiram step impulz in postavim vrednost s katerim primerjam števec interruptov za toliko period interrupta naprej kolikor je potrebno da preteče čas do sledečega impulza.
Ha, to pa bo predelava že narejenega programa..Pa tudi interrupt rutina bo veliko obsežnejša od moje, saj mora šteti tudi korake motorja in zaustaviti motor, ko pride le ta na cilj
A brez Muje se še čevelj ne obuje..
Hvala |
|
Nazaj na vrh |
|
 |
Tomazp Član


Pridružen-a: Sob 02 Feb 2008 13:24 Prispevkov: 559 Aktiv.: 2.63 Kraj: Ljubljana
|
Objavljeno: Ned Sep 14, 2014 12:59 pm Naslov sporočila: |
|
|
Dobro je, če imaš čim manj sprotnega preračunavanja.
Sam sem naredil neko namensko aplikacijo na osnovi mega8. Pc komunicira preko rs232 z avr in daje komande kaj naj se dogaja. Avr pa poskrbi za pravilno delovanje in povratne informacije nazaj na PC. Program si pa napišeš tako da ti funkcionalno najbolj odgovarja. Drugače je pa že BorisK lepo napisal.
vilko je napisal/a: |
Hvala!
Praviš poljubno število motorjev z eno timer interrupt rutino?
Tako kot sem jaz zastavil, to ne bi šlo, saj sproti račanam in polnim Interrupt loadtime variablo glede na čas, ki mora preteči do sledečega impuza mojega koračnega motorja. In ko preteće ćas, ko se dogodi interrupt, tedaj pretaknem step-output pin mikroprocesorja. In spet raačunam in polnim novo Loadtimer variablo, če se pač motor pospešuje..
Lahko kaj več napišeš o tvojem konceptu?
Ne gre za CNC, je mi pa dobrodošla informacija, da o tem že obstoja programje. A veš za kakšne družine mikroprocesorjev gre v tem slučaju? Ah, to je verjetno v kompletu z hardwareom in je programje zaprto v krmilniku..
Pozdrav
VS |
|
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5537 Aktiv.: 24.02 Kraj: Domzale
|
Objavljeno: Ned Sep 14, 2014 4:52 pm Naslov sporočila: |
|
|
Vilko, oglasi se ob priliki mimo, imam točno to na mizi, ravno v delu
Na kratko, imam timer na 100 us (lahko bi šel še tudi dol) in v tem timerju:
- povečujem spremenljivki "stepper1" in "stepper2"
- če je spr. "stepper1" večja od spremenljivke "hitrost1", togglam izhod za pulz steperju in seveda "stepper1" postavim nazaj na 0.
(taisto seveda s spremenljivko stepper2)
Slaba stvar te rešitve je, da nimam zveznega krmiljenja stepperjev (ampak le razmerja; npr. 1:2, 1:4 ...), ampak za konkretno aplikacijo tega ne potrebujem.
Mi je pa malo sivih las (no, niti ne, pogovor s Krokotom in Borisom je hitro razjasnil par stvari - tudi jaz dosedaj s stepperji še nisem delal) povzročilo dejstvo, da je stepper treba štartati počasi (slow start) - ne moreš ga kar takoj na polne obrate zagnati.
Druga zadeva je bila, da je treba uporabljati enable pin na kontrolerju, sicer se koračnik prav nemarno greje ...
Sve je lako, kad znaš kako ...
LP, g _________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
 |
PrimozL Član


Pridružen-a: Tor 21 Mar 2006 10:55 Prispevkov: 404 Aktiv.: 1.72 Kraj: okolica Vipave
|
Objavljeno: Ned Sep 14, 2014 10:34 pm Naslov sporočila: |
|
|
Živijo Vilko,
Veliko majhnih CNC sistemov sloni na GRBL, tudi 3D tiskalniki. GRBL podpira do 4 osi.:
http://www.shapeoko.com/wiki/index.php/Grbl
https://github.com/grbl/grbl/downloads
http://blog.protoneer.co.nz/quick-grbl-setup-guide-for-windows-arduino-g-code-interpreter/
Po serijskem vmesniku pošlješ G-kodo (linearen pomik, krožnico, lok, ...), mikrokrmilnik jo pregleda, razbije na koščke in izvede ustrezne premike na vseh oseh istočasno. Ne vem, če si imel kaj podobnega v mislih.
GRBL sloni na ATmega mikrokrmilnikih. HW je tako lahko Arduino uno vezje, ki je že zelo poceni. Ne vem, če je smiselno tukaj izumljat toplo vodo. V nižjem razredu to dobro obvlada GRBL, v srednjem in višjem pa npr Krokotova vezja.
Malo sem bral, kako je potekal razvoj GRBL kode in so se kar spotili, da so prišli do tukaj, kjer je SW zdaj.
LP Primož. |
|
Nazaj na vrh |
|
 |
dejko1 Član

Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 271 Aktiv.: 1.29 Kraj: Ljubljana
|
Objavljeno: Ned Sep 14, 2014 11:13 pm Naslov sporočila: |
|
|
Še en preprost način je da uporabiš hiter interrupt npr. 10kHz. V interruptu dodaš spremenljivki stepper1 hitrost1. Če vrednost stepper1 preseže neko prednastavljeno vrednost potem se generira pulz, od stepper1 pa se odšteje ta vrednost. Če za to vrednost izbereš število proženj interrupta na sekundo se ti hitrost1 točno ujema s številom oddanih pulzov na sekundo. Na podoben način lahko v tem interruptu tudi spreminjaš hitrost, da dosežeš npr. trapezni profil premikanja.
Koda: |
int stepper1;
int hitrost1 = 100;
int vrednost = 10000;
interrupt {
stepper1=stepper1+hitrost1;
if(stepper1>vrednost) {
generiraj_pulz;
stepper1=stepper1-vrednost;
}
}
|
Na podoben način deluje GRBL, za krmiljenje več motorjev pa uporablja še planer, saj za CNC ni zadosti da na več motorjih nastaviš hitrost ampak želiš da grejo sinhronizirano skozi točke ki jih določiš (moraš slediti številu korakov za vsako os)...
Kar je bolj "zapleteno" pri GRBL kodi je predvsem to kako kar precej računanja (sploh za 8-bit procesor) spravit v zelo omejen čas... |
|
Nazaj na vrh |
|
 |
Energetik-m Član


Pridružen-a: Pon 07 Dec 2009 19:16 Prispevkov: 1392 Aktiv.: 7.34 Kraj: Zagorje
|
Objavljeno: Pon Sep 15, 2014 12:34 am Naslov sporočila: |
|
|
Pred mnogimi leti je bil v Elektorju objavljen načrt za ploter, tam so uporabili bresenhamov algoritem za risanje poševne črte. Ne zahteva velike moči procesiranja, saj rabiš le seštevanje in deljenje z 2.
Išči pod "bresenhamov algoritem" _________________ lp |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Pon Sep 15, 2014 2:49 am Naslov sporočila: |
|
|
Pozdravljeni,
problem krmiljenja lahko razdelimo na več delov:
- branje (parsanje) G-kode
- preračun iz g-kode v "interni" načrt premikov, ki upošteva določene omejitve
- digitalno krmiljenje (step, direction, ...)
- močnostno krmiljenje
Bolj profesionalne izvedbe lahko prve tri faze izvedejo na kontrolerju.
Močnostni del je ponavadi ločen od kontrolnega.
Za DIY (učno) izvedno pa lahko prve 3 faze izvedeš na močnejšem računalniku (PC), kjer imaš na voljo skoraj neprimerljivo večjo računsko moč kot na malem mlinčku.
Predlagam da v prvi fazi g-kodo preračunavaš v načrt pomikanja kar na PCju.
Na vezju na katerem pa se učiš pa le izvajaš tisto kar si naračunal na PCju (torej da na vezju izvajaš le tretji korak).
Kot so ti že drugi napisali bo najlažje, če interrupt rutina ne počne skoraj ničesar drugega kot prišteva/odšteva in primerja.
Primer "načrta" za naslednjih 100 ciklov:
X: +10 (na vsakih 10 ciklov en impulz, direction = 1)
Y: +20 (na vsakih 20 ciklov en impulz, direction = 1)
Z: -5 (na vsakih 5 ciklov en impulz, direction = 0)
N: 100
Koda: |
// inicializacija
dx = X = 10;
dy = Y = 20;
dz = Z = -5;
// xyz
portD = 0x06; (== 000000110) recimo da imamo na portu D direction
n = 100;
int_enbl = 1;
interrupt rutina:
... stepper_int ()
{
if(0 >= n) return;
dx -= 1;
dy -= 1;
dz -= 1;
n -= 1;
// xyz
int tmp = portA & 0xF8; // == 11111000; (ugasnemo step bit za vse tri osi)
if(0 == dx)
{
// x
tmp |= 0x04; // == 00000100 (če smo prišli do 0 == dx prižgemo step bit na x osi)
dx = X;
}
if(0 == dy)
{
// y
tmp |= 0x02; // == 00000010 (če smo prišli do 0 == dy prižgemo step bit na y osi)
dy = Y;
}
if(0 == dz)
{
// z
tmp |= 0x01; // == 00000001 (če smo prišli do 0 == dz prižgemo step bit na z osi)
dz = Z;
}
portA = tmp;
}
|
koda je rahlo poenostavljena pač toliko da dobiš občutek kako dela.
predpostavljeno je da je dovolj, če je step pin prižgan en cikel interrupt rutine
(to pomeni da isr ni ne prehiter, ne prepočasen)
Če bi bil isr prepočasen, bi morda lahko stepper naredil 2 koraka, čeprav si ti želel enega.
Zadevo sem opisal bolj na splošno iz programerskega stališča (samih stepper motorjev še nisem krmilil, si pa predstavljam kako bi to moral izvesti).
Upam da bo napisano v pomoč,
lp, Gregor |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3366 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Pon Sep 15, 2014 8:56 am Naslov sporočila: |
|
|
Kot sem že enkrat napisal, ne gre za CNC stroj. Gre preprosto za učenje, kako več koračnih motorjev povezati v sistem. Vsaka robotska roka ima več steper motorjev, ki morajo delati kot moštvo, ubrano.
Uspel sem upravljati en motor, z enim mikroprocesorjem in z enim timerjwm, kjer sem timerload spremenljiko generiral in polnil po potrebi, in sem s tem popolnoma onesposobil timer za druge zadeve.
Dali ste mi koncept, kjer ima timer konstantno timerload vrednost, in v timer prekinitvi štejem prekinitve za vsak motor posebnem števcu število prekinitev, ki je potrebno za sledeči step impulz. Hvala
A vsekakor hvala tudi za informacije v zvezi z CNC. So izredno informativne in poučne, in kdo ve, kdaj pridejo prav. Če ne meni, pa morda kakemu drugemu forumašu začetniku. |
|
Nazaj na vrh |
|
 |
Tomazp Član


Pridružen-a: Sob 02 Feb 2008 13:24 Prispevkov: 559 Aktiv.: 2.63 Kraj: Ljubljana
|
Objavljeno: Pon Sep 15, 2014 9:52 am Naslov sporočila: |
|
|
Sem mnenja, da bi take stvari lažje naredil v C-ju. Ko imaš uporabljenih več različnih rutin in hardwera (več časovnikov, zunanje prekinitve...) po možnosti med seboj usklajenih bo glava precej manj bolela. Načeloma v Bascomu vse dela. Ko pa začneš združevati pa se lahko začnejo pojavljati težave. Sam sem naredil svojo prvo aplikacijo v Bascomu, sedaj pa vse v C-ju. |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3366 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Pon Sep 15, 2014 11:05 am Naslov sporočila: |
|
|
Rešitev,
da generiram timer prekinitveni podprogram vsakih 100 usec in merim dolžino periode v teh časovnih intervalih, dela.
Generira pa se mi nov problemček:
Za pomoč pri razhroščevanju programa rad uporabljam sofwaresko generirani UART na nekem prostem pinu in informacije berem na Terminal Emulatorju. (Hvala Bray!)
Toda če glavni program tako pogosto prekinjam, se timing softwarsko generiranega uart tako zmede, da na terminalu vidim samo smeti.
Tukaj ne vidim druge rešitve, ko da grem na Portd.1 kjer ima moj mega328 tx integriranega uarta. Te rešitve sem se izogibal, ker sem ta uart hranil za bolj zahtevne komunikacije med mikroprocesorji.
Verjetno ne bo šlo drugače. Če hočeš palačinko, moraš razbiti jajce.. |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.70 Kraj: glej fogl
|
Objavljeno: Pon Sep 15, 2014 12:42 pm Naslov sporočila: |
|
|
A to želiš izvesti z mikrokontrolerjem? Če ne, ti predlagam da uporabiš linuxcnc. Tam recimo samo zaženeš stepgen modul (16 motorjev lahko krmiliš z njim), potem izhode tega modula povežeš na lpt port, vhode pa ti krmiliš - npr. vpišeš kam hočeš da se motor zavrti. _________________ lp, Klemen |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 9 dni
Powered by phpBB © 2001, 2005 phpBB Group
|