Mex píše: ↑10. 7. 2018, 3:56
A jseš si tím jistý?
Ty stepgeny přece musíš úkolovat vzhledem k periodě servo-threadu. Pokud potřebuješ jet nějakou rychlostí, tak tomu odpovídá nějaká konkrétní frekvence kroků STEP. Takže tomu stepgenu musíš nějak předat informaci o frekvenci, kterou má generovat.
Já ale přece ty
StepGeny neúkoluji v žádném případě
vzhledem k periodě Servo-Threadu, ale
pouze je v periodě Servo-Threadu
"aktualizuji". Tedy řeknu jim
"máš být tam a tam" v polohovém režimu (nebo "
jeď takovouhle rychlostí"
v rychlostním režimu).
StepGen pak (bez ohledu na to jak moc pravidelně je "updatován" - to je mu
skoro jedno pokud se nejedná o SW stepgen)
udělá vše pro to, aby "okamžitě" dosáhl zadané polohy a
uplatní vnitřní regulátor, který má k dispozici následující:
- požadovanou novou polohu (
S2)
- precizní aktuální pozici (
S1) (přečteno z akumulátoru pozice MESA přesnost něco kolem nanometrů),
- aktuální rychlost (
V1) (tato je přesně zadaná z minulé "aktualizace" v Servo-Threadu)
- povolenou maximální akceleraci (
Amax) a povolenou maximální rychlost (
Vmax) (aby mohl spočítat minimální chybu v době dosažení zadané polohy)
Akcelerace je (tak nějak slovy řečeno) zmněna rychlosti v daném čase, takže aby mohl určit "novou rychlost" a dodržet limity Maximální Akcelerace (
Amax)tak má k dispozici:
- přesný čas minulé "aktualizace" (
T1)
- přesný současný čas (
T2)
- současnou rychlost (
V1)
Novou požadovanou rychlost (
V2) spočte dle
algoritmu minimalizující chybu v bodě požadované polohy (
S2)
(vzoreček z hlavy nevypotím, protože už to je pár let co jsem se v tom hrabal a není uplně jednoduchý a je větvený/podmíněný v závislosti na různých stavech a možnostech do jakého stavu se může dostat atd...)
Nově zadaná rychlost (
V2) pak ještě musí ležet v intervalu:
V1 +- (Amax * (T2 - T1))
a nakonec ořezání maximální povolené rychlosti (samože v obou směrech):
pokud
V2 > Vmax tak
V2 = Vmax (pohyb v kladném směru)
pokud
V2 < -Vmax tak
V2 = -Vmax (pohyb v záporném směru)
Všimni si, že v uvedených vzorečcích nikde nefiguruje perioda - Nově zadaná rychlost (a tedy frekvence) není nijak přímo vázaná na Servo-Thread.
(v horším případe je vázaná na BaseThread pokud bych uvažoval Software StepGeny - což ale není oblastí našeho zájmu)
(ona v kódu tedy na některých místech ve skutečnosti figuruje i ta perioda respektive její délka, ale to teď není podstatné)
Ještě se vrátím k tomu
skoro jedno. Není mu to úplně jedno, protože akcelerace je měněna skokově s frekvencí ServoThreadu.
Pokud by byla perioda update přiliš dlouhá, nebo nepravidelná, tak by byla akcelerace taky tak nějako nepravidelná a protože hračka "necítí" rychlost, ale "cití" zrychlení tak by to mělo nejspíše vliv na "plynulost" pohybu - možná nějaké vibrace atd.
Mex píše: ↑10. 7. 2018, 3:56
Moc mi není jasné, jak se pak úkolují stepgeny v polohovém režimu (tedy např. že mají dojet na pozici 45.7 kroků), když jim neřekneš čas, za který tam mají dorazit, nebo rychlost, kterou tam mají dojet. U mechanických systémů je to snadné - když úkoluješ servo po 1ms, tak tam se prostě pohyb zprůměruje mechanickou setrvačností. Ale elektronický stepgen umí teoreticky nekonečnou akceleraci.
Stepgen sice "umí teoreticky nekonečnou akceleraci", ale protože programátor nespadl z hrušky tak i ten
elektronický StepGen dodržuje nastavenou maxmální akceleraci (Amax) (která musí být trochu větší než tak kterou je omezen
Trajectory Planner)
Sranda je v tom, že v polohovém režimu jim
neříkáš "KDY" mají být na místě, ale
"KDE" (S2) mají být "TEĎ" (T2) (a oni udělají maximum aby se tam "střelhbitě" dostali s dodržením "vnitřních limitů rychlosti a akcelerace")
To, že chodí správná požadovaná poloha "pravidelně", je úkolem
Trajectory-Planeru, který počítá "
novou požadovanou polohu (S2)" každý
Servo-Thread a to je pak ještě přepočítáno přes
Kinematiku stroje pro převod Kartézských souřadnic polohy dané
G-Kódem na jednotlivé osy - tedy vstupy jednotlivých
StepGenů).
Všimni si, že i tady je požadovaná poloha počítána v tom samém
Servo-Threadu a tedy případná nepravidelnost má malý vliv na správný výpočet požadované polohy, protože i tento počíta s aktuálním přesným časem (dle
HPET)
Po pochopení těchto souvislostí teprve zjistíš, jak je "nemožné" odtrhnout vlastní generování polohy od "
jádra LinuxCNC" (nezamněňovat s RealTime jádrem Linxu - operačního systému), tak aby nepotřeboval relativně pravidelný
Servo-Thread. V současném pojetí celého "
jádra LinuxCNC" není prostě možné ho "odtrhnout" od
Real-Time a udělat z něj pouhý "
sender" G-Kódů, protože
výpočet kinematiky a polohy je docela fest svázán se správným generováním aktuální požadované polohy pro Servo-Thread a není zdaleka tak triviální jak si nezasvěcení myslí .....
... jsem se zase nějako rozepsal
