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 

Pospeševanje koračnega motorja na STM32F4Discovery

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
hamm
Član
Član



Pridružen-a: Sob 27 Okt 2012 21:47
Prispevkov: 216
Aktiv.: 1.55
Kraj: Mengeš

PrispevekObjavljeno: Tor Okt 28, 2014 5:49 pm    Naslov sporočila:  Pospeševanje koračnega motorja na STM32F4Discovery Odgovori s citatom

Pozdravljeni!

Že dalj časa se mučim, kako bi na tej plati usposobil pospeševanje koračnega motorja.
Koračni motor mi sicer lepo deluje, poganjam ga s TIM3 torej naprej, nazaj, štejem korake, da se točno tam ustavi kjer želim, itd. Ko števec doseže vrednost ARR pride do TIM_IT_Update dogodka (vsakih nekaj 100 mikro sekund). V ISR preklapljam izhodni pin (torej pin, ki je vezan na STEP od driverja za koračni motor). Torej do tu vse lepo in prav.
Sedaj pa hočem implementirati enakomerno pospeševanje (linearno) do neke hitrosti, v bistvu trapezni profil pospeševanja. Za to sem uporabil še en časovnik, TIM4. Ne trdim, da je to najboljša rešitev, vendar tako sem se lotil. V tem časovniku enostavno na vsako eno milisekundo spremenim vrednost ARR za TIM3. Ta vrednost se seveda ob vsaki prekinitvi linearno zmanjšuje, pomeni pa število mikro sekund do naslednje prekinitve.
Problem je v tem, ker zadeva ne deluje, oziroma motor res pospešuje vendar z zatikanjem Think To zatikanje je vsakič ko motor poženem naključno, enkrat nekje pri začetku pospeševanja, spet drugič nekje na sredini ali pa večkrat na celi poti pospeševanja. V bistvu motor "cukne", kot da je za hip ustavil in spet speljal. Pogledal sem kako je z NVIC prioritetami za prekinitve, vendar nobena nastavitev ne pomaga. Pomislil sem, da TIM4, torej časovnik s katerim krmilim TIM3 mogoče predolgo opravlja svojo "nalogo", vendar seštevanje dveh integerjev in nov zapis v TIM4 ARR ne bi smelo vzeti veliko strojnih ciklov.

Ta princip se mi je zdel v osnovi enostaven, vendar nikakor mi ne uspe, da bi deloval. Ali obstaja kakšna bolj elegantna metoda pospeševanja korakarjev? Kako vi rešujete ta problem (ne moj, pospeševanje na splošno Wink )?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.11

PrispevekObjavljeno: Tor Okt 28, 2014 6:11 pm    Naslov sporočila:  Re: Pospeševanje koračnega motorja na STM32F4Discovery Odgovori s citatom

hamm je napisal/a:
Ko števec doseže vrednost ARR pride do TIM_IT_Update dogodka (vsakih nekaj 100 mikro sekund). V ISR preklapljam izhodni pin (torej pin, ki je vezan na STEP od driverja za koračni motor).
Ali imaš v ARR fiksno vrednost, vrednost števca pa vsakič resetiraš?

Po novem pusti števec pri miru in vsakič prištej konstanto plus vrednost neke spremenljivke k ARR. Tisto spremenljivko pa ob vsakem prehodu povečaj ali zmanjšaj za neko drugo spremenljivko (pospešek) oziroma jo pusti pri miru.

Glede na dva bita potem stojiš 00, pospešuješ 01 (prištevaš), konstantno voziš 11, ali zaviraš 10 (odštevaš).

Prištevanje ali odštevanje pospeška k hitrosti mora imeti blokiran prehod okrog ničle. ARR-ju pa lahko v miru prištevaš hitrost (čas do naslednjega impulza), tudi če s tem presežeš njegov maksimum.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
r0b1
Član
Član



Pridružen-a: Sre 12 Avg 2009 10:22
Prispevkov: 71
Aktiv.: 0.40
Kraj: Nm

PrispevekObjavljeno: Tor Okt 28, 2014 6:45 pm    Naslov sporočila:   Odgovori s citatom

S podobno zadevo sem sem ukvarjal tudi sam. Če želiš linearno pospeševanje, časa med koraki ne moreš linearno skrajševati, ampak ga moraš sproti izračunavat za naslednji korak. Strnjeno obrazložitev najdeš na http://hwml.com/LeibRamp.pdf.

Če krmiliš motorje v polnokoračnem načinu se zgodi da motor pride v resonanco, kar lahko povzroči izgubljanje korakov in nenavadno obnašanje motorja. Rešitev je, da ga krmiliš vsaj polkoračno. Lahko pa pomaga že če ga samo obremeniš.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Tomazp
Član
Član



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

PrispevekObjavljeno: Tor Okt 28, 2014 7:42 pm    Naslov sporočila:   Odgovori s citatom

Sam sem podoben problem rešil samo z enim timerjem (avr). Ob prekinitvi so se povečale oz. spreminjale vrednosti spremenljivk za hitrost in števec.

Primer:

Ko naraste vrednost števca za hitrost do določene vrednosti gre v izvajanje pulza. Hkrati pa se spremeni ciljna vrednost števca za hitrost zato motor pospešuje oz. zavira. Same ciljne vrednosti pa postavljaš v eni od rutin programa. V interaptu naj bodo rutine čim krajše z enostavnimi opreracijami ++,-- if ...

Je pa kar nekaj možnosti za izdelavo take rutine.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sigi
Član
Član



Pridružen-a: Čet 31 Jul 2014 11:42
Prispevkov: 199
Aktiv.: 1.69
Kraj: Kamnik

PrispevekObjavljeno: Tor Okt 28, 2014 8:06 pm    Naslov sporočila:   Odgovori s citatom

Na AVR (mega) sem za trajektorijo koračnega uporabljal tabelo za pospešek/pojemek. Računal sem jo pred startom, in se je spreminjala le če sem spreminjal parametre za pospešek/pojemek ali max. hitrost. Tabela z 32 "reload" vrednostmi za timer je v mojem primeru zadostovala. Tako je imel 8 bitni mlinček s tem malo dela, prosti procesorski čas sem rabil za druge funkcije aplikacije.
Na ARM-u še nisem pisal kode za koračnike, bi šel pa na čist matematični pristop, saj je "sape" dovolj. In "na vodi" že čutim, da bo v kratkem treba zagrabit prav to (zaenkrat se še pogovarjamo o projektu).

To, da koračni motor "cuka", pa je druga stvar. Ali lahko to anomalijo "ujameš" na osciloskop ali logični analizator? Morda ti kak del softvera packa po istih portih, kjer je koračni. Poskusi v softveru onemogočit vse, razen koračnega. Pa ko bereš/pišeš po timerjih, jih pred branjem/pisanjem ustavi in ko končaš zopet poženi. Saj če je koda prav napisana, to ni potrebno, ampak lahko imaš kako prekrivanje in ga je treba poiskat.

Preveri tudi signale, morda ti kaj "seka" v CLK/DIR/ENABLE za driver. Sem že kdaj prečul noč in iskal softverski ocvirk, pa je bil "cvikl" na elektroniki...

lp
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: 265
Aktiv.: 1.36
Kraj: Ljubljana

PrispevekObjavljeno: Tor Okt 28, 2014 11:11 pm    Naslov sporočila:   Odgovori s citatom

Pazi: nekje pri srednjih obratih ima koračni motor resonanco, zaradi česar se ti lahko tudi ustavi, čeprav če praviš da se včasih večkrat ustavi verjetno ne bo to.

Kaj se zgodi če v ARR vpišeš vrednost nižjo od trenutne vrednosti timerja?

Za ideje si lahko pogledaš tudi kakšno kodo od CNC kontrolerja, npr. GRBL ali kaj za 3Dp... Tam imaš ponavadi fiksno časovno bazo / interrupt in je potem samo možnost ali je pulz ali pa ga ni.
Nazaj na vrh
Prisoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
hamm
Član
Član



Pridružen-a: Sob 27 Okt 2012 21:47
Prispevkov: 216
Aktiv.: 1.55
Kraj: Mengeš

PrispevekObjavljeno: Sre Okt 29, 2014 12:59 am    Naslov sporočila:   Odgovori s citatom

Uf, koliko nasvetov, hvala vsem za hiter odziv! Bom jutri bolj natančno pogledal zadevo.
@igo Ja, ARR sem nastavil na fiksno vrednost, vendar kot rečeno, na vsako milisekundo sem ga z drugim časovnikom spreminjal, števec pa pustil pri miru. Če števec resetiram, pa dobim čuden rezultat.

@r0b1 čas med koraki sem res linearno skrajševal, vendar z drugim časovnikom, ki je imel fiksno periodo, pribl. vsako milisekundo sem zmanjševal vrednost tistega timerja, ki krmili motor. Zavedam pa se, da če bi to počel z enim, da je treba ob vsaki novi nastavitvi preračunavati naslednjo zakasnitev. Koračni motor sem sicer krmilil z mikrokoraki, 1/8, torej 1600 korakov na obrat.

@Tomazp Nisem najbolj razumel, a si mislil nekako takole? (to je koda z neke druge teme na tem forumu):

int stepper1;
int hitrost1 = 100;
int vrednost = 10000;

interrupt {
stepper1=stepper1+hitrost1;
if(stepper1>vrednost) {
generiraj_pulz;
stepper1=stepper1-vrednost;
}
}

@Sigi žal nimam osciloskopa, vendar mislim da je problem res zgolj programski, ker sicer motor v redu dela. Pravzaprav si želim S-curve za pospešek in sem se v resnici najprej igral s tem, ker ima ta plata kot si rekel, res dosti "sape" v tem primeru podporo za strojno pospeševanje za floating point, kar je idealno. Za hitrejšo odpravo napake pa sem se lotil najprej linearnega pospeševanja.
Citiram:
Pa ko bereš/pišeš po timerjih, jih pred branjem/pisanjem ustavi in ko končaš zopet poženi. Saj če je koda prav napisana, to ni potrebno, ampak lahko imaš kako prekrivanje in ga je treba poiskat.


To sem tudi naredil in je rezultat isti. Ob prekinitvi TIM4 (torej časovnika ki nadzira ARR TIM3, ta pa proži pin STEP za motor) sem ustavil TIM3, izračunal nov ARR, ga vpisal v TIM3 in zopet pognal TIM3. Rezultat je isti. Gre pa res za neko prekrivanje...

@dejko1
Citiram:
Kaj se zgodi če v ARR vpišeš vrednost nižjo od trenutne vrednosti timerja?
Bom jutri probal, mislim pa, da gre števec časovnika enostavno naprej, ko doseže ARR, pa od 0 do nove natavljene vrednosti ARR, nisem pa prepričan...

Ahh, že vidim, jutri bo doooolg dan d'oh! Hvala vsem za odgovore, nekaj bom že stuhtal. Upam Whistle
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek
Član
Član



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

PrispevekObjavljeno: Sre Okt 29, 2014 10:03 am    Naslov sporočila:   Odgovori s citatom

Ma da bi jaz tole temo kak mesec nazaj bral, ko sem se tudi sam ubadal s podobnimi problemi ... Motor NEMA17, PoStep krmilnik.

- Nekje med 0,9 in 1,1 Hz (obrati na osi) je motor trokiral ko nor. Nad tem in pod tem je šel ko "puter". Verjetno problem z že omenjeno lastno resonanco.

- S kontrolerja (ATmega) sem mu šibal pulze z duty cycle-om 50%. Pri višjih hitrostih (šel sem do 28 Hz!) se je zadeva obnašala čudno (trokirala), čeprav so bili pulzi "lepi" (merjeno direktno na krmilniku). Zadeva se je čudežno rešila, ko sem duty cycle zmanjšal na 10%.

- Za višje hitrosti je potreben "mehak zagon" motorja, sicer običajno le malo piska in stoji na mestu ... Sad Tudi sam sem zadevo rešil "tabelarično", kot že eden od predhodnikov.

Osciloskop se je pri tem projektu izkazal kot nepogrešljiv pripomoček! Dodatno sem nanj dal še en Hall switch (in magnet na os), tako da sem lahko meril tudi obrate motorja.

LP, g

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



Pridružen-a: Sob 27 Okt 2012 21:47
Prispevkov: 216
Aktiv.: 1.55
Kraj: Mengeš

PrispevekObjavljeno: Čet Dec 11, 2014 10:36 am    Naslov sporočila:   Odgovori s citatom

No, pa sem le ugotovil, kaj je bilo narobe Dancing Končno!Pray
Namreč vsakič ko sem z drugim časovnikom spremenil ARR vrednost časovnika, ki poganja motor, sem pozabil tudi resetirati vrednost števca. Npr. recimo da je ARR=100 in števec šteje navzgor. V trenutku ko ima števec vrednost 90 pa jaz nastavim novo vrednost ARR na 50. Naslednji IT_UPDATE se seveda zgodi čez približno 4 milijarde mikro sekund (TIM2 ima števec 32-biten, delilnik pa je nastavljen tako, da ena enota v števcu pomeni eno mikro sekundo). Če uporabim 16-bitni časovnik, pa se motor ustavi za pribl. 0,065 sekunde, kar pojasni tisto kratko ustavljanje, ki sem ga opisal.
Zanimivo je tudi to, da sem nekje vmes celo pomislil na to, vendar nisem izrecno ponastavil števca, ampak sem preden sem spreminjal vrednost ARR izklopil časovnik (tistega ki poganja motor seveda), spremenil ARR in vklopil nazaj časovnik. Zgleda da izklop ne ponastavi vrednosti counter registra... No kakorkoli že, hvala vsem za nasvete, mucek, tebi najlepša hvala, ker si mi posodil osciloskop, pa upam da če se bo kdo tega lotil sedaj ne bo imel problemov Wink
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 -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group