www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

sistem z več koračnimi motorji - kako se to dela?
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3366
Aktiv.: 14.17
Kraj: Dragomer

PrispevekObjavljeno: Ned Sep 14, 2014 6:38 am    Naslov sporočila:  sistem z več koračnimi motorji - kako se to dela? Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Tomazp
Član
Član



Pridružen-a: Sob 02 Feb 2008 13:24
Prispevkov: 559
Aktiv.: 2.64
Kraj: Ljubljana

PrispevekObjavljeno: Ned Sep 14, 2014 10:09 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3366
Aktiv.: 14.17
Kraj: Dragomer

PrispevekObjavljeno: Ned Sep 14, 2014 11:54 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
BorisK
Član
Član



Pridružen-a: Sre 02 Apr 2008 23:43
Prispevkov: 278
Aktiv.: 1.32
Kraj: Ljubljana

PrispevekObjavljeno: Ned Sep 14, 2014 12:25 pm    Naslov sporočila:   Odgovori s citatom

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. Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3366
Aktiv.: 14.17
Kraj: Dragomer

PrispevekObjavljeno: Ned Sep 14, 2014 12:46 pm    Naslov sporočila:   Odgovori s citatom

Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Tomazp
Član
Član



Pridružen-a: Sob 02 Feb 2008 13:24
Prispevkov: 559
Aktiv.: 2.64
Kraj: Ljubljana

PrispevekObjavljeno: Ned Sep 14, 2014 12:59 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5537
Aktiv.: 24.02
Kraj: Domzale

PrispevekObjavljeno: Ned Sep 14, 2014 4:52 pm    Naslov sporočila:   Odgovori s citatom

Vilko, oglasi se ob priliki mimo, imam točno to na mizi, ravno v delu Wink

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 ... Smile

Sve je lako, kad znaš kako ...

LP, g

_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
PrimozL
Član
Član



Pridružen-a: Tor 21 Mar 2006 10:55
Prispevkov: 404
Aktiv.: 1.72
Kraj: okolica Vipave

PrispevekObjavljeno: Ned Sep 14, 2014 10:34 pm    Naslov sporočila:   Odgovori s citatom

Ž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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dejko1
Član
Član



Pridružen-a: Ned 16 Mar 2008 0:21
Prispevkov: 271
Aktiv.: 1.29
Kraj: Ljubljana

PrispevekObjavljeno: Ned Sep 14, 2014 11:13 pm    Naslov sporočila:   Odgovori s citatom

Š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. Wink Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Energetik-m
Član
Član



Pridružen-a: Pon 07 Dec 2009 19:16
Prispevkov: 1392
Aktiv.: 7.34
Kraj: Zagorje

PrispevekObjavljeno: Pon Sep 15, 2014 12:34 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Pon Sep 15, 2014 2:49 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3366
Aktiv.: 14.17
Kraj: Dragomer

PrispevekObjavljeno: Pon Sep 15, 2014 8:56 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Tomazp
Član
Član



Pridružen-a: Sob 02 Feb 2008 13:24
Prispevkov: 559
Aktiv.: 2.64
Kraj: Ljubljana

PrispevekObjavljeno: Pon Sep 15, 2014 9:52 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3366
Aktiv.: 14.17
Kraj: Dragomer

PrispevekObjavljeno: Pon Sep 15, 2014 11:05 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1282
Aktiv.: 5.70
Kraj: glej fogl

PrispevekObjavljeno: Pon Sep 15, 2014 12:42 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika za začetnike Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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